Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-11-21 00:28:57

0001 // -*- C++ -*-
0002 //
0003 // Package:    L1Trigger/L1TZDC
0004 // Class:      L1TZDC
0005 //
0006 /**\class L1TZDC L1TZDCProducer.cc L1Trigger/L1TZDC/plugins/L1TZDCProducer.cc
0007 
0008  Description: ZDC Producer for L1 Trigger emulation
0009 
0010  Implementation:
0011  Modified from v1 L1TZDCProducer (v1 under L1Trigger/L1TZDC/test) to work w/ hcalTps w/ ZDC included at abs(ieta) 42 - effectively a pass through
0012  ZDC EtSums found at iphi 99
0013 */
0014 //
0015 // Modded from L1TZDCProducer by: Chris McGinn
0016 //        Modifications Made: Wed, 26 Sep 2023
0017 //        Contact: christopher.mc.ginn@cern.ch or
0018 //                 cfmcginn on github for bugs/issues
0019 //
0020 #include <memory>
0021 #include <iostream>
0022 // user include files
0023 
0024 #include "FWCore/Framework/interface/EventSetup.h"
0025 #include "FWCore/Framework/interface/Frameworkfwd.h"
0026 #include "FWCore/Framework/interface/stream/EDProducer.h"
0027 #include "FWCore/Framework/interface/ESHandle.h"
0028 #include "FWCore/Framework/interface/Event.h"
0029 #include "FWCore/Framework/interface/MakerMacros.h"
0030 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0031 #include "FWCore/Utilities/interface/EDGetToken.h"
0032 #include "FWCore/Utilities/interface/EDPutToken.h"
0033 #include "FWCore/Utilities/interface/InputTag.h"
0034 #include "FWCore/Utilities/interface/ESGetToken.h"
0035 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0036 
0037 #include "L1Trigger/L1TCalorimeter/interface/Stage2Layer2FirmwareFactory.h"
0038 #include "L1Trigger/L1TCalorimeter/interface/Stage2MainProcessor.h"
0039 #include "L1Trigger/L1TCalorimeter/interface/CaloTools.h"
0040 
0041 #include "L1Trigger/L1TCalorimeter/interface/CaloParamsHelper.h"
0042 #include "CondFormats/DataRecord/interface/L1TCaloParamsRcd.h"
0043 #include "CondFormats/DataRecord/interface/L1TCaloParamsO2ORcd.h"
0044 
0045 #include "DataFormats/L1TCalorimeter/interface/CaloTower.h"
0046 #include "DataFormats/L1Trigger/interface/EGamma.h"
0047 #include "DataFormats/L1Trigger/interface/Tau.h"
0048 #include "DataFormats/L1Trigger/interface/Jet.h"
0049 #include "DataFormats/L1Trigger/interface/EtSum.h"
0050 
0051 #include "DataFormats/HcalDigi/interface/HcalDigiCollections.h"
0052 
0053 //
0054 // class declaration
0055 //
0056 
0057 using namespace l1t;
0058 
0059 class L1TZDCProducer : public edm::stream::EDProducer<> {
0060 public:
0061   explicit L1TZDCProducer(const edm::ParameterSet& ps);
0062   ~L1TZDCProducer() override = default;
0063 
0064   static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0065 
0066 private:
0067   void produce(edm::Event&, const edm::EventSetup&) override;
0068 
0069   void beginRun(edm::Run const&, edm::EventSetup const&) override;
0070 
0071   // ----------member data ---------------------------
0072 
0073   // input tokens
0074   //Add the hcalTP token
0075   edm::EDGetTokenT<HcalTrigPrimDigiCollection> hcalTPSource;
0076 
0077   //input ints
0078   int bxFirst_;
0079   int bxLast_;
0080 
0081   // put tokens
0082   edm::EDPutTokenT<EtSumBxCollection> etToken_;
0083 };
0084 
0085 L1TZDCProducer::L1TZDCProducer(const edm::ParameterSet& ps)
0086     : hcalTPSource(consumes<HcalTrigPrimDigiCollection>(ps.getParameter<edm::InputTag>("hcalTPDigis"))) {
0087   // register what you produce
0088   etToken_ = produces<EtSumBxCollection>();
0089 
0090   bxFirst_ = ps.getParameter<int>("bxFirst");
0091   bxLast_ = ps.getParameter<int>("bxLast");
0092 }
0093 
0094 // ------------ method called to produce the data  ------------
0095 void L1TZDCProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0096   using namespace edm;
0097   using namespace l1t;
0098 
0099   LogDebug("L1TZDCProducer") << "L1TZDCProducer::produce function called..." << std::endl;
0100 
0101   // reduced collection to be emplaced in output
0102   EtSumBxCollection etsumsReduced(0, bxFirst_, bxLast_);
0103 
0104   edm::Handle<HcalTrigPrimDigiCollection> hcalTPs;
0105   iEvent.getByToken(hcalTPSource, hcalTPs);
0106 
0107   //Check if the hcal tokens are valid
0108   if (hcalTPs.isValid()) {
0109     //If valid, process
0110     for (const auto& hcalTp : *hcalTPs) {
0111       int ieta = hcalTp.id().ieta();
0112       uint32_t absIEta = std::abs(ieta);
0113 
0114       //absIEta position 42 is used for the ZDC; -42 for ZDCM, +42 for ZDCP
0115       if (absIEta != 42)
0116         continue;
0117 
0118       int iphi = hcalTp.id().iphi();
0119       //iphi position 99 is used for the etSums
0120       if (iphi != 99)
0121         continue;
0122 
0123       //Get number of samples and number of presamples; bx 0 is nPresamples
0124       int nSamples = hcalTp.size();
0125       int nPresamples = hcalTp.presamples();
0126 
0127       for (int ibx = 0; ibx < nSamples; ibx++) {
0128         if (ibx >= nPresamples + bxFirst_ && ibx <= nPresamples + bxLast_) {
0129           HcalTriggerPrimitiveSample hcalTpSample = hcalTp.sample(ibx);
0130           int ietIn = hcalTpSample.compressedEt();
0131 
0132           l1t::EtSum tempEt = l1t::EtSum();
0133           tempEt.setHwPt(ietIn);
0134           tempEt.setHwPhi(0.);
0135 
0136           //ieta < 0 is ZDCMinus; > 0 is ZDCPlus
0137           if (ieta < 0) {
0138             tempEt.setHwEta(-1.);
0139             tempEt.setType(EtSum::EtSumType::kZDCM);
0140           } else {
0141             tempEt.setHwEta(1.);
0142             tempEt.setType(EtSum::EtSumType::kZDCP);
0143           }
0144 
0145           //By construction, nPresamples is 0 bx (since presamples span 0 to nPresamples-1)
0146           etsumsReduced.push_back(ibx - nPresamples, CaloTools::etSumP4Demux(tempEt));
0147         }
0148       }
0149     }
0150   } else {
0151     // If the collection is not valid issue a warning before putting an empty collection
0152     edm::LogWarning("L1TZDCProducer") << "hcalTps not valid; return empty ZDC Et Sum BXCollection" << std::endl;
0153   }
0154 
0155   // Emplace even if !hcalTps.isValid()
0156   // Output in this case will be an empty collection
0157   iEvent.emplace(etToken_, std::move(etsumsReduced));
0158 }
0159 
0160 // ------------ method called when starting to processes a run  ------------
0161 void L1TZDCProducer::beginRun(edm::Run const& iRun, edm::EventSetup const& iSetup) {}
0162 
0163 // ------------ method fills 'descriptions' with the allowed parameters for the module  ------------
0164 void L1TZDCProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0165   edm::ParameterSetDescription desc;
0166   desc.add<edm::InputTag>("hcalTPDigis", edm::InputTag("simHcalTriggerPrimitiveDigis"));
0167   desc.add<int>("bxFirst", -2);
0168   desc.add<int>("bxLast", 2);
0169   descriptions.add("l1tZDCProducer", desc);
0170 }
0171 
0172 //define this as a plug-in
0173 DEFINE_FWK_MODULE(L1TZDCProducer);