00001 #include "Geometry/CaloGeometry/interface/IdealObliquePrism.h"
00002 #include <math.h>
00003
00004 namespace calogeom {
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 static GlobalPoint etaPhiPerp( float eta, float phi, float perp )
00016 {
00017 return GlobalPoint( perp*cosf(phi) ,
00018 perp*sinf(phi) ,
00019 perp*sinhf(eta) ) ;
00020 }
00021
00022 static GlobalPoint etaPhiZ(float eta, float phi, float z)
00023 {
00024 return GlobalPoint( z*cosf(phi)/sinhf(eta) ,
00025 z*sinf(phi)/sinhf(eta) ,
00026 z ) ;
00027 }
00028
00029
00030 std::vector<HepGeom::Point3D<double> >
00031 IdealObliquePrism::localCorners( const double* pv ,
00032 HepGeom::Point3D<double> & ref )
00033 {
00034 assert( 0 != pv ) ;
00035
00036 const double dEta ( pv[0] ) ;
00037 const double dPhi ( pv[1] ) ;
00038 const double dz ( pv[2] ) ;
00039 const double eta ( pv[3] ) ;
00040 const double z ( pv[4] ) ;
00041
00042 std::vector<GlobalPoint> gc ( 8, GlobalPoint(0,0,0) ) ;
00043 std::vector<HepGeom::Point3D<double> > lc ( 8, HepGeom::Point3D<double> ( 0,0,0) ) ;
00044
00045 const GlobalPoint p ( etaPhiZ( eta, 0, z ) ) ;
00046
00047 if( 0 < dz )
00048 {
00049 const float r_near ( p.perp()/cos( dPhi ) ) ;
00050 const float r_far ( r_near*( ( p.mag() + 2*dz )/p.mag() ) ) ;
00051 gc[ 0 ] = etaPhiPerp( eta + dEta , +dPhi , r_near ) ;
00052 gc[ 1 ] = etaPhiPerp( eta + dEta , -dPhi , r_near ) ;
00053 gc[ 2 ] = etaPhiPerp( eta - dEta , -dPhi , r_near ) ;
00054 gc[ 3 ] = etaPhiPerp( eta - dEta , +dPhi , r_near ) ;
00055 gc[ 4 ] = etaPhiPerp( eta + dEta , +dPhi , r_far ) ;
00056 gc[ 5 ] = etaPhiPerp( eta + dEta , -dPhi , r_far ) ;
00057 gc[ 6 ] = etaPhiPerp( eta - dEta , -dPhi , r_far ) ;
00058 gc[ 7 ] = etaPhiPerp( eta - dEta , +dPhi , r_far ) ;
00059 }
00060 else
00061 {
00062 const float z_near ( z ) ;
00063 const float z_far ( z*( 1 - 2*dz/p.mag() ) ) ;
00064 gc[ 0 ] = etaPhiZ( eta + dEta , +dPhi , z_near ) ;
00065 gc[ 1 ] = etaPhiZ( eta + dEta , -dPhi , z_near ) ;
00066 gc[ 2 ] = etaPhiZ( eta - dEta , -dPhi , z_near ) ;
00067 gc[ 3 ] = etaPhiZ( eta - dEta , +dPhi , z_near ) ;
00068 gc[ 4 ] = etaPhiZ( eta + dEta , +dPhi , z_far ) ;
00069 gc[ 5 ] = etaPhiZ( eta + dEta , -dPhi , z_far ) ;
00070 gc[ 6 ] = etaPhiZ( eta - dEta , -dPhi , z_far ) ;
00071 gc[ 7 ] = etaPhiZ( eta - dEta , +dPhi , z_far ) ;
00072 }
00073 for( unsigned int i ( 0 ) ; i != 8 ; ++i )
00074 {
00075 lc[i] = HepGeom::Point3D<double> ( gc[i].x(), gc[i].y(), gc[i].z() ) ;
00076 }
00077
00078 ref = 0.25*( lc[0] + lc[1] + lc[2] + lc[3] ) ;
00079 return lc ;
00080 }
00081
00082 const CaloCellGeometry::CornersVec&
00083 IdealObliquePrism::getCorners() const
00084 {
00085 const CornersVec& co ( CaloCellGeometry::getCorners() ) ;
00086 if( co.uninitialized() )
00087 {
00088 CornersVec& corners ( setCorners() ) ;
00089 if( dz()>0 )
00090 {
00091
00092
00093
00094
00095 const GlobalPoint p ( getPosition() ) ;
00096 const float r_near ( p.perp()/cos(dPhi()) ) ;
00097 const float r_far ( r_near*( ( p.mag() + 2*dz() )/p.mag() ) ) ;
00098 const float eta ( p.eta() ) ;
00099 const float phi ( p.phi() ) ;
00100 corners[ 0 ] = etaPhiPerp( eta + dEta() , phi + dPhi() , r_near ) ;
00101 corners[ 1 ] = etaPhiPerp( eta + dEta() , phi - dPhi() , r_near ) ;
00102 corners[ 2 ] = etaPhiPerp( eta - dEta() , phi - dPhi() , r_near ) ;
00103 corners[ 3 ] = etaPhiPerp( eta - dEta() , phi + dPhi() , r_near ) ;
00104 corners[ 4 ] = etaPhiPerp( eta + dEta() , phi + dPhi() , r_far ) ;
00105 corners[ 5 ] = etaPhiPerp( eta + dEta() , phi - dPhi() , r_far ) ;
00106 corners[ 6 ] = etaPhiPerp( eta - dEta() , phi - dPhi() , r_far ) ;
00107 corners[ 7 ] = etaPhiPerp( eta - dEta() , phi + dPhi() , r_far ) ;
00108 }
00109 else
00110 {
00111
00112
00113
00114
00115 const GlobalPoint p ( getPosition() ) ;
00116 const float z_near ( p.z() ) ;
00117 const float mag ( p.mag() ) ;
00118 const float z_far ( z_near*( 1 - 2*dz()/mag ) ) ;
00119 const float eta ( p.eta() ) ;
00120 const float phi ( p.phi() ) ;
00121
00122 corners[ 0 ] = etaPhiZ( eta + dEta(), phi + dPhi(), z_near ) ;
00123 corners[ 1 ] = etaPhiZ( eta + dEta(), phi - dPhi(), z_near ) ;
00124 corners[ 2 ] = etaPhiZ( eta - dEta(), phi - dPhi(), z_near ) ;
00125 corners[ 3 ] = etaPhiZ( eta - dEta(), phi + dPhi(), z_near ) ;
00126 corners[ 4 ] = etaPhiZ( eta + dEta(), phi + dPhi(), z_far ) ;
00127 corners[ 5 ] = etaPhiZ( eta + dEta(), phi - dPhi(), z_far ) ;
00128 corners[ 6 ] = etaPhiZ( eta - dEta(), phi - dPhi(), z_far ) ;
00129 corners[ 7 ] = etaPhiZ( eta - dEta(), phi + dPhi(), z_far ) ;
00130
00131 }
00132 }
00133 return co ;
00134 }
00135
00136 std::ostream& operator<<( std::ostream& s, const IdealObliquePrism& cell )
00137 {
00138 s << "Center: " << cell.getPosition() << std::endl ;
00139 s << "dEta = " << cell.dEta() << ", dPhi = " << cell.dPhi() << ", dz = " << cell.dz() << std::endl ;
00140 return s;
00141 }
00142
00143 }