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