CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
ForwardDiskSectorBuilderFromWedges.cc
Go to the documentation of this file.
2 
5 
6 using namespace std;
7 
8 // Warning, remember to assign this pointer to a ReferenceCountingPointer!
9 BoundDiskSector* ForwardDiskSectorBuilderFromWedges::operator()(const vector<const TECWedge*>& wedges) const {
10  // check first that all wedges are about at the same phi and z !
11  float phiStart = wedges.front()->position().phi();
12  float zStart = wedges.front()->position().z();
13  float wphimin, wphimax;
14  for (vector<const TECWedge*>::const_iterator i = wedges.begin(); i != wedges.end(); i++) {
15  float zdiff = (**i).surface().position().z() - zStart;
16  if (std::abs(zdiff) > 5.)
17  edm::LogError("TkDetLayers") << " ForwardDiskSectorBuilderFromWedges: Trying to build "
18  << "Petal from Wedges at different z ! Delta Z = " << zdiff;
19  float wphi = (**i).surface().position().phi();
20  if (Geom::phiLess(phiStart, wphi)) {
21  wphimin = phiStart;
22  wphimax = wphi;
23  } else {
24  wphimin = wphi;
25  wphimax = phiStart;
26  }
27  float phidiff = wphimax - wphimin;
28  if (phidiff < 0.)
29  phidiff += 2. * Geom::pi();
30  if (phidiff > 0.3)
31  edm::LogError("TkDetLayers") << " ForwardDiskSectorBuilderFromWedges: Trying to build "
32  << "Petal from Wedges at different phi ! Delta phi = " << phidiff;
33  }
34 
35  auto bo = computeBounds(wedges);
36 
37  Surface::PositionType pos(bo.second.x(), bo.second.y(), bo.second.z());
38  Surface::RotationType rot = computeRotation(wedges, pos);
39  return new BoundDiskSector(pos, rot, bo.first);
40 }
41 
42 pair<DiskSectorBounds*, GlobalVector> ForwardDiskSectorBuilderFromWedges::computeBounds(
43  const vector<const TECWedge*>& wedges) const {
44  // compute maximum and minimum radius and phi
45  float rmin((**(wedges.begin())).specificSurface().innerRadius());
46  float rmax(rmin);
47  float zmin((**(wedges.begin())).surface().position().z());
48  float zmax(zmin);
49  float phimin((**(wedges.begin())).surface().position().phi());
50  float phimax(phimin);
51 
52  for (vector<const TECWedge*>::const_iterator iw = wedges.begin(); iw != wedges.end(); iw++) {
53  // edm::LogInfo(TkDetLayers) << "---------------------------------------------" ;
54  // edm::LogInfo(TkDetLayers) << " Builder: Position of wedge :" << (**iw).position() ;
55  float ri = (**iw).specificSurface().innerRadius();
56  float ro = (**iw).specificSurface().outerRadius();
57  float zmi = (**iw).surface().position().z() - (**iw).specificSurface().bounds().thickness() / 2.;
58  float zma = (**iw).surface().position().z() + (**iw).specificSurface().bounds().thickness() / 2.;
59  float phi1 = (**iw).surface().position().phi() - (**iw).specificSurface().phiHalfExtension();
60  float phi2 = (**iw).surface().position().phi() + (**iw).specificSurface().phiHalfExtension();
61  rmin = min(rmin, ri);
62  rmax = max(rmax, ro);
63  zmin = min(zmin, zmi);
64  zmax = max(zmax, zma);
65  if (Geom::phiLess(phi1, phimin))
66  phimin = phi1;
67  if (Geom::phiLess(phimax, phi2))
68  phimax = phi2;
69  }
70 
71  if (!Geom::phiLess(phimin, phimax))
72  edm::LogError("TkDetLayers") << " ForwardDiskSectorBuilderFromWedges : "
73  << "Something went wrong with Phi Sorting !";
74  float zPos = (zmax + zmin) / 2.;
75  float phiWin = phimax - phimin;
76  float phiPos = (phimax + phimin) / 2.;
77  float rmed = (rmin + rmax) / 2.;
78  if (phiWin < 0.) {
79  if ((phimin < Geom::pi() / 2.) || (phimax > -Geom::pi() / 2.)) {
80  edm::LogError("TkDetLayers") << " Debug: something strange going on, please check ";
81  }
82  // edm::LogInfo(TkDetLayers) << " Petal at pi: phi " << phimin << " " << phimax << " " << phiWin
83  // << " " << 2.*Geom::pi()+phiWin << " " ;
84  phiWin += 2. * Geom::pi();
85  phiPos += Geom::pi();
86  }
87 
88  GlobalVector pos(rmed * cos(phiPos), rmed * sin(phiPos), zPos);
89  return make_pair(new DiskSectorBounds(rmin, rmax, zmin - zPos, zmax - zPos, phiWin), pos);
90 }
91 
93  Surface::PositionType pos) const {
94  GlobalVector yAxis = (GlobalVector(pos.x(), pos.y(), 0.)).unit();
95 
96  GlobalVector zAxis(0., 0., 1.);
97  GlobalVector xAxis = yAxis.cross(zAxis);
98 
99  return Surface::RotationType(xAxis, yAxis);
100 }
std::pair< DiskSectorBounds *, GlobalVector > computeBounds(const std::vector< const TECWedge * > &wedges) const
Vector3DBase< typename PreciseFloatType< T, U >::Type, FrameTag > cross(const Vector3DBase< U, FrameTag > &v) const
Definition: Vector3DBase.h:110
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
T y() const
Definition: PV3DBase.h:60
double phidiff(double phi)
Normalized difference in azimuthal angles to a range between .
Definition: fourvec.cc:220
Log< level::Error, false > LogError
BoundDiskSector * operator()(const std::vector< const TECWedge * > &wedges) const
Surface::RotationType computeRotation(const std::vector< const TECWedge * > &wedges, Surface::PositionType pos) const
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
T min(T a, T b)
Definition: MathUtil.h:58
bool phiLess(float phi1, float phi2)
Definition: VectorUtil.h:18
TkRotation< float > RotationType
tuple zAxis
Definition: MetAnalyzer.py:57
constexpr double pi()
Definition: Pi.h:31
T x() const
Definition: PV3DBase.h:59
const PositionType & position() const
Global3DVector GlobalVector
Definition: GlobalVector.h:10
Basic3DVector unit() const