CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/Geometry/CaloGeometry/src/IdealObliquePrism.cc

Go to the documentation of this file.
00001 #include "Geometry/CaloGeometry/interface/IdealObliquePrism.h"
00002 #include <math.h>
00003 
00004 typedef IdealObliquePrism::CCGFloat CCGFloat ;
00005 typedef IdealObliquePrism::Pt3D     Pt3D     ;
00006 typedef IdealObliquePrism::Pt3DVec  Pt3DVec  ;
00007 
00008 IdealObliquePrism::IdealObliquePrism() :
00009    CaloCellGeometry()
00010 {}
00011 
00012 IdealObliquePrism::IdealObliquePrism( const IdealObliquePrism& idop ) 
00013   : CaloCellGeometry( idop )
00014 {
00015   *this = idop ;
00016 }
00017 
00018 IdealObliquePrism& 
00019 IdealObliquePrism::operator=( const IdealObliquePrism& idop ) 
00020 {
00021   if( &idop != this ) CaloCellGeometry::operator=( idop ) ;
00022   return *this ;
00023 }
00024 
00025 IdealObliquePrism::IdealObliquePrism( const GlobalPoint& faceCenter, 
00026                                       const CornersMgr*  mgr       ,
00027                                       const CCGFloat*    parm       )
00028   : CaloCellGeometry ( faceCenter, mgr, parm )
00029 {}
00030 
00031 IdealObliquePrism::~IdealObliquePrism() 
00032 {}
00033 
00034 CCGFloat 
00035 IdealObliquePrism::dEta()  const 
00036 {
00037    return param()[0] ;
00038 }
00039 
00040 CCGFloat 
00041 IdealObliquePrism::dPhi()  const 
00042 { 
00043    return param()[1] ;
00044 }
00045 
00046 CCGFloat 
00047 IdealObliquePrism::dz()    const 
00048 {
00049    return param()[2] ;
00050 }
00051 
00052 CCGFloat 
00053 IdealObliquePrism::eta()   const
00054 {
00055    return param()[3] ; 
00056 }
00057 
00058 CCGFloat 
00059 IdealObliquePrism::z()     const 
00060 {
00061    return param()[4] ;
00062 }
00063 
00064 void 
00065 IdealObliquePrism::vocalCorners( Pt3DVec&        vec ,
00066                                  const CCGFloat* pv  ,
00067                                  Pt3D&           ref  ) const 
00068 { 
00069    localCorners( vec, pv, ref ) ; 
00070 }
00071 
00072   /*
00073    static GlobalPoint etaPhiR( float eta, float phi, float rad )
00074    {
00075       return GlobalPoint( rad*cosf(phi)/coshf(eta) , 
00076                           rad*sinf(phi)/coshf(eta) ,
00077                           rad*tanhf(eta)            ) ;
00078    }
00079   */
00080 
00081 GlobalPoint
00082 IdealObliquePrism::etaPhiPerp( float eta, float phi, float perp )  
00083 {
00084    return GlobalPoint( perp*cosf(phi) ,
00085                        perp*sinf(phi) ,
00086                        perp*sinhf(eta) ) ;
00087 }
00088 
00089 GlobalPoint 
00090 IdealObliquePrism::etaPhiZ(float eta, float phi, float z) 
00091 {
00092    return GlobalPoint( z*cosf(phi)/sinhf(eta) , 
00093                        z*sinf(phi)/sinhf(eta) ,
00094                        z                       ) ;
00095 }
00096 
00097 void IdealObliquePrism::localCorners( Pt3DVec&        lc  ,
00098                                       const CCGFloat* pv  ,
00099                                       Pt3D&           ref   )
00100 {
00101    assert( 8 == lc.size() ) ;
00102    assert( 0 != pv ) ;
00103    
00104    const CCGFloat dEta ( pv[0] ) ;
00105    const CCGFloat dPhi ( pv[1] ) ;
00106    const CCGFloat dz   ( pv[2] ) ;
00107    const CCGFloat eta  ( pv[3] ) ;
00108    const CCGFloat z    ( pv[4] ) ;
00109    
00110    std::vector<GlobalPoint> gc ( 8, GlobalPoint(0,0,0) ) ;
00111 
00112    const GlobalPoint p ( etaPhiZ( eta, 0, z ) ) ;
00113 
00114    if( 0 < dz )
00115    {
00116       const CCGFloat r_near ( p.perp()/cos( dPhi ) ) ;
00117       const CCGFloat r_far  ( r_near*( ( p.mag() + 2*dz )/p.mag() ) ) ;
00118       gc[ 0 ] = etaPhiPerp( eta + dEta , +dPhi , r_near ) ; // (+,+,near)
00119       gc[ 1 ] = etaPhiPerp( eta + dEta , -dPhi , r_near ) ; // (+,-,near)
00120       gc[ 2 ] = etaPhiPerp( eta - dEta , -dPhi , r_near ) ; // (-,-,near)
00121       gc[ 3 ] = etaPhiPerp( eta - dEta , +dPhi , r_near ) ; // (-,+,far)
00122       gc[ 4 ] = etaPhiPerp( eta + dEta , +dPhi , r_far  ) ; // (+,+,far)
00123       gc[ 5 ] = etaPhiPerp( eta + dEta , -dPhi , r_far  ) ; // (+,-,far)
00124       gc[ 6 ] = etaPhiPerp( eta - dEta , -dPhi , r_far  ) ; // (-,-,far)
00125       gc[ 7 ] = etaPhiPerp( eta - dEta , +dPhi , r_far  ) ; // (-,+,far)
00126    }
00127    else
00128    {
00129       const CCGFloat z_near ( z ) ;
00130       const CCGFloat z_far  ( z*( 1 - 2*dz/p.mag() ) ) ;
00131       gc[ 0 ] = etaPhiZ( eta + dEta , +dPhi , z_near ) ; // (+,+,near)
00132       gc[ 1 ] = etaPhiZ( eta + dEta , -dPhi , z_near ) ; // (+,-,near)
00133       gc[ 2 ] = etaPhiZ( eta - dEta , -dPhi , z_near ) ; // (-,-,near)
00134       gc[ 3 ] = etaPhiZ( eta - dEta , +dPhi , z_near ) ; // (-,+,far)
00135       gc[ 4 ] = etaPhiZ( eta + dEta , +dPhi , z_far  ) ; // (+,+,far)
00136       gc[ 5 ] = etaPhiZ( eta + dEta , -dPhi , z_far  ) ; // (+,-,far)
00137       gc[ 6 ] = etaPhiZ( eta - dEta , -dPhi , z_far  ) ; // (-,-,far)
00138       gc[ 7 ] = etaPhiZ( eta - dEta , +dPhi , z_far  ) ; // (-,+,far)
00139    }
00140    for( unsigned int i ( 0 ) ; i != 8 ; ++i )
00141    {
00142       lc[i] = Pt3D( gc[i].x(), gc[i].y(), gc[i].z() ) ;
00143    }
00144    
00145    ref   = 0.25*( lc[0] + lc[1] + lc[2] + lc[3] ) ;
00146 }
00147 
00148 const CaloCellGeometry::CornersVec& 
00149 IdealObliquePrism::getCorners() const
00150 {
00151    const CornersVec& co ( CaloCellGeometry::getCorners() ) ;
00152    if( co.uninitialized() )
00153    {
00154       CornersVec& corners ( setCorners() ) ;
00155       if( dz()>0 ) 
00156       { 
00157          /* In this case, the faces are parallel to the zaxis.  
00158             This implies that all corners will have the same 
00159             cylindrical radius. 
00160          */
00161          const GlobalPoint p      ( getPosition() ) ;
00162          const CCGFloat    r_near ( p.perp()/cos(dPhi()) ) ;
00163          const CCGFloat    r_far  ( r_near*( ( p.mag() + 2*dz() )/p.mag() ) ) ;
00164          const CCGFloat    eta    ( p.eta() ) ;
00165          const CCGFloat    phi    ( p.phi() ) ;
00166          corners[ 0 ] = etaPhiPerp( eta + dEta() , phi + dPhi() , r_near ) ; // (+,+,near)
00167          corners[ 1 ] = etaPhiPerp( eta + dEta() , phi - dPhi() , r_near ) ; // (+,-,near)
00168          corners[ 2 ] = etaPhiPerp( eta - dEta() , phi - dPhi() , r_near ) ; // (-,-,near)
00169          corners[ 3 ] = etaPhiPerp( eta - dEta() , phi + dPhi() , r_near ) ; // (-,+,near)
00170          corners[ 4 ] = etaPhiPerp( eta + dEta() , phi + dPhi() , r_far ) ; // (+,+,far)
00171          corners[ 5 ] = etaPhiPerp( eta + dEta() , phi - dPhi() , r_far ) ; // (+,-,far)
00172          corners[ 6 ] = etaPhiPerp( eta - dEta() , phi - dPhi() , r_far ) ; // (-,-,far)
00173          corners[ 7 ] = etaPhiPerp( eta - dEta() , phi + dPhi() , r_far ) ; // (-,+,far)
00174       } 
00175       else 
00176       {
00177          /* In this case, the faces are perpendicular to the zaxis.  
00178             This implies that all corners will have the same 
00179             z-dimension. 
00180          */
00181          const GlobalPoint p      ( getPosition() ) ;
00182          const CCGFloat    z_near ( p.z() ) ;
00183          const CCGFloat    mag    ( p.mag() ) ;
00184          const CCGFloat    z_far  ( z_near*( 1 - 2*dz()/mag ) ) ; // negative to correct sign
00185          const CCGFloat    eta    ( p.eta() ) ;
00186          const CCGFloat    phi    ( p.phi() ) ;
00187          
00188          corners[ 0 ] = etaPhiZ( eta + dEta(), phi + dPhi(), z_near ) ; // (+,+,near)
00189          corners[ 1 ] = etaPhiZ( eta + dEta(), phi - dPhi(), z_near ) ; // (+,-,near)
00190          corners[ 2 ] = etaPhiZ( eta - dEta(), phi - dPhi(), z_near ) ; // (-,-,near)
00191          corners[ 3 ] = etaPhiZ( eta - dEta(), phi + dPhi(), z_near ) ; // (-,+,near)
00192          corners[ 4 ] = etaPhiZ( eta + dEta(), phi + dPhi(), z_far  ) ; // (+,+,far)
00193          corners[ 5 ] = etaPhiZ( eta + dEta(), phi - dPhi(), z_far  ) ; // (+,-,far)
00194          corners[ 6 ] = etaPhiZ( eta - dEta(), phi - dPhi(), z_far  ) ; // (-,-,far)
00195          corners[ 7 ] = etaPhiZ( eta - dEta(), phi + dPhi(), z_far  ) ; // (-,+,far)
00196          
00197       }
00198    }
00199    return co ;
00200 }
00201 
00202 std::ostream& operator<<( std::ostream& s, const IdealObliquePrism& cell ) 
00203 {
00204    s << "Center: " <<  cell.getPosition() << std::endl ;
00205    s << "dEta = " << cell.dEta() << ", dPhi = " << cell.dPhi() << ", dz = " << cell.dz() << std::endl ;
00206    return s;
00207 }