File indexing completed on 2023-10-25 09:39:04
0001 #include "DataFormats/GeometrySurface/interface/BoundSpan.h"
0002 #include "DataFormats/GeometrySurface/interface/Surface.h"
0003 #include "DataFormats/GeometrySurface/interface/TrapezoidalPlaneBounds.h"
0004 #include "DataFormats/GeometrySurface/interface/RectangularPlaneBounds.h"
0005
0006 #include "DataFormats/GeometryVector/interface/VectorUtil.h"
0007
0008 void BoundSpan::compute(Surface const& plane) {
0009 const TrapezoidalPlaneBounds* trapezoidalBounds(dynamic_cast<const TrapezoidalPlaneBounds*>(&(plane.bounds())));
0010 const RectangularPlaneBounds* rectangularBounds(dynamic_cast<const RectangularPlaneBounds*>(&(plane.bounds())));
0011
0012 Surface::GlobalPoint corners[8];
0013
0014 if (trapezoidalBounds) {
0015 std::array<const float, 4> const& parameters = (*trapezoidalBounds).parameters();
0016
0017 auto hbotedge = parameters[0];
0018 auto htopedge = parameters[1];
0019 auto hapothem = parameters[3];
0020 auto thickness = (*trapezoidalBounds).thickness();
0021
0022 corners[0] = plane.toGlobal(LocalPoint(-htopedge, hapothem, thickness / 2));
0023 corners[1] = plane.toGlobal(LocalPoint(htopedge, hapothem, thickness / 2));
0024 corners[2] = plane.toGlobal(LocalPoint(hbotedge, -hapothem, thickness / 2));
0025 corners[3] = plane.toGlobal(LocalPoint(-hbotedge, -hapothem, thickness / 2));
0026 corners[4] = plane.toGlobal(LocalPoint(-htopedge, hapothem, -thickness / 2));
0027 corners[5] = plane.toGlobal(LocalPoint(htopedge, hapothem, -thickness / 2));
0028 corners[6] = plane.toGlobal(LocalPoint(hbotedge, -hapothem, -thickness / 2));
0029 corners[7] = plane.toGlobal(LocalPoint(-hbotedge, -hapothem, -thickness / 2));
0030
0031 } else if (rectangularBounds) {
0032 auto length = rectangularBounds->length();
0033 auto width = rectangularBounds->width();
0034 auto thickness = (*rectangularBounds).thickness();
0035
0036 corners[0] = plane.toGlobal(LocalPoint(-width / 2, -length / 2, thickness / 2));
0037 corners[1] = plane.toGlobal(LocalPoint(-width / 2, +length / 2, thickness / 2));
0038 corners[2] = plane.toGlobal(LocalPoint(+width / 2, -length / 2, thickness / 2));
0039 corners[3] = plane.toGlobal(LocalPoint(+width / 2, +length / 2, thickness / 2));
0040 corners[4] = plane.toGlobal(LocalPoint(-width / 2, -length / 2, -thickness / 2));
0041 corners[5] = plane.toGlobal(LocalPoint(-width / 2, +length / 2, -thickness / 2));
0042 corners[6] = plane.toGlobal(LocalPoint(+width / 2, -length / 2, -thickness / 2));
0043 corners[7] = plane.toGlobal(LocalPoint(+width / 2, +length / 2, -thickness / 2));
0044 } else {
0045 }
0046
0047 float phimin = corners[0].barePhi();
0048 float phimax = phimin;
0049 float zmin = corners[0].z();
0050 float zmax = zmin;
0051 float rmin = corners[0].perp2();
0052 float rmax = rmin;
0053 for (int i = 1; i < 8; i++) {
0054 auto cPhi = corners[i].barePhi();
0055 if (Geom::phiLess(cPhi, phimin)) {
0056 phimin = cPhi;
0057 }
0058 if (Geom::phiLess(phimax, cPhi)) {
0059 phimax = cPhi;
0060 }
0061 auto z = corners[i].z();
0062 if (z < zmin)
0063 zmin = z;
0064 if (z > zmax)
0065 zmax = z;
0066 auto r = corners[i].perp2();
0067 if (r < rmin)
0068 rmin = r;
0069 if (r > rmax)
0070 rmax = r;
0071 }
0072 m_zSpan.first = zmin;
0073 m_zSpan.second = zmax;
0074 m_rSpan.first = std::sqrt(rmin);
0075 m_rSpan.second = std::sqrt(rmax);
0076 m_phiSpan.first = phimin;
0077 m_phiSpan.second = phimax;
0078 }