Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-03-17 13:03:45

0001 //#define EDM_ML_DEBUG
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     // barphiflat scenario
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));  // name of module volume
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       // error checking
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       // v2 scenario
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));  // name of module volume
0104       uint32_t pos = rodName.find("Zpos");
0105       zside = (pos <= rodName.size() ? 1 : 0);
0106 
0107       // for negative side swap module numbers betwee sides of the tray, so as to keep the same number for the same phi angle
0108       // in the existing model. This introduces a misalignemtn between module number and volume copy for the negative side.
0109       if (zside == 0) {
0110         modCopy = negModCopy[modCopy - 1];
0111       }
0112 
0113       modtyp = ::atoi(&baseNumber.getLevelName(2).back());
0114 
0115       // error checking
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     // all inputs are fine. Go ahead and decode
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     // v2 scenario, geographicalId per module
0166     // for tracking navigation geometry
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));  // name of module volume
0177     uint32_t pos = rodName.find("Zpos");
0178     zside = (pos <= rodName.size() ? 1 : 0);
0179 
0180     // for negative side swap module numbers betwee sides of the tray, so as to keep the same number for the same phi angle
0181     // in the existing model. This introduces a misalignemtn between module number and volume copy for the negative side.
0182     if (zside == 0) {
0183       modCopy = negModCopy[modCopy - 1];
0184     }
0185 
0186     modtyp = ::atoi(&baseNumber.getLevelName(1).back());
0187 
0188     // error checking
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     // all inputs are fine. Go ahead and decode
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 }