Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-10-25 09:55:51

0001 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0002 #include "DataFormats/Common/interface/Handle.h"
0003 #include "FWCore/Utilities/interface/EDGetToken.h"
0004 
0005 #include "FWCore/Framework/interface/MakerMacros.h"
0006 #include "DataFormats/Common/interface/View.h"
0007 
0008 #include "FWCore/Framework/interface/Frameworkfwd.h"
0009 #include "FWCore/Framework/interface/global/EDProducer.h"
0010 
0011 #include "FWCore/Framework/interface/Event.h"
0012 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0013 #include "DataFormats/L1Trigger/interface/P2GTCandidate.h"
0014 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0015 #include "L1Trigger/Phase2L1GT/interface/L1GTScales.h"
0016 
0017 #include "DataFormats/L1Trigger/interface/TkJetWord.h"
0018 #include "DataFormats/L1Trigger/interface/VertexWord.h"
0019 
0020 #include "DataFormats/L1TMuonPhase2/interface/SAMuon.h"
0021 #include "DataFormats/L1TMuonPhase2/interface/TrackerMuon.h"
0022 
0023 #include "DataFormats/L1TParticleFlow/interface/PFJet.h"
0024 #include "DataFormats/L1TCorrelator/interface/TkEmFwd.h"
0025 #include "DataFormats/L1TCorrelator/interface/TkEm.h"
0026 #include "DataFormats/L1TCorrelator/interface/TkElectronFwd.h"
0027 #include "DataFormats/L1TCorrelator/interface/TkElectron.h"
0028 #include "DataFormats/L1TParticleFlow/interface/PFTau.h"
0029 #include "DataFormats/L1TParticleFlow/interface/gt_datatypes.h"
0030 
0031 #include "DataFormats/L1Trigger/interface/EtSum.h"
0032 
0033 #include <vector>
0034 #include <array>
0035 #include <string>
0036 #include <type_traits>
0037 
0038 namespace l1t {
0039 
0040   class L1GTProducer : public edm::global::EDProducer<> {
0041   public:
0042     explicit L1GTProducer(const edm::ParameterSet &);
0043     ~L1GTProducer() override = default;
0044 
0045     static void fillDescriptions(edm::ConfigurationDescriptions &);
0046 
0047   private:
0048     void produceGTTPromptJets(edm::Event &event) const;
0049     void produceGTTDisplacedJets(edm::Event &event) const;
0050     void produceGTTPrimaryVert(edm::Event &event) const;
0051 
0052     void produceGMTSaPromptMuons(edm::Event &event) const;
0053     void produceGMTSaDisplacedMuons(edm::Event &event) const;
0054     void produceGMTTkMuons(edm::Event &event) const;
0055 
0056     void produceCL2Jets(edm::Event &event) const;
0057     void produceCL2Photons(edm::Event &event) const;
0058     void produceCL2Electrons(edm::Event &event) const;
0059     void produceCL2Taus(edm::Event &event) const;
0060     void produceCL2EtSum(edm::Event &event) const;
0061     void produceCl2HtSum(edm::Event &event) const;
0062 
0063     void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override;
0064 
0065     const L1GTScales scales_;
0066 
0067     const edm::EDGetTokenT<TkJetWordCollection> gttPromptJetToken_;
0068     const edm::EDGetTokenT<TkJetWordCollection> gttDisplacedJetToken_;
0069     const edm::EDGetTokenT<VertexWordCollection> gttPrimaryVertexToken_;
0070 
0071     const edm::EDGetTokenT<SAMuonCollection> gmtSaPromptMuonToken_;
0072     const edm::EDGetTokenT<SAMuonCollection> gmtSaDisplacedMuonToken_;
0073     const edm::EDGetTokenT<TrackerMuonCollection> gmtTkMuonToken_;
0074 
0075     const edm::EDGetTokenT<PFJetCollection> cl2JetToken_;
0076     const edm::EDGetTokenT<TkEmCollection> cl2PhotonToken_;
0077     const edm::EDGetTokenT<TkElectronCollection> cl2ElectronToken_;
0078     const edm::EDGetTokenT<PFTauCollection> cl2TauToken_;
0079     const edm::EDGetTokenT<std::vector<l1t::EtSum>> cl2EtSumToken_;
0080     const edm::EDGetTokenT<std::vector<l1t::EtSum>> cl2HtSumToken_;
0081   };
0082 
0083   L1GTProducer::L1GTProducer(const edm::ParameterSet &config)
0084       : scales_(config.getParameter<edm::ParameterSet>("scales")),
0085         gttPromptJetToken_(consumes<TkJetWordCollection>(config.getParameter<edm::InputTag>("GTTPromptJets"))),
0086         gttDisplacedJetToken_(consumes<TkJetWordCollection>(config.getParameter<edm::InputTag>("GTTDisplacedJets"))),
0087         gttPrimaryVertexToken_(consumes<VertexWordCollection>(config.getParameter<edm::InputTag>("GTTPrimaryVert"))),
0088         gmtSaPromptMuonToken_(consumes<SAMuonCollection>(config.getParameter<edm::InputTag>("GMTSaPromptMuons"))),
0089         gmtSaDisplacedMuonToken_(consumes<SAMuonCollection>(config.getParameter<edm::InputTag>("GMTSaDisplacedMuons"))),
0090         gmtTkMuonToken_(consumes<TrackerMuonCollection>(config.getParameter<edm::InputTag>("GMTTkMuons"))),
0091         cl2JetToken_(consumes<PFJetCollection>(config.getParameter<edm::InputTag>("CL2Jets"))),
0092         cl2PhotonToken_(consumes<TkEmCollection>(config.getParameter<edm::InputTag>("CL2Photons"))),
0093         cl2ElectronToken_(consumes<TkElectronCollection>(config.getParameter<edm::InputTag>("CL2Electrons"))),
0094         cl2TauToken_(consumes<PFTauCollection>(config.getParameter<edm::InputTag>("CL2Taus"))),
0095         cl2EtSumToken_(consumes<std::vector<l1t::EtSum>>(config.getParameter<edm::InputTag>("CL2EtSum"))),
0096         cl2HtSumToken_(consumes<std::vector<l1t::EtSum>>(config.getParameter<edm::InputTag>("CL2HtSum"))) {
0097     produces<P2GTCandidateCollection>("GTTPromptJets");
0098     produces<P2GTCandidateCollection>("GTTDisplacedJets");
0099     produces<P2GTCandidateCollection>("GTTPrimaryVert");
0100 
0101     produces<P2GTCandidateCollection>("GMTSaPromptMuons");
0102     produces<P2GTCandidateCollection>("GMTSaDisplacedMuons");
0103     produces<P2GTCandidateCollection>("GMTTkMuons");
0104 
0105     produces<P2GTCandidateCollection>("CL2Jets");
0106     produces<P2GTCandidateCollection>("CL2Photons");
0107     produces<P2GTCandidateCollection>("CL2Electrons");
0108     produces<P2GTCandidateCollection>("CL2Taus");
0109     produces<P2GTCandidateCollection>("CL2EtSum");
0110     produces<P2GTCandidateCollection>("CL2HtSum");
0111   }
0112 
0113   void L1GTProducer::fillDescriptions(edm::ConfigurationDescriptions &description) {
0114     edm::ParameterSetDescription desc;
0115 
0116     edm::ParameterSetDescription scalesDesc;
0117     L1GTScales::fillPSetDescription(scalesDesc);
0118     desc.add<edm::ParameterSetDescription>("scales", scalesDesc);
0119 
0120     desc.add<edm::InputTag>("GTTPromptJets");
0121     desc.add<edm::InputTag>("GTTDisplacedJets");
0122     desc.add<edm::InputTag>("GTTPrimaryVert");
0123 
0124     desc.add<edm::InputTag>("GMTSaPromptMuons");
0125     desc.add<edm::InputTag>("GMTSaDisplacedMuons");
0126     desc.add<edm::InputTag>("GMTTkMuons");
0127 
0128     desc.add<edm::InputTag>("CL2Jets");
0129     desc.add<edm::InputTag>("CL2Photons");
0130     desc.add<edm::InputTag>("CL2Electrons");
0131     desc.add<edm::InputTag>("CL2Taus");
0132     desc.add<edm::InputTag>("CL2EtSum");
0133     desc.add<edm::InputTag>("CL2HtSum");
0134 
0135     description.addWithDefaultLabel(desc);
0136   }
0137 
0138   void L1GTProducer::produceGTTPrimaryVert(edm::Event &event) const {
0139     std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
0140     const VertexWordCollection &collection = event.get(gttPrimaryVertexToken_);
0141     for (std::size_t i = 0; i < collection.size() && i < 10; i++) {
0142       const VertexWord &obj = collection[i];
0143       int hwZ0 = obj.z0Word().V.to_int() * 5;
0144       P2GTCandidate gtObj(
0145           0, reco::ParticleState::PolarLorentzVector(), reco::ParticleState::Point(0, 0, scales_.to_z0(hwZ0)));
0146       gtObj.hwZ0_ = hwZ0;
0147       gtObj.hwQual_ = obj.qualityWord().V.to_int();
0148       gtObj.hwSum_pT_pv_ = obj.multiplicityWord().V.to_int();
0149       gtObj.hwNumber_of_tracks_in_pv_ = obj.multiplicityWord().V.to_int();
0150       gtObj.hwNumber_of_tracks_not_in_pv_ = obj.inverseMultiplicityWord().V.to_int();
0151       gtObj.objectType_ = P2GTCandidate::GTTPrimaryVert;
0152 
0153       outputCollection->push_back(gtObj);
0154     }
0155     event.put(std::move(outputCollection), "GTTPrimaryVert");
0156   }
0157 
0158   void L1GTProducer::produceGTTPromptJets(edm::Event &event) const {
0159     std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
0160     const TkJetWordCollection &collection = event.get(gttPromptJetToken_);
0161     for (std::size_t i = 0; i < collection.size() && i < 12; i++) {
0162       const TkJetWord &obj = collection[i];
0163       int hwZ0 = obj.z0Word().V.to_int() << 7;
0164       P2GTCandidate gtObj(0,
0165                           reco::ParticleState::PolarLorentzVector(scales_.to_pT(obj.ptWord().V.to_int()),
0166                                                                   scales_.to_eta(obj.glbEtaWord().V.to_int()),
0167                                                                   scales_.to_phi(obj.glbPhiWord().V.to_int()),
0168                                                                   0),
0169                           reco::ParticleState::Point(0, 0, scales_.to_z0(hwZ0)));
0170       gtObj.hwPT_ = obj.ptWord().V.to_int();
0171       gtObj.hwPhi_ = obj.glbPhiWord().V.to_int();
0172       gtObj.hwEta_ = obj.glbEtaWord().V.to_int();
0173       gtObj.hwZ0_ = hwZ0;
0174       gtObj.hwNumber_of_tracks_ = obj.ntWord().V.to_int();
0175       gtObj.objectType_ = P2GTCandidate::GTTPromptJets;
0176 
0177       outputCollection->push_back(gtObj);
0178     }
0179     event.put(std::move(outputCollection), "GTTPromptJets");
0180   }
0181 
0182   void L1GTProducer::produceGTTDisplacedJets(edm::Event &event) const {
0183     std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
0184     const TkJetWordCollection &collection = event.get(gttDisplacedJetToken_);
0185     for (std::size_t i = 0; i < collection.size() && i < 12; i++) {
0186       const TkJetWord &obj = collection[i];
0187       int hwZ0 = obj.z0Word().V.to_int() << 7;
0188       P2GTCandidate gtObj(0,
0189                           reco::ParticleState::PolarLorentzVector(scales_.to_pT(obj.ptWord().V.to_int()),
0190                                                                   scales_.to_eta(obj.glbEtaWord().V.to_int()),
0191                                                                   scales_.to_phi(obj.glbPhiWord().V.to_int()),
0192                                                                   0),
0193                           reco::ParticleState::Point(0, 0, scales_.to_z0(hwZ0)));
0194       gtObj.hwPT_ = obj.ptWord().V.to_int();
0195       gtObj.hwPhi_ = obj.glbPhiWord().V.to_int();
0196       gtObj.hwEta_ = obj.glbEtaWord().V.to_int();
0197       gtObj.hwZ0_ = hwZ0;
0198       gtObj.hwNumber_of_tracks_ = obj.ntWord().V.to_int();
0199       gtObj.objectType_ = P2GTCandidate::GTTDisplacedJets;
0200 
0201       outputCollection->push_back(gtObj);
0202     }
0203     event.put(std::move(outputCollection), "GTTDisplacedJets");
0204   }
0205 
0206   void L1GTProducer::produceGMTSaPromptMuons(edm::Event &event) const {
0207     std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
0208     const SAMuonCollection &collection = event.get(gmtSaPromptMuonToken_);
0209     for (size_t i = 0; i < collection.size() && i < 12; i++) {
0210       const SAMuon &obj = collection[i];
0211       int hwZ0 = obj.apZ0().to_int() << 12;
0212       P2GTCandidate gtObj(scales_.to_chg(obj.apCharge().to_int()),
0213                           reco::ParticleState::PolarLorentzVector(scales_.to_pT(obj.apPt().to_int()),
0214                                                                   scales_.to_eta(obj.apEta().to_int()),
0215                                                                   scales_.to_phi(obj.apPhi().to_int()),
0216                                                                   0),
0217                           reco::ParticleState::Point(0, 0, scales_.to_z0(hwZ0)));
0218       gtObj.hwPT_ = obj.apPt().to_int();
0219       gtObj.hwPhi_ = obj.apPhi().to_int();
0220       gtObj.hwEta_ = obj.apEta().to_int();
0221       gtObj.hwZ0_ = hwZ0;
0222       gtObj.hwQual_ = obj.apQual().to_int();
0223       gtObj.hwCharge_ = obj.apCharge().to_int();
0224       gtObj.hwD0_ = obj.apD0().to_int();
0225       gtObj.objectType_ = P2GTCandidate::GMTSaPromptMuons;
0226 
0227       outputCollection->push_back(gtObj);
0228     }
0229     event.put(std::move(outputCollection), "GMTSaPromptMuons");
0230   }
0231 
0232   void L1GTProducer::produceGMTSaDisplacedMuons(edm::Event &event) const {
0233     std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
0234     const SAMuonCollection &collection = event.get(gmtSaDisplacedMuonToken_);
0235     for (size_t i = 0; i < collection.size() && i < 12; i++) {
0236       const SAMuon &obj = collection[i];
0237       int hwZ0 = obj.apZ0().to_int() << 12;
0238       P2GTCandidate gtObj(scales_.to_chg(obj.apCharge().to_int()),
0239                           reco::ParticleState::PolarLorentzVector(scales_.to_pT(obj.apPt().to_int()),
0240                                                                   scales_.to_eta(obj.apEta().to_int()),
0241                                                                   scales_.to_phi(obj.apPhi().to_int()),
0242                                                                   0),
0243                           reco::ParticleState::Point(0, 0, scales_.to_z0(hwZ0)));
0244       gtObj.hwPT_ = obj.apPt().to_int();
0245       gtObj.hwPhi_ = obj.apPhi().to_int();
0246       gtObj.hwEta_ = obj.apEta().to_int();
0247       gtObj.hwZ0_ = hwZ0;
0248       gtObj.hwQual_ = obj.apQual().to_int();
0249       gtObj.hwCharge_ = obj.apCharge().to_int();
0250       gtObj.hwD0_ = obj.apD0().to_int();
0251       gtObj.objectType_ = P2GTCandidate::GMTSaDisplacedMuons;
0252 
0253       outputCollection->push_back(gtObj);
0254     }
0255     event.put(std::move(outputCollection), "GMTSaDisplacedMuons");
0256   }
0257 
0258   void L1GTProducer::produceGMTTkMuons(edm::Event &event) const {
0259     std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
0260     const TrackerMuonCollection &collection = event.get(gmtTkMuonToken_);
0261     for (size_t i = 0; i < collection.size() && i < 12; i++) {
0262       const TrackerMuon &obj = collection[i];
0263       int hwZ0 = obj.apZ0().to_int() << 7;
0264       P2GTCandidate gtObj(scales_.to_chg(obj.apCharge().to_int()),
0265                           reco::ParticleState::PolarLorentzVector(scales_.to_pT(obj.apPt().to_int()),
0266                                                                   scales_.to_eta(obj.apEta().to_int()),
0267                                                                   scales_.to_phi(obj.apPhi().to_int()),
0268                                                                   0),
0269                           reco::ParticleState::Point(0, 0, scales_.to_z0(hwZ0)));
0270       gtObj.hwPT_ = obj.apPt().to_int();
0271       gtObj.hwPhi_ = obj.apPhi().to_int();
0272       gtObj.hwEta_ = obj.apEta().to_int();
0273       gtObj.hwZ0_ = hwZ0;
0274       gtObj.hwIso_ = obj.apIso().to_int();
0275       gtObj.hwQual_ = obj.apQual().to_int();
0276       gtObj.hwCharge_ = obj.apCharge().to_int();
0277       gtObj.hwD0_ = obj.apD0().to_int();
0278       gtObj.hwBeta_ = obj.apBeta().to_int();
0279       gtObj.objectType_ = P2GTCandidate::GMTTkMuons;
0280 
0281       outputCollection->push_back(gtObj);
0282     }
0283     event.put(std::move(outputCollection), "GMTTkMuons");
0284   }
0285 
0286   void L1GTProducer::produceCL2Jets(edm::Event &event) const {
0287     std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
0288     const PFJetCollection &collection = event.get(cl2JetToken_);
0289     for (size_t i = 0; i < collection.size() && i < 12; i++) {
0290       l1gt::Jet gtJet = l1gt::Jet::unpack(collection[i].getHWJetGT());
0291       int hwZ0 = gtJet.z0.V.to_int() << 7;
0292       P2GTCandidate gtObj(0,
0293                           reco::ParticleState::PolarLorentzVector(scales_.to_pT(gtJet.v3.pt.V.to_int()),
0294                                                                   scales_.to_eta(gtJet.v3.eta.V.to_int()),
0295                                                                   scales_.to_phi(gtJet.v3.phi.V.to_int()),
0296                                                                   0),
0297                           reco::ParticleState::Point(0, 0, scales_.to_z0(hwZ0)));
0298       gtObj.hwPT_ = gtJet.v3.pt.V.to_int();
0299       gtObj.hwPhi_ = gtJet.v3.phi.V.to_int();
0300       gtObj.hwEta_ = gtJet.v3.eta.V.to_int();
0301       gtObj.hwZ0_ = hwZ0;
0302       gtObj.objectType_ = P2GTCandidate::CL2Jets;
0303 
0304       outputCollection->push_back(gtObj);
0305     }
0306     event.put(std::move(outputCollection), "CL2Jets");
0307   }
0308 
0309   void L1GTProducer::produceCL2Photons(edm::Event &event) const {
0310     std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
0311     const TkEmCollection &collection = event.get(cl2PhotonToken_);
0312     for (size_t i = 0; i < collection.size() && i < 12; i++) {
0313       l1gt::Photon gtPhoton = l1gt::Photon::unpack_ap(const_cast<TkEm &>(collection[i]).egBinaryWord<96>());
0314       P2GTCandidate gtObj(0,
0315                           reco::ParticleState::PolarLorentzVector(scales_.to_pT(gtPhoton.v3.pt.V.to_int()),
0316                                                                   scales_.to_eta(gtPhoton.v3.eta.V.to_int()),
0317                                                                   scales_.to_phi(gtPhoton.v3.phi.V.to_int()),
0318                                                                   0));
0319       gtObj.hwPT_ = gtPhoton.v3.pt.V.to_int();
0320       gtObj.hwPhi_ = gtPhoton.v3.phi.V.to_int();
0321       gtObj.hwEta_ = gtPhoton.v3.eta.V.to_int();
0322       gtObj.hwIso_ = gtPhoton.isolation.V.to_int();
0323       gtObj.hwQual_ = gtPhoton.quality.V.to_int();
0324       gtObj.objectType_ = P2GTCandidate::CL2Photons;
0325 
0326       outputCollection->push_back(gtObj);
0327     }
0328     event.put(std::move(outputCollection), "CL2Photons");
0329   }
0330 
0331   void L1GTProducer::produceCL2Electrons(edm::Event &event) const {
0332     std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
0333     const TkElectronCollection &collection = event.get(cl2ElectronToken_);
0334     for (size_t i = 0; i < collection.size() && i < 12; i++) {
0335       l1gt::Electron gtElectron = l1gt::Electron::unpack_ap(const_cast<TkElectron &>(collection[i]).egBinaryWord<96>());
0336       int hwZ0 = gtElectron.z0.V.to_int() << 7;
0337       P2GTCandidate gtObj(scales_.to_chg(gtElectron.charge.V.to_int()),
0338                           reco::ParticleState::PolarLorentzVector(scales_.to_pT(gtElectron.v3.pt.V.to_int()),
0339                                                                   scales_.to_eta(gtElectron.v3.eta.V.to_int()),
0340                                                                   scales_.to_phi(gtElectron.v3.phi.V.to_int()),
0341                                                                   0),
0342                           reco::ParticleState::Point(0, 0, scales_.to_z0(hwZ0)));
0343       gtObj.hwPT_ = gtElectron.v3.pt.V.to_int();
0344       gtObj.hwPhi_ = gtElectron.v3.phi.V.to_int();
0345       gtObj.hwEta_ = gtElectron.v3.eta.V.to_int();
0346       gtObj.hwZ0_ = hwZ0;
0347       gtObj.hwIso_ = gtElectron.isolation.V.to_int();
0348       gtObj.hwQual_ = gtElectron.quality.V.to_int();
0349       gtObj.hwCharge_ = gtElectron.charge.V.to_int();
0350       gtObj.objectType_ = P2GTCandidate::CL2Electrons;
0351 
0352       outputCollection->push_back(gtObj);
0353     }
0354     event.put(std::move(outputCollection), "CL2Electrons");
0355   }
0356 
0357   void L1GTProducer::produceCL2Taus(edm::Event &event) const {
0358     std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
0359     const PFTauCollection &collection = event.get(cl2TauToken_);
0360     for (size_t i = 0; i < collection.size() && i < 12; i++) {
0361       l1gt::Tau gtTau = collection[i].getHWTauGT();
0362       P2GTCandidate gtObj(scales_.to_chg(gtTau.charge.V.to_int()),
0363                           reco::ParticleState::PolarLorentzVector(scales_.to_pT(gtTau.v3.pt.V.to_int()),
0364                                                                   scales_.to_eta(gtTau.v3.eta.V.to_int()),
0365                                                                   scales_.to_phi(gtTau.v3.phi.V.to_int()),
0366                                                                   0));
0367       gtObj.hwPT_ = gtTau.v3.pt.V.to_int();
0368       gtObj.hwPhi_ = gtTau.v3.phi.V.to_int();
0369       gtObj.hwEta_ = gtTau.v3.eta.V.to_int();
0370       gtObj.hwSeed_pT_ = gtTau.seed_pt.V.to_int();
0371       gtObj.hwSeed_z0_ = gtTau.seed_z0.V.to_int();
0372       gtObj.hwCharge_ = gtTau.charge.V.to_int();
0373       gtObj.hwType_ = gtTau.type.V.to_int();
0374       gtObj.hwIso_ = gtTau.isolation.V.to_int();
0375       gtObj.objectType_ = P2GTCandidate::CL2Taus;
0376 
0377       outputCollection->push_back(gtObj);
0378     }
0379     event.put(std::move(outputCollection), "CL2Taus");
0380   }
0381 
0382   void L1GTProducer::produceCL2EtSum(edm::Event &event) const {
0383     std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
0384     const std::vector<EtSum> &collection = event.get(cl2EtSumToken_);
0385     const EtSum &met = collection[0];
0386 
0387     l1gt::Sum sum{true /* valid */, met.pt(), met.phi() / l1gt::Scales::ETAPHI_LSB, 0 /* scalar sum */};
0388 
0389     P2GTCandidate gtObj(0,
0390                         reco::ParticleState::PolarLorentzVector(
0391                             scales_.to_pT(sum.vector_pt.V.to_int()), 0, scales_.to_phi(sum.vector_phi.V.to_int()), 0));
0392     gtObj.hwPT_ = sum.vector_pt.V.to_int();
0393     gtObj.hwPhi_ = sum.vector_phi.V.to_int();
0394     gtObj.hwSca_sum_ = sum.scalar_pt.V.to_int();
0395     gtObj.objectType_ = P2GTCandidate::CL2EtSum;
0396 
0397     outputCollection->push_back(gtObj);
0398     event.put(std::move(outputCollection), "CL2EtSum");
0399   }
0400 
0401   void L1GTProducer::produceCl2HtSum(edm::Event &event) const {
0402     std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
0403     const std::vector<EtSum> &collection = event.get(cl2HtSumToken_);
0404     const EtSum &ht = collection[0];
0405     const EtSum &mht = collection[1];
0406 
0407     P2GTCandidate gtObj(
0408         0, reco::ParticleState::PolarLorentzVector(scales_.to_pT(mht.hwPt()), 0, scales_.to_phi(mht.hwPhi()), 0));
0409     gtObj.hwPT_ = mht.hwPt();
0410     gtObj.hwPhi_ = mht.hwPhi();
0411     gtObj.hwSca_sum_ = ht.hwPt();
0412     gtObj.objectType_ = P2GTCandidate::CL2HtSum;
0413 
0414     outputCollection->push_back(gtObj);
0415     event.put(std::move(outputCollection), "CL2HtSum");
0416   }
0417 
0418   void L1GTProducer::produce(edm::StreamID, edm::Event &event, const edm::EventSetup &setup) const {
0419     produceGTTPromptJets(event);
0420     produceGTTDisplacedJets(event);
0421     produceGTTPrimaryVert(event);
0422 
0423     produceGMTSaPromptMuons(event);
0424     produceGMTSaDisplacedMuons(event);
0425     produceGMTTkMuons(event);
0426 
0427     produceCL2Jets(event);
0428     produceCL2Photons(event);
0429     produceCL2Electrons(event);
0430     produceCL2Taus(event);
0431     produceCL2EtSum(event);
0432     produceCl2HtSum(event);
0433   }
0434 }  // namespace l1t
0435 
0436 using namespace l1t;
0437 
0438 DEFINE_FWK_MODULE(L1GTProducer);