File indexing completed on 2023-03-17 10:50:02
0001 #include "DataFormats/HcalDetId/interface/HcalCalibDetId.h"
0002 #include "DataFormats/HcalDetId/interface/HcalSubdetector.h"
0003 #include "FWCore/Utilities/interface/Exception.h"
0004
0005 HcalCalibDetId::HcalCalibDetId() : HcalOtherDetId() {}
0006
0007 HcalCalibDetId::HcalCalibDetId(uint32_t rawid) : HcalOtherDetId(rawid) {}
0008
0009 HcalCalibDetId::HcalCalibDetId(HcalSubdetector subdet, int ieta, int iphi, int ctype)
0010 : HcalOtherDetId(HcalCalibration) {
0011 id_ |= (CalibrationBox << 17);
0012 id_ |= (ctype & 0xF);
0013 id_ |= (((ieta + 2) & 0x7) << 11);
0014 id_ |= ((subdet & 0x7) << 14);
0015 if (subdet == 4)
0016 id_ |= ((((((((iphi - 1) & 0x7E) + 1) / 18) * 18) + 1) & 0x7F)
0017 << 4);
0018
0019
0020 else if (subdet == 1 || subdet == 2)
0021 id_ |= (((((((iphi + 1) >> 2) & 0x1F) << 2) + 71) % 72)
0022 << 4);
0023 else if (subdet == 3 && ieta == 0)
0024 id_ |= (((((((iphi + 1) / 6) * 6) + 71) % 72) & 0x7F)
0025 << 4);
0026 else if (subdet == 3 && ieta != 0)
0027 id_ |= (((((((iphi + 1) / 12) * 12) + 71) % 72) & 0x7F)
0028 << 4);
0029 else
0030 id_ |= ((iphi & 0x7F) << 4);
0031 }
0032
0033
0034 HcalCalibDetId::HcalCalibDetId(int ieta, int iphi) : HcalOtherDetId(HcalCalibration) {
0035 id_ |= (HOCrosstalk << 17);
0036 id_ |= (iphi & 0x7F)
0037 | ((abs(ieta) & 0xF) << 7)
0038 | (((ieta > 0) ? (1) : (0)) << 11);
0039 }
0040
0041 HcalCalibDetId::HcalCalibDetId(CalibDetType dt, int ieta, int iphi) : HcalOtherDetId(HcalCalibration) {
0042 id_ |= (dt << 17);
0043 id_ |= (iphi & 0x7F);
0044
0045 (dt == HOCrosstalk) ? (id_ |= ((abs(ieta) & 0xF) << 7) | (((ieta > 0) ? (1) : (0)) << 11))
0046 : (id_ |= ((abs(ieta) & 0x1F) << 7) | (((ieta > 0) ? (1) : (0)) << 12));
0047 }
0048
0049 HcalCalibDetId::HcalCalibDetId(CalibDetType dt, int value) : HcalOtherDetId(HcalCalibration) {
0050 id_ |= (dt << 17);
0051 id_ |= value & 0xFF;
0052 }
0053
0054 HcalCalibDetId::HcalCalibDetId(CalibDetType dt, int value1, int value2, int value3) : HcalOtherDetId(HcalCalibration) {
0055 id_ |= (dt << 17);
0056 id_ |= (value1 & 0x3F) << 10;
0057 id_ |= (value2 & 0x1F) << 5;
0058 id_ |= (value3 & 0x1F);
0059 }
0060
0061 HcalCalibDetId::HcalCalibDetId(const DetId& gen) {
0062 if (!gen.null() && (gen.det() != Hcal || gen.subdetId() != HcalOther)) {
0063 throw cms::Exception("Invalid DetId")
0064 << "Cannot initialize HcalCalibDetId from " << std::hex << gen.rawId() << std::dec;
0065 }
0066 id_ = gen.rawId();
0067 if (subdet() != HcalCalibration) {
0068 throw cms::Exception("Invalid DetId")
0069 << "Cannot initialize HcalCalibDetId from " << std::hex << gen.rawId() << std::dec;
0070 }
0071 }
0072
0073 HcalCalibDetId& HcalCalibDetId::operator=(const DetId& gen) {
0074 if (!gen.null() && (gen.det() != Hcal || gen.subdetId() != HcalOther)) {
0075 throw cms::Exception("Invalid DetId")
0076 << "Cannot assign HcalCalibDetId from " << std::hex << gen.rawId() << std::dec;
0077 }
0078 id_ = gen.rawId();
0079 if (subdet() != HcalCalibration) {
0080 throw cms::Exception("Invalid DetId")
0081 << "Cannot assign HcalCalibDetId from " << std::hex << gen.rawId() << std::dec;
0082 }
0083 return *this;
0084 }
0085
0086 int HcalCalibDetId::cboxChannel() const {
0087 return (calibFlavor() == CalibrationBox || calibFlavor() == LASERMON) ? (id_ & 0xF) : (0);
0088 }
0089
0090 HcalSubdetector HcalCalibDetId::hcalSubdet() const {
0091 return (HcalSubdetector)((calibFlavor() == CalibrationBox) ? ((id_ >> 14) & 0x7) : (0));
0092 }
0093
0094 int HcalCalibDetId::ieta() const {
0095 CalibDetType cf = calibFlavor();
0096 return (cf == CalibrationBox)
0097 ? (((id_ >> 11) & 0x7) - 2)
0098 : ((cf == HOCrosstalk)
0099 ? (((id_ >> 7) & 0xF) * zside())
0100 : (cf == LASERMON ? ((id_ >> 10) & 0x3F)
0101 : (((cf == HBX || cf == HEX) ? ((id_ >> 7) & 0x1F) * zside() : (0)))));
0102 }
0103
0104 int HcalCalibDetId::iphi() const {
0105 CalibDetType cf = calibFlavor();
0106 return (cf == CalibrationBox)
0107 ? ((id_ >> 4) & 0x7F)
0108 : ((cf == HOCrosstalk || cf == HBX || cf == HEX) ? (id_ & 0x7F)
0109 : (cf == LASERMON ? ((id_ >> 5) & 0x1F) : (0)));
0110 }
0111
0112 int HcalCalibDetId::zside() const {
0113 CalibDetType cf = calibFlavor();
0114 return (cf == HOCrosstalk) ? (((id_ >> 11) & 0x1) ? (1) : (-1))
0115 : ((cf == HBX || cf == HEX) ? (((id_ >> 12) & 0x1) ? (1) : (-1)) : (0));
0116 }
0117
0118 std::string HcalCalibDetId::cboxChannelString() const {
0119 switch (cboxChannel()) {
0120 case (cbox_MixerHigh):
0121 return "Mixer-High";
0122 case (cbox_MixerLow):
0123 return "Mixer-Low";
0124 case (cbox_LaserMegatile):
0125 return "Megatile";
0126 case (cbox_RadDam_Layer0_RM4):
0127 return "RadDam-L0-RM4";
0128 case (cbox_RadDam_Layer7_RM4):
0129 return "RadDam-L7-RM4";
0130 case (cbox_RadDam_Layer0_RM1):
0131 return "RadDam-L0-RM1";
0132 case (cbox_RadDam_Layer7_RM1):
0133 return "RadDam-L7-RM1";
0134 case (cbox_HOCrosstalkPIN):
0135 return "HO-Crosstalk-PIN";
0136 case (cbox_HF_ScintillatorPIN):
0137 return "HF-Scint-PIN";
0138 default:
0139 return "";
0140 }
0141 }
0142
0143 int HcalCalibDetId::channel() const { return (calibFlavor() == uMNqie) ? (id_ & 0xFF) : (id_ & 0x1F); }
0144
0145 int HcalCalibDetId::fiber() const { return (calibFlavor() == CastorRadFacility) ? ((id_ >> 5) & 0x1F) : (0); }
0146
0147 int HcalCalibDetId::rm() const { return (calibFlavor() == CastorRadFacility) ? ((id_ >> 10) & 0x3F) : (0); }
0148
0149 std::ostream& operator<<(std::ostream& s, const HcalCalibDetId& id) {
0150 std::string sd;
0151 switch (id.hcalSubdet()) {
0152 case (HcalBarrel):
0153 sd = "HB";
0154 break;
0155 case (HcalEndcap):
0156 sd = "HE";
0157 break;
0158 case (HcalOuter):
0159 sd = "HO";
0160 break;
0161 case (HcalForward):
0162 sd = "HF";
0163 break;
0164 default:
0165 break;
0166 }
0167 switch (id.calibFlavor()) {
0168 case (HcalCalibDetId::CalibrationBox):
0169 return s << "(HcalCalibBox " << sd << ' ' << id.ieta() << "," << id.iphi() << ' ' << id.cboxChannelString()
0170 << ')';
0171 case (HcalCalibDetId::HOCrosstalk):
0172 return s << "(HOCrosstalk " << id.ieta() << "," << id.iphi() << ')';
0173 case (HcalCalibDetId::uMNqie):
0174 return s << "(uMNqie " << id.channel() << ')';
0175 case (HcalCalibDetId::LASERMON):
0176 return s << "(LASERMON" << id.channel() << ')';
0177 case (HcalCalibDetId::CastorRadFacility):
0178 return s << "(CastorRadFacility " << id.rm() << " / " << id.fiber() << " / " << id.channel() << ')';
0179 case (HcalCalibDetId::HBX):
0180 return s << "(HBX " << id.ieta() << "," << id.iphi() << ")";
0181 case (HcalCalibDetId::HEX):
0182 return s << "(HEX " << id.ieta() << "," << id.iphi() << ")";
0183 default:
0184 return s;
0185 };
0186 }