CMS 3D CMS Logo

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