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