CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch9/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 namespace calogeom {
00005    
00006   /*
00007    static GlobalPoint etaPhiR( float eta, float phi, float rad )
00008    {
00009       return GlobalPoint( rad*cosf(phi)/coshf(eta) , 
00010                           rad*sinf(phi)/coshf(eta) ,
00011                           rad*tanhf(eta)            ) ;
00012    }
00013   */
00014    
00015    static GlobalPoint etaPhiPerp( float eta, float phi, float perp )  
00016    {
00017       return GlobalPoint( perp*cosf(phi) ,
00018                           perp*sinf(phi) ,
00019                           perp*sinhf(eta) ) ;
00020    }
00021 
00022    static GlobalPoint etaPhiZ(float eta, float phi, float z) 
00023    {
00024       return GlobalPoint( z*cosf(phi)/sinhf(eta) , 
00025                           z*sinf(phi)/sinhf(eta) ,
00026                           z                       ) ;
00027    }
00028 
00029 
00030    std::vector<HepGeom::Point3D<double> >
00031    IdealObliquePrism::localCorners( const double* pv  ,
00032                                     HepGeom::Point3D<double> &   ref   )
00033    {
00034       assert( 0 != pv ) ;
00035 
00036       const double dEta ( pv[0] ) ;
00037       const double dPhi ( pv[1] ) ;
00038       const double dz   ( pv[2] ) ;
00039       const double eta  ( pv[3] ) ;
00040       const double z    ( pv[4] ) ;
00041 
00042       std::vector<GlobalPoint> gc ( 8, GlobalPoint(0,0,0) ) ;
00043       std::vector<HepGeom::Point3D<double> >  lc ( 8, HepGeom::Point3D<double> ( 0,0,0) ) ;
00044 
00045       const GlobalPoint p ( etaPhiZ( eta, 0, z ) ) ;
00046 
00047       if( 0 < dz )
00048       {
00049          const float r_near ( p.perp()/cos( dPhi ) ) ;
00050          const float r_far  ( r_near*( ( p.mag() + 2*dz )/p.mag() ) ) ;
00051          gc[ 0 ] = etaPhiPerp( eta + dEta , +dPhi , r_near ) ; // (+,+,near)
00052          gc[ 1 ] = etaPhiPerp( eta + dEta , -dPhi , r_near ) ; // (+,-,near)
00053          gc[ 2 ] = etaPhiPerp( eta - dEta , -dPhi , r_near ) ; // (-,-,near)
00054          gc[ 3 ] = etaPhiPerp( eta - dEta , +dPhi , r_near ) ; // (-,+,far)
00055          gc[ 4 ] = etaPhiPerp( eta + dEta , +dPhi , r_far  ) ; // (+,+,far)
00056          gc[ 5 ] = etaPhiPerp( eta + dEta , -dPhi , r_far  ) ; // (+,-,far)
00057          gc[ 6 ] = etaPhiPerp( eta - dEta , -dPhi , r_far  ) ; // (-,-,far)
00058          gc[ 7 ] = etaPhiPerp( eta - dEta , +dPhi , r_far  ) ; // (-,+,far)
00059       }
00060       else
00061       {
00062          const float z_near ( z ) ;
00063          const float z_far  ( z*( 1 - 2*dz/p.mag() ) ) ;
00064          gc[ 0 ] = etaPhiZ( eta + dEta , +dPhi , z_near ) ; // (+,+,near)
00065          gc[ 1 ] = etaPhiZ( eta + dEta , -dPhi , z_near ) ; // (+,-,near)
00066          gc[ 2 ] = etaPhiZ( eta - dEta , -dPhi , z_near ) ; // (-,-,near)
00067          gc[ 3 ] = etaPhiZ( eta - dEta , +dPhi , z_near ) ; // (-,+,far)
00068          gc[ 4 ] = etaPhiZ( eta + dEta , +dPhi , z_far  ) ; // (+,+,far)
00069          gc[ 5 ] = etaPhiZ( eta + dEta , -dPhi , z_far  ) ; // (+,-,far)
00070          gc[ 6 ] = etaPhiZ( eta - dEta , -dPhi , z_far  ) ; // (-,-,far)
00071          gc[ 7 ] = etaPhiZ( eta - dEta , +dPhi , z_far  ) ; // (-,+,far)
00072       }
00073       for( unsigned int i ( 0 ) ; i != 8 ; ++i )
00074       {
00075          lc[i] = HepGeom::Point3D<double> ( gc[i].x(), gc[i].y(), gc[i].z() ) ;
00076       }
00077 
00078       ref   = 0.25*( lc[0] + lc[1] + lc[2] + lc[3] ) ;
00079       return lc ;
00080    }
00081 
00082    const CaloCellGeometry::CornersVec& 
00083    IdealObliquePrism::getCorners() const
00084    {
00085       const CornersVec& co ( CaloCellGeometry::getCorners() ) ;
00086       if( co.uninitialized() )
00087       {
00088          CornersVec& corners ( setCorners() ) ;
00089          if( dz()>0 ) 
00090          { 
00091             /* In this case, the faces are parallel to the zaxis.  
00092                This implies that all corners will have the same 
00093                cylindrical radius. 
00094             */
00095             const GlobalPoint p      ( getPosition() ) ;
00096             const float       r_near ( p.perp()/cos(dPhi()) ) ;
00097             const float       r_far  ( r_near*( ( p.mag() + 2*dz() )/p.mag() ) ) ;
00098             const float       eta    ( p.eta() ) ;
00099             const float       phi    ( p.phi() ) ;
00100             corners[ 0 ] = etaPhiPerp( eta + dEta() , phi + dPhi() , r_near ) ; // (+,+,near)
00101             corners[ 1 ] = etaPhiPerp( eta + dEta() , phi - dPhi() , r_near ) ; // (+,-,near)
00102             corners[ 2 ] = etaPhiPerp( eta - dEta() , phi - dPhi() , r_near ) ; // (-,-,near)
00103             corners[ 3 ] = etaPhiPerp( eta - dEta() , phi + dPhi() , r_near ) ; // (-,+,near)
00104             corners[ 4 ] = etaPhiPerp( eta + dEta() , phi + dPhi() , r_far ) ; // (+,+,far)
00105             corners[ 5 ] = etaPhiPerp( eta + dEta() , phi - dPhi() , r_far ) ; // (+,-,far)
00106             corners[ 6 ] = etaPhiPerp( eta - dEta() , phi - dPhi() , r_far ) ; // (-,-,far)
00107             corners[ 7 ] = etaPhiPerp( eta - dEta() , phi + dPhi() , r_far ) ; // (-,+,far)
00108          } 
00109          else 
00110          {
00111             /* In this case, the faces are perpendicular to the zaxis.  
00112                This implies that all corners will have the same 
00113                z-dimension. 
00114             */
00115             const GlobalPoint p      ( getPosition() ) ;
00116             const float       z_near ( p.z() ) ;
00117             const float       mag    ( p.mag() ) ;
00118             const float       z_far  ( z_near*( 1 - 2*dz()/mag ) ) ; // negative to correct sign
00119             const float       eta    ( p.eta() ) ;
00120             const float       phi    ( p.phi() ) ;
00121             
00122             corners[ 0 ] = etaPhiZ( eta + dEta(), phi + dPhi(), z_near ) ; // (+,+,near)
00123             corners[ 1 ] = etaPhiZ( eta + dEta(), phi - dPhi(), z_near ) ; // (+,-,near)
00124             corners[ 2 ] = etaPhiZ( eta - dEta(), phi - dPhi(), z_near ) ; // (-,-,near)
00125             corners[ 3 ] = etaPhiZ( eta - dEta(), phi + dPhi(), z_near ) ; // (-,+,near)
00126             corners[ 4 ] = etaPhiZ( eta + dEta(), phi + dPhi(), z_far  ) ; // (+,+,far)
00127             corners[ 5 ] = etaPhiZ( eta + dEta(), phi - dPhi(), z_far  ) ; // (+,-,far)
00128             corners[ 6 ] = etaPhiZ( eta - dEta(), phi - dPhi(), z_far  ) ; // (-,-,far)
00129             corners[ 7 ] = etaPhiZ( eta - dEta(), phi + dPhi(), z_far  ) ; // (-,+,far)
00130 
00131          }
00132       }
00133       return co ;
00134    }
00135 
00136    std::ostream& operator<<( std::ostream& s, const IdealObliquePrism& cell ) 
00137    {
00138       s << "Center: " <<  cell.getPosition() << std::endl ;
00139       s << "dEta = " << cell.dEta() << ", dPhi = " << cell.dPhi() << ", dz = " << cell.dz() << std::endl ;
00140       return s;
00141 }
00142 
00143 }