CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/Geometry/CaloGeometry/src/IdealZPrism.cc

Go to the documentation of this file.
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 ) ; // (+,+,near)
00058       gc[ 1 ] = etaPhiZ( eta + dEta , -dPhi , z_near ) ; // (+,-,near)
00059       gc[ 2 ] = etaPhiZ( eta - dEta , -dPhi , z_near ) ; // (-,-,near)
00060       gc[ 3 ] = etaPhiZ( eta - dEta , +dPhi , z_near ) ; // (-,+,far)
00061       gc[ 4 ] = GlobalPoint( gc[0].x(), gc[0].y(), z_far ); // (+,+,far)
00062       gc[ 5 ] = GlobalPoint( gc[1].x(), gc[1].y(), z_far ); // (+,-,far)
00063       gc[ 6 ] = GlobalPoint( gc[2].x(), gc[2].y(), z_far ); // (-,-,far)
00064       gc[ 7 ] = GlobalPoint( gc[3].x(), gc[3].y(), z_far ); // (-,+,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 ); // (+,+,near)
00090          corners[ 1 ] = etaPhiZ( eta + dEta(), phi - dPhi(), z_near ); // (+,-,near)
00091          corners[ 2 ] = etaPhiZ( eta - dEta(), phi - dPhi(), z_near ); // (-,-,near)
00092          corners[ 3 ] = etaPhiZ( eta - dEta(), phi + dPhi(), z_near ); // (-,+,near)
00093          corners[ 4 ] = GlobalPoint( corners[0].x(), corners[0].y(), z_far ); // (+,+,far)
00094          corners[ 5 ] = GlobalPoint( corners[1].x(), corners[1].y(), z_far ); // (+,-,far)
00095          corners[ 6 ] = GlobalPoint( corners[2].x(), corners[2].y(), z_far ); // (-,-,far)
00096          corners[ 7 ] = GlobalPoint( corners[3].x(), corners[3].y(), z_far ); // (-,+,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 }