Go to the documentation of this file.00001 #include "Geometry/CaloGeometry/interface/CaloCellGeometry.h"
00002 #include "Geometry/ForwardGeometry/interface/CastorHardcodeGeometryLoader.h"
00003 #include "Geometry/ForwardGeometry/interface/IdealCastorTrapezoid.h"
00004 #include "Geometry/ForwardGeometry/interface/CastorGeometry.h"
00005 #include "Geometry/ForwardGeometry/src/CastorGeometryData.h"
00006 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00007 #include <algorithm>
00008
00009 CastorHardcodeGeometryLoader::CastorHardcodeGeometryLoader() :
00010 theTopology ( new CastorTopology ) ,
00011 extTopology ( theTopology )
00012 {
00013 init();
00014 }
00015
00016 CastorHardcodeGeometryLoader::CastorHardcodeGeometryLoader( const CastorTopology& ht ) :
00017 theTopology( 0 ) ,
00018 extTopology ( &ht )
00019 {
00020 init();
00021 }
00022
00023 void CastorHardcodeGeometryLoader::init()
00024 {
00025 theEMSectiondX = 2.*dXEMPlate;
00026 theEMSectiondY = 2.*dYEMPlate;
00027 theEMSectiondZ = 101.0;
00028 theHADSectiondX = 2.*dXHADPlate;
00029 theHADSectiondY = 2.*dYHADPlate;
00030 theHADSectiondZ = 1212.;
00031 }
00032
00033 std::auto_ptr<CaloSubdetectorGeometry>
00034 CastorHardcodeGeometryLoader::load( DetId::Detector det,
00035 int subdet)
00036 {
00037 std::auto_ptr<CaloSubdetectorGeometry> hg(new CastorGeometry( extTopology ));
00038 if( subdet == HcalCastorDetId::SubdetectorId )
00039 {
00040 fill( HcalCastorDetId::EM, hg.get() ) ;
00041 fill( HcalCastorDetId::HAD, hg.get() ) ;
00042 }
00043 return hg;
00044 }
00045
00046 std::auto_ptr<CaloSubdetectorGeometry>
00047 CastorHardcodeGeometryLoader::load()
00048 {
00049 std::auto_ptr<CaloSubdetectorGeometry> hg
00050 ( new CastorGeometry( extTopology ) ) ;
00051 fill( HcalCastorDetId::EM, hg.get() ) ;
00052 fill( HcalCastorDetId::HAD, hg.get() ) ;
00053 return hg;
00054 }
00055
00056 void
00057 CastorHardcodeGeometryLoader::fill( HcalCastorDetId::Section section ,
00058 CaloSubdetectorGeometry* geom )
00059 {
00060 if( geom->cornersMgr() == 0 ) geom->allocateCorners(
00061 HcalCastorDetId::kSizeForDenseIndexing ) ;
00062 if( geom->parMgr() == 0 ) geom->allocatePar(
00063 CastorGeometry::k_NumberOfShapes*
00064 CastorGeometry::k_NumberOfParametersPerShape,
00065 CastorGeometry::k_NumberOfParametersPerShape ) ;
00066
00067
00068 std::vector<HcalCastorDetId> castorIds ;
00069
00070 const int firstCell ( extTopology->firstCell( section ) ) ;
00071 const int lastCell ( extTopology->lastCell( section ) );
00072
00073 for( int imodule ( firstCell ) ; imodule <= lastCell ; ++imodule )
00074 {
00075 for( int isector ( 1 ) ;
00076 isector <= HcalCastorDetId::kNumberSectorsPerEnd ; ++isector )
00077 {
00078 const HcalCastorDetId id ( section, false, isector, imodule ) ;
00079 if( extTopology->valid( id ) ) castorIds.push_back( id ) ;
00080 }
00081 }
00082
00083
00084
00085
00086
00087
00088 for( std::vector<HcalCastorDetId>::const_iterator
00089 castorIdItr ( castorIds.begin() ) ;
00090 castorIdItr != castorIds.end() ; ++castorIdItr )
00091 {
00092 geom->addCell( *castorIdItr, makeCell( *castorIdItr, geom ) ) ;
00093 }
00094 }
00095
00096 CaloCellGeometry*
00097 CastorHardcodeGeometryLoader::makeCell( const HcalCastorDetId& detId ,
00098 CaloSubdetectorGeometry* geom ) const
00099 {
00100 const double zside ( 1.0*detId.zside() ) ;
00101 const HcalCastorDetId::Section section ( detId.section() ) ;
00102 const int module ( detId.module() ) ;
00103 const int isect ( detId.sector() ) ;
00104 const double sector ( 1.0*isect ) ;
00105
00106
00107
00108
00109 const double sign ( 0 == isect%2 ? -1 : 1 ) ;
00110
00111
00112
00113 static const double an ( atan( 1.));
00114 static const double can ( cos( an ));
00115 static const double san ( sin( an ));
00116 static const double dxlEM ( 1.55/2. ) ;
00117 static const double dxhEM ( 5.73/2. ) ;
00118 static const double dhEM ( 14.26/2. );
00119 static const double dR ( 0.1 + 2.*dhEM*san*dxlEM/( dxhEM-dxlEM ) ) ;
00120 static const double dhHAD ( 19.88/2. );
00121
00122 static const double dxhHAD ( dxhEM*( 2.*dhHAD*san + dR )/
00123 ( 2.*dhEM*san + dR ) ) ;
00124 static const double zm ( 1439.0 ) ;
00125 static const double dzEM ( 5.45/2 ) ;
00126 static const double dzHAD ( 10.075/2 ) ;
00127
00128
00129
00130 const double dxl ( sign*dxlEM ) ;
00131
00132 const double dxh ( sign*( section == HcalCastorDetId::EM ?
00133 dxhEM : dxhHAD ) ) ;
00134 const double dh ( section == HcalCastorDetId::EM ?
00135 dhEM : dhHAD ) ;
00136 const double dz ( section == HcalCastorDetId::EM ?
00137 dzEM : dzHAD ) ;
00138
00139 const double delz ( dh*can ) ;
00140 const double dy ( dh*san ) ;
00141 const double dx ( ( dxl + dxh )/2. ) ;
00142 const double leg ( dR + dy ) ;
00143 const double len ( sqrt( leg*leg + dx*dx ) ) ;
00144
00145 static const double dphi
00146 ( 2.*M_PI/(1.0*HcalCastorDetId::kNumberSectorsPerEnd ) ) ;
00147
00148 const double fphi ( atan( dx/( dR + dy ) ) ) ;
00149
00150 const double phi ( 0==isect%2 ? (sector-1.)*dphi - fphi :
00151 sector*dphi - fphi ) ;
00152
00153 const double sphi ( sin( phi ) ) ;
00154 const double cphi ( cos( phi ) ) ;
00155
00156 const double xc ( len*cphi ) ;
00157 const double yc ( len*sphi ) ;
00158 const double zc ( zside*( zm + delz +
00159 ( module<3 ? ( 1.*module - 1.0 )*2.*dzEM :
00160 4.*dzEM + ( 1.*(module-2) - 1 )*2.*dzHAD ) ) ) ;
00161
00162 const GlobalPoint fc ( xc, yc, zc ) ;
00163
00164 std::vector<double> zz ;
00165 zz.reserve( CastorGeometry::k_NumberOfParametersPerShape ) ;
00166 zz.push_back( dxl ) ;
00167 zz.push_back( dxh ) ;
00168 zz.push_back( dh ) ;
00169 zz.push_back( dz ) ;
00170 zz.push_back( an ) ;
00171 zz.push_back( dR ) ;
00172
00173 return new calogeom::IdealCastorTrapezoid(
00174 fc,
00175 geom->cornersMgr(),
00176 CaloCellGeometry::getParmPtr( zz,
00177 geom->parMgr(),
00178 geom->parVecVec() ) );
00179 }
00180
00181