CMS 3D CMS Logo

IdealObliquePrism.cc
Go to the documentation of this file.
2 #include <cmath>
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 
73 IdealObliquePrism::etaPhiPerp( float eta, float phi, float perp )
74 {
75  return GlobalPoint( perp*cosf(phi) ,
76  perp*sinf(phi) ,
77  perp*sinhf(eta) ) ;
78 }
79 
81 IdealObliquePrism::etaPhiZ(float eta, float phi, float z)
82 {
83  return GlobalPoint( z*cosf(phi)/sinhf(eta) ,
84  z*sinf(phi)/sinhf(eta) ,
85  z ) ;
86 }
87 
89  const CCGFloat* pv ,
90  Pt3D& ref )
91 {
92  assert( 8 == lc.size() ) ;
93  assert( nullptr != pv ) ;
94 
95  const CCGFloat dEta ( pv[0] ) ;
96  const CCGFloat dPhi ( pv[1] ) ;
97  const CCGFloat dz ( pv[2] ) ;
98  const CCGFloat eta ( pv[3] ) ;
99  const CCGFloat z ( pv[4] ) ;
100 
101  std::vector<GlobalPoint> gc ( 8, GlobalPoint(0,0,0) ) ;
102 
103  const GlobalPoint p ( etaPhiZ( eta, 0, z ) ) ;
104 
105  if( 0 < dz )
106  {
107  const CCGFloat r_near ( p.perp()/cos( dPhi ) ) ;
108  const CCGFloat r_far ( r_near*( ( p.mag() + 2*dz )/p.mag() ) ) ;
109  gc[ 0 ] = etaPhiPerp( eta + dEta , +dPhi , r_near ) ; // (+,+,near)
110  gc[ 1 ] = etaPhiPerp( eta + dEta , -dPhi , r_near ) ; // (+,-,near)
111  gc[ 2 ] = etaPhiPerp( eta - dEta , -dPhi , r_near ) ; // (-,-,near)
112  gc[ 3 ] = etaPhiPerp( eta - dEta , +dPhi , r_near ) ; // (-,+,near)
113  gc[ 4 ] = etaPhiPerp( eta + dEta , +dPhi , r_far ) ; // (+,+,far)
114  gc[ 5 ] = etaPhiPerp( eta + dEta , -dPhi , r_far ) ; // (+,-,far)
115  gc[ 6 ] = etaPhiPerp( eta - dEta , -dPhi , r_far ) ; // (-,-,far)
116  gc[ 7 ] = etaPhiPerp( eta - dEta , +dPhi , r_far ) ; // (-,+,far)
117  }
118  else
119  {
120  const CCGFloat z_near ( z ) ;
121  const CCGFloat z_far ( z*( 1 - 2*dz/p.mag() ) ) ;
122  gc[ 0 ] = etaPhiZ( eta + dEta , +dPhi , z_near ) ; // (+,+,near)
123  gc[ 1 ] = etaPhiZ( eta + dEta , -dPhi , z_near ) ; // (+,-,near)
124  gc[ 2 ] = etaPhiZ( eta - dEta , -dPhi , z_near ) ; // (-,-,near)
125  gc[ 3 ] = etaPhiZ( eta - dEta , +dPhi , z_near ) ; // (-,+,near)
126  gc[ 4 ] = etaPhiZ( eta + dEta , +dPhi , z_far ) ; // (+,+,far)
127  gc[ 5 ] = etaPhiZ( eta + dEta , -dPhi , z_far ) ; // (+,-,far)
128  gc[ 6 ] = etaPhiZ( eta - dEta , -dPhi , z_far ) ; // (-,-,far)
129  gc[ 7 ] = etaPhiZ( eta - dEta , +dPhi , z_far ) ; // (-,+,far)
130  }
131  for( unsigned int i ( 0 ) ; i != 8 ; ++i )
132  {
133  lc[i] = Pt3D( gc[i].x(), gc[i].y(), gc[i].z() ) ;
134  }
135 
136  ref = 0.25*( lc[0] + lc[1] + lc[2] + lc[3] ) ;
137 }
138 
140 {
141  if( co.uninitialized() )
142  {
143  CornersVec& corners ( co ) ;
144  if( dz()>0 )
145  {
146  /* In this case, the faces are parallel to the zaxis.
147  This implies that all corners will have the same
148  cylindrical radius.
149  */
150  const GlobalPoint p ( getPosition() ) ;
151  const CCGFloat r_near ( p.perp()/cos(dPhi()) ) ;
152  const CCGFloat r_far ( r_near*( ( p.mag() + 2*dz() )/p.mag() ) ) ;
153  const CCGFloat eta ( p.eta() ) ;
154  const CCGFloat phi ( p.phi() ) ;
155  corners[ 0 ] = etaPhiPerp( eta + dEta() , phi + dPhi() , r_near ) ; // (+,+,near)
156  corners[ 1 ] = etaPhiPerp( eta + dEta() , phi - dPhi() , r_near ) ; // (+,-,near)
157  corners[ 2 ] = etaPhiPerp( eta - dEta() , phi - dPhi() , r_near ) ; // (-,-,near)
158  corners[ 3 ] = etaPhiPerp( eta - dEta() , phi + dPhi() , r_near ) ; // (-,+,near)
159  corners[ 4 ] = etaPhiPerp( eta + dEta() , phi + dPhi() , r_far ) ; // (+,+,far)
160  corners[ 5 ] = etaPhiPerp( eta + dEta() , phi - dPhi() , r_far ) ; // (+,-,far)
161  corners[ 6 ] = etaPhiPerp( eta - dEta() , phi - dPhi() , r_far ) ; // (-,-,far)
162  corners[ 7 ] = etaPhiPerp( eta - dEta() , phi + dPhi() , r_far ) ; // (-,+,far)
163  }
164  else
165  {
166  /* In this case, the faces are perpendicular to the zaxis.
167  This implies that all corners will have the same
168  z-dimension.
169  */
170  const GlobalPoint p ( getPosition() ) ;
171  const CCGFloat z_near ( p.z() ) ;
172  const CCGFloat mag ( p.mag() ) ;
173  const CCGFloat z_far ( z_near*( 1 - 2*dz()/mag ) ) ; // negative to correct sign
174  const CCGFloat eta ( p.eta() ) ;
175  const CCGFloat phi ( p.phi() ) ;
176 
177  corners[ 0 ] = etaPhiZ( eta + dEta(), phi + dPhi(), z_near ) ; // (+,+,near)
178  corners[ 1 ] = etaPhiZ( eta + dEta(), phi - dPhi(), z_near ) ; // (+,-,near)
179  corners[ 2 ] = etaPhiZ( eta - dEta(), phi - dPhi(), z_near ) ; // (-,-,near)
180  corners[ 3 ] = etaPhiZ( eta - dEta(), phi + dPhi(), z_near ) ; // (-,+,near)
181  corners[ 4 ] = etaPhiZ( eta + dEta(), phi + dPhi(), z_far ) ; // (+,+,far)
182  corners[ 5 ] = etaPhiZ( eta + dEta(), phi - dPhi(), z_far ) ; // (+,-,far)
183  corners[ 6 ] = etaPhiZ( eta - dEta(), phi - dPhi(), z_far ) ; // (-,-,far)
184  corners[ 7 ] = etaPhiZ( eta - dEta(), phi + dPhi(), z_far ) ; // (-,+,far)
185 
186  }
187  }
188 }
189 
190 std::ostream& operator<<( std::ostream& s, const IdealObliquePrism& cell )
191 {
192  s << "Center: " << cell.getPosition() << std::endl ;
193  s << "dEta = " << cell.dEta() << ", dPhi = " << cell.dPhi() << ", dz = " << cell.dz() << std::endl ;
194  return s;
195 }
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())
virtual const GlobalPoint & getPosition() const
Returns the position of reference for this cell.
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
CaloCellGeometry::CCGFloat CCGFloat
def pv(vc)
Definition: MetAnalyzer.py:7
void initCorners(CornersVec &) override
~IdealObliquePrism() 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
void vocalCorners(Pt3DVec &vec, const CCGFloat *pv, Pt3D &ref) const override
IdealObliquePrism & operator=(const IdealObliquePrism &idop)
CCGFloat dz() const
CaloCellGeometry::Pt3DVec Pt3DVec