File indexing completed on 2024-04-06 12:07:12
0001 #include "DQM/EcalCommon/interface/EcalDQMCommonUtils.h"
0002
0003 #include "DataFormats/EcalDetId/interface/EcalPnDiodeDetId.h"
0004
0005 #include <mutex>
0006
0007 namespace ecaldqm {
0008 unsigned memarr[] = {kEEm07, kEEm08, kEEm02, kEEm03, kEBm01, kEBm02, kEBm03, kEBm04, kEBm05, kEBm06, kEBm07,
0009 kEBm08, kEBm09, kEBm10, kEBm11, kEBm12, kEBm13, kEBm14, kEBm15, kEBm16, kEBm17, kEBm18,
0010 kEBp01, kEBp02, kEBp03, kEBp04, kEBp05, kEBp06, kEBp07, kEBp08, kEBp09, kEBp10, kEBp11,
0011 kEBp12, kEBp13, kEBp14, kEBp15, kEBp16, kEBp17, kEBp18, kEEp07, kEEp08, kEEp02, kEEp03};
0012 const std::vector<unsigned> memDCC(memarr, memarr + 44);
0013
0014 const double etaBound(1.479);
0015
0016 unsigned dccId(const DetId &_id, const EcalElectronicsMapping *map) {
0017 unsigned subdet(_id.subdetId());
0018
0019 if (subdet == EcalBarrel)
0020 return map->DCCid(EBDetId(_id));
0021 else if (subdet == EcalTriggerTower)
0022 return map->DCCid(EcalTrigTowerDetId(_id));
0023 else if (subdet == EcalEndcap) {
0024 if (isEcalScDetId(_id))
0025 return map->getDCCandSC(EcalScDetId(_id)).first;
0026 else
0027 return map->getElectronicsId(EEDetId(_id)).dccId();
0028 } else if (subdet == EcalLaserPnDiode)
0029 return EcalPnDiodeDetId(_id).iDCCId();
0030
0031 throw cms::Exception("InvalidDetId") << "EcalDQMCommonUtils::dccId(" << _id.rawId() << ")" << std::endl;
0032
0033 return 0;
0034 }
0035
0036 unsigned dccId(const EcalElectronicsId &_id) { return _id.dccId(); }
0037
0038 unsigned memDCCId(unsigned _index) {
0039
0040
0041 if (_index >= memDCC.size())
0042 return 0;
0043 return memDCC.at(_index) + 1;
0044 }
0045
0046 unsigned memDCCIndex(unsigned _dccid) {
0047 std::vector<unsigned>::const_iterator itr(std::find(memDCC.begin(), memDCC.end(), _dccid - 1));
0048 if (itr == memDCC.end())
0049 return -1;
0050
0051 return (itr - memDCC.begin());
0052 }
0053
0054 unsigned tccId(const DetId &_id, const EcalElectronicsMapping *map) {
0055 unsigned subdet(_id.subdetId());
0056
0057 if (subdet == EcalBarrel)
0058 return map->TCCid(EBDetId(_id));
0059 else if (subdet == EcalTriggerTower)
0060 return map->TCCid(EcalTrigTowerDetId(_id));
0061 else if (subdet == EcalEndcap) {
0062 if (isEcalScDetId(_id))
0063 return 0;
0064 else
0065 return map->getTriggerElectronicsId(EEDetId(_id)).tccId();
0066 }
0067
0068 throw cms::Exception("InvalidDetId") << "EcalDQMCommonUtils::tccId(" << uint32_t(_id) << ")" << std::endl;
0069
0070 return 0;
0071 }
0072
0073 unsigned tccId(const EcalElectronicsId &_id, const EcalElectronicsMapping *map) {
0074 return map->getTriggerElectronicsId(_id).tccId();
0075 }
0076
0077 unsigned towerId(const DetId &_id, const EcalElectronicsMapping *map) {
0078 unsigned subdet(_id.subdetId());
0079
0080 if (subdet == EcalBarrel)
0081 return EBDetId(_id).tower().iTT();
0082 else if (subdet == EcalTriggerTower)
0083 return EcalTrigTowerDetId(_id).iTT();
0084 else if (subdet == EcalEndcap) {
0085 if (isEcalScDetId(_id))
0086 return map->getDCCandSC(EcalScDetId(_id)).second;
0087 else
0088 return map->getElectronicsId(EEDetId(_id)).towerId();
0089 }
0090
0091 throw cms::Exception("InvalidDetId") << "EcalDQMCommonUtils::towerId(" << std::hex << uint32_t(_id) << ")"
0092 << std::endl;
0093
0094 return 0;
0095 }
0096
0097 unsigned towerId(const EcalElectronicsId &_id) { return _id.towerId(); }
0098
0099 unsigned ttId(const DetId &_id, const EcalElectronicsMapping *map) {
0100 unsigned subdet(_id.subdetId());
0101
0102 if (subdet == EcalBarrel)
0103 return EBDetId(_id).tower().iTT();
0104 else if (subdet == EcalTriggerTower)
0105 return map->iTT(EcalTrigTowerDetId(_id));
0106 else if (subdet == EcalEndcap && !isEcalScDetId(_id))
0107 return map->getTriggerElectronicsId(_id).ttId();
0108
0109 throw cms::Exception("InvalidDetId") << "EcalDQMCommonUtils::ttId(" << std::hex << uint32_t(_id) << ")"
0110 << std::endl;
0111
0112 return 0;
0113 }
0114
0115 unsigned ttId(const EcalElectronicsId &_id, const EcalElectronicsMapping *map) {
0116 return map->getTriggerElectronicsId(_id).ttId();
0117 }
0118
0119 unsigned rtHalf(DetId const &_id, const EcalElectronicsMapping *electronicsMap) {
0120 if (_id.subdetId() == EcalBarrel) {
0121 int ic(EBDetId(_id).ic());
0122 if ((ic - 1) / 20 > 4 && (ic - 1) % 20 < 10)
0123 return 1;
0124 } else {
0125 unsigned iDCC(dccId(_id, electronicsMap) - 1);
0126 if ((iDCC == kEEm05 || iDCC == kEEp05) && EEDetId(_id).ix() > 50)
0127 return 1;
0128 }
0129
0130 return 0;
0131 }
0132
0133 std::pair<unsigned, unsigned> innerTCCs(unsigned _dccId) {
0134 int iDCC(_dccId - 1);
0135 std::pair<unsigned, unsigned> res;
0136 if (iDCC <= kEEmHigh) {
0137 res.first = (iDCC - kEEmLow) * 2;
0138 if (res.first == 0)
0139 res.first = 18;
0140 res.second = (iDCC - kEEmLow) * 2 + 1;
0141 } else if (iDCC < -kEBpHigh)
0142 res.first = res.second = _dccId + 27;
0143 else {
0144 res.first = (iDCC - kEEpLow) * 2 + 90;
0145 if (res.first == 90)
0146 res.first = 108;
0147 res.second = (iDCC - kEEpLow) * 2 + 91;
0148 }
0149
0150 return res;
0151 }
0152
0153 std::pair<unsigned, unsigned> outerTCCs(unsigned _dccId) {
0154 int iDCC(_dccId - 1);
0155 std::pair<unsigned, unsigned> res;
0156 if (iDCC <= kEEmHigh) {
0157 res.first = (iDCC - kEEmLow) * 2 + 18;
0158 if (res.first == 18)
0159 res.first = 36;
0160 res.second = (iDCC - kEEmLow) * 2 + 19;
0161 } else if (iDCC <= kEBpHigh)
0162 res.first = res.second = _dccId + 27;
0163 else {
0164 res.first = (iDCC - kEEpLow) * 2 + 72;
0165 if (res.first == 72)
0166 res.first = 90;
0167 res.second = (iDCC - kEEpLow) * 2 + 73;
0168 }
0169
0170 return res;
0171 }
0172
0173 std::vector<DetId> scConstituents(EcalScDetId const &_scid) {
0174 std::vector<DetId> res;
0175
0176 int ixbase((_scid.ix() - 1) * 5);
0177 int iybase((_scid.iy() - 1) * 5);
0178
0179 for (int ix(1); ix <= 5; ++ix) {
0180 for (int iy(1); iy <= 5; ++iy) {
0181 if (EEDetId::validDetId(ixbase + ix, iybase + iy, _scid.zside()))
0182 res.push_back(EEDetId(ixbase + ix, iybase + iy, _scid.zside()));
0183 }
0184 }
0185
0186 return res;
0187 }
0188
0189 int zside(const DetId &_id) {
0190 uint32_t rawId(_id);
0191
0192 switch (_id.subdetId()) {
0193 case EcalBarrel:
0194 return (((rawId >> 16) & 0x1) == 1 ? 1 : -1);
0195 case EcalEndcap:
0196 return (((rawId >> 14) & 0x1) == 1 ? 1 : -1);
0197 case EcalTriggerTower:
0198 return (((rawId >> 15) & 0x1) == 1 ? 1 : -1);
0199 case EcalLaserPnDiode:
0200 return (((rawId >> 4) & 0x7f) > kEBpLow ? 1 : -1);
0201 default:
0202 throw cms::Exception("InvalidDetId")
0203 << "EcalDQMCommonUtils::zside(" << std::hex << uint32_t(_id) << ")" << std::endl;
0204 }
0205
0206 return 0;
0207 }
0208
0209 double eta(const EBDetId &_ebid, const CaloGeometry *geometry) {
0210 return _ebid.approxEta() + (_ebid.zside() < 0 ? 0.5 : -0.5) * EBDetId::crystalUnitToEta;
0211 }
0212
0213 double eta(const EEDetId &_id, const CaloGeometry *geometry) { return geometry->getPosition(_id).eta(); }
0214
0215 double phi(EBDetId const &_ebid) {
0216 const double degToRad(0.0174533);
0217 return (_ebid.iphi() - 10.5) * degToRad;
0218 }
0219
0220 double phi(EEDetId const &_eeid) {
0221 const double degToRad(0.0174533);
0222 double p(std::atan2(_eeid.ix() - 50.5, _eeid.iy() - 50.5));
0223 if (p < -10. * degToRad)
0224 p += 360. * degToRad;
0225 return p;
0226 }
0227
0228 double phi(EcalTrigTowerDetId const &_ttid) {
0229 const double degToRad(0.0174533);
0230 double p((_ttid.iphi() - 0.5) * 5. * degToRad);
0231 if (p > 350. * degToRad)
0232 p -= 360. * degToRad;
0233 return p;
0234 }
0235
0236 double phi(double _phi) {
0237 const double degToRad(0.0174533);
0238 if (_phi < -10. * degToRad)
0239 _phi += 360. * degToRad;
0240 return _phi;
0241 }
0242
0243 bool isForward(DetId const &_id) {
0244
0245
0246 if (_id.subdetId() != EcalEndcap)
0247 return false;
0248 if (isEcalScDetId(_id)) {
0249 EcalScDetId scid(_id);
0250 return (scid.ix() - 10) * (scid.ix() - 10) + (scid.iy() - 10) * (scid.iy() - 10) < 25.;
0251 } else {
0252 EEDetId eeid(_id);
0253 return (eeid.ix() - 50) * (eeid.ix() - 50) + (eeid.iy() - 50) * (eeid.iy() - 50) < 625.;
0254 }
0255 }
0256
0257 bool isCrystalId(const DetId &_id) {
0258 return (_id.det() == DetId::Ecal) &&
0259 ((_id.subdetId() == EcalBarrel) || ((_id.subdetId() == EcalEndcap) && (((_id.rawId() >> 15) & 0x1) == 0)));
0260 }
0261
0262 bool isSingleChannelId(const DetId &_id) {
0263 return (_id.det() == DetId::Ecal) && (isCrystalId(_id) || (_id.subdetId() == EcalLaserPnDiode));
0264 }
0265
0266 bool isEcalScDetId(const DetId &_id) {
0267 return (_id.det() == DetId::Ecal) && ((_id.subdetId() == EcalEndcap) && ((_id.rawId() >> 15) & 0x1));
0268 }
0269
0270 bool isEndcapTTId(const DetId &_id) {
0271 return (_id.det() == DetId::Ecal) && ((_id.subdetId() == EcalTriggerTower) && (((_id.rawId() >> 7) & 0x7f) > 17));
0272 }
0273
0274 unsigned dccId(std::string const &_smName) {
0275 unsigned smNumber(std::atoi(_smName.substr(3).c_str()));
0276
0277 if (_smName.find("EE-") == 0)
0278 return kEEmLow + 1 + ((smNumber + 2) % 9);
0279 else if (_smName.find("EB-") == 0)
0280 return kEBmLow + 1 + smNumber;
0281 else if (_smName.find("EB+") == 0)
0282 return kEBpLow + 1 + smNumber;
0283 else if (_smName.find("EE+") == 0)
0284 return kEEpLow + 1 + ((smNumber + 2) % 9);
0285 else
0286 return 0;
0287 }
0288
0289 std::string smName(unsigned _dccId) {
0290 std::stringstream ss;
0291
0292 unsigned iSM(_dccId - 1);
0293
0294 if (iSM <= kEEmHigh)
0295 ss << "EE-" << std::setw(2) << std::setfill('0') << (((iSM - kEEmLow + 6) % 9) + 1);
0296 else if (iSM <= kEBmHigh)
0297 ss << "EB-" << std::setw(2) << std::setfill('0') << (iSM - kEBmLow + 1);
0298 else if (iSM <= kEBpHigh)
0299 ss << "EB+" << std::setw(2) << std::setfill('0') << (iSM - kEBpLow + 1);
0300 else if (iSM <= kEEpHigh)
0301 ss << "EE+" << std::setw(2) << std::setfill('0') << (((iSM - kEEpLow + 6) % 9) + 1);
0302
0303 return ss.str();
0304 }
0305
0306
0307 unsigned EEPnDCC(unsigned _dee, unsigned _ab) {
0308 switch (_dee) {
0309 case 1:
0310 if (_ab == 0)
0311 return 50;
0312 else
0313 return 51;
0314 case 2:
0315 if (_ab == 0)
0316 return 47;
0317 else
0318 return 46;
0319 case 3:
0320 if (_ab == 0)
0321 return 1;
0322 else
0323 return 2;
0324 case 4:
0325 if (_ab == 0)
0326 return 5;
0327 else
0328 return 6;
0329 default:
0330 return 0;
0331 }
0332 }
0333
0334 unsigned nCrystals(unsigned _dccId) {
0335 unsigned iSM(_dccId - 1);
0336
0337 if (iSM >= kEBmLow && iSM <= kEBpHigh)
0338 return 1700;
0339
0340 switch (iSM) {
0341 case kEEm05:
0342 case kEEp05:
0343 return 810;
0344 case kEEm07:
0345 case kEEm03:
0346 case kEEp07:
0347 case kEEp03:
0348 return 830;
0349 case kEEm09:
0350 case kEEm01:
0351 case kEEp09:
0352 case kEEp01:
0353 return 815;
0354 case kEEm08:
0355 case kEEm02:
0356 case kEEp08:
0357 case kEEp02:
0358 return 791;
0359 case kEEm04:
0360 case kEEm06:
0361 case kEEp04:
0362 case kEEp06:
0363 return 821;
0364 default:
0365 return 0;
0366 }
0367 }
0368
0369 unsigned nSuperCrystals(unsigned _dccId) {
0370 unsigned iSM(_dccId - 1);
0371
0372 if (iSM >= kEBmLow && iSM <= kEBpHigh)
0373 return 68;
0374
0375 switch (iSM) {
0376 case kEEm05:
0377 case kEEp05:
0378 return 41;
0379 case kEEm07:
0380 case kEEm03:
0381 case kEEp07:
0382 case kEEp03:
0383 return 34;
0384 case kEEm09:
0385 case kEEm01:
0386 case kEEm04:
0387 case kEEm06:
0388 case kEEp09:
0389 case kEEp01:
0390 case kEEp04:
0391 case kEEp06:
0392 return 33;
0393 case kEEm08:
0394 case kEEm02:
0395 case kEEp08:
0396 case kEEp02:
0397 return 32;
0398 default:
0399 return 0;
0400 }
0401 }
0402
0403 bool ccuExists(unsigned _dccId, unsigned _towerId) {
0404 if (_towerId == 69 || _towerId == 70)
0405 return true;
0406 else if ((_dccId == 8 || _dccId == 53) && _towerId >= 18 && _towerId <= 24)
0407 return false;
0408 else if (_dccId <= kEEmHigh + 1 || _dccId >= kEEpLow + 1)
0409 return _towerId <= nSuperCrystals(_dccId);
0410 else
0411 return _towerId <= 68;
0412 }
0413 }