File indexing completed on 2025-03-23 15:57:50
0001
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
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
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
0115
0116
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 }