00001 #include "CalibTracker/SiStripCommon/interface/TkDetMap.h"
00002 #include "CalibTracker/SiStripCommon/interface/SiStripDetInfoFileReader.h"
00003 #include "DataFormats/SiStripDetId/interface/SiStripSubStructure.h"
00004 #include "DataFormats/SiStripDetId/interface/TIBDetId.h"
00005 #include "DataFormats/SiStripDetId/interface/TIDDetId.h"
00006 #include "DataFormats/SiStripDetId/interface/TOBDetId.h"
00007 #include "DataFormats/SiStripDetId/interface/TECDetId.h"
00008
00009 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00010
00011 #include <iostream>
00012 #include <cstring>
00013
00014 TkLayerMap::TkLayerMap(int in):layerEnumNb_(in){
00015
00016 LogTrace("TkLayerMap") <<" TkLayerMap::constructor for layer " << in;
00017
00018 initialize(layerEnumNb_);
00019
00020 if(!edm::Service<SiStripDetInfoFileReader>().isAvailable()){
00021 edm::LogError("TkLayerMap") <<
00022 "\n------------------------------------------"
00023 "\nUnAvailable Service SiStripDetInfoFileReader: please insert in the configuration file an instance like"
00024 "\n\tprocess.SiStripDetInfoFileReader = cms.Service(\"SiStripDetInfoFileReader\")"
00025 "\n------------------------------------------";
00026 }
00027
00028 SiStripDetInfoFileReader * fr=edm::Service<SiStripDetInfoFileReader>().operator->();
00029
00030 std::vector<uint32_t> TkDetIdList=fr->getAllDetIds();
00031
00032 switch (layerEnumNb_)
00033 {
00034 case TkLayerMap::TIB_L1:
00035 case TkLayerMap::TIB_L2:
00036 case TkLayerMap::TIB_L3:
00037 case TkLayerMap::TIB_L4:
00038 createTIB(TkDetIdList,layerEnumNb_);
00039 break;
00040 case TkLayerMap::TIDP_D1:
00041 case TkLayerMap::TIDP_D2:
00042 case TkLayerMap::TIDP_D3:
00043 case TkLayerMap::TIDM_D1:
00044 case TkLayerMap::TIDM_D2:
00045 case TkLayerMap::TIDM_D3:
00046 createTID(TkDetIdList,layerEnumNb_);
00047 break;
00048 case TkLayerMap::TOB_L1:
00049 case TkLayerMap::TOB_L2:
00050 case TkLayerMap::TOB_L3:
00051 case TkLayerMap::TOB_L4:
00052 case TkLayerMap::TOB_L5:
00053 case TkLayerMap::TOB_L6:
00054 createTOB(TkDetIdList,layerEnumNb_);
00055 break;
00056 case TkLayerMap::TECP_W1:
00057 case TkLayerMap::TECP_W2:
00058 case TkLayerMap::TECP_W3:
00059 case TkLayerMap::TECP_W4:
00060 case TkLayerMap::TECP_W5:
00061 case TkLayerMap::TECP_W6:
00062 case TkLayerMap::TECP_W7:
00063 case TkLayerMap::TECP_W8:
00064 case TkLayerMap::TECP_W9:
00065 case TkLayerMap::TECM_W1:
00066 case TkLayerMap::TECM_W2:
00067 case TkLayerMap::TECM_W3:
00068 case TkLayerMap::TECM_W4:
00069 case TkLayerMap::TECM_W5:
00070 case TkLayerMap::TECM_W6:
00071 case TkLayerMap::TECM_W7:
00072 case TkLayerMap::TECM_W8:
00073 case TkLayerMap::TECM_W9:
00074 createTEC(TkDetIdList,layerEnumNb_);
00075 break;
00076 default:
00077 edm::LogError("TkLayerMap") <<" TkLayerMap::requested creation of a wrong layer Nb "<< layerEnumNb_;
00078 }
00079 }
00080
00081 uint32_t TkLayerMap::getDetFromBin(int ix, int iy){
00082
00083 int val=(ix-1)+nchX*(iy-1);
00084 if(val>-1 && val < nchX*nchY)
00085 return binToDet[val];
00086 return 0;
00087 }
00088
00089 const int16_t TkLayerMap::layerSearch(uint32_t detid){
00090
00091
00092 if(SiStripDetId(detid).subDetector()==SiStripDetId::TIB){
00093 TIBDetId D(detid);
00094 return TkLayerMap::TIB_L1 -1 +D.layerNumber();
00095 } else if (SiStripDetId(detid).subDetector()==SiStripDetId::TID){
00096 TIDDetId D(detid);
00097 return TkLayerMap::TIDM_D1 -1 + (D.side() -1)*3 + D.wheel();
00098 } else if (SiStripDetId(detid).subDetector()==SiStripDetId::TOB){
00099 TOBDetId D(detid);
00100 return TkLayerMap::TOB_L1 -1 +D.layerNumber();
00101 } else if (SiStripDetId(detid).subDetector()==SiStripDetId::TEC){
00102 TECDetId D(detid);
00103 return TkLayerMap::TECM_W1 -1 + (D.side() -1)*9 + D.wheel();
00104 }
00105 return 0;
00106 }
00107
00108 void TkLayerMap::initialize(int layer){
00109
00110 switch (layer){
00111 case TkLayerMap::TIB_L1:
00112
00113 Nstring_ext=30;
00114 SingleExtString.insert(SingleExtString.begin(),8,0);
00115 SingleExtString.insert(SingleExtString.begin()+8,7,1);
00116 SingleExtString.insert(SingleExtString.begin()+15,8,2);
00117 SingleExtString.insert(SingleExtString.begin()+23,7,3);
00118 nchX=12;
00119 lowX=-6;
00120 highX=6;
00121 nchY=2*(Nstring_ext+1);
00122 lowY=-1.*(Nstring_ext+1.);
00123 highY=(Nstring_ext+1);
00124
00125 break;
00126 case TkLayerMap::TIB_L2:
00127
00128 Nstring_ext=38;
00129 SingleExtString.insert(SingleExtString.begin(),10,0);
00130 SingleExtString.insert(SingleExtString.begin()+10,9,1);
00131 SingleExtString.insert(SingleExtString.begin()+19,10,2);
00132 SingleExtString.insert(SingleExtString.begin()+29,9,3);
00133 nchX=12;
00134 lowX=-6;
00135 highX=6;
00136 nchY=2*(Nstring_ext+1);
00137 lowY=-1.*(Nstring_ext+1.);
00138 highY=(Nstring_ext+1);
00139
00140 break;
00141 case TkLayerMap::TIB_L3:
00142
00143 Nstring_ext=46;
00144 SingleExtString.insert(SingleExtString.begin(),23,0);
00145 SingleExtString.insert(SingleExtString.begin()+23,23,1);
00146 nchX=12;
00147 lowX=-6;
00148 highX=6;
00149 nchY=Nstring_ext;
00150 lowY=0;
00151 highY=nchY;
00152
00153 break;
00154 case TkLayerMap::TIB_L4:
00155
00156 Nstring_ext=56;
00157 SingleExtString.insert(SingleExtString.begin(),14,0);
00158 SingleExtString.insert(SingleExtString.begin()+14,14,1);
00159 SingleExtString.insert(SingleExtString.begin()+28,14,2);
00160 SingleExtString.insert(SingleExtString.begin()+42,14,3);
00161 nchX=12;
00162 lowX=-6.;
00163 highX=6.;
00164 nchY=Nstring_ext;
00165 lowY=0.;
00166 highY=nchY;
00167
00168 break;
00169 case TkLayerMap::TIDM_D1:
00170 case TkLayerMap::TIDM_D2:
00171 case TkLayerMap::TIDM_D3:
00172
00173 nchX=7;
00174 lowX=-7.;
00175 highX=0.;
00176 nchY=40;
00177 lowY=0.0;
00178 highY=1.*nchY;
00179
00180 break;
00181 case TkLayerMap::TIDP_D1:
00182 case TkLayerMap::TIDP_D2:
00183 case TkLayerMap::TIDP_D3:
00184
00185 nchX=7;
00186 lowX=0.;
00187 highX=7.;
00188 nchY=40;
00189 lowY=0.0;
00190 highY=1.*nchY;
00191
00192 break;
00193 case TkLayerMap::TOB_L1:
00194
00195 Nrod=42;
00196 nchX=12;
00197 lowX=-6.;
00198 highX=6.;
00199 nchY=2*(Nrod+1);
00200 lowY=-1.*(Nrod+1.);
00201 highY=(Nrod+1.);
00202
00203 break;
00204 case TkLayerMap::TOB_L2:
00205
00206 Nrod=48;
00207 nchX=12;
00208 lowX=-6.;
00209 highX=6.;
00210 nchY=int(2.*(Nrod+1.));
00211 lowY=-1.*(Nrod+1.);
00212 highY=(Nrod+1.);
00213
00214 break;
00215 case TkLayerMap::TOB_L3:
00216
00217 Nrod=54;
00218 nchX=12;
00219 lowX=-6.;
00220 highX=6.;
00221 nchY=Nrod;
00222 lowY=0.;
00223 highY=1.*Nrod;
00224
00225 break;
00226 case TkLayerMap::TOB_L4:
00227
00228 Nrod=60;
00229 nchX=12;
00230 lowX=-6.;
00231 highX=6.;
00232 nchY=Nrod;
00233 lowY=0.;
00234 highY=1.*Nrod;
00235
00236 break;
00237 case TkLayerMap::TOB_L5:
00238
00239 Nrod=66;
00240 nchX=12;
00241 lowX=-6.;
00242 highX=6.;
00243 nchY=Nrod;
00244 lowY=0.;
00245 highY=1.*Nrod;
00246
00247 break;
00248 case TkLayerMap::TOB_L6:
00249
00250 Nrod=74;
00251 nchX=12;
00252 lowX=-6.;
00253 highX=6.;
00254 nchY=Nrod;
00255 lowY=0.;
00256 highY=1.*Nrod;
00257
00258 break;
00259 default:
00260 switch (layer){
00261 case TkLayerMap::TECM_W1:
00262 case TkLayerMap::TECM_W2:
00263 case TkLayerMap::TECM_W3:
00264 nchX=16;
00265 lowX=-16.;
00266 highX=0.;
00267 nchY=80;
00268 lowY=0.;
00269 highY=1.*nchY;
00270
00271 BinForRing.push_back(0);
00272 BinForRing.push_back(1);
00273 BinForRing.push_back(4);
00274 BinForRing.push_back(7);
00275 BinForRing.push_back(9);
00276 BinForRing.push_back(11);
00277 BinForRing.push_back(14);
00278 BinForRing.push_back(16);
00279 break;
00280 case TkLayerMap::TECM_W4:
00281 case TkLayerMap::TECM_W5:
00282 case TkLayerMap::TECM_W6:
00283 nchX=13;
00284 lowX=-16.;
00285 highX=-3.;
00286 nchY=80;
00287 lowY=0.;
00288 highY=1.*nchY;
00289
00290 BinForRing.push_back(0);
00291 BinForRing.push_back(0);
00292 BinForRing.push_back(1);
00293 BinForRing.push_back(4);
00294 BinForRing.push_back(6);
00295 BinForRing.push_back(8);
00296 BinForRing.push_back(11);
00297 BinForRing.push_back(13);
00298 break;
00299 case TkLayerMap::TECM_W7:
00300 case TkLayerMap::TECM_W8:
00301 nchX=10;
00302 lowX=-16.;
00303 highX=-6.;
00304 nchY=80;
00305 lowY=0.;
00306 highY=1.*nchY;
00307
00308 BinForRing.push_back(0);
00309 BinForRing.push_back(0);
00310 BinForRing.push_back(0);
00311 BinForRing.push_back(1);
00312 BinForRing.push_back(3);
00313 BinForRing.push_back(5);
00314 BinForRing.push_back(8);
00315 BinForRing.push_back(10);
00316 break;
00317 case TkLayerMap::TECM_W9:
00318 nchX=8;
00319 lowX=-16.;
00320 highX=-8.;
00321 nchY=80;
00322 lowY=0.;
00323 highY=1.*nchY;
00324
00325 BinForRing.push_back(0);
00326 BinForRing.push_back(0);
00327 BinForRing.push_back(0);
00328 BinForRing.push_back(0);
00329 BinForRing.push_back(1);
00330 BinForRing.push_back(3);
00331 BinForRing.push_back(6);
00332 BinForRing.push_back(8);
00333 break;
00334 case TkLayerMap::TECP_W1:
00335 case TkLayerMap::TECP_W2:
00336 case TkLayerMap::TECP_W3:
00337 nchX=16;
00338 lowX=0.;
00339 highX=16.;
00340 nchY=80;
00341 lowY=0.;
00342 highY=1.*nchY;
00343
00344 BinForRing.push_back(0);
00345 BinForRing.push_back(1);
00346 BinForRing.push_back(4);
00347 BinForRing.push_back(7);
00348 BinForRing.push_back(9);
00349 BinForRing.push_back(11);
00350 BinForRing.push_back(14);
00351 BinForRing.push_back(16);
00352 break;
00353 case TkLayerMap::TECP_W4:
00354 case TkLayerMap::TECP_W5:
00355 case TkLayerMap::TECP_W6:
00356 nchX=13;
00357 lowX=3.;
00358 highX=16.;
00359 nchY=80;
00360 lowY=0.;
00361 highY=1.*nchY;
00362
00363 BinForRing.push_back(0);
00364 BinForRing.push_back(0);
00365 BinForRing.push_back(1);
00366 BinForRing.push_back(4);
00367 BinForRing.push_back(6);
00368 BinForRing.push_back(8);
00369 BinForRing.push_back(11);
00370 BinForRing.push_back(13);
00371 break;
00372 case TkLayerMap::TECP_W7:
00373 case TkLayerMap::TECP_W8:
00374 nchX=10;
00375 lowX=6.;
00376 highX=16.;
00377 nchY=80;
00378 lowY=0.;
00379 highY=1.*nchY;
00380
00381 BinForRing.push_back(0);
00382 BinForRing.push_back(0);
00383 BinForRing.push_back(0);
00384 BinForRing.push_back(1);
00385 BinForRing.push_back(3);
00386 BinForRing.push_back(5);
00387 BinForRing.push_back(8);
00388 BinForRing.push_back(10);
00389 break;
00390 case TkLayerMap::TECP_W9:
00391 nchX=8;
00392 lowX=8.;
00393 highX=16.;
00394 nchY=80;
00395 lowY=0.;
00396 highY=1.*nchY;
00397
00398 BinForRing.push_back(0);
00399 BinForRing.push_back(0);
00400 BinForRing.push_back(0);
00401 BinForRing.push_back(0);
00402 BinForRing.push_back(1);
00403 BinForRing.push_back(3);
00404 BinForRing.push_back(6);
00405 BinForRing.push_back(8);
00406 }
00407
00408
00409 ModulesInRingFront.push_back(0);
00410 ModulesInRingFront.push_back(2);
00411 ModulesInRingFront.push_back(2);
00412 ModulesInRingFront.push_back(3);
00413 ModulesInRingFront.push_back(4);
00414 ModulesInRingFront.push_back(2);
00415 ModulesInRingFront.push_back(4);
00416 ModulesInRingFront.push_back(5);
00417
00418 ModulesInRingBack.push_back(0);
00419 ModulesInRingBack.push_back(1);
00420 ModulesInRingBack.push_back(1);
00421 ModulesInRingBack.push_back(2);
00422 ModulesInRingBack.push_back(3);
00423 ModulesInRingBack.push_back(3);
00424 ModulesInRingBack.push_back(3);
00425 ModulesInRingBack.push_back(5);
00426 }
00427
00428 for (size_t i=0;i<SingleExtString.size();i++)
00429 LogTrace("TkLayerMap") << "[initialize SingleExtString["<<i<<"] " << SingleExtString[i];
00430
00431 binToDet= new uint32_t[nchX*nchY];
00432 for(size_t i=0;i<(size_t) nchX*nchY;++i)
00433 binToDet[i]=0;
00434 }
00435
00436 void TkLayerMap::createTIB(std::vector<uint32_t>& TkDetIdList,int layerEnumNb){
00437
00438 std::vector<uint32_t> LayerDetIdList;
00439 SiStripSubStructure siStripSubStructure;
00440
00441
00442 siStripSubStructure.getTIBDetectors(TkDetIdList,LayerDetIdList,layerEnumNb,0,0,0);
00443
00444 LogTrace("TkLayerMap") << "[TkLayerMap::createTIB12] layer " << layerEnumNb << " number of dets " << LayerDetIdList.size() << " lowY " << lowY << " high " << highY << " Nstring " << Nstring_ext;
00445
00446 for(size_t j=0;j<LayerDetIdList.size();++j){
00447 xybin=getXY_TIB(LayerDetIdList[j],layerEnumNb);
00448 binToDet[(xybin.ix-1)+nchX*(xybin.iy-1)]=LayerDetIdList[j];
00449 LogTrace("TkLayerMap") << "[TkLayerMap::createTIB] " << LayerDetIdList[j]<< " " << xybin.ix << " " << xybin.iy << " " << xybin.x << " " << xybin.y ;
00450 }
00451 }
00452
00453 void TkLayerMap::createTOB(std::vector<uint32_t>& TkDetIdList,int layerEnumNb){
00454
00455 std::vector<uint32_t> LayerDetIdList;
00456 SiStripSubStructure siStripSubStructure;
00457
00458
00459 siStripSubStructure.getTOBDetectors(TkDetIdList,LayerDetIdList,layerEnumNb-10,0,0);
00460
00461 LogTrace("TkLayerMap") << "[TkLayerMap::createTOB] layer " << layerEnumNb-10 << " number of dets " << LayerDetIdList.size() << " lowY " << lowY << " high " << highY << " Nstring " << Nstring_ext;
00462
00463 for(size_t j=0;j<LayerDetIdList.size();++j){
00464 xybin=getXY_TOB(LayerDetIdList[j],layerEnumNb);
00465 binToDet[(xybin.ix-1)+nchX*(xybin.iy-1)]=LayerDetIdList[j];
00466 LogTrace("TkLayerMap") << "[TkLayerMap::createTOB] " << LayerDetIdList[j]<< " " << xybin.ix << " " << xybin.iy << " " << xybin.x << " " << xybin.y ;
00467 }
00468 }
00469
00470 void TkLayerMap::createTID(std::vector<uint32_t>& TkDetIdList,int layerEnumNb){
00471
00472 std::vector<uint32_t> LayerDetIdList;
00473 SiStripSubStructure siStripSubStructure;
00474
00475
00476 siStripSubStructure.getTIDDetectors(TkDetIdList,LayerDetIdList,(layerEnumNb-TkLayerMap::TIDM_D1)/3+1,(layerEnumNb-TkLayerMap::TIDM_D1)%3+1,0,0);
00477
00478 LogTrace("TkLayerMap") << "[TkLayerMap::createTID] layer side " << (layerEnumNb-TkLayerMap::TIDM_D1)/3+1 << " nb " << (layerEnumNb-TkLayerMap::TIDM_D1)%3+1 << " number of dets " << LayerDetIdList.size() << " lowY " << lowY << " high " << highY << " Nstring " << Nstring_ext;
00479
00480 for(size_t j=0;j<LayerDetIdList.size();++j){
00481 xybin=getXY_TID(LayerDetIdList[j],layerEnumNb);
00482 binToDet[(xybin.ix-1)+nchX*(xybin.iy-1)]=LayerDetIdList[j];
00483 LogTrace("TkLayerMap") << "[TkLayerMap::createTID] " << LayerDetIdList[j]<< " " << xybin.ix << " " << xybin.iy << " " << xybin.x << " " << xybin.y ;
00484 }
00485 }
00486
00487 void TkLayerMap::createTEC(std::vector<uint32_t>& TkDetIdList,int layerEnumNb){
00488
00489 std::vector<uint32_t> LayerDetIdList;
00490 SiStripSubStructure siStripSubStructure;
00491
00492
00493 siStripSubStructure.getTECDetectors(TkDetIdList,LayerDetIdList,(layerEnumNb-TkLayerMap::TECM_W1)/9+1,(layerEnumNb-TkLayerMap::TECM_W1)%9+1,0,0);
00494
00495 LogTrace("TkLayerMap") << "[TkLayerMap::createTEC] layer side " << (layerEnumNb-TkLayerMap::TECM_W1)/9+1 << " " << (layerEnumNb-TkLayerMap::TECM_W1)%9+1 << " number of dets " << LayerDetIdList.size() << " lowY " << lowY << " high " << highY << " Nstring " << Nstring_ext;
00496
00497 for(size_t j=0;j<LayerDetIdList.size();++j){
00498 xybin=getXY_TEC(LayerDetIdList[j],layerEnumNb);
00499 binToDet[(xybin.ix-1)+nchX*(xybin.iy-1)]=LayerDetIdList[j];
00500 LogTrace("TkLayerMap") << "[TkLayerMap::createTEC] " << LayerDetIdList[j]<< " " << xybin.ix << " " << xybin.iy << " " << xybin.x << " " << xybin.y ;
00501
00502 }
00503 }
00504
00505
00506 const TkLayerMap::XYbin TkLayerMap::getXY(uint32_t& detid, int layerEnumNb){
00507 LogTrace("TkLayerMap") << "[TkLayerMap::getXY] " << detid << " layer " << layerEnumNb;
00508
00509 if(!layerEnumNb)
00510 layerEnumNb=layerSearch(detid);
00511
00512 if(layerEnumNb!=layerEnumNb_)
00513 throw cms::Exception("CorruptedData")
00514 << "[TkLayerMap::getXY] Fill of DetId " << detid << " layerEnumNb " << layerEnumNb << " are requested to wrong TkLayerMap " << layerEnumNb_ << " \nPlease check the TkDetMap code";
00515
00516
00517 if(layerEnumNb>=TkLayerMap::TIB_L1 && layerEnumNb<=TkLayerMap::TIB_L4)
00518 return getXY_TIB(detid,layerEnumNb);
00519 else if(layerEnumNb>=TkLayerMap::TIDM_D1 && layerEnumNb<=TkLayerMap::TIDP_D3)
00520 return getXY_TID(detid,layerEnumNb);
00521 else if(layerEnumNb>=TkLayerMap::TOB_L1 && layerEnumNb<=TkLayerMap::TOB_L6)
00522 return getXY_TOB(detid,layerEnumNb);
00523 else
00524 return getXY_TEC(detid,layerEnumNb);
00525 }
00526
00527 TkLayerMap::XYbin TkLayerMap::getXY_TIB(uint32_t& detid, int layerEnumNb){
00528 if(!layerEnumNb)
00529 layerEnumNb=layerSearch(detid);
00530
00531 TIBDetId D(detid);
00532 if(D.layerNumber()%2){
00533 Offset=D.isInternalString()?2:1;
00534 }else{
00535 Offset=D.isInternalString()?1:2;
00536 }
00537 xybin.ix=2*(D.isZMinusSide()?-1*D.moduleNumber()+3:D.moduleNumber()+2)+Offset;
00538 xybin.iy=D.isInternalString()?D.stringNumber()+SingleExtString[D.stringNumber()]:D.stringNumber();
00539 if(D.layerNumber()<3 && !D.isStereo())
00540 xybin.iy+=Nstring_ext+2;
00541
00542 xybin.x=lowX+xybin.ix-0.5;
00543 xybin.y=lowY+xybin.iy-0.5;
00544 return xybin;
00545 }
00546
00547 TkLayerMap::XYbin TkLayerMap::getXY_TOB(uint32_t& detid, int layerEnumNb){
00548 if(!layerEnumNb)
00549 layerEnumNb=layerSearch(detid);
00550
00551 TOBDetId D(detid);
00552 xybin.ix=D.isZMinusSide()?-1*D.moduleNumber()+7:D.moduleNumber()+6;
00553 xybin.iy=D.rodNumber();
00554 if(D.layerNumber()<3 && !D.isStereo())
00555 xybin.iy+=Nrod+2;
00556
00557 xybin.x=lowX+xybin.ix-0.5;
00558 xybin.y=lowY+xybin.iy-0.5;
00559 return xybin;
00560 }
00561
00562 TkLayerMap::XYbin TkLayerMap::getXY_TID(uint32_t& detid, int layerEnumNb){
00563 if(!layerEnumNb)
00564 layerEnumNb=layerSearch(detid);
00565
00566 TIDDetId D(detid);
00567 xybin.ix=D.isZMinusSide()?-3*D.ring()+10:3*D.ring()-2;
00568 if(D.isStereo())
00569 xybin.ix+=(D.isZMinusSide()?-1:1);
00570 xybin.iy= int(2. * D.moduleNumber() - (D.isBackRing()?0.:1.));
00571
00572 xybin.x=lowX+xybin.ix-0.5;
00573 xybin.y=lowY+xybin.iy-0.5;
00574 return xybin;
00575 }
00576
00577 TkLayerMap::XYbin TkLayerMap::getXY_TEC(uint32_t& detid, int layerEnumNb){
00578 if(!layerEnumNb)
00579 layerEnumNb=layerSearch(detid);
00580
00581 TECDetId D(detid);
00582 xybin.ix=D.isZMinusSide()?BinForRing[7]-BinForRing[D.ring()]+1:BinForRing[D.ring()];
00583 if(D.isStereo())
00584 xybin.ix+=(D.isZMinusSide()?-1:1);
00585
00586 if(D.isZMinusSide()){
00587 xybin.iy= (D.petalNumber()-1)*(ModulesInRingFront[D.ring()]+ModulesInRingBack[D.ring()]) + ModulesInRingFront[D.ring()] - D.moduleNumber() +1;
00588 if(D.isBackPetal())
00589 xybin.iy+=ModulesInRingBack[D.ring()];
00590 }else{
00591 xybin.iy= (D.petalNumber()-1)*(ModulesInRingFront[D.ring()]+ModulesInRingBack[D.ring()])+D.moduleNumber();
00592 if(D.isBackPetal())
00593 xybin.iy+=ModulesInRingFront[D.ring()];
00594 }
00595
00596 xybin.x=lowX+xybin.ix-0.5;
00597 xybin.y=lowY+xybin.iy-0.5;
00598 return xybin;
00599 }
00600
00601
00602
00603 TkDetMap::TkDetMap(const edm::ParameterSet& p,const edm::ActivityRegistry& a)
00604 :cached_detid(0),
00605 cached_layer(TkLayerMap::INVALID){
00606 doMe();
00607 }
00608
00609 TkDetMap::TkDetMap()
00610 :cached_detid(0),
00611 cached_layer(TkLayerMap::INVALID){
00612 doMe();
00613 }
00614
00615 void TkDetMap::doMe(){
00616 LogTrace("TkDetMap") <<"TkDetMap::constructor ";
00617
00618 TkMap.resize(35);
00619
00620 for(int layer=1;layer<35;++layer){
00621 TkMap[layer]=new TkLayerMap(layer);
00622 }
00623 }
00624
00625 TkDetMap::~TkDetMap(){
00626 detmapType::iterator iter=TkMap.begin();
00627 detmapType::iterator iterE=TkMap.end();
00628
00629 for(;iter!=iterE;++iter)
00630 delete (*iter);
00631 }
00632
00633 const TkLayerMap::XYbin& TkDetMap::getXY(uint32_t& detid){
00634
00635 LogTrace("TkDetMap") <<"[getXY] detid "<< detid << " cache " << cached_detid << " layer " << cached_layer << " XY " << cached_XYbin.ix << " " << cached_XYbin.iy << " " << cached_XYbin.x << " " << cached_XYbin.y ;
00636 if(detid==cached_detid)
00637 return cached_XYbin;
00638
00639
00640
00641 FindLayer(detid);
00642 LogTrace("TkDetMap") <<"[getXY] detid "<< detid << " cache " << cached_detid << " layer " << cached_layer << " XY " << cached_XYbin.ix << " " << cached_XYbin.iy << " " << cached_XYbin.x << " " << cached_XYbin.y ;
00643 return cached_XYbin;
00644 }
00645
00646 int16_t TkDetMap::FindLayer(uint32_t& detid){
00647
00648 if(detid==cached_detid)
00649 return cached_layer;
00650
00651 cached_detid=detid;
00652
00653 int16_t layer=TkLayerMap::layerSearch(detid);
00654 LogTrace("TkDetMap") <<"[FindLayer] detid "<< detid << " layer " << layer;
00655 if(layer!=cached_layer){
00656 cached_layer=layer;
00657 }
00658 cached_XYbin=TkMap[cached_layer]->getXY(detid,layer);
00659 LogTrace("TkDetMap") <<"[FindLayer] detid "<< detid << " cached_XYbin " << cached_XYbin.ix << " "<< cached_XYbin.iy;
00660
00661 return cached_layer;
00662 }
00663
00664
00665
00666 void TkDetMap::getComponents(int& layer,
00667 int& nchX,double& lowX,double& highX,
00668 int& nchY,double& lowY,double& highY){
00669 nchX=TkMap[layer]->get_nchX();
00670 lowX=TkMap[layer]->get_lowX();
00671 highX=TkMap[layer]->get_highX();
00672 nchY=TkMap[layer]->get_nchY();
00673 lowY=TkMap[layer]->get_lowY();
00674 highY=TkMap[layer]->get_highY();
00675 }
00676
00677 void TkDetMap::getDetsForLayer(int layer,std::vector<uint32_t>& output){
00678 output.clear();
00679 size_t size_=TkMap[layer]->get_nchX()*TkMap[layer]->get_nchY();
00680 output.resize(size_);
00681 memcpy((void*)&output[0],(void*)TkMap[layer]->getBinToDet(),size_*sizeof(uint32_t));
00682 }
00683
00684 std::string TkDetMap::getLayerName(int& in){
00685 switch (in)
00686 {
00687 case TkLayerMap::TIB_L1:
00688 return "TIB_L1";
00689 case TkLayerMap::TIB_L2:
00690 return "TIB_L2";
00691 case TkLayerMap::TIB_L3:
00692 return "TIB_L3";
00693 case TkLayerMap::TIB_L4:
00694 return "TIB_L4";
00695 case TkLayerMap::TIDP_D1:
00696 return "TIDP_D1";
00697 case TkLayerMap::TIDP_D2:
00698 return "TIDP_D2";
00699 case TkLayerMap::TIDP_D3:
00700 return "TIDP_D3";
00701 case TkLayerMap::TIDM_D1:
00702 return "TIDM_D1";
00703 case TkLayerMap::TIDM_D2:
00704 return "TIDM_D2";
00705 case TkLayerMap::TIDM_D3:
00706 return "TIDM_D3";
00707 case TkLayerMap::TOB_L1:
00708 return "TOB_L1";
00709 case TkLayerMap::TOB_L2:
00710 return "TOB_L2";
00711 case TkLayerMap::TOB_L3:
00712 return "TOB_L3";
00713 case TkLayerMap::TOB_L4:
00714 return "TOB_L4";
00715 case TkLayerMap::TOB_L5:
00716 return "TOB_L5";
00717 case TkLayerMap::TOB_L6:
00718 return "TOB_L6";
00719 case TkLayerMap::TECP_W1:
00720 return "TECP_W1";
00721 case TkLayerMap::TECP_W2:
00722 return "TECP_W2";
00723 case TkLayerMap::TECP_W3:
00724 return "TECP_W3";
00725 case TkLayerMap::TECP_W4:
00726 return "TECP_W4";
00727 case TkLayerMap::TECP_W5:
00728 return "TECP_W5";
00729 case TkLayerMap::TECP_W6:
00730 return "TECP_W6";
00731 case TkLayerMap::TECP_W7:
00732 return "TECP_W7";
00733 case TkLayerMap::TECP_W8:
00734 return "TECP_W8";
00735 case TkLayerMap::TECP_W9:
00736 return "TECP_W9";
00737 case TkLayerMap::TECM_W1:
00738 return "TECM_W1";
00739 case TkLayerMap::TECM_W2:
00740 return "TECM_W2";
00741 case TkLayerMap::TECM_W3:
00742 return "TECM_W3";
00743 case TkLayerMap::TECM_W4:
00744 return "TECM_W4";
00745 case TkLayerMap::TECM_W5:
00746 return "TECM_W5";
00747 case TkLayerMap::TECM_W6:
00748 return "TECM_W6";
00749 case TkLayerMap::TECM_W7:
00750 return "TECM_W7";
00751 case TkLayerMap::TECM_W8:
00752 return "TECM_W8";
00753 case TkLayerMap::TECM_W9:
00754 return "TECM_W9";
00755 }
00756 return "Invalid";
00757 }
00758
00759 int TkDetMap::getLayerNum(std::string& in){
00760 if(in.compare( "TIB_L1")==0)
00761 return TkLayerMap::TIB_L1;
00762 if(in.compare( "TIB_L2")==0)
00763 return TkLayerMap::TIB_L2;
00764 if(in.compare( "TIB_L3")==0)
00765 return TkLayerMap::TIB_L3;
00766 if(in.compare( "TIB_L4")==0)
00767 return TkLayerMap::TIB_L4;
00768 if(in.compare( "TIDP_D1")==0)
00769 return TkLayerMap::TIDP_D1;
00770 if(in.compare( "TIDP_D2")==0)
00771 return TkLayerMap::TIDP_D2;
00772 if(in.compare( "TIDP_D3")==0)
00773 return TkLayerMap::TIDP_D3;
00774 if(in.compare( "TIDM_D1")==0)
00775 return TkLayerMap::TIDM_D1;
00776 if(in.compare( "TIDM_D2")==0)
00777 return TkLayerMap::TIDM_D2;
00778 if(in.compare( "TIDM_D3")==0)
00779 return TkLayerMap::TIDM_D3;
00780 if(in.compare( "TOB_L1")==0)
00781 return TkLayerMap::TOB_L1;
00782 if(in.compare( "TOB_L2")==0)
00783 return TkLayerMap::TOB_L2;
00784 if(in.compare( "TOB_L3")==0)
00785 return TkLayerMap::TOB_L3;
00786 if(in.compare( "TOB_L4")==0)
00787 return TkLayerMap::TOB_L4;
00788 if(in.compare( "TOB_L5")==0)
00789 return TkLayerMap::TOB_L5;
00790 if(in.compare( "TOB_L6")==0)
00791 return TkLayerMap::TOB_L6;
00792 if(in.compare( "TECP_W1")==0)
00793 return TkLayerMap::TECP_W1;
00794 if(in.compare( "TECP_W2")==0)
00795 return TkLayerMap::TECP_W2;
00796 if(in.compare( "TECP_W3")==0)
00797 return TkLayerMap::TECP_W3;
00798 if(in.compare( "TECP_W4")==0)
00799 return TkLayerMap::TECP_W4;
00800 if(in.compare( "TECP_W5")==0)
00801 return TkLayerMap::TECP_W5;
00802 if(in.compare( "TECP_W6")==0)
00803 return TkLayerMap::TECP_W6;
00804 if(in.compare( "TECP_W7")==0)
00805 return TkLayerMap::TECP_W7;
00806 if(in.compare( "TECP_W8")==0)
00807 return TkLayerMap::TECP_W8;
00808 if(in.compare( "TECP_W9")==0)
00809 return TkLayerMap::TECP_W9;
00810 if(in.compare( "TECM_W1")==0)
00811 return TkLayerMap::TECM_W1;
00812 if(in.compare( "TECM_W2")==0)
00813 return TkLayerMap::TECM_W2;
00814 if(in.compare( "TECM_W3")==0)
00815 return TkLayerMap::TECM_W3;
00816 if(in.compare( "TECM_W4")==0)
00817 return TkLayerMap::TECM_W4;
00818 if(in.compare( "TECM_W5")==0)
00819 return TkLayerMap::TECM_W5;
00820 if(in.compare( "TECM_W6")==0)
00821 return TkLayerMap::TECM_W6;
00822 if(in.compare( "TECM_W7")==0)
00823 return TkLayerMap::TECM_W7;
00824 if(in.compare( "TECM_W8")==0)
00825 return TkLayerMap::TECM_W8;
00826 if(in.compare( "TECM_W9")==0)
00827 return TkLayerMap::TECM_W9;
00828 return 0;
00829 }
00830
00831 void TkDetMap::getSubDetLayerSide(int& in,SiStripDetId::SubDetector& subDet,uint32_t& layer,uint32_t& side){
00832 switch (in)
00833 {
00834 case TkLayerMap::TIB_L1:
00835 subDet = SiStripDetId::TIB;
00836 layer = 1;
00837 break;
00838 case TkLayerMap::TIB_L2:
00839 subDet = SiStripDetId::TIB;
00840 layer = 2;
00841 break;
00842 case TkLayerMap::TIB_L3:
00843 subDet = SiStripDetId::TIB;
00844 layer = 3;
00845 break;
00846 case TkLayerMap::TIB_L4:
00847 subDet = SiStripDetId::TIB;
00848 layer = 4;
00849 break;
00850 case TkLayerMap::TIDP_D1:
00851 subDet = SiStripDetId::TID;
00852 layer = 1;
00853 side=2;
00854 break;
00855 case TkLayerMap::TIDP_D2:
00856 subDet = SiStripDetId::TID;
00857 layer = 2;
00858 side=2;
00859 break;
00860 case TkLayerMap::TIDP_D3:
00861 subDet = SiStripDetId::TID;
00862 layer = 3;
00863 side=2;
00864 break;
00865 case TkLayerMap::TIDM_D1:
00866 subDet = SiStripDetId::TID;
00867 layer = 1;
00868 side=1;
00869 break;
00870 case TkLayerMap::TIDM_D2:
00871 subDet = SiStripDetId::TID;
00872 layer = 2;
00873 side=1;
00874 break;
00875 case TkLayerMap::TIDM_D3:
00876 subDet = SiStripDetId::TID;
00877 layer = 3;
00878 side=1;
00879 break;
00880 case TkLayerMap::TOB_L1:
00881 subDet = SiStripDetId::TOB;
00882 layer = 1;
00883 break;
00884 case TkLayerMap::TOB_L2:
00885 subDet = SiStripDetId::TOB;
00886 layer = 2;
00887 break;
00888 case TkLayerMap::TOB_L3:
00889 subDet = SiStripDetId::TOB;
00890 layer = 3;
00891 break;
00892 case TkLayerMap::TOB_L4:
00893 subDet = SiStripDetId::TOB;
00894 layer = 4;
00895 break;
00896 case TkLayerMap::TOB_L5:
00897 subDet = SiStripDetId::TOB;
00898 layer = 5;
00899 break;
00900 case TkLayerMap::TOB_L6:
00901 subDet = SiStripDetId::TOB;
00902 layer = 6;
00903 break;
00904 case TkLayerMap::TECP_W1:
00905 subDet = SiStripDetId::TEC;
00906 layer = 1;
00907 side=2;
00908 break;
00909 case TkLayerMap::TECP_W2:
00910 subDet = SiStripDetId::TEC;
00911 layer = 2;
00912 side=2;
00913 break;
00914 case TkLayerMap::TECP_W3:
00915 subDet = SiStripDetId::TEC;
00916 layer = 3;
00917 side=2;
00918 break;
00919 case TkLayerMap::TECP_W4:
00920 subDet = SiStripDetId::TEC;
00921 layer = 4;
00922 side=2;
00923 break;
00924 case TkLayerMap::TECP_W5:
00925 subDet = SiStripDetId::TEC;
00926 layer = 5;
00927 side=2;
00928 break;
00929 case TkLayerMap::TECP_W6:
00930 subDet = SiStripDetId::TEC;
00931 layer = 6;
00932 side=2;
00933 break;
00934 case TkLayerMap::TECP_W7:
00935 subDet = SiStripDetId::TEC;
00936 layer = 7;
00937 side=2;
00938 break;
00939 case TkLayerMap::TECP_W8:
00940 subDet = SiStripDetId::TEC;
00941 layer = 8;
00942 side=2;
00943 break;
00944 case TkLayerMap::TECP_W9:
00945 subDet = SiStripDetId::TEC;
00946 layer = 9;
00947 side=2;
00948 break;
00949 case TkLayerMap::TECM_W1:
00950 subDet = SiStripDetId::TEC;
00951 layer = 1;
00952 side=1;
00953 break;
00954 case TkLayerMap::TECM_W2:
00955 subDet = SiStripDetId::TEC;
00956 layer = 2;
00957 side=1;
00958 break;
00959 case TkLayerMap::TECM_W3:
00960 subDet = SiStripDetId::TEC;
00961 layer = 3;
00962 side=1;
00963 break;
00964 case TkLayerMap::TECM_W4:
00965 subDet = SiStripDetId::TEC;
00966 layer = 4;
00967 side=1;
00968 break;
00969 case TkLayerMap::TECM_W5:
00970 subDet = SiStripDetId::TEC;
00971 layer = 5;
00972 side=1;
00973 break;
00974 case TkLayerMap::TECM_W6:
00975 subDet = SiStripDetId::TEC;
00976 layer = 6;
00977 side=1;
00978 break;
00979 case TkLayerMap::TECM_W7:
00980 subDet = SiStripDetId::TEC;
00981 layer = 7;
00982 side=1;
00983 break;
00984 case TkLayerMap::TECM_W8:
00985 subDet = SiStripDetId::TEC;
00986 layer = 8;
00987 side=1;
00988 break;
00989 case TkLayerMap::TECM_W9:
00990 subDet = SiStripDetId::TEC;
00991 layer = 9;
00992 side=1;
00993 break;
00994 }
00995 }
00996
00997