Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-06-18 02:20:21

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     // barphiflat scenario
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));  // name of module volume
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       // error checking
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       // v2 or v3 scenario
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));  // name of module volume
0115       uint32_t pos = rodName.find("Zpos");
0116       zside = (pos <= rodName.size() ? 1 : 0);
0117 
0118       // for negative side swap module numbers betwee sides of the tray, so as to keep the same number for the same phi angle
0119       // in the existing model. This introduces a misalignemtn between module number and volume copy for the negative side.
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         // V2: the type is embedded in crystal name
0132         modtyp = ::atoi(&bareBaseName(baseNumber.getLevelName(2)).back());
0133       } else {
0134         // V3: build type and RU number per type from global RU number
0135         modtyp = globalru2type[runitCopy - 1];
0136         runitCopy = globalru2ru[runitCopy - 1];
0137       }
0138 
0139       // error checking
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     // all inputs are fine. Go ahead and decode
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     // v2 scenario, geographicalId per module
0191     // for tracking navigation geometry
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));  // name of module volume
0206     uint32_t pos = rodName.find("Zpos");
0207     zside = (pos <= rodName.size() ? 1 : 0);
0208 
0209     // for negative side swap module numbers betwee sides of the tray, so as to keep the same number for the same phi angle
0210     // in the existing model. This introduces a misalignemtn between module number and volume copy for the negative side.
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       // V2: the type is embedded in crystal name
0223       modtyp = ::atoi(&bareBaseName(baseNumber.getLevelName(1)).back());
0224     } else {
0225       // V3: build type and RU number per type from global RU number
0226       modtyp = globalru2type[runitCopy - 1];
0227       runitCopy = globalru2ru[runitCopy - 1];
0228     }
0229 
0230     // error checking
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     // all inputs are fine. Go ahead and decode
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 }