Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-06-20 01:53:33

0001 #include <unordered_map>
0002 
0003 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0004 #include "FWCore/Framework/interface/stream/EDProducer.h"
0005 #include "FWCore/Framework/interface/Event.h"
0006 #include "FWCore/Utilities/interface/InputTag.h"
0007 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0008 #include "FWCore/Framework/interface/Frameworkfwd.h"
0009 #include "FWCore/Framework/interface/MakerMacros.h"
0010 
0011 #include "DataFormats/L1TParticleFlow/interface/PFCandidate.h"
0012 #include "DataFormats/L1TParticleFlow/interface/PFCluster.h"
0013 
0014 #include "L1Trigger/Phase2L1ParticleFlow/interface/deregionizer/deregionizer_input.h"
0015 #include "L1Trigger/Phase2L1ParticleFlow/interface/deregionizer/deregionizer_ref.h"
0016 
0017 class DeregionizerProducer : public edm::stream::EDProducer<> {
0018 public:
0019   explicit DeregionizerProducer(const edm::ParameterSet &);
0020   ~DeregionizerProducer() override;
0021   static void fillDescriptions(edm::ConfigurationDescriptions &descriptions);
0022 
0023 private:
0024   edm::ParameterSet config_;
0025   edm::EDGetTokenT<l1t::PFCandidateRegionalOutput> token_;
0026   std::vector<edm::ParameterSet> linkConfigs_;
0027   const unsigned int nInputFramesPerBX_;
0028   l1ct::DeregionizerEmulator emulator_;
0029   l1ct::DeregionizerInput input_;
0030   std::vector<uint32_t> boardOrder_, nOutputFramesPerBX_, nPuppiFramesPerRegion_, nLinksPuppi_, nPuppiPerRegion_;
0031   std::vector<std::vector<uint32_t>> outputRegions_;
0032   const unsigned int tmuxFactor_ = 6;  // not really configurable in current architecture
0033 
0034   void produce(edm::Event &, const edm::EventSetup &) override;
0035   void hwToEdm_(const std::vector<l1ct::PuppiObjEmu> &hwOut, std::vector<l1t::PFCandidate> &edmOut) const;
0036   void setRefs_(l1t::PFCandidate &pf, const l1ct::PuppiObjEmu &p) const;
0037 };
0038 
0039 DeregionizerProducer::DeregionizerProducer(const edm::ParameterSet &iConfig)
0040     : config_(iConfig),
0041       token_(consumes<l1t::PFCandidateRegionalOutput>(iConfig.getParameter<edm::InputTag>("RegionalPuppiCands"))),
0042       linkConfigs_(iConfig.getParameter<std::vector<edm::ParameterSet>>("linkConfigs")),
0043       nInputFramesPerBX_(iConfig.getParameter<uint32_t>("nInputFramesPerBX")),
0044       emulator_(iConfig),
0045       input_(linkConfigs_) {
0046   produces<l1t::PFCandidateCollection>("Puppi");
0047   produces<l1t::PFCandidateCollection>("TruncatedPuppi");
0048 }
0049 
0050 DeregionizerProducer::~DeregionizerProducer() {}
0051 
0052 void DeregionizerProducer::produce(edm::Event &iEvent, const edm::EventSetup &iSetup) {
0053   auto deregColl = std::make_unique<l1t::PFCandidateCollection>();
0054   auto truncColl = std::make_unique<l1t::PFCandidateCollection>();
0055 
0056   edm::Handle<l1t::PFCandidateRegionalOutput> src;
0057 
0058   iEvent.getByToken(token_, src);
0059 
0060   std::vector<l1ct::OutputRegion> outputRegions;
0061   std::vector<l1ct::PuppiObjEmu> hwOut;
0062   std::vector<l1t::PFCandidate> edmOut;
0063   std::vector<l1ct::PuppiObjEmu> hwTruncOut;
0064   std::vector<l1t::PFCandidate> edmTruncOut;
0065 
0066   LogDebug("DeregionizerProducer") << "\nRegional Puppi Candidates";
0067   for (unsigned int iReg = 0, nReg = src->nRegions(); iReg < nReg; ++iReg) {
0068     l1ct::OutputRegion tempOutputRegion;
0069 
0070     auto region = src->region(iReg);
0071     float eta = src->eta(iReg);
0072     float phi = src->phi(iReg);
0073     LogDebug("DeregionizerProducer") << "\nRegion " << iReg << "\n"
0074                                      << "Eta = " << eta << " and Phi = " << phi << "\n"
0075                                      << "###########";
0076     for (int i = 0, n = region.size(); i < n; ++i) {
0077       l1ct::PuppiObjEmu tempPuppi;
0078       const l1t::PFCandidate &cand = region[i];
0079 
0080       tempPuppi.initFromBits(cand.encodedPuppi64());
0081       tempPuppi.srcCand = &cand;
0082       tempOutputRegion.puppi.push_back(tempPuppi);
0083       LogDebug("DeregionizerProducer") << "pt[" << i << "] = " << tempOutputRegion.puppi.back().hwPt << ", eta[" << i
0084                                        << "] = " << tempOutputRegion.puppi.back().floatEta() << ", phi[" << i
0085                                        << "] = " << tempOutputRegion.puppi.back().floatPhi();
0086     }
0087     outputRegions.push_back(tempOutputRegion);
0088   }
0089 
0090   std::vector<std::vector<std::vector<l1ct::PuppiObjEmu>>> layer2In = input_.orderInputs(outputRegions);
0091 
0092   emulator_.run(layer2In, hwOut, hwTruncOut);
0093 
0094   DeregionizerProducer::hwToEdm_(hwOut, edmOut);
0095   DeregionizerProducer::hwToEdm_(hwTruncOut, edmTruncOut);
0096 
0097   deregColl->swap(edmOut);
0098   truncColl->swap(edmTruncOut);
0099 
0100   iEvent.put(std::move(deregColl), "Puppi");
0101   iEvent.put(std::move(truncColl), "TruncatedPuppi");
0102 }
0103 
0104 void DeregionizerProducer::hwToEdm_(const std::vector<l1ct::PuppiObjEmu> &hwOut,
0105                                     std::vector<l1t::PFCandidate> &edmOut) const {
0106   for (const auto &hwPuppi : hwOut) {
0107     l1t::PFCandidate::ParticleType type;
0108     float mass = 0.13f;
0109     if (hwPuppi.hwId.charged()) {
0110       if (hwPuppi.hwId.isMuon()) {
0111         type = l1t::PFCandidate::Muon;
0112         mass = 0.105;
0113       } else if (hwPuppi.hwId.isElectron()) {
0114         type = l1t::PFCandidate::Electron;
0115         mass = 0.005;
0116       } else
0117         type = l1t::PFCandidate::ChargedHadron;
0118     } else {
0119       type = hwPuppi.hwId.isPhoton() ? l1t::PFCandidate::Photon : l1t::PFCandidate::NeutralHadron;
0120       mass = hwPuppi.hwId.isPhoton() ? 0.0 : 0.5;
0121     }
0122     reco::Particle::PolarLorentzVector p4(hwPuppi.floatPt(), hwPuppi.floatEta(), hwPuppi.floatPhi(), mass);
0123     edmOut.emplace_back(
0124         type, hwPuppi.intCharge(), p4, hwPuppi.floatPuppiW(), hwPuppi.intPt(), hwPuppi.intEta(), hwPuppi.intPhi());
0125     if (hwPuppi.hwId.charged()) {
0126       edmOut.back().setZ0(hwPuppi.floatZ0());
0127       edmOut.back().setDxy(hwPuppi.floatDxy());
0128       edmOut.back().setHwZ0(hwPuppi.hwZ0());
0129       edmOut.back().setHwDxy(hwPuppi.hwDxy());
0130       edmOut.back().setHwTkQuality(hwPuppi.hwTkQuality());
0131     } else {
0132       edmOut.back().setHwPuppiWeight(hwPuppi.hwPuppiW());
0133       edmOut.back().setHwEmID(hwPuppi.hwEmID());
0134     }
0135     edmOut.back().setEncodedPuppi64(hwPuppi.pack().to_uint64());
0136     edmOut.back().setCaloPtr(hwPuppi.srcCand->caloPtr());
0137     edmOut.back().setPFTrack(hwPuppi.srcCand->pfTrack());
0138     edmOut.back().setMuon(hwPuppi.srcCand->muon());
0139   }
0140 }
0141 
0142 void DeregionizerProducer::fillDescriptions(edm::ConfigurationDescriptions &descriptions) {
0143   edm::ParameterSetDescription desc;
0144   desc.add<edm::InputTag>("RegionalPuppiCands", edm::InputTag("l1tLayer1", "PuppiRegional"));
0145   desc.add<unsigned int>("nPuppiFinalBuffer", 128);
0146   desc.add<unsigned int>("nPuppiPerClk", 6);
0147   desc.add<unsigned int>("nPuppiFirstBuffers", 12);
0148   desc.add<unsigned int>("nPuppiSecondBuffers", 32);
0149   desc.add<unsigned int>("nPuppiThirdBuffers", 64);
0150   desc.add<unsigned int>("nInputFramesPerBX", 9);
0151   edm::ParameterSetDescription linkConfigDummyValidator;
0152   linkConfigDummyValidator.setAllowAnything();
0153   desc.addVPSet("linkConfigs", linkConfigDummyValidator);
0154   descriptions.add("DeregionizerProducer", desc);
0155 }
0156 
0157 #include "FWCore/Framework/interface/MakerMacros.h"
0158 DEFINE_FWK_MODULE(DeregionizerProducer);