Go to the documentation of this file.00001 #include "Geometry/CaloGeometry/interface/CaloCellGeometry.h"
00002 #include "Geometry/ForwardGeometry/interface/ZdcHardcodeGeometryLoader.h"
00003 #include "Geometry/ForwardGeometry/interface/IdealZDCTrapezoid.h"
00004 #include "Geometry/ForwardGeometry/interface/ZdcGeometry.h"
00005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00006 #include <algorithm>
00007
00008 ZdcHardcodeGeometryLoader::ZdcHardcodeGeometryLoader() :
00009 theTopology ( new ZdcTopology ) ,
00010 extTopology ( theTopology )
00011 {
00012 init();
00013 }
00014
00015 ZdcHardcodeGeometryLoader::ZdcHardcodeGeometryLoader(const ZdcTopology& ht) :
00016 theTopology( 0 ) ,
00017 extTopology( &ht )
00018 {
00019 init();
00020 }
00021
00022 void ZdcHardcodeGeometryLoader::init()
00023 {
00024 }
00025
00026 ZdcHardcodeGeometryLoader::ReturnType
00027 ZdcHardcodeGeometryLoader::load(DetId::Detector det, int subdet)
00028 {
00029 ReturnType hg(new ZdcGeometry( extTopology ) );
00030 if(subdet == HcalZDCDetId::SubdetectorId)
00031 {
00032 fill(HcalZDCDetId::EM ,hg );
00033 fill(HcalZDCDetId::LUM ,hg );
00034 fill(HcalZDCDetId::HAD ,hg );
00035 }
00036 return hg;
00037 }
00038
00039 ZdcHardcodeGeometryLoader::ReturnType
00040 ZdcHardcodeGeometryLoader::load()
00041 {
00042 ReturnType hg(new ZdcGeometry( extTopology ) );
00043 fill(HcalZDCDetId::EM ,hg );
00044 fill(HcalZDCDetId::LUM ,hg );
00045 fill(HcalZDCDetId::HAD ,hg );
00046 return hg;
00047 }
00048
00049 void ZdcHardcodeGeometryLoader::fill( HcalZDCDetId::Section section,
00050 ReturnType geom )
00051 {
00052
00053 std::vector<HcalZDCDetId> zdcIds;
00054 HcalZDCDetId id;
00055 int firstCell = extTopology->firstCell(section);
00056 int lastCell = extTopology->lastCell(section);
00057 for(int ichannel = firstCell; ichannel <= lastCell; ++ichannel) {
00058 id = HcalZDCDetId(section, true, ichannel);
00059 if(extTopology->valid(id)) zdcIds.push_back(id);
00060 id = HcalZDCDetId(section, false, ichannel);
00061 if(extTopology->valid(id)) zdcIds.push_back(id);
00062 }
00063 if( geom->cornersMgr() == 0 ) geom->allocateCorners( HcalZDCDetId::kSizeForDenseIndexing ) ;
00064 if( geom->parMgr() == 0 ) geom->allocatePar(
00065 ZdcGeometry::k_NumberOfParametersPerShape*ZdcGeometry::k_NumberOfShapes,
00066 ZdcGeometry::k_NumberOfParametersPerShape ) ;
00067
00068 edm::LogInfo("ZdcHardcodeGeometry") << "Number of ZDC DetIds made: " << section << " " << zdcIds.size();
00069
00070
00071
00072 for(std::vector<HcalZDCDetId>::const_iterator zdcIdItr = zdcIds.begin();
00073 zdcIdItr != zdcIds.end(); ++zdcIdItr)
00074 {
00075 geom->addCell( *zdcIdItr, makeCell(*zdcIdItr, geom ) );
00076 }
00077 }
00078
00079 CaloCellGeometry*
00080 ZdcHardcodeGeometryLoader::makeCell(const HcalZDCDetId& detId,
00081 ReturnType geom) const
00082 {
00083 double zside ( detId.zside() ) ;
00084
00085 const HcalZDCDetId::Section section ( detId.section() ) ;
00086
00087 const int channel ( detId.channel() ) ;
00088
00089
00090
00091
00092 static const double x0 ( 0 ) ;
00093 static const double y0 ( 0 ) ;
00094 static const double z0 ( 14000 ) ;
00095
00096 static const double angEM ( 0 ) ;
00097 static const double angLUM ( 0 ) ;
00098 static const double angHAD ( atan( 1. ) ) ;
00099
00100
00101
00102 static const double dxHAD ( 4.8 ) ;
00103 static const double dxEM ( dxHAD/5. ) ;
00104 static const double dxLUM ( 4.8 ) ;
00105
00106 static const double dhEM ( 6.25 ) ;
00107 static const double dhLUM ( 6.25 ) ;
00108 static const double dhHAD ( 6.25 ) ;
00109
00110 static const double dzEM ( 33.*0.15 ) ;
00111 static const double dzLUM ( 23.5 ) ;
00112 static const double dzHAD ( 0.82*6./cos(angHAD) ) ;
00113
00114
00115
00116
00117 static const double xOffEM ( -4.*dxEM ) ;
00118 static const double xOffLUM ( 0 ) ;
00119 static const double xOffHAD ( 0 ) ;
00120
00121 static const double yOffEM ( 0 ) ;
00122 static const double yOffLUM ( 0 ) ;
00123 static const double yOffHAD ( 0 ) ;
00124
00125 static const double zOffEM ( -49.85 - 0.15 ) ;
00126 static const double zOffLUM ( -39.555 ) ;
00127 static const double zOffHAD ( -29.00 ) ;
00128
00129
00130
00131 double dx, dh, dz, x, y, z, an ;
00132
00133 if( section==HcalZDCDetId::EM )
00134 {
00135 dx = dxEM ;
00136 dh = dhEM ;
00137 dz = dzEM ;
00138 an = angEM ;
00139 x = zside*( x0 + xOffEM + ( channel - 1.0 )*dxEM*2. ) ;
00140 y = y0 + yOffEM ;
00141 z = zside*( z0 + zOffEM ) ;
00142 }
00143 else
00144 {
00145 if( section==HcalZDCDetId::LUM )
00146 {
00147 dx = dxLUM ;
00148 dh = dhLUM ;
00149 dz = dzLUM ;
00150 an = angLUM ;
00151 x = zside*( x0 + xOffLUM ) ;
00152 y = y0 + yOffLUM ;
00153 z = zside*( z0 + zOffLUM + ( channel - 1.0 )*dzLUM*2. ) ;
00154 }
00155 else
00156 {
00157 assert( section==HcalZDCDetId::HAD ) ;
00158 dx = dxHAD ;
00159 dh = dhHAD ;
00160 dz = dzHAD ;
00161 an = angHAD ;
00162 x = zside*( x0 + xOffHAD ) ;
00163 y = y0 + yOffHAD ;
00164 z = zside*( z0 + zOffHAD + ( channel - 1.0 )*dzHAD*2. ) ;
00165 }
00166 }
00167
00168 const GlobalPoint faceCenter ( x, y, z );
00169
00170 const double dy ( dh*cos( an ) ) ;
00171
00172 std::vector<double> zz ;
00173 zz.reserve( ZdcGeometry::k_NumberOfParametersPerShape ) ;
00174 zz.push_back( an ) ;
00175 zz.push_back( dx ) ;
00176 zz.push_back( dy ) ;
00177 zz.push_back( dz ) ;
00178
00179 return new calogeom::IdealZDCTrapezoid(
00180 faceCenter,
00181 geom->cornersMgr(),
00182 CaloCellGeometry::getParmPtr( zz,
00183 geom->parMgr(),
00184 geom->parVecVec() ) );
00185 }
00186
00187