Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-03-17 13:03:45

0001 //#define EDM_ML_DEBUG
0002 
0003 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0004 
0005 #include "Geometry/MTDCommonData/interface/ETLNumberingScheme.h"
0006 #include "DataFormats/ForwardDetId/interface/ETLDetId.h"
0007 
0008 #include <iostream>
0009 
0010 ETLNumberingScheme::ETLNumberingScheme() : MTDNumberingScheme() {
0011 #ifdef EDM_ML_DEBUG
0012   edm::LogInfo("MTDGeom") << "Creating ETLNumberingScheme";
0013 #endif
0014 }
0015 
0016 ETLNumberingScheme::~ETLNumberingScheme() {
0017 #ifdef EDM_ML_DEBUG
0018   edm::LogInfo("MTDGeom") << "Deleting ETLNumberingScheme";
0019 #endif
0020 }
0021 
0022 uint32_t ETLNumberingScheme::getUnitID(const MTDBaseNumber& baseNumber) const {
0023   const uint32_t nLevels(baseNumber.getLevels());
0024 
0025 #ifdef EDM_ML_DEBUG
0026   edm::LogInfo("MTDGeom") << "ETLNumberingScheme geometry levels = " << nLevels;
0027 #endif
0028 
0029   if (11 > nLevels) {
0030     edm::LogWarning("MTDGeom") << "ETLNumberingScheme::getUnitID(): "
0031                                << "Not enough levels found in MTDBaseNumber ( " << nLevels << ") Returning 0";
0032     return 0;
0033   }
0034 
0035   // Discriminate pre-TDR and TDR scenarios
0036 
0037   const bool preTDR = (baseNumber.getLevelName(3).find("Ring") != std::string::npos);
0038 
0039   const uint32_t modCopy(baseNumber.getCopyNumber(2));
0040 
0041   const std::string_view& ringName(baseNumber.getLevelName(3));  // name of ring volume
0042   int modtyp(0);
0043   std::string_view baseName = ringName.substr(ringName.find(':') + 1);
0044   int ringCopy(::atoi(baseName.data() + 4));
0045 
0046   uint32_t discN, sectorS, sectorN;
0047   if (!preTDR) {
0048     discN = (baseNumber.getLevelName(4).find("Disc1") != std::string::npos) ? 0 : 1;
0049     sectorS = (baseNumber.getLevelName(3).find("Front") != std::string::npos) ? 0 : 1;
0050     sectorN = baseNumber.getCopyNumber(3);
0051 
0052     ETLDetId tmpId;
0053     ringCopy = static_cast<int>(tmpId.encodeSector(discN, sectorS, sectorN));
0054 
0055     modtyp = (baseNumber.getLevelName(2).find("_Left") != std::string::npos) ? 1 : 2;
0056   }
0057 
0058   // Side choice: up to scenario D38 is given by level 7 (HGCal v9)
0059   int nSide(7);
0060   const std::string_view& sideName(baseNumber.getLevelName(nSide));
0061   // Side choice: from scenario D41 is given by level 8 (HGCal v10)
0062   if (sideName.find("CALOECTSFront") != std::string::npos) {
0063     nSide = 8;
0064   }
0065   const uint32_t sideCopy(baseNumber.getCopyNumber(nSide));
0066   const uint32_t zside(sideCopy == 1 ? 1 : 0);
0067 
0068 #ifdef EDM_ML_DEBUG
0069   edm::LogInfo("MTDGeom") << baseNumber.getLevelName(0) << ", " << baseNumber.getLevelName(1) << ", "
0070                           << baseNumber.getLevelName(2) << ", " << baseNumber.getLevelName(3) << ", "
0071                           << baseNumber.getLevelName(4) << ", " << baseNumber.getLevelName(5) << ", "
0072                           << baseNumber.getLevelName(6) << ", " << baseNumber.getLevelName(7) << ", "
0073                           << baseNumber.getLevelName(8) << ", " << baseNumber.getLevelName(9) << ", "
0074                           << baseNumber.getLevelName(10) << ", " << baseNumber.getLevelName(11);
0075 #endif
0076 
0077   // error checking
0078 
0079   if ((modtyp != 0 && preTDR) || (modtyp == 0 && !preTDR)) {
0080     edm::LogWarning("MTDGeom") << "ETLNumberingScheme::getUnitID(): "
0081                                << "****************** Bad module name = " << modtyp
0082                                << ", Volume Name = " << baseNumber.getLevelName(4);
0083     return 0;
0084   }
0085 
0086   if ((preTDR && (1 > modCopy || ETLDetId::kETLv1maxModule < modCopy)) ||
0087       (!preTDR && (1 > modCopy ||
0088                    static_cast<unsigned>(std::max(ETLDetId::kETLv4maxModule, ETLDetId::kETLv5maxModule)) < modCopy))) {
0089     edm::LogWarning("MTDGeom") << "ETLNumberingScheme::getUnitID(): "
0090                                << "****************** Bad module copy = " << modCopy
0091                                << ", Volume Number = " << baseNumber.getCopyNumber(4);
0092     return 0;
0093   }
0094 
0095   if ((preTDR && (1 > ringCopy || ETLDetId::kETLv1maxRing < ringCopy)) ||
0096       (!preTDR && (1 > ringCopy || ETLDetId::kETLv4maxRing < ringCopy))) {
0097     edm::LogWarning("MTDGeom") << "ETLNumberingScheme::getUnitID(): "
0098                                << "****************** Bad ring copy = " << ringCopy
0099                                << ", Volume Number = " << baseNumber.getCopyNumber(3);
0100     return 0;
0101   }
0102 
0103   // all inputs are fine. Go ahead and decode
0104 
0105   ETLDetId thisETLdetid(zside, ringCopy, modCopy, modtyp);
0106   const uint32_t intindex = thisETLdetid.rawId();
0107 
0108 #ifdef EDM_ML_DEBUG
0109   edm::LogInfo("MTDGeom") << "ETL Numbering scheme: "
0110                           << " ring = " << ringCopy << " zside = " << zside << " module = " << modCopy
0111                           << " modtyp = " << modtyp << " Raw Id = " << intindex << thisETLdetid;
0112 #endif
0113   if (!preTDR) {
0114     ETLDetId altETLdetid(zside, discN, sectorS, sectorN, modCopy, modtyp);
0115     const uint32_t altintindex = altETLdetid.rawId();
0116     if (intindex != altintindex) {
0117       edm::LogWarning("MTDGeom") << "Incorrect alternative construction \n"
0118                                  << "disc = " << discN << " disc side = " << sectorS << " sector = " << sectorN << "\n"
0119                                  << altETLdetid;
0120     }
0121   }
0122 
0123   return intindex;
0124 }