CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_10/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 typedef IdealZPrism::CCGFloat CCGFloat ;
00005 typedef IdealZPrism::Pt3D     Pt3D     ;
00006 typedef IdealZPrism::Pt3DVec  Pt3DVec  ;
00007 
00008 IdealZPrism::IdealZPrism()
00009   : CaloCellGeometry()
00010 {}
00011 
00012 IdealZPrism::IdealZPrism( const IdealZPrism& idzp ) 
00013   : CaloCellGeometry( idzp )
00014 {
00015   *this = idzp ;
00016 }
00017 
00018 IdealZPrism& 
00019 IdealZPrism::operator=( const IdealZPrism& idzp ) 
00020 {
00021   if( &idzp != this ) CaloCellGeometry::operator=( idzp ) ;
00022   return *this ;
00023 }
00024 
00025 IdealZPrism::IdealZPrism( const GlobalPoint& faceCenter , 
00026                           const CornersMgr*  mgr        ,
00027                           const CCGFloat*    parm         )
00028   : CaloCellGeometry ( faceCenter, mgr, parm )   
00029 {}
00030 
00031 IdealZPrism::~IdealZPrism() 
00032 {}
00033 
00034 CCGFloat 
00035 IdealZPrism::dEta() const 
00036 {
00037    return param()[0] ;
00038 }
00039 
00040 CCGFloat 
00041 IdealZPrism::dPhi() const 
00042 { 
00043    return param()[1] ;
00044 }
00045 
00046 CCGFloat 
00047 IdealZPrism::dz()   const 
00048 { 
00049    return param()[2] ;
00050 }
00051 
00052 CCGFloat 
00053 IdealZPrism::eta()  const 
00054 {
00055    return param()[3] ; 
00056 }
00057 
00058 CCGFloat 
00059 IdealZPrism::z()    const 
00060 { 
00061    return param()[4] ;
00062 }
00063 
00064 void 
00065 IdealZPrism::vocalCorners( Pt3DVec&        vec ,
00066                            const CCGFloat* pv  ,
00067                            Pt3D&           ref   ) const 
00068 { 
00069    localCorners( vec, pv, ref ) ; 
00070 }
00071 
00072 GlobalPoint 
00073 IdealZPrism::etaPhiR( float eta ,
00074                       float phi ,
00075                       float rad   ) 
00076 {
00077    return GlobalPoint( rad*cosf(  phi )/coshf( eta ) ,
00078                        rad*sinf(  phi )/coshf( eta ) ,
00079                        rad*tanhf( eta )             ) ;
00080 }
00081 
00082 GlobalPoint 
00083 IdealZPrism::etaPhiPerp( float eta , 
00084                          float phi , 
00085                          float perp  ) 
00086 {
00087    return GlobalPoint( perp*cosf(  phi ) , 
00088                        perp*sinf(  phi ) , 
00089                        perp*sinhf( eta ) );
00090 }
00091 
00092 GlobalPoint 
00093 IdealZPrism::etaPhiZ( float eta , 
00094                       float phi ,
00095                       float z    ) 
00096 {
00097    return GlobalPoint( z*cosf( phi )/sinhf( eta ) ,
00098                        z*sinf( phi )/sinhf( eta ) ,
00099                        z                            ) ;
00100 }
00101 
00102 void
00103 IdealZPrism::localCorners( Pt3DVec&        lc  ,
00104                            const CCGFloat* pv  ,
00105                            Pt3D&           ref   )
00106 {
00107    assert( 8 == lc.size() ) ;
00108    if( false )
00109    {
00110       GlobalPoint g1 ( etaPhiR(0,0,0) ) ;
00111       GlobalPoint g2 ( etaPhiPerp(0,0,0) ) ;
00112    }
00113    assert( 0 != pv ) ;
00114    
00115    const CCGFloat dEta ( pv[0] ) ;
00116    const CCGFloat dPhi ( pv[1] ) ;
00117    const CCGFloat dz   ( pv[2] ) ;
00118    const CCGFloat eta  ( pv[3] ) ;
00119    const CCGFloat z    ( pv[4] ) ;
00120    
00121    std::vector<GlobalPoint> gc ( 8, GlobalPoint(0,0,0) ) ;
00122    
00123    const GlobalPoint p ( etaPhiZ( eta, 0, z ) ) ;
00124    
00125    const float z_near ( z ) ;
00126    const float z_far  ( z*( 1 - 2*dz/p.mag() ) ) ;
00127    gc[ 0 ] = etaPhiZ( eta + dEta , +dPhi , z_near ) ; // (+,+,near)
00128    gc[ 1 ] = etaPhiZ( eta + dEta , -dPhi , z_near ) ; // (+,-,near)
00129    gc[ 2 ] = etaPhiZ( eta - dEta , -dPhi , z_near ) ; // (-,-,near)
00130    gc[ 3 ] = etaPhiZ( eta - dEta , +dPhi , z_near ) ; // (-,+,far)
00131    gc[ 4 ] = GlobalPoint( gc[0].x(), gc[0].y(), z_far ); // (+,+,far)
00132    gc[ 5 ] = GlobalPoint( gc[1].x(), gc[1].y(), z_far ); // (+,-,far)
00133    gc[ 6 ] = GlobalPoint( gc[2].x(), gc[2].y(), z_far ); // (-,-,far)
00134    gc[ 7 ] = GlobalPoint( gc[3].x(), gc[3].y(), z_far ); // (-,+,far)   
00135    
00136    for( unsigned int i ( 0 ) ; i != 8 ; ++i )
00137    {
00138       lc[i] = Pt3D( gc[i].x(), gc[i].y(), gc[i].z() ) ;
00139    }
00140    
00141    ref   = 0.25*( lc[0] + lc[1] + lc[2] + lc[3] ) ;
00142 }
00143 
00144 const CaloCellGeometry::CornersVec& 
00145 IdealZPrism::getCorners() const 
00146 {
00147    const CornersVec& co ( CaloCellGeometry::getCorners() ) ;
00148    if( co.uninitialized() ) 
00149    {
00150       CornersVec& corners ( setCorners() ) ;
00151       
00152       const GlobalPoint p      ( getPosition() ) ;
00153       const CCGFloat    z_near ( p.z() ) ;
00154       const CCGFloat    z_far  ( z_near + 2*dz()*p.z()/fabs( p.z() ) ) ;
00155       const CCGFloat    eta    ( p.eta() ) ;
00156       const CCGFloat    phi    ( p.phi() ) ;
00157       
00158       corners[ 0 ] = etaPhiZ( eta + dEta(), phi + dPhi(), z_near ); // (+,+,near)
00159       corners[ 1 ] = etaPhiZ( eta + dEta(), phi - dPhi(), z_near ); // (+,-,near)
00160       corners[ 2 ] = etaPhiZ( eta - dEta(), phi - dPhi(), z_near ); // (-,-,near)
00161       corners[ 3 ] = etaPhiZ( eta - dEta(), phi + dPhi(), z_near ); // (-,+,near)
00162       corners[ 4 ] = GlobalPoint( corners[0].x(), corners[0].y(), z_far ); // (+,+,far)
00163       corners[ 5 ] = GlobalPoint( corners[1].x(), corners[1].y(), z_far ); // (+,-,far)
00164       corners[ 6 ] = GlobalPoint( corners[2].x(), corners[2].y(), z_far ); // (-,-,far)
00165       corners[ 7 ] = GlobalPoint( corners[3].x(), corners[3].y(), z_far ); // (-,+,far) 
00166    }
00167    return co ;
00168 }
00169 
00170 std::ostream& operator<<( std::ostream& s, const IdealZPrism& cell ) 
00171 {
00172    s << "Center: " <<  cell.getPosition() << std::endl ;
00173    s << "dEta = " << cell.dEta() << ", dPhi = " << cell.dPhi() << ", dz = " << cell.dz() << std::endl ;
00174    return s;
00175 }