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
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);