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 const CaloCellGeometry::CornersVec&
00034 IdealZPrism::getCorners() const
00035 {
00036 const CornersVec& co ( CaloCellGeometry::getCorners() ) ;
00037 if( co.uninitialized() )
00038 {
00039 CornersVec& corners ( setCorners() ) ;
00040
00041 const GlobalPoint p ( getPosition() ) ;
00042 const float z_near ( p.z() ) ;
00043 const float z_far ( z_near + 2*dz()*p.z()/fabs( p.z() ) ) ;
00044 const float eta ( p.eta() ) ;
00045 const float phi ( p.phi() ) ;
00046
00047 corners[ 0 ] = etaPhiZ( eta + dEta(), phi + dPhi(), z_near );
00048 corners[ 1 ] = etaPhiZ( eta + dEta(), phi - dPhi(), z_near );
00049 corners[ 2 ] = etaPhiZ( eta - dEta(), phi - dPhi(), z_near );
00050 corners[ 3 ] = etaPhiZ( eta - dEta(), phi + dPhi(), z_near );
00051 corners[ 4 ] = GlobalPoint( corners[0].x(), corners[0].y(), z_far );
00052 corners[ 5 ] = GlobalPoint( corners[1].x(), corners[1].y(), z_far );
00053 corners[ 6 ] = GlobalPoint( corners[2].x(), corners[2].y(), z_far );
00054 corners[ 7 ] = GlobalPoint( corners[3].x(), corners[3].y(), z_far );
00055 }
00056 return co ;
00057 }
00058
00059 bool
00060 IdealZPrism::inside( const GlobalPoint & point ) const
00061 {
00062 return ( fabs( point.eta() - getPosition().eta() ) <= dEta() &&
00063 fabs( point.phi() - getPosition().phi() ) <= dPhi() &&
00064 fabs( point.z() - getPosition().z() ) <= dz() ) ;
00065 }
00066
00067 std::ostream& operator<<( std::ostream& s, const IdealZPrism& cell )
00068 {
00069 s << "Center: " << cell.getPosition() << std::endl ;
00070 s << "dEta = " << cell.dEta() << ", dPhi = " << cell.dPhi() << ", dz = " << cell.dz() << std::endl ;
00071 return s;
00072 }
00073
00074 }