Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-03-23 15:57:50

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   const bool prev8(baseNumber.getLevelName(2).find("Sensor") != std::string::npos);
0036   const bool prev9(baseNumber.getLevelName(2).find("Half_") == std::string::npos);
0037 
0038   std::stringstream ss;
0039   auto dump_levels = [&]() {
0040     for (size_t ii = 0; ii < nLevels; ii++) {
0041       ss << ii << ": " << baseNumber.getLevelName(ii) << "  ";
0042     }
0043     ss << "\nReturning 0";
0044     return ss.str();
0045   };
0046 
0047   uint32_t modCopy(baseNumber.getCopyNumber(2));
0048   if (!prev9) {
0049     modCopy = baseNumber.getCopyNumber(3);
0050   }
0051   uint32_t modtyp(0);
0052   if (prev9) {
0053     modtyp = (baseNumber.getLevelName(2).find("_Left") != std::string::npos) ? 1 : 2;
0054   } else {
0055     modtyp = baseNumber.getCopyNumber(2);
0056   }
0057   uint32_t sensor(0);
0058   if (!prev8) {
0059     sensor = baseNumber.getCopyNumber(1);
0060   }
0061   // for v9 keep the same sensor order inside a module as in v8
0062   if (!prev9 && modtyp == 2) {
0063     sensor = (sensor == 1) ? 2 : 1;
0064   }
0065 
0066   uint32_t discN, sectorS, sectorN;
0067   uint32_t offset = prev9 ? 3 : 4;
0068   discN = (baseNumber.getLevelName(offset + 1).find("Disc1") != std::string::npos) ? 0 : 1;
0069   sectorS = (baseNumber.getLevelName(offset).find("Front") != std::string::npos) ? 0 : 1;
0070   sectorN = baseNumber.getCopyNumber(offset);
0071 
0072   ETLDetId tmpId;
0073   uint32_t ringCopy = static_cast<int>(tmpId.encodeSector(discN, sectorS, sectorN));
0074 
0075   uint32_t nSide(999);
0076   if (baseNumber.getLevelName(7).find("CALOECTSFront") != std::string::npos) {
0077     nSide = 8;
0078   } else if (baseNumber.getLevelName(8).find("CALOECTSFront") != std::string::npos) {
0079     nSide = 9;
0080   } else {
0081     edm::LogWarning("MTDGeom") << "ETLNumberingScheme::getUnitID(): incorrect volume stack: \n" << dump_levels();
0082     return 0;
0083   }
0084   const uint32_t sideCopy(baseNumber.getCopyNumber(nSide));
0085   const uint32_t zside(sideCopy == 1 ? 1 : 0);
0086 
0087 #ifdef EDM_ML_DEBUG
0088   edm::LogInfo("MTDGeom") << dump_levels();
0089 #endif
0090 
0091   // error checking
0092 
0093   if (modtyp == 0) {
0094     edm::LogWarning("MTDGeom") << "ETLNumberingScheme::getUnitID(): "
0095                                << "****************** Bad module name = " << modtyp
0096                                << ", Volume Name = " << baseNumber.getLevelName(4);
0097     return 0;
0098   }
0099 
0100   if (1 > modCopy || static_cast<unsigned>(std::max(ETLDetId::kETLv4maxModule, ETLDetId::kETLv5maxModule)) < modCopy) {
0101     edm::LogWarning("MTDGeom") << "ETLNumberingScheme::getUnitID(): "
0102                                << "****************** Bad module copy = " << modCopy
0103                                << ", Volume Number = " << baseNumber.getCopyNumber(4);
0104     return 0;
0105   }
0106 
0107   if (1 > ringCopy || ETLDetId::kETLv4maxRing < ringCopy) {
0108     edm::LogWarning("MTDGeom") << "ETLNumberingScheme::getUnitID(): "
0109                                << "****************** Bad ring copy = " << ringCopy
0110                                << ", Volume Number = " << baseNumber.getCopyNumber(3);
0111     return 0;
0112   }
0113 
0114   // all inputs are fine. Go ahead and decode
0115 
0116   // Different for v8 and pre v8 ETL geometries
0117   uint32_t intindex = 0;
0118   uint32_t altintindex = 0;
0119   if (prev8) {
0120     ETLDetId thisETLdetid(zside, ringCopy, modCopy, modtyp);
0121     intindex = thisETLdetid.rawId();
0122 #ifdef EDM_ML_DEBUG
0123     edm::LogInfo("MTDGeom") << "ETL Numbering scheme: "
0124                             << " ring = " << ringCopy << " zside = " << zside << " module = " << modCopy
0125                             << " modtyp = " << modtyp << " Raw Id = " << intindex;
0126 #endif
0127 
0128     ETLDetId altETLdetid(zside, discN, sectorS, sectorN, modCopy, modtyp);
0129     altintindex = altETLdetid.rawId();
0130 
0131   } else {
0132     ETLDetId thisETLdetid(zside, ringCopy, modCopy, modtyp, sensor);
0133     intindex = thisETLdetid.rawId();
0134 #ifdef EDM_ML_DEBUG
0135     edm::LogInfo("MTDGeom") << "ETL Numbering scheme: "
0136                             << " ring = " << ringCopy << " zside = " << zside << " module = " << modCopy
0137                             << " modtyp = " << modtyp << " sensor = " << sensor << " Raw Id = " << intindex;
0138 #endif
0139 
0140     ETLDetId altETLdetid(zside, discN, sectorS, sectorN, modCopy, modtyp, sensor);
0141     altintindex = altETLdetid.rawId();
0142   }
0143 
0144   if (intindex != altintindex) {
0145     edm::LogWarning("MTDGeom") << "Incorrect alternative construction \n"
0146                                << "disc = " << discN << " disc side = " << sectorS << " sector = " << sectorN << "\n";
0147   }
0148 
0149   return intindex;
0150 }