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