Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "Geometry/MTDCommonData/interface/BTLElectronicsMapping.h"
#include "FWCore/Utilities/interface/Exception.h"
#include <Geometry/MTDCommonData/interface/MTDTopologyMode.h>

#include <ostream>
#include <algorithm>
#include <vector>
BTLElectronicsMapping::BTLElectronicsMapping(const BTLDetId::CrysLayout lay) {
  if (static_cast<int>(lay) < 7) {
    throw cms::Exception("BTLElectronicsMapping")
        << "MTD Topology mode with layout " << static_cast<int>(lay) << " is not supported\n"
        << "use layout : 7 (v4) or later!" << std::endl;
  }
}

// Get SiPM Channel from crystal ID

int BTLElectronicsMapping::SiPMCh(uint32_t smodCopy, uint32_t crystal, uint32_t SiPMSide) {
  if (0 > int(crystal) || crystal > BTLDetId::kCrystalsPerModuleV2) {
    edm::LogWarning("MTDGeom") << "BTLNumberingScheme::BTLElectronicsMapping(): "
                               << "****************** Bad crystal number = " << int(crystal);
    return 0;
  }

  if (0 > int(smodCopy) || smodCopy > BTLDetId::kSModulesPerDM) {
    edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
                               << "****************** Bad detector module copy = " << int(smodCopy);
    return 0;
  }

  if (smodCopy == 0)
    return BTLElectronicsMapping::SiPMChannelMapFW[crystal + SiPMSide * BTLDetId::kCrystalsPerModuleV2];
  else
    return BTLElectronicsMapping::SiPMChannelMapBW[crystal + SiPMSide * BTLDetId::kCrystalsPerModuleV2];
}

int BTLElectronicsMapping::SiPMCh(BTLDetId det, uint32_t SiPMSide) {
  uint32_t smodCopy = det.smodule();
  uint32_t crystal = det.crystal();

  return BTLElectronicsMapping::SiPMCh(smodCopy, crystal, SiPMSide);
}

int BTLElectronicsMapping::SiPMCh(uint32_t rawId, uint32_t SiPMSide) {
  BTLDetId theId(rawId);
  return BTLElectronicsMapping::SiPMCh(theId, SiPMSide);
}

BTLElectronicsMapping::SiPMChPair BTLElectronicsMapping::GetSiPMChPair(uint32_t smodCopy, uint32_t crystal) {
  BTLElectronicsMapping::SiPMChPair SiPMChs;
  SiPMChs.Minus = BTLElectronicsMapping::SiPMCh(smodCopy, crystal, 0);
  SiPMChs.Plus = BTLElectronicsMapping::SiPMCh(smodCopy, crystal, 1);
  return SiPMChs;
}

BTLElectronicsMapping::SiPMChPair BTLElectronicsMapping::GetSiPMChPair(BTLDetId det) {
  BTLElectronicsMapping::SiPMChPair SiPMChs;
  SiPMChs.Minus = BTLElectronicsMapping::SiPMCh(det, 0);
  SiPMChs.Plus = BTLElectronicsMapping::SiPMCh(det, 1);
  return SiPMChs;
}
BTLElectronicsMapping::SiPMChPair BTLElectronicsMapping::GetSiPMChPair(uint32_t rawID) {
  BTLElectronicsMapping::SiPMChPair SiPMChs;
  SiPMChs.Minus = BTLElectronicsMapping::SiPMCh(rawID, 0);
  SiPMChs.Plus = BTLElectronicsMapping::SiPMCh(rawID, 1);
  return SiPMChs;
}

// Get TOFHIR Channel from crystal ID

int BTLElectronicsMapping::TOFHIRCh(uint32_t smodCopy, uint32_t crystal, uint32_t SiPMSide) {
  int SiPMCh_ = BTLElectronicsMapping::SiPMCh(smodCopy, crystal, SiPMSide);
  return BTLElectronicsMapping::THChannelMap[SiPMCh_];
}

int BTLElectronicsMapping::TOFHIRCh(BTLDetId det, uint32_t SiPMSide) {
  uint32_t smodCopy = det.smodule();
  uint32_t crystal = det.crystal();

  return BTLElectronicsMapping::TOFHIRCh(smodCopy, crystal, SiPMSide);
}

int BTLElectronicsMapping::TOFHIRCh(uint32_t rawId, uint32_t SiPMSide) {
  BTLDetId theId(rawId);
  return BTLElectronicsMapping::TOFHIRCh(theId, SiPMSide);
}

BTLElectronicsMapping::TOFHIRChPair BTLElectronicsMapping::GetTOFHIRChPair(uint32_t smodCopy, uint32_t crystal) {
  BTLElectronicsMapping::TOFHIRChPair TOFHIRChs;
  TOFHIRChs.Minus = BTLElectronicsMapping::TOFHIRCh(smodCopy, crystal, 0);
  TOFHIRChs.Plus = BTLElectronicsMapping::TOFHIRCh(smodCopy, crystal, 1);
  return TOFHIRChs;
}

BTLElectronicsMapping::TOFHIRChPair BTLElectronicsMapping::GetTOFHIRChPair(BTLDetId det) {
  BTLElectronicsMapping::TOFHIRChPair TOFHIRChs;
  TOFHIRChs.Minus = BTLElectronicsMapping::TOFHIRCh(det, 0);
  TOFHIRChs.Plus = BTLElectronicsMapping::TOFHIRCh(det, 1);
  return TOFHIRChs;
}
BTLElectronicsMapping::TOFHIRChPair BTLElectronicsMapping::GetTOFHIRChPair(uint32_t rawID) {
  BTLElectronicsMapping::TOFHIRChPair TOFHIRChs;
  TOFHIRChs.Minus = BTLElectronicsMapping::TOFHIRCh(rawID, 0);
  TOFHIRChs.Plus = BTLElectronicsMapping::TOFHIRCh(rawID, 1);
  return TOFHIRChs;
}

// Get crystal ID from TOFHIR Channel

int BTLElectronicsMapping::THChToXtal(uint32_t smodCopy, uint32_t THCh) {
  if (0 > int(smodCopy) || BTLDetId::kSModulesPerDM < smodCopy) {
    edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
                               << "****************** Bad detector module copy = " << int(smodCopy);
    return 0;
  }

  auto THChPos =
      std::find(BTLElectronicsMapping::THChannelMap.begin(), BTLElectronicsMapping::THChannelMap.end(), THCh);
  int targetSiPMCh = std::distance(BTLElectronicsMapping::THChannelMap.begin(), THChPos);

  std::array<uint32_t, BTLDetId::kCrystalsPerModuleV2 * 2> SiPMChMap;
  if (smodCopy == 0)
    SiPMChMap = BTLElectronicsMapping::SiPMChannelMapFW;
  else
    SiPMChMap = BTLElectronicsMapping::SiPMChannelMapBW;

  auto targetpos = std::find(SiPMChMap.begin(), SiPMChMap.end(), targetSiPMCh);
  return std::distance(SiPMChMap.begin(), targetpos) % BTLDetId::kCrystalsPerModuleV2 + 1;
}

BTLDetId BTLElectronicsMapping::THChToBTLDetId(
    uint32_t zside, uint32_t rod, uint32_t runit, uint32_t dmodule, uint32_t smodCopy, uint32_t THCh) {
  if (0 > int(THCh) || 31 < THCh) {
    edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
                               << "****************** Bad TOFHIR channel = " << int(THCh);
    return 0;
  }

  if (0 > int(smodCopy) || BTLDetId::kSModulesPerDM < smodCopy) {
    edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
                               << "****************** Bad detector module copy = " << int(smodCopy);
    return 0;
  }

  if (0 > int(dmodule) || 12 < dmodule) {
    edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
                               << "****************** Bad module copy = " << int(dmodule);
    return 0;
  }

  if (1 > rod || 36 < rod) {
    edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
                               << "****************** Bad rod copy = " << rod;
    return 0;
  }

  if (1 < zside) {
    edm::LogWarning("MTDGeom") << "BTLNumberingScheme::getUnitID(): "
                               << "****************** Bad side = " << zside;
    return 0;
  }

  int crystal = BTLElectronicsMapping::THChToXtal(smodCopy, THCh);

  return BTLDetId(zside, rod, runit, dmodule, smodCopy, crystal);
}

// Get TOFHIR asic number
// if dmodule is odd number (DM range [1-12])
//    SM1 --> TOFHIR A0 (simply 0)
//    SM2 --> TOFHIR A1 (simply 1)
// else if dmodule is even number the order is inverted
//    SM1 --> TOFHIR A1 (simply 1)
//    SM2 --> TOFHIR A0 (simply 0)
int BTLElectronicsMapping::TOFHIRASIC(uint32_t dmodule, uint32_t smodCopy) {
  if (dmodule % BTLDetId::kSModulesInDM == 0)
    return smodCopy;
  else
    return BTLDetId::kSModulesInDM - smodCopy - 1;
}

int BTLElectronicsMapping::TOFHIRASIC(BTLDetId det) {
  uint32_t dmodule = det.dmodule();
  uint32_t smodCopy = det.smodule();
  return BTLElectronicsMapping::TOFHIRASIC(dmodule, smodCopy);
}

int BTLElectronicsMapping::TOFHIRASIC(uint32_t rawID) {
  BTLDetId theId(rawID);
  return BTLElectronicsMapping::TOFHIRASIC(theId);
}

/** Returns FE board number */
int BTLElectronicsMapping::FEBoardFromDM(uint32_t dmodule) { return dmodule; }

int BTLElectronicsMapping::FEBoard(BTLDetId det) {
  uint32_t dmodule = det.dmodule();
  return BTLElectronicsMapping::FEBoardFromDM(dmodule);
}

int BTLElectronicsMapping::FEBoard(uint32_t rawID) {
  BTLDetId theId(rawID);
  return BTLElectronicsMapping::FEBoard(theId);
}

/** Returns CC board number */
int BTLElectronicsMapping::CCBoardFromRU(uint32_t runit) { return runit; }

int BTLElectronicsMapping::CCBoard(BTLDetId det) {
  uint32_t runit = det.runit();
  return BTLElectronicsMapping::CCBoardFromRU(runit);
}

int BTLElectronicsMapping::CCBoard(uint32_t rawID) {
  BTLDetId theId(rawID);
  return BTLElectronicsMapping::CCBoard(theId);
}