Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-04-30 22:24:28

0001 #include "FWCore/Framework/interface/Frameworkfwd.h"
0002 #include "FWCore/Framework/interface/stream/EDProducer.h"
0003 #include "FWCore/Framework/interface/Event.h"
0004 #include "FWCore/Framework/interface/MakerMacros.h"
0005 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0006 #include "FWCore/Utilities/interface/InputTag.h"
0007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0008 #include "FWCore/MessageLogger/interface/MessageDrop.h"
0009 
0010 #include "DataFormats/L1TParticleFlow/interface/PFJet.h"
0011 #include "DataFormats/JetReco/interface/Jet.h"
0012 #include "DataFormats/L1TParticleFlow/interface/PFCandidate.h"
0013 #include "L1Trigger/Phase2L1ParticleFlow/interface/L1TSC4NGJetID.h"
0014 #include "DataFormats/Common/interface/ValueMap.h"
0015 
0016 #include "DataFormats/L1Trigger/interface/VertexWord.h"
0017 
0018 #include <cmath>
0019 #include <vector>
0020 
0021 class L1TSC4NGJetProducer : public edm::stream::EDProducer<> {
0022 public:
0023   explicit L1TSC4NGJetProducer(const edm::ParameterSet&);
0024   ~L1TSC4NGJetProducer() override = default;
0025 
0026   static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0027 
0028 private:
0029   std::unique_ptr<L1TSC4NGJetID> fJetId_;
0030   void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;
0031 
0032   edm::EDGetTokenT<edm::View<l1t::PFJet>> const jets_;
0033   bool const fUseRawPt_;
0034   double const fMinPt_;
0035   double const fMaxEta_;
0036   unsigned int const fMaxJets_;
0037   int const fNParticles_;
0038   bool const isDebugEnabled = false;
0039 
0040   std::vector<l1ct::JetTagClass> classes_;
0041 
0042   hls4mlEmulator::ModelLoader loader;
0043   std::shared_ptr<hls4mlEmulator::Model> model;
0044 };
0045 
0046 L1TSC4NGJetProducer::L1TSC4NGJetProducer(const edm::ParameterSet& cfg)
0047     : jets_(consumes<edm::View<l1t::PFJet>>(cfg.getParameter<edm::InputTag>("jets"))),
0048       fUseRawPt_(cfg.getParameter<bool>("useRawPt")),
0049       fMinPt_(cfg.getParameter<double>("minPt")),
0050       fMaxEta_(cfg.getParameter<double>("maxEta")),
0051       fMaxJets_(cfg.getParameter<int>("maxJets")),
0052       fNParticles_(cfg.getParameter<int>("nParticles")),
0053       isDebugEnabled(edm::isDebugEnabled()),
0054       loader(hls4mlEmulator::ModelLoader(cfg.getParameter<string>("l1tSC4NGJetModelPath"))) {
0055   std::vector<std::string> classes = cfg.getParameter<std::vector<std::string>>("classes");
0056   for (unsigned i = 0; i < classes.size(); i++) {
0057     classes_.push_back(l1ct::JetTagClass(classes[i]));
0058   }
0059   try {
0060     model = loader.load_model();
0061   } catch (std::runtime_error& e) {
0062     throw cms::Exception("ModelError") << " ERROR: failed to load L1TSC4NGJet model version \"" << loader.model_name()
0063                                        << "\". Model version not found in cms-hls4ml externals.";
0064   }
0065   fJetId_ = std::make_unique<L1TSC4NGJetID>(model, fNParticles_, isDebugEnabled);
0066   produces<l1t::PFJetCollection>("l1tSC4NGJets");
0067 }
0068 
0069 void L1TSC4NGJetProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0070   edm::Handle<edm::View<l1t::PFJet>> jets;
0071   iEvent.getByToken(jets_, jets);
0072   std::vector<l1t::PFJet> taggedJets;
0073 
0074   for (const auto& srcjet : *jets) {
0075     l1ct::Jet ctHWTaggedJet = l1ct::Jet::unpack(srcjet.encodedJet(l1t::PFJet::HWEncoding::CT));
0076     if (((fUseRawPt_ ? srcjet.rawPt() : srcjet.pt()) < fMinPt_) || std::abs(srcjet.eta()) > fMaxEta_ ||
0077         taggedJets.size() >= fMaxJets_) {
0078       ctHWTaggedJet.clear();
0079       continue;
0080     }
0081     std::vector<float> JetScore_float = fJetId_->computeFixed(srcjet, fUseRawPt_);
0082     for (unsigned i = 0; i < classes_.size(); i++) {
0083       ctHWTaggedJet.hwTagScores[i] = JetScore_float[i];
0084     }
0085     float PtCorrection_ = JetScore_float[classes_.size()];
0086     ctHWTaggedJet.hwPt = (l1ct::pt_t)((float)ctHWTaggedJet.hwPt * PtCorrection_);
0087     l1gt::Jet gtHWTaggedJet = ctHWTaggedJet.toGT();
0088     // TODO set the regressed pT instead of the srcjet pt
0089     l1t::PFJet edmTaggedJet(srcjet.pt(),
0090                             srcjet.eta(),
0091                             srcjet.phi(),
0092                             srcjet.mass(),
0093                             gtHWTaggedJet.v3.pt.V,
0094                             gtHWTaggedJet.v3.eta.V,
0095                             gtHWTaggedJet.v3.phi.V);
0096     edmTaggedJet.setEncodedJet(l1t::PFJet::HWEncoding::CT, ctHWTaggedJet.pack());
0097     edmTaggedJet.setEncodedJet(l1t::PFJet::HWEncoding::GT, gtHWTaggedJet.pack());
0098 
0099     std::vector<edm::Ptr<l1t::PFCandidate>> constituents;
0100     std::for_each(srcjet.constituents().begin(), srcjet.constituents().end(), [&](auto constituent) {
0101       edmTaggedJet.addConstituent(constituent);
0102     });
0103     edmTaggedJet.addTagScores(JetScore_float, classes_, PtCorrection_);
0104     taggedJets.push_back(edmTaggedJet);
0105   }
0106   std::sort(taggedJets.begin(), taggedJets.end(), [](l1t::PFJet a, l1t::PFJet b) { return (a.pt() > b.pt()); });
0107 
0108   auto taggedJetsCollection = std::make_unique<l1t::PFJetCollection>();
0109   taggedJetsCollection->swap(taggedJets);
0110   iEvent.put(std::move(taggedJetsCollection), "l1tSC4NGJets");
0111 }
0112 
0113 void L1TSC4NGJetProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0114   edm::ParameterSetDescription desc;
0115   desc.add<edm::InputTag>("jets", edm::InputTag("l1tSC4PFL1PuppiExtendedEmulator"));
0116   desc.add<bool>("useRawPt", true);
0117   desc.add<std::string>("l1tSC4NGJetModelPath", std::string("L1TSC4NGJetModel_v0"));
0118   desc.add<int>("maxJets", 16);
0119   desc.add<int>("nParticles", 16);
0120   desc.add<double>("minPt", 10);
0121   desc.add<double>("maxEta", 2.4);
0122   desc.add<std::vector<std::string>>("classes", {"b", "c", "uds", "g", "tau_p", "tau_n", "mu", "e"});
0123   descriptions.add("l1tSC4NGJetProducer", desc);
0124 }
0125 
0126 #include "FWCore/Framework/interface/MakerMacros.h"
0127 DEFINE_FWK_MODULE(L1TSC4NGJetProducer);