CMS 3D CMS Logo

FlatTrd.cc
Go to the documentation of this file.
3 #include <algorithm>
4 #include <iostream>
5 
6 //#define DebugLog
7 
9 typedef FlatTrd::Pt3D Pt3D ;
12 
13 typedef HepGeom::Vector3D<CCGFloat> FVec3D ;
14 typedef HepGeom::Plane3D<CCGFloat> Plane3D ;
15 
16 typedef HepGeom::Vector3D<double> DVec3D ;
17 typedef HepGeom::Plane3D<double> DPlane3D ;
18 typedef HepGeom::Point3D<double> DPt3D ;
19 
20 //----------------------------------------------------------------------
21 
22 FlatTrd::FlatTrd() : CaloCellGeometry(), m_axis ( 0., 0., 0. ),
23  m_corOne ( 0., 0., 0. ), m_local (0., 0., 0.),
24  m_global ( 0., 0., 0. ) {
25 }
26 
28  *this = tr ;
29 }
30 
32  CaloCellGeometry::operator=( tr ) ;
33  if ( this != &tr ) {
34  m_axis = tr.m_axis ;
35  m_corOne = tr.m_corOne ;
36  m_local = tr.m_local;
37  m_global = tr.m_global;
38  m_tr = tr.m_tr;
39  }
40 #ifdef DebugLog
41  std::cout << "FlatTrd(Copy): Local " << m_local << " Global " << m_global
42  << " eta " << etaPos() << " phi " << phiPos() << " Translation "
43  << m_tr.getTranslation() << " and rotation " << m_tr.getRotation();
44 #endif
45  return *this ;
46 }
47 
49 CornersMgr* cMgr ,
50  const GlobalPoint& fCtr ,
51  const GlobalPoint& bCtr ,
52  const GlobalPoint& cor1 ,
53  const CCGFloat* parV ) :
54  CaloCellGeometry ( fCtr, cMgr, parV ) ,
55  m_axis ( ( bCtr - fCtr ).unit() ) ,
56  m_corOne ( cor1.x(), cor1.y(), cor1.z() ),
57  m_local (0., 0., 0.) {
58  getTransform(m_tr,nullptr);
59  Pt3D glb = m_tr*m_local;
60  m_global = GlobalPoint(glb.x(),glb.y(),glb.z());
61 #ifdef DebugLog
62  std::cout << "FlatTrd: Local " << m_local << " Global " << glb << " eta "
63  << etaPos() << " phi " << phiPos() << " Translation "
64  << m_tr.getTranslation() << " and rotation " << m_tr.getRotation();
65 #endif
66 }
67 
69  const CCGFloat* par ) :
70  CaloCellGeometry ( corn, par ) ,
71  m_corOne ( corn[0].x(), corn[0].y(), corn[0].z() ),
72  m_local (0., 0., 0.) {
73  getTransform(m_tr,nullptr);
74  m_axis = makeAxis();
75  Pt3D glb = m_tr*m_local;
76  m_global = GlobalPoint(glb.x(),glb.y(),glb.z());
77 #ifdef DebugLog
78  std::cout << "FlatTrd: Local " << m_local << " Global " << glb << " eta "
79  << etaPos() << " phi " << phiPos() << " Translation "
80  << m_tr.getTranslation() << " and rotation " << m_tr.getRotation();
81 #endif
82 }
83 
84 FlatTrd::FlatTrd( const FlatTrd& tr, const Pt3D & local ) :
85  CaloCellGeometry( tr ), m_local(local) {
86  *this = tr;
87  Pt3D glb = m_tr*m_local;
88  m_global = GlobalPoint(glb.x(),glb.y(),glb.z());
89 #ifdef DebugLog
90  std::cout << "FlatTrd: Local " << m_local << " Global " << glb << " eta "
91  << etaPos() << " phi " << phiPos() << " Translation "
92  << m_tr.getTranslation() << " and rotation " << m_tr.getRotation();
93 #endif
94 }
95 
97 
99  Pt3D glb = m_tr*local;
100 #ifdef DebugLog
101  std::cout << "FlatTrd::Local " << local.x() << ":" << local.y() << ":"
102  << local.z() << " Global " << glb.x() << ":" << glb.y() << ":"
103  << glb.z() << " TR " << m_tr.xx() << ":" << m_tr.xy() << ":"
104  << m_tr.xz() << ":" << m_tr.yx() << ":" << m_tr.yy() << ":"
105  << m_tr.yz() << ":" << m_tr.zx() << ":" << m_tr.zy() << ":"
106  << m_tr.zz() << ":" << m_tr.dx() << ":" << m_tr.dy() << ":"
107  << m_tr.dz() << std::endl;
108 #endif
109  return GlobalPoint(glb.x(),glb.y(),glb.z());
110 }
111 
112 Pt3D FlatTrd::getLocal(const GlobalPoint& global) const {
113  Pt3D local = m_tr.inverse()*Pt3D(global.x(),global.y(),global.z());
114 #ifdef DebugLog
115  std::cout << "FlatTrd::Global " << global.x() << ":" << global.y() << ":"
116  << global.z() << " Local " << local.x() << ":" << local.y() << ":"
117  << local.z() << std::endl;
118 #endif
119  return local;
120 }
121 
123  return m_axis.theta() ;
124 }
125 
127  return m_axis.phi() ;
128 }
129 
130 const GlobalVector& FlatTrd::axis() const {
131  return m_axis ;
132 }
133 
135  const CCGFloat* pv ,
136  Pt3D& ref ) const {
137  localCorners( vec, pv, ref ) ;
138 }
139 
140 void FlatTrd::createCorners( const std::vector<CCGFloat>& pv ,
141  const Tr3D& tr ,
142  std::vector<GlobalPoint>& co ) {
143 
144  assert( 11 <= pv.size() ) ;
145  assert( 8 == co.size() ) ;
146 
147  Pt3DVec ko ( 8, Pt3D(0,0,0) ) ;
148 
149  Pt3D tmp ;
150  Pt3DVec to ( 8, Pt3D(0,0,0) ) ;
151  localCorners( to, &pv.front(), tmp ) ;
152 
153  for( unsigned int i ( 0 ) ; i != 8 ; ++i ) {
154  ko[i] = tr * to[i] ; // apply transformation
155  const Pt3D & p ( ko[i] ) ;
156  co[ i ] = GlobalPoint( p.x(), p.y(), p.z() ) ;
157 #ifdef DebugLog
158  std::cout << "Corner[" << i << "] = " << co[i] << std::endl;
159 #endif
160  }
161 }
162 
164  const CCGFloat* pv ,
165  Pt3D& ref ) {
166  assert( nullptr != pv ) ;
167  assert( 8 == lc.size() ) ;
168 
169  const CCGFloat dz ( pv[0] ) ;
170  const CCGFloat h ( pv[3] ) ;
171  const CCGFloat bl ( pv[4] ) ;
172  const CCGFloat tl ( pv[5] ) ;
173  const CCGFloat a1 ( pv[6] ) ;
174 
175  const CCGFloat ta1 ( tan( a1 ) ) ;
176 
177  lc[0] = Pt3D ( - h*ta1 - bl, - h , -dz ); // (-,-,-)
178  lc[1] = Pt3D ( + h*ta1 - tl, + h , -dz ); // (-,+,-)
179  lc[2] = Pt3D ( + h*ta1 + tl, + h , -dz ); // (+,+,-)
180  lc[3] = Pt3D ( - h*ta1 + bl, - h , -dz ); // (+,-,-)
181  lc[4] = Pt3D ( - h*ta1 - bl, - h , dz ); // (-,-,+)
182  lc[5] = Pt3D ( + h*ta1 - tl, + h , dz ); // (-,+,+)
183  lc[6] = Pt3D ( + h*ta1 + tl, + h , dz ); // (+,+,+)
184  lc[7] = Pt3D ( - h*ta1 + bl, - h , dz ); // (+,-,+)
185 
186  ref = 0.25*( lc[0] + lc[1] + lc[2] + lc[3] ) ;
187 #ifdef DebugLog
188  std::cout << "Ref " << ref << " Local Corners " << lc[0] << "|" << lc[1]
189  << "|" << lc[2] << "|" << lc[3] << "|" << lc[4] << "|" << lc[5]
190  << "|" << lc[6] << "|" << lc[7] << std::endl;
191 #endif
192 }
193 
194 void FlatTrd::getTransform( Tr3D& tr, Pt3DVec* lptr ) const {
196  const Pt3D gFront ( p.x(), p.y(), p.z() ) ;
197  const DPt3D dgFront ( p.x(), p.y(), p.z() ) ;
198 
199  Pt3D lFront ;
200  assert( nullptr != param() ) ;
201  std::vector<Pt3D > lc( 8, Pt3D(0,0,0) ) ;
202  localCorners( lc, param(), lFront ) ;
203 
204  // figure out if reflction volume or not
205 
206  Pt3D lBack ( 0.25*(lc[4]+lc[5]+lc[6]+lc[7]) ) ;
207 
208  const DPt3D dlFront ( lFront.x(), lFront.y(), lFront.z() ) ;
209  const DPt3D dlBack ( lBack.x() , lBack.y() , lBack.z() ) ;
210  const DPt3D dlOne ( lc[0].x() , lc[0].y() , lc[0].z() ) ;
211 
212  const FVec3D dgAxis ( axis().x(), axis().y(), axis().z() ) ;
213 
214  const DPt3D dmOne ( m_corOne.x(), m_corOne.y(), m_corOne.z() ) ;
215 
216  const DPt3D dgBack ( dgFront + ( dlBack - dlFront ).mag()*dgAxis ) ;
217  DPt3D dgOne ( dgFront + ( dlOne - dlFront ).mag()*( dmOne - dgFront ).unit() ) ;
218 
219  const double dlangle ( ( dlBack - dlFront).angle( dlOne - dlFront ) ) ;
220  const double dgangle ( ( dgBack - dgFront).angle( dgOne - dgFront ) ) ;
221  const double dangle ( dlangle - dgangle ) ;
222 
223  if( 1.e-6 < fabs(dangle) ) {//guard against precision problems
224  const DPlane3D dgPl ( dgFront, dgOne, dgBack ) ;
225  const DPt3D dp2 ( dgFront + dgPl.normal().unit() ) ;
226 
227  DPt3D dgOld ( dgOne ) ;
228 
229  dgOne = ( dgFront + HepGeom::Rotate3D( -dangle, dgFront, dp2 )*
230  DVec3D( dgOld - dgFront ) ) ;
231  }
232 
233  tr = Tr3D( dlFront , dlBack , dlOne ,
234  dgFront , dgBack , dgOne ) ;
235 
236  if( nullptr != lptr ) (*lptr) = lc ;
237 }
238 
240 
241  if( co.uninitialized() ) {
242  CornersVec& corners ( co ) ;
243  Pt3DVec lc ;
244  Tr3D tr ;
245  getTransform( tr, &lc ) ;
246 
247  for (unsigned int i ( 0 ) ; i != 8 ; ++i ) {
248  const Pt3D corn ( tr*lc[i] ) ;
249  corners[i] = GlobalPoint( corn.x(), corn.y(), corn.z() ) ;
250  }
251  }
252 }
253 
255  return GlobalVector( backCtr() - getPosition() ).unit() ;
256 }
257 
259  float dz = (getCorners()[4].z() > getCorners()[0].z()) ?
260  param()[0] : -param()[0];
261  Pt3D local_b(m_local.x(),m_local.y(),m_local.z()+dz);
262  Pt3D global_b = m_tr*local_b;
263  GlobalPoint global(global_b.x(),global_b.y(),global_b.z());
264  return global;
265 }
266 
267 //----------------------------------------------------------------------
268 //----------------------------------------------------------------------
269 
270 std::ostream& operator<<( std::ostream& s, const FlatTrd& cell ) {
271  s << "Center: " << cell.getPosition() << " eta " << cell.etaPos()
272  << " phi " << cell.phiPos() << std::endl;
273  s << "Axis: " << cell.getThetaAxis() << " " << cell.getPhiAxis() <<std::endl;
274  const CaloCellGeometry::CornersVec& corners ( cell.getCorners() ) ;
275  for ( unsigned int i=0 ; i != corners.size() ; ++i ) {
276  s << "Corner: " << corners[i] << std::endl;
277  }
278  return s ;
279 }
280 
const GlobalVector & axis() const
Definition: FlatTrd.cc:130
A base class to handle the particular shape of HGCal volumes.
Definition: FlatTrd.h:19
HepGeom::Point3D< double > DPt3D
Definition: FlatTrd.cc:18
FlatTrd & operator=(const FlatTrd &tr)
Definition: FlatTrd.cc:31
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
CaloCellGeometry::Pt3D Pt3D
Definition: FlatTrd.h:23
HepGeom::Point3D< double > DPt3D
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
virtual const GlobalPoint & getPosition() const
Returns the position of reference for this cell.
double glb
Definition: hdecay.h:105
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
T y() const
Definition: PV3DBase.h:63
CaloCellGeometry::Pt3DVec Pt3DVec
Definition: FlatTrd.h:24
HepGeom::Transform3D Tr3D
FlatTrd::Pt3D Pt3D
Definition: FlatTrd.cc:9
std::vector< Pt3D > Pt3DVec
Tr3D m_tr
Definition: FlatTrd.h:84
FlatTrd::CCGFloat CCGFloat
Definition: FlatTrd.cc:8
HepGeom::Plane3D< CCGFloat > Plane3D
Definition: FlatTrd.cc:14
Geom::Theta< T > theta() const
Definition: PV3DBase.h:75
const GlobalPoint backCtr(void) const
Definition: FlatTrd.cc:258
const CCGFloat * param() const
Pt3D m_local
Definition: FlatTrd.h:82
void vocalCorners(Pt3DVec &vec, const CCGFloat *pv, Pt3D &ref) const override
Definition: FlatTrd.cc:134
CaloCellGeometry::CCGFloat CCGFloat
Definition: FlatTrd.h:22
T z() const
Definition: PV3DBase.h:64
HepGeom::Vector3D< CCGFloat > FVec3D
Definition: FlatTrd.cc:13
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
def pv(vc)
Definition: MetAnalyzer.py:6
FlatTrd::Tr3D Tr3D
Definition: FlatTrd.cc:11
HepGeom::Vector3D< double > DVec3D
Definition: FlatTrd.cc:16
Pt3D m_corOne
Definition: FlatTrd.h:82
static void localCorners(Pt3DVec &vec, const CCGFloat *pv, Pt3D &ref)
Definition: FlatTrd.cc:163
void getTransform(Tr3D &tr, Pt3DVec *lptr) const override
--------— only needed by specific utility; overloaded when needed -—
Definition: FlatTrd.cc:194
HepGeom::Plane3D< double > DPlane3D
Definition: FlatTrd.cc:17
~FlatTrd() override
Definition: FlatTrd.cc:96
Vector3DBase unit() const
Definition: Vector3DBase.h:57
Pt3D getLocal(const GlobalPoint &global) const
Definition: FlatTrd.cc:112
GlobalVector makeAxis(void)
Definition: FlatTrd.cc:254
HepGeom::Plane3D< double > DPlane3D
const GlobalPoint & getPosition() const override
Returns the position of reference for this cell.
Definition: FlatTrd.h:46
void initCorners(CornersVec &) override
Definition: FlatTrd.cc:239
HepGeom::Point3D< CCGFloat > Pt3D
Definition: EZMgrFL.h:8
static void createCorners(const std::vector< CCGFloat > &pv, const Tr3D &tr, std::vector< GlobalPoint > &co)
Definition: FlatTrd.cc:140
CornersVec const & getCorners() const
Returns the corner points of this cell&#39;s volume.
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
FlatTrd::Pt3DVec Pt3DVec
Definition: FlatTrd.cc:10
bool uninitialized() const
Definition: EZArrayFL.h:77
GlobalPoint m_global
Definition: FlatTrd.h:83
CaloCellGeometry::Tr3D Tr3D
Definition: FlatTrd.h:25
CCGFloat getThetaAxis() const
Definition: FlatTrd.cc:122
virtual float phiPos() const
Definition: FlatTrd.h:49
std::ostream & operator<<(std::ostream &s, const FlatTrd &cell)
Definition: FlatTrd.cc:270
virtual float etaPos() const
Definition: FlatTrd.h:48
FlatTrd(void)
Definition: FlatTrd.cc:22
T x() const
Definition: PV3DBase.h:62
CCGFloat getPhiAxis() const
Definition: FlatTrd.cc:126
HepGeom::Vector3D< CCGFloat > FVec3D
Global3DVector GlobalVector
Definition: GlobalVector.h:10
GlobalVector m_axis
Definition: FlatTrd.h:81
T angle(T x1, T y1, T z1, T x2, T y2, T z2)
Definition: angle.h:11