File indexing completed on 2025-01-18 03:42:05
0001 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0002
0003 #include "Geometry/MTDCommonData/interface/BTLNumberingScheme.h"
0004
0005 #include <iostream>
0006 #include <cstring>
0007
0008 BTLNumberingScheme::BTLNumberingScheme() : MTDNumberingScheme() {
0009 LogDebug("MTDGeom") << "Creating BTLNumberingScheme";
0010 }
0011
0012 BTLNumberingScheme::~BTLNumberingScheme() { LogDebug("MTDGeom") << "Deleting BTLNumberingScheme"; }
0013
0014 uint32_t BTLNumberingScheme::getUnitID(const MTDBaseNumber& baseNumber) const {
0015 uint32_t intindex(0);
0016 const uint32_t nLevels(baseNumber.getLevels());
0017
0018 LogDebug("MTDGeom") << "BTLNumberingScheme geometry levels = " << nLevels;
0019
0020 uint32_t zside(999), rodCopy(0), runitCopy(0), modCopy(0), modtyp(0), crystal(0);
0021
0022 bool isDD4hepOK(false);
0023 if (nLevels == kBTLcrystalLevel + 1) {
0024 if (baseNumber.getLevelName(9) == "world_volume_1") {
0025 isDD4hepOK = true;
0026 }
0027 }
0028
0029 #ifdef EDM_ML_DEBUG
0030 LogDebug("MTDGeom") << "BTLNumberingScheme::getUnitID(): isDD4hep " << isDD4hepOK;
0031 #endif
0032
0033 auto bareBaseName = [&](std::string_view name) {
0034 size_t ipos = name.rfind('_');
0035 return (isDD4hepOK) ? name.substr(0, ipos) : name;
0036 };
0037
0038 if (nLevels == kBTLcrystalLevel || isDD4hepOK) {
0039 LogDebug("MTDGeom") << bareBaseName(baseNumber.getLevelName(0)) << "[" << baseNumber.getCopyNumber(0) << "], "
0040 << bareBaseName(baseNumber.getLevelName(1)) << "[" << baseNumber.getCopyNumber(1) << "], "
0041 << bareBaseName(baseNumber.getLevelName(2)) << "[" << baseNumber.getCopyNumber(2) << "], "
0042 << bareBaseName(baseNumber.getLevelName(3)) << "[" << baseNumber.getCopyNumber(3) << "], "
0043 << bareBaseName(baseNumber.getLevelName(4)) << "[" << baseNumber.getCopyNumber(4) << "], "
0044 << bareBaseName(baseNumber.getLevelName(5)) << "[" << baseNumber.getCopyNumber(5) << "], "
0045 << bareBaseName(baseNumber.getLevelName(6)) << "[" << baseNumber.getCopyNumber(6) << "], "
0046 << bareBaseName(baseNumber.getLevelName(7)) << "[" << baseNumber.getCopyNumber(7) << "], "
0047 << bareBaseName(baseNumber.getLevelName(8)) << "[" << baseNumber.getCopyNumber(8) << "]";
0048
0049
0050
0051 if (baseNumber.getLevelName(0).find("Timingactive") != std::string_view::npos) {
0052 crystal = baseNumber.getCopyNumber(0);
0053
0054 modCopy = baseNumber.getCopyNumber(2);
0055 rodCopy = baseNumber.getCopyNumber(3);
0056
0057 const std::string_view& modName(baseNumber.getLevelName(2));
0058 uint32_t pos = modName.find("Positive");
0059
0060 zside = (pos <= modName.size() ? 1 : 0);
0061 std::string_view baseName = modName.substr(modName.find(':') + 1);
0062
0063 modtyp = ::atoi(&baseName.at(7));
0064 if (modtyp == 17) {
0065 modtyp = 2;
0066 } else if (modtyp == 33) {
0067 modtyp = 3;
0068 }
0069
0070
0071
0072 if (1 > crystal || 64 < crystal) {
0073 edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0074 << "****************** Bad crystal number = " << crystal
0075 << ", Volume Number = " << baseNumber.getCopyNumber(0);
0076 return 0;
0077 }
0078
0079 if (1 > modtyp || 3 < modtyp) {
0080 edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0081 << "****************** Bad module name = " << modName
0082 << ", Volume Name = " << baseNumber.getLevelName(2);
0083 return 0;
0084 }
0085
0086 if (1 > modCopy || 54 < modCopy) {
0087 edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0088 << "****************** Bad module copy = " << modCopy
0089 << ", Volume Number = " << baseNumber.getCopyNumber(2);
0090 return 0;
0091 }
0092
0093 if (1 > rodCopy || 36 < rodCopy) {
0094 edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0095 << "****************** Bad rod copy = " << rodCopy
0096 << ", Volume Number = " << baseNumber.getCopyNumber(4);
0097 return 0;
0098 }
0099
0100 if (1 < zside) {
0101 edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0102 << "****************** Bad side = " << zside
0103 << ", Volume Name = " << baseNumber.getLevelName(2);
0104 return 0;
0105 }
0106 } else if (baseNumber.getLevelName(0).find("BTLCrystal") != std::string_view::npos) {
0107
0108
0109 crystal = baseNumber.getCopyNumber(0);
0110 modCopy = baseNumber.getCopyNumber(1);
0111 runitCopy = baseNumber.getCopyNumber(2);
0112 rodCopy = baseNumber.getCopyNumber(3);
0113
0114 const std::string_view& rodName(baseNumber.getLevelName(3));
0115 uint32_t pos = rodName.find("Zpos");
0116 zside = (pos <= rodName.size() ? 1 : 0);
0117
0118
0119
0120 if (zside == 0) {
0121 modCopy = negModCopy[modCopy - 1];
0122 }
0123
0124 bool isV2(bareBaseName(baseNumber.getLevelName(0)).back() != 'l');
0125
0126 #ifdef EDM_ML_DEBUG
0127 LogDebug("MTDGeom") << "BTLNumberingScheme::getUnitID(): isV2 " << isV2;
0128 #endif
0129
0130 if (isV2) {
0131
0132 modtyp = ::atoi(&bareBaseName(baseNumber.getLevelName(2)).back());
0133 } else {
0134
0135 modtyp = globalru2type[runitCopy - 1];
0136 runitCopy = globalru2ru[runitCopy - 1];
0137 }
0138
0139
0140
0141 if (1 > crystal || BTLDetId::kCrystalsPerModuleV2 < crystal) {
0142 edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0143 << "****************** Bad crystal number = " << crystal
0144 << ", Volume Number = " << baseNumber.getCopyNumber(0);
0145 return 0;
0146 }
0147
0148 if (1 > modtyp || 3 < modtyp) {
0149 edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0150 << "****************** Bad RU name, Volume Name = "
0151 << bareBaseName(baseNumber.getLevelName(2));
0152 return 0;
0153 }
0154
0155 if (1 > modCopy || BTLDetId::kModulesPerRUV2 < modCopy) {
0156 edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0157 << "****************** Bad module copy = " << modCopy
0158 << ", Volume Number = " << baseNumber.getCopyNumber(1);
0159 return 0;
0160 }
0161
0162 if (1 > runitCopy || BTLDetId::kRUPerTypeV2 < runitCopy) {
0163 edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0164 << "****************** Bad readout unit copy = " << runitCopy
0165 << ", Volume Number = " << baseNumber.getCopyNumber(2);
0166 return 0;
0167 }
0168
0169 if (1 > rodCopy || BTLDetId::HALF_ROD < rodCopy) {
0170 edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0171 << "****************** Bad rod copy = " << rodCopy
0172 << ", Volume Number = " << baseNumber.getCopyNumber(3);
0173 return 0;
0174 }
0175
0176 if (1 < zside) {
0177 edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0178 << "****************** Bad side = " << zside
0179 << ", Volume Name = " << baseNumber.getLevelName(3);
0180 return 0;
0181 }
0182 }
0183
0184
0185
0186 BTLDetId thisBTLdetid(zside, rodCopy, runitCopy, modCopy, modtyp, crystal);
0187 intindex = thisBTLdetid.rawId();
0188
0189 } else if (nLevels == kBTLmoduleLevel && baseNumber.getLevelName(0).find("BTLModule") != std::string_view::npos) {
0190
0191
0192 LogDebug("MTDGeom") << bareBaseName(baseNumber.getLevelName(0)) << "[" << baseNumber.getCopyNumber(0) << "], "
0193 << bareBaseName(baseNumber.getLevelName(1)) << "[" << baseNumber.getCopyNumber(1) << "], "
0194 << bareBaseName(baseNumber.getLevelName(2)) << "[" << baseNumber.getCopyNumber(2) << "], "
0195 << bareBaseName(baseNumber.getLevelName(3)) << "[" << baseNumber.getCopyNumber(3) << "], "
0196 << bareBaseName(baseNumber.getLevelName(4)) << "[" << baseNumber.getCopyNumber(4) << "], "
0197 << bareBaseName(baseNumber.getLevelName(5)) << "[" << baseNumber.getCopyNumber(5) << "], "
0198 << bareBaseName(baseNumber.getLevelName(6)) << "[" << baseNumber.getCopyNumber(6) << "], "
0199 << bareBaseName(baseNumber.getLevelName(7)) << "[" << baseNumber.getCopyNumber(7) << "]";
0200
0201 modCopy = baseNumber.getCopyNumber(0);
0202 runitCopy = baseNumber.getCopyNumber(1);
0203 rodCopy = baseNumber.getCopyNumber(2);
0204
0205 const std::string_view& rodName(baseNumber.getLevelName(2));
0206 uint32_t pos = rodName.find("Zpos");
0207 zside = (pos <= rodName.size() ? 1 : 0);
0208
0209
0210
0211 if (zside == 0) {
0212 modCopy = negModCopy[modCopy - 1];
0213 }
0214
0215 bool isV2(bareBaseName(baseNumber.getLevelName(0)).back() != 'e');
0216
0217 #ifdef EDM_ML_DEBUG
0218 LogDebug("MTDGeom") << "BTLNumberingScheme::getUnitID(): isV2 " << isV2;
0219 #endif
0220
0221 if (isV2) {
0222
0223 modtyp = ::atoi(&bareBaseName(baseNumber.getLevelName(1)).back());
0224 } else {
0225
0226 modtyp = globalru2type[runitCopy - 1];
0227 runitCopy = globalru2ru[runitCopy - 1];
0228 }
0229
0230
0231
0232 if (1 > modtyp || 3 < modtyp) {
0233 edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0234 << "****************** Bad RU name, Volume Name = "
0235 << bareBaseName(baseNumber.getLevelName(1));
0236 return 0;
0237 }
0238
0239 if (1 > modCopy || BTLDetId::kModulesPerRUV2 < modCopy) {
0240 edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0241 << "****************** Bad module copy = " << modCopy
0242 << ", Volume Number = " << baseNumber.getCopyNumber(0);
0243 return 0;
0244 }
0245
0246 if (1 > runitCopy || BTLDetId::kRUPerTypeV2 < runitCopy) {
0247 edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0248 << "****************** Bad readout unit copy = " << runitCopy
0249 << ", Volume Number = " << baseNumber.getCopyNumber(1);
0250 return 0;
0251 }
0252
0253 if (1 > rodCopy || BTLDetId::HALF_ROD < rodCopy) {
0254 edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0255 << "****************** Bad rod copy = " << rodCopy
0256 << ", Volume Number = " << baseNumber.getCopyNumber(2);
0257 return 0;
0258 }
0259
0260 if (1 < zside) {
0261 edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0262 << "****************** Bad side = " << zside
0263 << ", Volume Name = " << baseNumber.getLevelName(2);
0264 return 0;
0265 }
0266
0267
0268
0269 BTLDetId thisBTLdetid(zside, rodCopy, runitCopy, modCopy, modtyp, 0);
0270 intindex = thisBTLdetid.geographicalId(BTLDetId::CrysLayout::v2).rawId();
0271
0272 } else {
0273 edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0274 << "Not enough levels found in MTDBaseNumber ( " << nLevels
0275 << ") or not correct path. Returning 0";
0276 return 0;
0277 }
0278
0279 LogDebug("MTDGeom") << "BTL Numbering scheme: "
0280 << " zside = " << zside << " rod = " << rodCopy << " modtyp = " << modtyp << " RU = " << runitCopy
0281 << " module = " << modCopy << " crystal = " << crystal << " Raw Id = " << intindex << "\n"
0282 << BTLDetId(intindex);
0283
0284 return intindex;
0285 }