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