00001 #include "Geometry/CaloGeometry/interface/IdealZPrism.h"
00002 #include <math.h>
00003
00004 typedef IdealZPrism::CCGFloat CCGFloat ;
00005 typedef IdealZPrism::Pt3D Pt3D ;
00006 typedef IdealZPrism::Pt3DVec Pt3DVec ;
00007
00008 IdealZPrism::IdealZPrism()
00009 : CaloCellGeometry()
00010 {}
00011
00012 IdealZPrism::IdealZPrism( const IdealZPrism& idzp )
00013 : CaloCellGeometry( idzp )
00014 {
00015 *this = idzp ;
00016 }
00017
00018 IdealZPrism&
00019 IdealZPrism::operator=( const IdealZPrism& idzp )
00020 {
00021 if( &idzp != this ) CaloCellGeometry::operator=( idzp ) ;
00022 return *this ;
00023 }
00024
00025 IdealZPrism::IdealZPrism( const GlobalPoint& faceCenter ,
00026 const CornersMgr* mgr ,
00027 const CCGFloat* parm )
00028 : CaloCellGeometry ( faceCenter, mgr, parm )
00029 {}
00030
00031 IdealZPrism::~IdealZPrism()
00032 {}
00033
00034 CCGFloat
00035 IdealZPrism::dEta() const
00036 {
00037 return param()[0] ;
00038 }
00039
00040 CCGFloat
00041 IdealZPrism::dPhi() const
00042 {
00043 return param()[1] ;
00044 }
00045
00046 CCGFloat
00047 IdealZPrism::dz() const
00048 {
00049 return param()[2] ;
00050 }
00051
00052 CCGFloat
00053 IdealZPrism::eta() const
00054 {
00055 return param()[3] ;
00056 }
00057
00058 CCGFloat
00059 IdealZPrism::z() const
00060 {
00061 return param()[4] ;
00062 }
00063
00064 void
00065 IdealZPrism::vocalCorners( Pt3DVec& vec ,
00066 const CCGFloat* pv ,
00067 Pt3D& ref ) const
00068 {
00069 localCorners( vec, pv, ref ) ;
00070 }
00071
00072 GlobalPoint
00073 IdealZPrism::etaPhiR( float eta ,
00074 float phi ,
00075 float rad )
00076 {
00077 return GlobalPoint( rad*cosf( phi )/coshf( eta ) ,
00078 rad*sinf( phi )/coshf( eta ) ,
00079 rad*tanhf( eta ) ) ;
00080 }
00081
00082 GlobalPoint
00083 IdealZPrism::etaPhiPerp( float eta ,
00084 float phi ,
00085 float perp )
00086 {
00087 return GlobalPoint( perp*cosf( phi ) ,
00088 perp*sinf( phi ) ,
00089 perp*sinhf( eta ) );
00090 }
00091
00092 GlobalPoint
00093 IdealZPrism::etaPhiZ( float eta ,
00094 float phi ,
00095 float z )
00096 {
00097 return GlobalPoint( z*cosf( phi )/sinhf( eta ) ,
00098 z*sinf( phi )/sinhf( eta ) ,
00099 z ) ;
00100 }
00101
00102 void
00103 IdealZPrism::localCorners( Pt3DVec& lc ,
00104 const CCGFloat* pv ,
00105 Pt3D& ref )
00106 {
00107 assert( 8 == lc.size() ) ;
00108 if( false )
00109 {
00110 GlobalPoint g1 ( etaPhiR(0,0,0) ) ;
00111 GlobalPoint g2 ( etaPhiPerp(0,0,0) ) ;
00112 }
00113 assert( 0 != pv ) ;
00114
00115 const CCGFloat dEta ( pv[0] ) ;
00116 const CCGFloat dPhi ( pv[1] ) ;
00117 const CCGFloat dz ( pv[2] ) ;
00118 const CCGFloat eta ( pv[3] ) ;
00119 const CCGFloat z ( pv[4] ) ;
00120
00121 std::vector<GlobalPoint> gc ( 8, GlobalPoint(0,0,0) ) ;
00122
00123 const GlobalPoint p ( etaPhiZ( eta, 0, z ) ) ;
00124
00125 const float z_near ( z ) ;
00126 const float z_far ( z*( 1 - 2*dz/p.mag() ) ) ;
00127 gc[ 0 ] = etaPhiZ( eta + dEta , +dPhi , z_near ) ;
00128 gc[ 1 ] = etaPhiZ( eta + dEta , -dPhi , z_near ) ;
00129 gc[ 2 ] = etaPhiZ( eta - dEta , -dPhi , z_near ) ;
00130 gc[ 3 ] = etaPhiZ( eta - dEta , +dPhi , z_near ) ;
00131 gc[ 4 ] = GlobalPoint( gc[0].x(), gc[0].y(), z_far );
00132 gc[ 5 ] = GlobalPoint( gc[1].x(), gc[1].y(), z_far );
00133 gc[ 6 ] = GlobalPoint( gc[2].x(), gc[2].y(), z_far );
00134 gc[ 7 ] = GlobalPoint( gc[3].x(), gc[3].y(), z_far );
00135
00136 for( unsigned int i ( 0 ) ; i != 8 ; ++i )
00137 {
00138 lc[i] = Pt3D( gc[i].x(), gc[i].y(), gc[i].z() ) ;
00139 }
00140
00141 ref = 0.25*( lc[0] + lc[1] + lc[2] + lc[3] ) ;
00142 }
00143
00144 const CaloCellGeometry::CornersVec&
00145 IdealZPrism::getCorners() const
00146 {
00147 const CornersVec& co ( CaloCellGeometry::getCorners() ) ;
00148 if( co.uninitialized() )
00149 {
00150 CornersVec& corners ( setCorners() ) ;
00151
00152 const GlobalPoint p ( getPosition() ) ;
00153 const CCGFloat z_near ( p.z() ) ;
00154 const CCGFloat z_far ( z_near + 2*dz()*p.z()/fabs( p.z() ) ) ;
00155 const CCGFloat eta ( p.eta() ) ;
00156 const CCGFloat phi ( p.phi() ) ;
00157
00158 corners[ 0 ] = etaPhiZ( eta + dEta(), phi + dPhi(), z_near );
00159 corners[ 1 ] = etaPhiZ( eta + dEta(), phi - dPhi(), z_near );
00160 corners[ 2 ] = etaPhiZ( eta - dEta(), phi - dPhi(), z_near );
00161 corners[ 3 ] = etaPhiZ( eta - dEta(), phi + dPhi(), z_near );
00162 corners[ 4 ] = GlobalPoint( corners[0].x(), corners[0].y(), z_far );
00163 corners[ 5 ] = GlobalPoint( corners[1].x(), corners[1].y(), z_far );
00164 corners[ 6 ] = GlobalPoint( corners[2].x(), corners[2].y(), z_far );
00165 corners[ 7 ] = GlobalPoint( corners[3].x(), corners[3].y(), z_far );
00166 }
00167 return co ;
00168 }
00169
00170 std::ostream& operator<<( std::ostream& s, const IdealZPrism& cell )
00171 {
00172 s << "Center: " << cell.getPosition() << std::endl ;
00173 s << "dEta = " << cell.dEta() << ", dPhi = " << cell.dPhi() << ", dz = " << cell.dz() << std::endl ;
00174 return s;
00175 }