File indexing completed on 2024-04-06 12:10:52
0001 #define EDM_ML_DEBUG 1
0002
0003 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0004
0005 #include "EventFilter/L1TRawToDigi/plugins/UnpackerFactory.h"
0006
0007 #include "L1Trigger/L1TCalorimeter/interface/CaloTools.h"
0008
0009 #include "CaloCollections.h"
0010 #include "L1TStage2Layer2Constants.h"
0011 #include "MPUnpacker_0x10010010.h"
0012
0013 namespace l1t {
0014 namespace stage2 {
0015 bool MPUnpacker_0x10010010::unpack(const Block& block, UnpackerCollections* coll) {
0016 LogDebug("L1T") << "Block ID = " << block.header().getID() << " size = " << block.header().getSize()
0017 << " AMC = " << block.amc().getAMCNumber();
0018
0019
0020 const unsigned int tmt = block.amc().getBoardID() - l1t::stage2::layer2::mp::offsetBoardId + 1;
0021 const unsigned int bxid = block.amc().getBX();
0022
0023
0024
0025 LogDebug("L1T") << "Unpacking TMT # " << tmt << " for BX " << bxid;
0026
0027 auto res1_ = static_cast<CaloCollections*>(coll)->getMPJets();
0028 auto res2_ = static_cast<CaloCollections*>(coll)->getMPEtSums();
0029 auto res3_ = static_cast<CaloCollections*>(coll)->getMPEGammas();
0030 auto res4_ = static_cast<CaloCollections*>(coll)->getMPTaus();
0031
0032 res1_->setBXRange(0, 0);
0033 res2_->setBXRange(0, 0);
0034 res3_->setBXRange(0, 0);
0035 res4_->setBXRange(0, 0);
0036
0037
0038 const int unsigned fet = 0;
0039 const int unsigned fht = 2;
0040 const int unsigned feg = 4;
0041 const int unsigned ftau = 6;
0042 const int unsigned fjet = 8;
0043 const int unsigned faux = 10;
0044
0045
0046
0047
0048
0049 uint32_t raw_data = block.payload()[fet];
0050
0051 l1t::EtSum ethf = l1t::EtSum();
0052
0053 switch (block.header().getID()) {
0054 case 123:
0055 ethf.setType(l1t::EtSum::kTotalEtHF);
0056 ethf.setHwPt(static_cast<int32_t>(uint32_t(raw_data & 0xFFFF)));
0057 break;
0058 case 121:
0059 ethf.setType(l1t::EtSum::kTotalEtxHF);
0060 ethf.setHwPt(static_cast<int32_t>(uint32_t(raw_data)));
0061 break;
0062 case 127:
0063 ethf.setType(l1t::EtSum::kTotalEtyHF);
0064 ethf.setHwPt(static_cast<int32_t>(uint32_t(raw_data)));
0065 break;
0066 case 125:
0067 ethf.setType(l1t::EtSum::kTotalEtHF);
0068 ethf.setHwPt(static_cast<int32_t>(uint32_t(raw_data & 0xFFFF)));
0069 break;
0070 case 131:
0071 ethf.setType(l1t::EtSum::kTotalEtxHF);
0072 ethf.setHwPt(static_cast<int32_t>(uint32_t(raw_data)));
0073 break;
0074 case 129:
0075 ethf.setType(l1t::EtSum::kTotalEtyHF);
0076 ethf.setHwPt(static_cast<int32_t>(uint32_t(raw_data)));
0077 break;
0078 default:
0079 break;
0080 }
0081
0082 LogDebug("L1T") << "ET/METx/METy: pT " << ethf.hwPt();
0083
0084 res2_->push_back(0, ethf);
0085
0086
0087
0088 raw_data = block.payload()[fet + 1];
0089
0090 l1t::EtSum etNoHF = l1t::EtSum();
0091
0092 switch (block.header().getID()) {
0093 case 123:
0094 etNoHF.setType(l1t::EtSum::kTotalEt);
0095 etNoHF.setHwPt(static_cast<int32_t>(uint32_t(raw_data & 0xFFFF)));
0096 break;
0097 case 121:
0098 etNoHF.setType(l1t::EtSum::kTotalEtx);
0099 etNoHF.setHwPt(static_cast<int32_t>(uint32_t(raw_data)));
0100 break;
0101 case 127:
0102 etNoHF.setType(l1t::EtSum::kTotalEty);
0103 etNoHF.setHwPt(static_cast<int32_t>(uint32_t(raw_data)));
0104 break;
0105 case 125:
0106 etNoHF.setType(l1t::EtSum::kTotalEt);
0107 etNoHF.setHwPt(static_cast<int32_t>(uint32_t(raw_data & 0xFFFF)));
0108 break;
0109 case 131:
0110 etNoHF.setType(l1t::EtSum::kTotalEtx);
0111 etNoHF.setHwPt(static_cast<int32_t>(uint32_t(raw_data)));
0112 break;
0113 case 129:
0114 etNoHF.setType(l1t::EtSum::kTotalEty);
0115 etNoHF.setHwPt(static_cast<int32_t>(uint32_t(raw_data)));
0116 break;
0117 default:
0118 break;
0119 }
0120
0121 LogDebug("L1T") << "ET/METx/METy (no HF): pT " << etNoHF.hwPt();
0122
0123 res2_->push_back(0, etNoHF);
0124
0125
0126
0127 raw_data = block.payload()[fht];
0128
0129 l1t::EtSum hthf = l1t::EtSum();
0130
0131 switch (block.header().getID()) {
0132 case 123:
0133 hthf.setType(l1t::EtSum::kTotalHtHF);
0134 hthf.setHwPt(static_cast<int32_t>(uint32_t(raw_data & 0xFFFF)));
0135 break;
0136 case 121:
0137 hthf.setType(l1t::EtSum::kTotalHtxHF);
0138 hthf.setHwPt(static_cast<int32_t>(uint32_t(raw_data)));
0139 break;
0140 case 127:
0141 hthf.setType(l1t::EtSum::kTotalHtyHF);
0142 hthf.setHwPt(static_cast<int32_t>(uint32_t(raw_data)));
0143 break;
0144 case 125:
0145 hthf.setType(l1t::EtSum::kTotalHtHF);
0146 hthf.setHwPt(static_cast<int32_t>(uint32_t(raw_data & 0xFFFF)));
0147 break;
0148 case 131:
0149 hthf.setType(l1t::EtSum::kTotalHtxHF);
0150 hthf.setHwPt(static_cast<int32_t>(uint32_t(raw_data)));
0151 break;
0152 case 129:
0153 hthf.setType(l1t::EtSum::kTotalHtyHF);
0154 hthf.setHwPt(static_cast<int32_t>(uint32_t(raw_data)));
0155 break;
0156 default:
0157 break;
0158 }
0159
0160 LogDebug("L1T") << "HTHF/MHTHFx/MHTHFy: pT " << hthf.hwPt();
0161
0162 res2_->push_back(0, hthf);
0163
0164
0165
0166 raw_data = block.payload()[fht + 1];
0167
0168 l1t::EtSum htNoHF = l1t::EtSum();
0169
0170 switch (block.header().getID()) {
0171 case 123:
0172 htNoHF.setType(l1t::EtSum::kTotalHt);
0173 htNoHF.setHwPt(static_cast<int32_t>(uint32_t(raw_data & 0xFFFF)));
0174 break;
0175 case 121:
0176 htNoHF.setType(l1t::EtSum::kTotalHtx);
0177 htNoHF.setHwPt(static_cast<int32_t>(uint32_t(raw_data)));
0178 break;
0179 case 127:
0180 htNoHF.setType(l1t::EtSum::kTotalHty);
0181 htNoHF.setHwPt(static_cast<int32_t>(uint32_t(raw_data)));
0182 break;
0183 case 125:
0184 htNoHF.setType(l1t::EtSum::kTotalHt);
0185 htNoHF.setHwPt(static_cast<int32_t>(uint32_t(raw_data & 0xFFFF)));
0186 break;
0187 case 131:
0188 htNoHF.setType(l1t::EtSum::kTotalHtx);
0189 htNoHF.setHwPt(static_cast<int32_t>(uint32_t(raw_data)));
0190 break;
0191 case 129:
0192 htNoHF.setType(l1t::EtSum::kTotalHty);
0193 htNoHF.setHwPt(static_cast<int32_t>(uint32_t(raw_data)));
0194 break;
0195 default:
0196 break;
0197 }
0198
0199 LogDebug("L1T") << "HTNOHF/MHTNOHFx/MHTNOHFy: pT " << htNoHF.hwPt();
0200
0201 res2_->push_back(0, htNoHF);
0202
0203
0204 for (unsigned nJet = 0; nJet < 2; nJet++) {
0205 raw_data = block.payload()[fjet + nJet];
0206
0207 if (raw_data == 0)
0208 continue;
0209
0210 l1t::Jet jet = l1t::Jet();
0211
0212 int etasign = 1;
0213 if ((block.header().getID() == 125) || (block.header().getID() == 131) || (block.header().getID() == 129)) {
0214 etasign = -1;
0215 }
0216
0217 LogDebug("L1") << "block ID=" << block.header().getID() << " etasign=" << etasign;
0218
0219 int mpEta = etasign * (raw_data & 0x3F);
0220 jet.setHwEta(CaloTools::caloEta(mpEta));
0221 jet.setHwPhi((raw_data >> 6) & 0x7F);
0222 jet.setHwPt((raw_data >> 13) & 0xFFFF);
0223 jet.setHwQual((raw_data >> 29) & 0x1);
0224
0225 if (jet.hwPt() == 0)
0226 continue;
0227
0228 LogDebug("L1T") << "Jet: eta " << jet.hwEta() << " phi " << jet.hwPhi() << " pT " << jet.hwPt() << " qual "
0229 << jet.hwQual();
0230
0231 jet.setP4(l1t::CaloTools::p4MP(&jet));
0232 res1_->push_back(0, jet);
0233 }
0234
0235
0236
0237
0238
0239 for (unsigned nEG = 0; nEG < 2; nEG++) {
0240 raw_data = block.payload()[feg + nEG];
0241
0242 if (raw_data == 0)
0243 continue;
0244
0245 l1t::EGamma eg = l1t::EGamma();
0246
0247 int etasign = 1;
0248 if ((block.header().getID() == 125) || (block.header().getID() == 131) || (block.header().getID() == 129)) {
0249 etasign = -1;
0250 }
0251
0252 LogDebug("L1") << "block ID=" << block.header().getID() << " etasign=" << etasign;
0253
0254 eg.setHwEta(etasign * ((raw_data >> 3) & 0x3F));
0255 eg.setHwPhi((raw_data >> 9) & 0x7F);
0256 eg.setHwPt((raw_data >> 20) & 0xFFF);
0257 eg.setHwIso((raw_data >> 1) & 0x3);
0258 eg.setHwQual((raw_data >> 16) & 0xf);
0259
0260 if (eg.hwPt() == 0)
0261 continue;
0262
0263 LogDebug("L1T") << "Egamma: eta " << eg.hwEta() << " phi " << eg.hwPhi() << " pT " << eg.hwPt() << " qual "
0264 << eg.hwQual();
0265
0266 eg.setP4(l1t::CaloTools::p4MP(&eg));
0267 res3_->push_back(0, eg);
0268 }
0269
0270
0271
0272
0273
0274 for (unsigned nTau = 0; nTau < 2; nTau++) {
0275 raw_data = block.payload()[ftau + nTau];
0276
0277 if (raw_data == 0)
0278 continue;
0279
0280 l1t::Tau tau = l1t::Tau();
0281
0282 int etasign = 1;
0283 if ((block.header().getID() == 125) || (block.header().getID() == 131) || (block.header().getID() == 129)) {
0284 etasign = -1;
0285 }
0286
0287 LogDebug("L1") << "block ID=" << block.header().getID() << " etasign=" << etasign;
0288
0289 tau.setHwEta(etasign * ((raw_data >> 3) & 0x3F));
0290 tau.setHwPhi((raw_data >> 9) & 0x7F);
0291 tau.setHwPt((raw_data >> 20) & 0xFFF);
0292 tau.setHwIso((raw_data >> 1) & 0x3);
0293 tau.setHwQual((raw_data >> 16) & 0xf);
0294
0295 if (tau.hwPt() == 0)
0296 continue;
0297
0298 LogDebug("L1T") << "Tau: eta " << tau.hwEta() << " phi " << tau.hwPhi() << " pT " << tau.hwPt() << " qual "
0299 << tau.hwQual();
0300
0301 tau.setP4(l1t::CaloTools::p4MP(&tau));
0302 res4_->push_back(0, tau);
0303 }
0304
0305
0306
0307
0308 if (block.header().getSize() > faux) {
0309
0310 raw_data = block.payload()[faux];
0311
0312
0313 switch (block.header().getID()) {
0314 case 121:
0315 {
0316
0317 l1t::EtSum mbp0{l1t::EtSum::kMinBiasHFP0};
0318 mbp0.setHwPt((raw_data >> 24) & 0xF);
0319
0320
0321 l1t::EtSum mbm0{l1t::EtSum::kMinBiasHFM0};
0322 mbm0.setHwPt((raw_data >> 16) & 0xF);
0323
0324
0325 l1t::EtSum mbp1{l1t::EtSum::kMinBiasHFP1};
0326 mbp1.setHwPt((raw_data >> 8) & 0xF);
0327
0328
0329 l1t::EtSum mbm1{l1t::EtSum::kMinBiasHFM1};
0330 mbm1.setHwPt(raw_data & 0xF);
0331
0332 LogDebug("L1T") << "mbp0 HF sum: " << mbp0.hwPt();
0333 LogDebug("L1T") << "mbm0 HF sum: " << mbm0.hwPt();
0334 LogDebug("L1T") << "mbp1 HF sum: " << mbp1.hwPt();
0335 LogDebug("L1T") << "mbm1 HF sum: " << mbm1.hwPt();
0336
0337 res2_->push_back(0, mbp0);
0338 res2_->push_back(0, mbm0);
0339 res2_->push_back(0, mbp1);
0340 res2_->push_back(0, mbm1);
0341 break;
0342 }
0343 default:
0344 break;
0345 }
0346 }
0347
0348 return true;
0349 }
0350 }
0351 }
0352
0353 DEFINE_L1T_UNPACKER(l1t::stage2::MPUnpacker_0x10010010);