CMS 3D CMS Logo

IdealObliquePrism.cc
Go to the documentation of this file.
2 #include <math.h>
3 
7 
10 {}
11 
13  : CaloCellGeometry( idop )
14 {
15  *this = idop ;
16 }
17 
20 {
21  if( &idop != this ) CaloCellGeometry::operator=( idop ) ;
22  return *this ;
23 }
24 
26  CornersMgr* mgr ,
27  const CCGFloat* parm )
28  : CaloCellGeometry ( faceCenter, mgr, parm )
29 {initSpan();}
30 
32 {}
33 
34 CCGFloat
36 {
37  return param()[0] ;
38 }
39 
40 CCGFloat
42 {
43  return param()[1] ;
44 }
45 
46 CCGFloat
48 {
49  return param()[2] ;
50 }
51 
52 CCGFloat
54 {
55  return param()[3] ;
56 }
57 
58 CCGFloat
60 {
61  return param()[4] ;
62 }
63 
64 void
66  const CCGFloat* pv ,
67  Pt3D& ref ) const
68 {
69  localCorners( vec, pv, ref ) ;
70 }
71 
72  /*
73  static GlobalPoint etaPhiR( float eta, float phi, float rad )
74  {
75  return GlobalPoint( rad*cosf(phi)/coshf(eta) ,
76  rad*sinf(phi)/coshf(eta) ,
77  rad*tanhf(eta) ) ;
78  }
79  */
80 
82 IdealObliquePrism::etaPhiPerp( float eta, float phi, float perp )
83 {
84  return GlobalPoint( perp*cosf(phi) ,
85  perp*sinf(phi) ,
86  perp*sinhf(eta) ) ;
87 }
88 
90 IdealObliquePrism::etaPhiZ(float eta, float phi, float z)
91 {
92  return GlobalPoint( z*cosf(phi)/sinhf(eta) ,
93  z*sinf(phi)/sinhf(eta) ,
94  z ) ;
95 }
96 
98  const CCGFloat* pv ,
99  Pt3D& ref )
100 {
101  assert( 8 == lc.size() ) ;
102  assert( 0 != pv ) ;
103 
104  const CCGFloat dEta ( pv[0] ) ;
105  const CCGFloat dPhi ( pv[1] ) ;
106  const CCGFloat dz ( pv[2] ) ;
107  const CCGFloat eta ( pv[3] ) ;
108  const CCGFloat z ( pv[4] ) ;
109 
110  std::vector<GlobalPoint> gc ( 8, GlobalPoint(0,0,0) ) ;
111 
112  const GlobalPoint p ( etaPhiZ( eta, 0, z ) ) ;
113 
114  if( 0 < dz )
115  {
116  const CCGFloat r_near ( p.perp()/cos( dPhi ) ) ;
117  const CCGFloat r_far ( r_near*( ( p.mag() + 2*dz )/p.mag() ) ) ;
118  gc[ 0 ] = etaPhiPerp( eta + dEta , +dPhi , r_near ) ; // (+,+,near)
119  gc[ 1 ] = etaPhiPerp( eta + dEta , -dPhi , r_near ) ; // (+,-,near)
120  gc[ 2 ] = etaPhiPerp( eta - dEta , -dPhi , r_near ) ; // (-,-,near)
121  gc[ 3 ] = etaPhiPerp( eta - dEta , +dPhi , r_near ) ; // (-,+,near)
122  gc[ 4 ] = etaPhiPerp( eta + dEta , +dPhi , r_far ) ; // (+,+,far)
123  gc[ 5 ] = etaPhiPerp( eta + dEta , -dPhi , r_far ) ; // (+,-,far)
124  gc[ 6 ] = etaPhiPerp( eta - dEta , -dPhi , r_far ) ; // (-,-,far)
125  gc[ 7 ] = etaPhiPerp( eta - dEta , +dPhi , r_far ) ; // (-,+,far)
126  }
127  else
128  {
129  const CCGFloat z_near ( z ) ;
130  const CCGFloat z_far ( z*( 1 - 2*dz/p.mag() ) ) ;
131  gc[ 0 ] = etaPhiZ( eta + dEta , +dPhi , z_near ) ; // (+,+,near)
132  gc[ 1 ] = etaPhiZ( eta + dEta , -dPhi , z_near ) ; // (+,-,near)
133  gc[ 2 ] = etaPhiZ( eta - dEta , -dPhi , z_near ) ; // (-,-,near)
134  gc[ 3 ] = etaPhiZ( eta - dEta , +dPhi , z_near ) ; // (-,+,near)
135  gc[ 4 ] = etaPhiZ( eta + dEta , +dPhi , z_far ) ; // (+,+,far)
136  gc[ 5 ] = etaPhiZ( eta + dEta , -dPhi , z_far ) ; // (+,-,far)
137  gc[ 6 ] = etaPhiZ( eta - dEta , -dPhi , z_far ) ; // (-,-,far)
138  gc[ 7 ] = etaPhiZ( eta - dEta , +dPhi , z_far ) ; // (-,+,far)
139  }
140  for( unsigned int i ( 0 ) ; i != 8 ; ++i )
141  {
142  lc[i] = Pt3D( gc[i].x(), gc[i].y(), gc[i].z() ) ;
143  }
144 
145  ref = 0.25*( lc[0] + lc[1] + lc[2] + lc[3] ) ;
146 }
147 
149 {
150  if( co.uninitialized() )
151  {
152  CornersVec& corners ( co ) ;
153  if( dz()>0 )
154  {
155  /* In this case, the faces are parallel to the zaxis.
156  This implies that all corners will have the same
157  cylindrical radius.
158  */
159  const GlobalPoint p ( getPosition() ) ;
160  const CCGFloat r_near ( p.perp()/cos(dPhi()) ) ;
161  const CCGFloat r_far ( r_near*( ( p.mag() + 2*dz() )/p.mag() ) ) ;
162  const CCGFloat eta ( p.eta() ) ;
163  const CCGFloat phi ( p.phi() ) ;
164  corners[ 0 ] = etaPhiPerp( eta + dEta() , phi + dPhi() , r_near ) ; // (+,+,near)
165  corners[ 1 ] = etaPhiPerp( eta + dEta() , phi - dPhi() , r_near ) ; // (+,-,near)
166  corners[ 2 ] = etaPhiPerp( eta - dEta() , phi - dPhi() , r_near ) ; // (-,-,near)
167  corners[ 3 ] = etaPhiPerp( eta - dEta() , phi + dPhi() , r_near ) ; // (-,+,near)
168  corners[ 4 ] = etaPhiPerp( eta + dEta() , phi + dPhi() , r_far ) ; // (+,+,far)
169  corners[ 5 ] = etaPhiPerp( eta + dEta() , phi - dPhi() , r_far ) ; // (+,-,far)
170  corners[ 6 ] = etaPhiPerp( eta - dEta() , phi - dPhi() , r_far ) ; // (-,-,far)
171  corners[ 7 ] = etaPhiPerp( eta - dEta() , phi + dPhi() , r_far ) ; // (-,+,far)
172  }
173  else
174  {
175  /* In this case, the faces are perpendicular to the zaxis.
176  This implies that all corners will have the same
177  z-dimension.
178  */
179  const GlobalPoint p ( getPosition() ) ;
180  const CCGFloat z_near ( p.z() ) ;
181  const CCGFloat mag ( p.mag() ) ;
182  const CCGFloat z_far ( z_near*( 1 - 2*dz()/mag ) ) ; // negative to correct sign
183  const CCGFloat eta ( p.eta() ) ;
184  const CCGFloat phi ( p.phi() ) ;
185 
186  corners[ 0 ] = etaPhiZ( eta + dEta(), phi + dPhi(), z_near ) ; // (+,+,near)
187  corners[ 1 ] = etaPhiZ( eta + dEta(), phi - dPhi(), z_near ) ; // (+,-,near)
188  corners[ 2 ] = etaPhiZ( eta - dEta(), phi - dPhi(), z_near ) ; // (-,-,near)
189  corners[ 3 ] = etaPhiZ( eta - dEta(), phi + dPhi(), z_near ) ; // (-,+,near)
190  corners[ 4 ] = etaPhiZ( eta + dEta(), phi + dPhi(), z_far ) ; // (+,+,far)
191  corners[ 5 ] = etaPhiZ( eta + dEta(), phi - dPhi(), z_far ) ; // (+,-,far)
192  corners[ 6 ] = etaPhiZ( eta - dEta(), phi - dPhi(), z_far ) ; // (-,-,far)
193  corners[ 7 ] = etaPhiZ( eta - dEta(), phi + dPhi(), z_far ) ; // (-,+,far)
194 
195  }
196  }
197 }
198 
199 std::ostream& operator<<( std::ostream& s, const IdealObliquePrism& cell )
200 {
201  s << "Center: " << cell.getPosition() << std::endl ;
202  s << "dEta = " << cell.dEta() << ", dPhi = " << cell.dPhi() << ", dz = " << cell.dz() << std::endl ;
203  return s;
204 }
static GlobalPoint etaPhiZ(float eta, float phi, float z)
IdealObliquePrism::Pt3DVec Pt3DVec
T perp() const
Definition: PV3DBase.h:72
CCGFloat dEta() const
std::ostream & operator<<(std::ostream &s, const IdealObliquePrism &cell)
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
std::vector< Pt3D > Pt3DVec
CCGFloat eta() const
const CCGFloat * param() const
T mag() const
Definition: PV3DBase.h:67
CaloCellGeometry::Pt3D Pt3D
static void localCorners(Pt3DVec &vec, const CCGFloat *pv, Pt3D &ref)
T z() const
Definition: PV3DBase.h:64
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
virtual ~IdealObliquePrism()
CaloCellGeometry::CCGFloat CCGFloat
def pv(vc)
Definition: MetAnalyzer.py:6
virtual void initCorners(CornersVec &) override
IdealObliquePrism::Pt3D Pt3D
IdealObliquePrism::CCGFloat CCGFloat
static GlobalPoint etaPhiPerp(float eta, float phi, float perp)
CCGFloat dPhi() const
CCGFloat z() const
HepGeom::Point3D< CCGFloat > Pt3D
Definition: EZMgrFL.h:8
T eta() const
Definition: PV3DBase.h:76
T perp() const
Magnitude of transverse component.
bool uninitialized() const
Definition: EZArrayFL.h:77
const GlobalPoint & getPosition() const
Returns the position of reference for this cell.
virtual void vocalCorners(Pt3DVec &vec, const CCGFloat *pv, Pt3D &ref) const override
IdealObliquePrism & operator=(const IdealObliquePrism &idop)
CCGFloat dz() const
CaloCellGeometry::Pt3DVec Pt3DVec