File indexing completed on 2024-04-06 12:10:27
0001 #include "EventFilter/CSCRawToDigi/interface/CSCTMBHeader2020_TMB.h"
0002 #include "EventFilter/CSCRawToDigi/interface/CSCDMBHeader.h"
0003 #include "FWCore/Utilities/interface/Exception.h"
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 CSCTMBHeader2020_TMB::CSCTMBHeader2020_TMB() {
0019 bzero(data(), sizeInWords() * 2);
0020 bits.nHeaderFrames = 42;
0021 bits.e0bline = 0x6E0B;
0022 bits.b0cline = 0xDB0C;
0023 bits.firmRevCode = 0x801;
0024 bits.nTBins = 12;
0025 bits.nCFEBs = 5;
0026 }
0027
0028 CSCTMBHeader2020_TMB::CSCTMBHeader2020_TMB(const unsigned short* buf) { memcpy(data(), buf, sizeInWords() * 2); }
0029
0030 void CSCTMBHeader2020_TMB::setEventInformation(const CSCDMBHeader& dmbHeader) {
0031 bits.cscID = dmbHeader.dmbID();
0032 bits.l1aNumber = dmbHeader.l1a();
0033 bits.bxnCount = dmbHeader.bxn();
0034 }
0035
0036
0037 std::vector<CSCCLCTDigi> CSCTMBHeader2020_TMB::CLCTDigis(uint32_t idlayer) {
0038 std::vector<CSCCLCTDigi> result;
0039 unsigned halfstrip = bits.clct0_key_low + (bits.clct0_key_high << 7);
0040 unsigned strip = halfstrip % 32;
0041 unsigned cfeb = halfstrip / 32;
0042 unsigned pattern = bits.clct0_shape;
0043 unsigned bend = pattern & 0x1;
0044
0045 CSCCLCTDigi digi0(
0046 bits.clct0_valid, bits.clct0_quality, pattern, 1, bend, strip, cfeb, bits.clct_bxn, 1, bits.bxnPreTrigger);
0047
0048 halfstrip = bits.clct1_key_low + (bits.clct1_key_high << 7);
0049 strip = halfstrip % 32;
0050 cfeb = halfstrip / 32;
0051 pattern = bits.clct1_shape;
0052 bend = pattern & 0x1;
0053
0054 CSCCLCTDigi digi1(
0055 bits.clct1_valid, bits.clct1_quality, pattern, 1, bend, strip, cfeb, bits.clct_bxn, 2, bits.bxnPreTrigger);
0056 result.push_back(digi0);
0057 result.push_back(digi1);
0058 return result;
0059 }
0060
0061
0062 std::vector<CSCCorrelatedLCTDigi> CSCTMBHeader2020_TMB::CorrelatedLCTDigis(uint32_t idlayer) const {
0063 std::vector<CSCCorrelatedLCTDigi> result;
0064 unsigned strip = bits.MPC_Muon0_clct_key_halfstrip;
0065
0066
0067
0068 unsigned slope = 0;
0069 unsigned hmt = bits.MPC_Muon_HMT_bit0 | (bits.MPC_Muon_HMT_high << 1);
0070
0071
0072
0073
0074
0075
0076
0077 unsigned run3_pattern = 0;
0078
0079 unsigned run2_pattern = (bits.MPC_Muon0_clct_bend_low & 0x7) | (bits.MPC_Muon0_clct_bend_bit4 << 3);
0080
0081 CSCCorrelatedLCTDigi digi(1,
0082 bits.MPC_Muon0_lct_vpf,
0083 bits.MPC_Muon0_lct_quality,
0084 bits.MPC_Muon0_alct_key_wire,
0085 strip,
0086 run2_pattern,
0087 bits.MPC_Muon0_clct_LR,
0088 bits.MPC_Muon_alct_bxn,
0089 0,
0090 bits.MPC_Muon0_clct_bx0,
0091 0,
0092 0,
0093 CSCCorrelatedLCTDigi::Version::Run3,
0094 false,
0095 false,
0096 run3_pattern,
0097 slope);
0098 digi.setHMT(hmt);
0099 result.push_back(digi);
0100
0101 strip = bits.MPC_Muon1_clct_key_halfstrip;
0102
0103
0104
0105
0106
0107
0108
0109 run2_pattern = (bits.MPC_Muon1_clct_bend_low & 0x7) | (bits.MPC_Muon1_clct_bend_bit4 << 3);
0110 digi = CSCCorrelatedLCTDigi(2,
0111 bits.MPC_Muon1_lct_vpf,
0112 bits.MPC_Muon1_lct_quality,
0113 bits.MPC_Muon1_alct_key_wire,
0114 strip,
0115 run2_pattern,
0116 bits.MPC_Muon1_clct_LR,
0117 bits.MPC_Muon_alct_bxn,
0118 0,
0119 bits.MPC_Muon1_clct_bx0,
0120 0,
0121 0,
0122 CSCCorrelatedLCTDigi::Version::Run3,
0123 false,
0124 false,
0125 run3_pattern,
0126 slope);
0127 digi.setHMT(hmt);
0128 result.push_back(digi);
0129 return result;
0130 }
0131
0132 CSCShowerDigi CSCTMBHeader2020_TMB::showerDigi(uint32_t idlayer) const {
0133 unsigned hmt_bits = bits.MPC_Muon_HMT_bit0 | (bits.MPC_Muon_HMT_high << 1);
0134 uint16_t cscid = bits.cscID;
0135
0136
0137
0138 uint16_t bx = CSCConstants::LCT_CENTRAL_BX - bits.pop_l1a_match_win;
0139
0140
0141 CSCShowerDigi result(hmt_bits & 0x3,
0142 (hmt_bits >> 2) & 0x3,
0143 cscid,
0144 bx,
0145 CSCShowerDigi::ShowerType::kLCTShower,
0146 0,
0147 0);
0148 return result;
0149 }
0150
0151 CSCShowerDigi CSCTMBHeader2020_TMB::anodeShowerDigi(uint32_t idlayer) const {
0152 uint16_t cscid = bits.cscID;
0153 uint16_t bx = CSCConstants::LCT_CENTRAL_BX - bits.pop_l1a_match_win;
0154
0155 CSCShowerDigi result(
0156 bits.anode_hmt & 0x3, 0, cscid, bx, CSCShowerDigi::ShowerType::kALCTShower, 0, 0);
0157 return result;
0158 }
0159
0160 CSCShowerDigi CSCTMBHeader2020_TMB::cathodeShowerDigi(uint32_t idlayer) const {
0161 uint16_t cscid = bits.cscID;
0162 uint16_t bx = CSCConstants::LCT_CENTRAL_BX - bits.pop_l1a_match_win;
0163
0164 CSCShowerDigi result(bits.cathode_hmt & 0x3,
0165 0,
0166 cscid,
0167 bx,
0168 CSCShowerDigi::ShowerType::kCLCTShower,
0169 0,
0170 0);
0171 return result;
0172 }
0173
0174 void CSCTMBHeader2020_TMB::addALCT0(const CSCALCTDigi& digi) {
0175 throw cms::Exception("In CSC TMBHeaderFormat 2007, ALCTs belong in ALCT header");
0176 }
0177
0178 void CSCTMBHeader2020_TMB::addALCT1(const CSCALCTDigi& digi) {
0179 throw cms::Exception("In CSC TMBHeaderFormat 2007, ALCTs belong in ALCT header");
0180 }
0181
0182 void CSCTMBHeader2020_TMB::addCLCT0(const CSCCLCTDigi& digi) {
0183 unsigned halfStrip = digi.getKeyStrip();
0184 unsigned pattern = digi.getPattern();
0185 bits.clct0_valid = digi.isValid();
0186 bits.clct0_quality = digi.getQuality();
0187 bits.clct0_shape = pattern;
0188
0189 bits.clct0_key_low = halfStrip & (0x7F);
0190
0191 bits.clct0_key_high = (halfStrip >> 7) & (0x1);
0192 bits.clct_bxn = digi.getBX();
0193 bits.bxnPreTrigger = digi.getFullBX();
0194 }
0195
0196 void CSCTMBHeader2020_TMB::addCLCT1(const CSCCLCTDigi& digi) {
0197 unsigned halfStrip = digi.getKeyStrip();
0198 unsigned pattern = digi.getPattern();
0199 bits.clct1_valid = digi.isValid();
0200 bits.clct1_quality = digi.getQuality();
0201 bits.clct1_shape = pattern;
0202
0203 bits.clct1_key_low = halfStrip & (0x7F);
0204
0205 bits.clct1_key_high = (halfStrip >> 7) & (0x1);
0206
0207
0208 bits.bxnPreTrigger = digi.getFullBX();
0209 }
0210
0211 void CSCTMBHeader2020_TMB::addCorrelatedLCT0(const CSCCorrelatedLCTDigi& digi) {
0212 bits.MPC_Muon0_lct_vpf = digi.isValid();
0213 bits.MPC_Muon0_alct_key_wire = digi.getKeyWG();
0214 bits.MPC_Muon0_clct_key_halfstrip = digi.getStrip(2) & 0xFF;
0215
0216
0217
0218
0219
0220 bits.MPC_Muon0_clct_QuarterStrip = 0;
0221 bits.MPC_Muon0_clct_EighthStrip = 0;
0222 bits.MPC_Muon0_lct_quality = digi.getQuality() & 0x7;
0223
0224
0225
0226
0227
0228
0229
0230
0231 bits.MPC_Muon_clct_pattern_low = 0;
0232 bits.MPC_Muon_clct_pattern_bit5 = 0;
0233
0234 bits.MPC_Muon0_clct_bend_low = digi.getPattern() & 0x7;
0235 bits.MPC_Muon0_clct_bend_bit4 = (digi.getPattern() >> 3) & 0x1;
0236 bits.MPC_Muon0_clct_LR = digi.getBend() & 0x1;
0237 bits.MPC_Muon_HMT_bit0 = digi.getHMT() & 0x1;
0238 bits.MPC_Muon_HMT_high = (digi.getHMT() >> 1) & 0x7;
0239 bits.MPC_Muon_alct_bxn = digi.getBX();
0240 bits.MPC_Muon0_clct_bx0 = digi.getBX0();
0241 }
0242
0243 void CSCTMBHeader2020_TMB::addCorrelatedLCT1(const CSCCorrelatedLCTDigi& digi) {
0244 bits.MPC_Muon1_lct_vpf = digi.isValid();
0245 bits.MPC_Muon1_alct_key_wire = digi.getKeyWG();
0246 bits.MPC_Muon1_clct_key_halfstrip = digi.getStrip(2) & 0xFF;
0247
0248
0249
0250
0251
0252 bits.MPC_Muon1_clct_QuarterStrip = 0;
0253 bits.MPC_Muon1_clct_EighthStrip = 0;
0254 bits.MPC_Muon1_lct_quality = digi.getQuality() & 0x7;
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268 bits.MPC_Muon_clct_pattern_low = 0;
0269 bits.MPC_Muon_clct_pattern_bit5 = 0;
0270
0271 bits.MPC_Muon1_clct_bend_low = digi.getPattern() & 0x7;
0272 bits.MPC_Muon1_clct_bend_bit4 = (digi.getPattern() >> 3) & 0x1;
0273 bits.MPC_Muon1_clct_LR = digi.getBend() & 0x1;
0274 bits.MPC_Muon_HMT_bit0 = digi.getHMT() & 0x1;
0275 bits.MPC_Muon_HMT_high = (digi.getHMT() >> 1) & 0x7;
0276 bits.MPC_Muon_alct_bxn = digi.getBX();
0277 bits.MPC_Muon1_clct_bx0 = digi.getBX0();
0278 }
0279
0280 void CSCTMBHeader2020_TMB::addShower(const CSCShowerDigi& digi) {
0281 uint16_t hmt_bits = (digi.bitsInTime() & 0x3) + ((digi.bitsOutOfTime() & 0x3) << 2);
0282
0283 if (not digi.isValid())
0284 hmt_bits = ((digi.bitsOutOfTime() & 0x3) << 2);
0285 bits.MPC_Muon_HMT_bit0 = hmt_bits & 0x1;
0286 bits.MPC_Muon_HMT_high = (hmt_bits >> 1) & 0x7;
0287 if (digi.isValid())
0288 bits.pop_l1a_match_win = CSCConstants::LCT_CENTRAL_BX - digi.getBX();
0289 else
0290 bits.pop_l1a_match_win = 3;
0291 }
0292
0293 void CSCTMBHeader2020_TMB::addAnodeShower(const CSCShowerDigi& digi) {
0294 uint16_t hmt_bits = digi.bitsInTime() & 0x3;
0295 if (not digi.isValid())
0296 hmt_bits = 0;
0297 bits.anode_hmt = hmt_bits;
0298 if (digi.isValid())
0299 bits.pop_l1a_match_win = CSCConstants::LCT_CENTRAL_BX - digi.getBX();
0300 else
0301 bits.pop_l1a_match_win = 3;
0302 }
0303
0304 void CSCTMBHeader2020_TMB::addCathodeShower(const CSCShowerDigi& digi) {
0305
0306
0307
0308
0309 bits.cathode_hmt = 0;
0310 }
0311
0312 void CSCTMBHeader2020_TMB::print(std::ostream& os) const {
0313 os << "...............(O)TMB2020 TMB Run3 Header.................."
0314 << "\n";
0315 os << std::hex << "BOC LINE " << bits.b0cline << " EOB " << bits.e0bline << "\n";
0316 os << std::hex << "FW revision: 0x" << bits.firmRevCode << "\n";
0317 os << std::dec << "fifoMode = " << bits.fifoMode << ", nTBins = " << bits.nTBins << "\n";
0318 os << "boardID = " << bits.boardID << ", cscID = " << bits.cscID << "\n";
0319 os << "l1aNumber = " << bits.l1aNumber << ", bxnCount = " << bits.bxnCount << "\n";
0320 os << "trigSourceVect = " << bits.trigSourceVect << ", activeCFEBs = 0x" << std::hex
0321 << (bits.activeCFEBs | (bits.activeCFEBs_2 << 5)) << ", readCFEBs = 0x" << std::hex
0322 << (bits.readCFEBs | (bits.readCFEBs_2 << 5)) << std::dec << "\n";
0323 os << "bxnPreTrigger = " << bits.bxnPreTrigger << "\n";
0324 os << "ALCT location in CLCT window " << bits.matchWin << " L1A location in TMB window " << bits.pop_l1a_match_win
0325 << "\n";
0326 os << "tmbMatch = " << bits.tmbMatch << " alctOnly = " << bits.alctOnly << " clctOnly = " << bits.clctOnly << "\n";
0327
0328 os << "CLCT Words:\n"
0329 << " bits.clct0_valid = " << bits.clct0_valid << " bits.clct0_shape = " << bits.clct0_shape
0330 << " bits.clct0_quality = " << bits.clct0_quality
0331 << " halfstrip = " << (bits.clct0_key_low + (bits.clct0_key_high << 7)) << "\n";
0332
0333 os << " bits.clct1_valid = " << bits.clct1_valid << " bits.clct1_shape = " << bits.clct1_shape
0334 << " bits.clct1_quality = " << bits.clct1_quality
0335 << " halfstrip = " << (bits.clct1_key_low + (bits.clct1_key_high << 7)) << "\n";
0336
0337 os << "MPC Words:\n"
0338 << " LCT0 valid = " << bits.MPC_Muon0_lct_vpf << " key WG = " << bits.MPC_Muon0_alct_key_wire
0339 << " key halfstrip = " << bits.MPC_Muon0_clct_key_halfstrip
0340 << " 1/4strip flag = " << bits.MPC_Muon0_clct_QuarterStrip
0341 << " 1/8strip flag = " << bits.MPC_Muon0_clct_EighthStrip << "\n"
0342 << " quality = " << bits.MPC_Muon0_lct_quality
0343 << " slope/bend = " << ((bits.MPC_Muon0_clct_bend_low & 0x7) | (bits.MPC_Muon0_clct_bend_bit4 << 3))
0344 << " L/R bend = " << bits.MPC_Muon0_clct_LR << "\n";
0345
0346 os << " LCT1 valid = " << bits.MPC_Muon1_lct_vpf << " key WG = " << bits.MPC_Muon1_alct_key_wire
0347 << " key halfstrip = " << bits.MPC_Muon1_clct_key_halfstrip
0348 << " 1/4strip flag = " << bits.MPC_Muon1_clct_QuarterStrip
0349 << " 1/8strip flag = " << bits.MPC_Muon1_clct_EighthStrip << "\n"
0350 << " quality = " << bits.MPC_Muon1_lct_quality
0351 << " slope/bend = " << ((bits.MPC_Muon1_clct_bend_low & 0x7) | (bits.MPC_Muon1_clct_bend_bit4 << 3))
0352 << " L/R bend = " << bits.MPC_Muon1_clct_LR << "\n";
0353
0354 os << " clct_5bit_pattern_id = " << (bits.MPC_Muon_clct_pattern_low | (bits.MPC_Muon_clct_pattern_bit5 << 4))
0355 << " HMT = " << (bits.MPC_Muon_HMT_bit0 | (bits.MPC_Muon_HMT_high << 1)) << ", alctHMT = " << bits.anode_hmt
0356 << ", clctHMT = " << bits.cathode_hmt << "\n";
0357 }