File indexing completed on 2023-03-17 11:13:21
0001 #include <fstream>
0002 #include <iostream>
0003 #include <memory>
0004 #include <string>
0005 using std::cerr;
0006 using std::cout;
0007 using std::endl;
0008 using std::ostream;
0009
0010 #include <iomanip>
0011
0012 #include "FWCore/Framework/interface/Event.h"
0013 #include "FWCore/Framework/interface/Frameworkfwd.h"
0014 #include "FWCore/Framework/interface/MakerMacros.h"
0015 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0016
0017 #include "L1Trigger/RegionalCaloTrigger/interface/L1RCTSaveInput.h"
0018
0019 #include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
0020 #include "DataFormats/HcalDigi/interface/HcalDigiCollections.h"
0021 #include "DataFormats/L1CaloTrigger/interface/L1CaloCollections.h"
0022
0023 #include "L1Trigger/RegionalCaloTrigger/interface/L1RCT.h"
0024 #include "L1Trigger/RegionalCaloTrigger/interface/L1RCTLookupTables.h"
0025
0026 L1RCTSaveInput::L1RCTSaveInput(const edm::ParameterSet &conf)
0027 : fileName(conf.getUntrackedParameter<std::string>("rctTestInputFile")),
0028 rctLookupTables(new L1RCTLookupTables),
0029 rct(new L1RCT(rctLookupTables)),
0030 useEcal(conf.getParameter<bool>("useEcal")),
0031 useHcal(conf.getParameter<bool>("useHcal")),
0032 ecalDigisToken_(consumes(conf.getParameter<edm::InputTag>("ecalDigisLabel"))),
0033 hcalDigisToken_(consumes(conf.getParameter<edm::InputTag>("hcalDigisLabel"))),
0034 rctParametersToken_(esConsumes<L1RCTParameters, L1RCTParametersRcd>()),
0035 channelMaskToken_(esConsumes<L1RCTChannelMask, L1RCTChannelMaskRcd>()),
0036 emScaleToken_(esConsumes<L1CaloEtScale, L1EmEtScaleRcd>()),
0037 transcoderToken_(esConsumes<CaloTPGTranscoder, CaloTPGRecord>()),
0038 hcalScaleToken_(esConsumes<L1CaloHcalScale, L1CaloHcalScaleRcd>()),
0039 ecalScaleToken_(esConsumes<L1CaloEcalScale, L1CaloEcalScaleRcd>()),
0040 useDebugTpgScales(conf.getParameter<bool>("useDebugTpgScales")),
0041 tokens_(consumesCollector()) {
0042 ofs.open(fileName.c_str(), std::ios::app);
0043 if (!ofs) {
0044 throw cms::Exception("FailedFileOpen") << "Could not create " << fileName << std::endl;
0045 }
0046 }
0047
0048 L1RCTSaveInput::~L1RCTSaveInput() {
0049 if (rct != nullptr)
0050 delete rct;
0051 if (rctLookupTables != nullptr)
0052 delete rctLookupTables;
0053 }
0054
0055 void L1RCTSaveInput::analyze(const edm::Event &event, const edm::EventSetup &eventSetup) {
0056 edm::ESHandle<L1RCTParameters> rctParameters = eventSetup.getHandle(rctParametersToken_);
0057 const L1RCTParameters *r = rctParameters.product();
0058 edm::ESHandle<L1RCTChannelMask> channelMask = eventSetup.getHandle(channelMaskToken_);
0059 const L1RCTChannelMask *c = channelMask.product();
0060 edm::ESHandle<L1CaloEtScale> emScale = eventSetup.getHandle(emScaleToken_);
0061 const L1CaloEtScale *s = emScale.product();
0062
0063 rctLookupTables->setRCTParameters(r);
0064 rctLookupTables->setChannelMask(c);
0065 rctLookupTables->setL1CaloEtScale(s);
0066
0067 if (useDebugTpgScales) {
0068
0069 edm::ESHandle<CaloTPGTranscoder> transcoder = eventSetup.getHandle(transcoderToken_);
0070 const CaloTPGTranscoder *h_tpg = transcoder.product();
0071
0072 EcalTPGScale e_tpg(tokens_, eventSetup);
0073
0074 L1CaloEcalScale *ecalScale = new L1CaloEcalScale();
0075 L1CaloHcalScale *hcalScale = new L1CaloHcalScale();
0076
0077
0078
0079 std::cout << "ECAL Pos " << L1CaloEcalScale::nBinRank << std::endl;
0080 for (unsigned short ieta = 1; ieta <= L1CaloEcalScale::nBinEta; ++ieta) {
0081 for (unsigned short irank = 0; irank < L1CaloEcalScale::nBinRank; ++irank) {
0082 std::cout << ieta << " " << irank;
0083 EcalSubdetector subdet = (ieta <= 17) ? EcalBarrel : EcalEndcap;
0084 double etGeVPos = e_tpg.getTPGInGeV(irank,
0085 EcalTrigTowerDetId(1,
0086 subdet,
0087 ieta,
0088 1));
0089 ecalScale->setBin(irank, ieta, 1, etGeVPos);
0090 std::cout << etGeVPos << ", ";
0091 }
0092 std::cout << std::endl;
0093 }
0094 std::cout << std::endl;
0095
0096 std::cout << "ECAL Neg" << std::endl;
0097 for (unsigned short ieta = 1; ieta <= L1CaloEcalScale::nBinEta; ++ieta) {
0098 for (unsigned short irank = 0; irank < L1CaloEcalScale::nBinRank; ++irank) {
0099 EcalSubdetector subdet = (ieta <= 17) ? EcalBarrel : EcalEndcap;
0100
0101 std::cout << ieta << " " << irank;
0102 double etGeVNeg = e_tpg.getTPGInGeV(irank,
0103 EcalTrigTowerDetId(-1,
0104 subdet,
0105 ieta,
0106 2));
0107 ecalScale->setBin(irank, ieta, -1, etGeVNeg);
0108 std::cout << etGeVNeg << ", ";
0109 }
0110 std::cout << std::endl;
0111 }
0112 std::cout << std::endl;
0113
0114
0115 std::cout << "HCAL" << std::endl;
0116 for (unsigned short ieta = 1; ieta <= L1CaloHcalScale::nBinEta; ++ieta) {
0117 for (unsigned short irank = 0; irank < L1CaloHcalScale::nBinRank; ++irank) {
0118 double etGeV = h_tpg->hcaletValue(ieta, irank);
0119
0120 hcalScale->setBin(irank, ieta, 1, etGeV);
0121 hcalScale->setBin(irank, ieta, -1, etGeV);
0122 std::cout << etGeV << ", ";
0123 std::cout << std::endl;
0124 }
0125 std::cout << std::endl;
0126 }
0127
0128
0129 rctLookupTables->setEcalScale(ecalScale);
0130 rctLookupTables->setHcalScale(hcalScale);
0131
0132 } else {
0133 edm::ESHandle<L1CaloHcalScale> hcalScale = eventSetup.getHandle(hcalScaleToken_);
0134 const L1CaloHcalScale *h = hcalScale.product();
0135 edm::ESHandle<L1CaloEcalScale> ecalScale = eventSetup.getHandle(ecalScaleToken_);
0136 const L1CaloEcalScale *e = ecalScale.product();
0137
0138 rctLookupTables->setHcalScale(h);
0139 rctLookupTables->setEcalScale(e);
0140 }
0141
0142 edm::Handle<EcalTrigPrimDigiCollection> ecal = event.getHandle(ecalDigisToken_);
0143 edm::Handle<HcalTrigPrimDigiCollection> hcal = event.getHandle(hcalDigisToken_);
0144 EcalTrigPrimDigiCollection ecalColl;
0145 HcalTrigPrimDigiCollection hcalColl;
0146 if (ecal.isValid()) {
0147 ecalColl = *ecal;
0148 }
0149 if (hcal.isValid()) {
0150 hcalColl = *hcal;
0151 }
0152 rct->digiInput(ecalColl, hcalColl);
0153 static int nEvents = 0;
0154 if (nEvents == 0) {
0155 ofs << "Crate = 0-17" << std::endl
0156 << "Card = 0-7 within the crate" << std::endl
0157 << "Tower = 0-31 covers 4 x 8 covered by the card" << std::endl
0158 << "EMAddr(0:8) = EMFGBit(0:0)+CompressedEMET(1:8)" << std::endl
0159 << "HDAddr(0:8) = HDFGBit(0:0)+CompressedHDET(1:8) - note: "
0160 "HDFGBit(0:0) is not part of the hardware LUT address"
0161 << std::endl
0162 << "LutOut(0:17)= "
0163 "LinearEMET(0:6)+HoEFGVetoBit(7:7)+LinearJetET(8:16)+ActivityBit(17:"
0164 "17)"
0165 << std::endl
0166 << "Event"
0167 << "\t"
0168 << "Crate"
0169 << "\t"
0170 << "Card"
0171 << "\t"
0172 << "Tower"
0173 << "\t"
0174 << "EMAddr"
0175 << "\t"
0176 << "HDAddr"
0177 << "\t"
0178 << "LUTOut" << std::endl;
0179 }
0180 if (nEvents < 64) {
0181 for (unsigned short iCrate = 0; iCrate < 18; iCrate++) {
0182 for (unsigned short iCard = 0; iCard < 7; iCard++) {
0183
0184 for (unsigned short iTower = 0; iTower < 32; iTower++) {
0185 unsigned short ecal = rct->ecalCompressedET(iCrate, iCard, iTower);
0186 unsigned short hcal = rct->hcalCompressedET(iCrate, iCard, iTower);
0187 unsigned short fgbit = rct->ecalFineGrainBit(iCrate, iCard, iTower);
0188 unsigned short mubit = rct->hcalFineGrainBit(iCrate, iCard, iTower);
0189 unsigned long lutOutput = rctLookupTables->lookup(ecal, hcal, fgbit, iCrate, iCard, iTower);
0190 ofs << std::hex << nEvents << "\t" << iCrate << "\t" << iCard << "\t" << iTower << "\t" << ecal * 2 + fgbit
0191 << "\t" << hcal * 2 + mubit << "\t" << lutOutput << std::dec << std::endl;
0192 }
0193 }
0194 }
0195 }
0196 nEvents++;
0197 }