File indexing completed on 2023-03-17 13:03:45
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
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));
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
0059 int nSide(7);
0060 const std::string_view& sideName(baseNumber.getLevelName(nSide));
0061
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
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
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 }