Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-03-08 03:04:14

0001 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0002 #include "Geometry/MTDCommonData/interface/BTLElectronicsMapping.h"
0003 #include "FWCore/Utilities/interface/Exception.h"
0004 #include <Geometry/MTDCommonData/interface/MTDTopologyMode.h>
0005 
0006 #include <ostream>
0007 #include <algorithm>
0008 #include <vector>
0009 BTLElectronicsMapping::BTLElectronicsMapping(const BTLDetId::CrysLayout lay) {
0010   if (static_cast<int>(lay) < 7) {
0011     throw cms::Exception("BTLElectronicsMapping")
0012         << "MTD Topology mode with layout " << static_cast<int>(lay) << " is not supported\n"
0013         << "use layout : 7 (v4) or later!" << std::endl;
0014   }
0015 }
0016 
0017 // Get SiPM Channel from crystal ID
0018 
0019 int BTLElectronicsMapping::SiPMCh(uint32_t smodCopy, uint32_t crystal, uint32_t SiPMSide) {
0020   if (0 > int(crystal) || crystal > BTLDetId::kCrystalsPerModuleV2) {
0021     edm::LogWarning("MTDGeom") << "BTLNumberingScheme::BTLElectronicsMapping(): "
0022                                << "****************** Bad crystal number = " << int(crystal);
0023     return 0;
0024   }
0025 
0026   if (0 > int(smodCopy) || smodCopy > BTLDetId::kSModulesPerDM) {
0027     edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0028                                << "****************** Bad detector module copy = " << int(smodCopy);
0029     return 0;
0030   }
0031 
0032   if (smodCopy == 0)
0033     return BTLElectronicsMapping::SiPMChannelMapFW[crystal + SiPMSide * BTLDetId::kCrystalsPerModuleV2];
0034   else
0035     return BTLElectronicsMapping::SiPMChannelMapBW[crystal + SiPMSide * BTLDetId::kCrystalsPerModuleV2];
0036 }
0037 
0038 int BTLElectronicsMapping::SiPMCh(BTLDetId det, uint32_t SiPMSide) {
0039   uint32_t smodCopy = det.smodule();
0040   uint32_t crystal = det.crystal();
0041 
0042   return BTLElectronicsMapping::SiPMCh(smodCopy, crystal, SiPMSide);
0043 }
0044 
0045 int BTLElectronicsMapping::SiPMCh(uint32_t rawId, uint32_t SiPMSide) {
0046   BTLDetId theId(rawId);
0047   return BTLElectronicsMapping::SiPMCh(theId, SiPMSide);
0048 }
0049 
0050 BTLElectronicsMapping::SiPMChPair BTLElectronicsMapping::GetSiPMChPair(uint32_t smodCopy, uint32_t crystal) {
0051   BTLElectronicsMapping::SiPMChPair SiPMChs;
0052   SiPMChs.Minus = BTLElectronicsMapping::SiPMCh(smodCopy, crystal, 0);
0053   SiPMChs.Plus = BTLElectronicsMapping::SiPMCh(smodCopy, crystal, 1);
0054   return SiPMChs;
0055 }
0056 
0057 BTLElectronicsMapping::SiPMChPair BTLElectronicsMapping::GetSiPMChPair(BTLDetId det) {
0058   BTLElectronicsMapping::SiPMChPair SiPMChs;
0059   SiPMChs.Minus = BTLElectronicsMapping::SiPMCh(det, 0);
0060   SiPMChs.Plus = BTLElectronicsMapping::SiPMCh(det, 1);
0061   return SiPMChs;
0062 }
0063 BTLElectronicsMapping::SiPMChPair BTLElectronicsMapping::GetSiPMChPair(uint32_t rawID) {
0064   BTLElectronicsMapping::SiPMChPair SiPMChs;
0065   SiPMChs.Minus = BTLElectronicsMapping::SiPMCh(rawID, 0);
0066   SiPMChs.Plus = BTLElectronicsMapping::SiPMCh(rawID, 1);
0067   return SiPMChs;
0068 }
0069 
0070 // Get TOFHIR Channel from crystal ID
0071 
0072 int BTLElectronicsMapping::TOFHIRCh(uint32_t smodCopy, uint32_t crystal, uint32_t SiPMSide) {
0073   int SiPMCh_ = BTLElectronicsMapping::SiPMCh(smodCopy, crystal, SiPMSide);
0074   return BTLElectronicsMapping::THChannelMap[SiPMCh_];
0075 }
0076 
0077 int BTLElectronicsMapping::TOFHIRCh(BTLDetId det, uint32_t SiPMSide) {
0078   uint32_t smodCopy = det.smodule();
0079   uint32_t crystal = det.crystal();
0080 
0081   return BTLElectronicsMapping::TOFHIRCh(smodCopy, crystal, SiPMSide);
0082 }
0083 
0084 int BTLElectronicsMapping::TOFHIRCh(uint32_t rawId, uint32_t SiPMSide) {
0085   BTLDetId theId(rawId);
0086   return BTLElectronicsMapping::TOFHIRCh(theId, SiPMSide);
0087 }
0088 
0089 BTLElectronicsMapping::TOFHIRChPair BTLElectronicsMapping::GetTOFHIRChPair(uint32_t smodCopy, uint32_t crystal) {
0090   BTLElectronicsMapping::TOFHIRChPair TOFHIRChs;
0091   TOFHIRChs.Minus = BTLElectronicsMapping::TOFHIRCh(smodCopy, crystal, 0);
0092   TOFHIRChs.Plus = BTLElectronicsMapping::TOFHIRCh(smodCopy, crystal, 1);
0093   return TOFHIRChs;
0094 }
0095 
0096 BTLElectronicsMapping::TOFHIRChPair BTLElectronicsMapping::GetTOFHIRChPair(BTLDetId det) {
0097   BTLElectronicsMapping::TOFHIRChPair TOFHIRChs;
0098   TOFHIRChs.Minus = BTLElectronicsMapping::TOFHIRCh(det, 0);
0099   TOFHIRChs.Plus = BTLElectronicsMapping::TOFHIRCh(det, 1);
0100   return TOFHIRChs;
0101 }
0102 BTLElectronicsMapping::TOFHIRChPair BTLElectronicsMapping::GetTOFHIRChPair(uint32_t rawID) {
0103   BTLElectronicsMapping::TOFHIRChPair TOFHIRChs;
0104   TOFHIRChs.Minus = BTLElectronicsMapping::TOFHIRCh(rawID, 0);
0105   TOFHIRChs.Plus = BTLElectronicsMapping::TOFHIRCh(rawID, 1);
0106   return TOFHIRChs;
0107 }
0108 
0109 // Get crystal ID from TOFHIR Channel
0110 
0111 int BTLElectronicsMapping::THChToXtal(uint32_t smodCopy, uint32_t THCh) {
0112   if (0 > int(smodCopy) || BTLDetId::kSModulesPerDM < smodCopy) {
0113     edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0114                                << "****************** Bad detector module copy = " << int(smodCopy);
0115     return 0;
0116   }
0117 
0118   auto THChPos =
0119       std::find(BTLElectronicsMapping::THChannelMap.begin(), BTLElectronicsMapping::THChannelMap.end(), THCh);
0120   int targetSiPMCh = std::distance(BTLElectronicsMapping::THChannelMap.begin(), THChPos);
0121 
0122   std::array<uint32_t, BTLDetId::kCrystalsPerModuleV2 * 2> SiPMChMap;
0123   if (smodCopy == 0)
0124     SiPMChMap = BTLElectronicsMapping::SiPMChannelMapFW;
0125   else
0126     SiPMChMap = BTLElectronicsMapping::SiPMChannelMapBW;
0127 
0128   auto targetpos = std::find(SiPMChMap.begin(), SiPMChMap.end(), targetSiPMCh);
0129   return std::distance(SiPMChMap.begin(), targetpos) % BTLDetId::kCrystalsPerModuleV2 + 1;
0130 }
0131 
0132 BTLDetId BTLElectronicsMapping::THChToBTLDetId(
0133     uint32_t zside, uint32_t rod, uint32_t runit, uint32_t dmodule, uint32_t smodCopy, uint32_t THCh) {
0134   if (0 > int(THCh) || 31 < THCh) {
0135     edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0136                                << "****************** Bad TOFHIR channel = " << int(THCh);
0137     return 0;
0138   }
0139 
0140   if (0 > int(smodCopy) || BTLDetId::kSModulesPerDM < smodCopy) {
0141     edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0142                                << "****************** Bad detector module copy = " << int(smodCopy);
0143     return 0;
0144   }
0145 
0146   if (0 > int(dmodule) || 12 < dmodule) {
0147     edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0148                                << "****************** Bad module copy = " << int(dmodule);
0149     return 0;
0150   }
0151 
0152   if (1 > rod || 36 < rod) {
0153     edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0154                                << "****************** Bad rod copy = " << rod;
0155     return 0;
0156   }
0157 
0158   if (1 < zside) {
0159     edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
0160                                << "****************** Bad side = " << zside;
0161     return 0;
0162   }
0163 
0164   int crystal = BTLElectronicsMapping::THChToXtal(smodCopy, THCh);
0165 
0166   return BTLDetId(zside, rod, runit, dmodule, smodCopy, crystal);
0167 }
0168 
0169 // Get TOFHIR asic number
0170 // if dmodule is odd number (DM range [1-12])
0171 //    SM1 --> TOFHIR A0 (simply 0)
0172 //    SM2 --> TOFHIR A1 (simply 1)
0173 // else if dmodule is even number the order is inverted
0174 //    SM1 --> TOFHIR A1 (simply 1)
0175 //    SM2 --> TOFHIR A0 (simply 0)
0176 int BTLElectronicsMapping::TOFHIRASIC(uint32_t dmodule, uint32_t smodCopy) {
0177   if (dmodule % BTLDetId::kSModulesInDM == 0)
0178     return smodCopy;
0179   else
0180     return BTLDetId::kSModulesInDM - smodCopy - 1;
0181 }
0182 
0183 int BTLElectronicsMapping::TOFHIRASIC(BTLDetId det) {
0184   uint32_t dmodule = det.dmodule();
0185   uint32_t smodCopy = det.smodule();
0186   return BTLElectronicsMapping::TOFHIRASIC(dmodule, smodCopy);
0187 }
0188 
0189 int BTLElectronicsMapping::TOFHIRASIC(uint32_t rawID) {
0190   BTLDetId theId(rawID);
0191   return BTLElectronicsMapping::TOFHIRASIC(theId);
0192 }
0193 
0194 /** Returns FE board number */
0195 int BTLElectronicsMapping::FEBoardFromDM(uint32_t dmodule) { return dmodule; }
0196 
0197 int BTLElectronicsMapping::FEBoard(BTLDetId det) {
0198   uint32_t dmodule = det.dmodule();
0199   return BTLElectronicsMapping::FEBoardFromDM(dmodule);
0200 }
0201 
0202 int BTLElectronicsMapping::FEBoard(uint32_t rawID) {
0203   BTLDetId theId(rawID);
0204   return BTLElectronicsMapping::FEBoard(theId);
0205 }
0206 
0207 /** Returns CC board number */
0208 int BTLElectronicsMapping::CCBoardFromRU(uint32_t runit) { return runit; }
0209 
0210 int BTLElectronicsMapping::CCBoard(BTLDetId det) {
0211   uint32_t runit = det.runit();
0212   return BTLElectronicsMapping::CCBoardFromRU(runit);
0213 }
0214 
0215 int BTLElectronicsMapping::CCBoard(uint32_t rawID) {
0216   BTLDetId theId(rawID);
0217   return BTLElectronicsMapping::CCBoard(theId);
0218 }