Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:21:36

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     // use old-style scales
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     // create input scales, werner's code
0078     // ECAL
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,  // +ve eta
0086                                                                subdet,
0087                                                                ieta,
0088                                                                1));  // dummy phi value
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,  // -ve eta
0104                                                                subdet,
0105                                                                ieta,
0106                                                                2));  // dummy phi value
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     // HCAL
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     // set the input scales
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         // tower numbered from 0-31
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 }