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 , met.pt(), met.phi() / l1gt::Scales::ETAPHI_LSB, 0 };
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 }
0435
0436 using namespace l1t;
0437
0438 DEFINE_FWK_MODULE(L1GTProducer);