diff --git a/RecoEgamma/EgammaHLTProducers/plugins/HLTCaloObjInRegionsProducer.cc b/RecoEgamma/EgammaHLTProducers/plugins/HLTCaloObjInRegionsProducer.cc index 17e7a3c953ad7..ad50363c7355b 100644 --- a/RecoEgamma/EgammaHLTProducers/plugins/HLTCaloObjInRegionsProducer.cc +++ b/RecoEgamma/EgammaHLTProducers/plugins/HLTCaloObjInRegionsProducer.cc @@ -331,3 +331,16 @@ DEFINE_FWK_MODULE(HLTEcalRecHitsInRegionsProducer); #include "DataFormats/EcalRecHit/interface/EcalUncalibratedRecHit.h" using HLTEcalUnCalibRecHitsInRegionsProducer = HLTCaloObjInRegionsProducer; DEFINE_FWK_MODULE(HLTEcalUnCalibRecHitsInRegionsProducer); + +// HGCAL Digis +#include "DataFormats/HGCDigi/interface/HGCDigiCollections.h" +using HLTHGCalDigisInRegionsProducer = HLTCaloObjInRegionsProducer; +DEFINE_FWK_MODULE(HLTHGCalDigisInRegionsProducer); + +// HGCAL RecHits +#include "DataFormats/HGCRecHit/interface/HGCRecHit.h" +using HLTHGCalRecHitsInRegionsProducer = HLTCaloObjInRegionsProducer; +DEFINE_FWK_MODULE(HLTHGCalRecHitsInRegionsProducer); +#include "DataFormats/HGCRecHit/interface/HGCUncalibratedRecHit.h" +using HLTHGCalUncalibratedRecHitsInRegionsProducer = HLTCaloObjInRegionsProducer; +DEFINE_FWK_MODULE(HLTHGCalUncalibratedRecHitsInRegionsProducer); diff --git a/RecoEgamma/EgammaHLTProducers/plugins/L1TEGammaFilteredCollectionProducer.cc b/RecoEgamma/EgammaHLTProducers/plugins/L1TEGammaFilteredCollectionProducer.cc new file mode 100644 index 0000000000000..b634ea3d4391e --- /dev/null +++ b/RecoEgamma/EgammaHLTProducers/plugins/L1TEGammaFilteredCollectionProducer.cc @@ -0,0 +1,121 @@ +/* + Author: Swagata Mukherjee + + Date: Feb 2021 + + At the time of writing this new module, it is intended to be used mainly for + phase-2. Before feeding in the L1 e/g collection to + HLTEcalRecHitInAllL1RegionsProducer, it can pass through this module which + will filter the collection based on hardware quality and pT. + + The most generic L1 e/g phase-2 collections are: + TkEm, which is std::vector + & + StaEG, which is BXVector + + Despite this technical difference, the objects are almost identical, for all + practical purposes. So any of these two collections could have been used. + Currently, BXVector is recognised by the next step + HLTEcalRecHitInAllL1RegionsProducer, while std::vector is not. So + using BXVector is straightforward. If for some reason one need to + use std::vector, changes in HLTEcalRecHitInAllL1RegionsProducer + would also be necesary. +*/ + +#include "DataFormats/L1TCorrelator/interface/TkEm.h" +#include "FWCore/Framework/interface/ESHandle.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/EventSetup.h" +#include "FWCore/Framework/interface/EventSetupRecord.h" +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/Framework/interface/global/EDProducer.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" + +class L1TEGammaFilteredCollectionProducer : public edm::global::EDProducer<> { +public: + explicit L1TEGammaFilteredCollectionProducer(const edm::ParameterSet&); + ~L1TEGammaFilteredCollectionProducer() override; + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + void produce(edm::StreamID sid, edm::Event& iEvent, const edm::EventSetup& iSetup) const override; + +private: + edm::InputTag l1EgTag_; + edm::EDGetTokenT> l1EgToken_; + int quality_; + bool qualIsMask_; + bool applyQual_; + int minBX_; + int maxBX_; + double minPt_; + std::vector scalings_; // pT scaling factors + double getOfflineEt(double et) const; +}; + +L1TEGammaFilteredCollectionProducer::L1TEGammaFilteredCollectionProducer(const edm::ParameterSet& iConfig) + : l1EgTag_(iConfig.getParameter("inputTag")), l1EgToken_(consumes>(l1EgTag_)) { + quality_ = iConfig.getParameter("quality"); + qualIsMask_ = iConfig.getParameter("qualIsMask"); + applyQual_ = iConfig.getParameter("applyQual"); + minBX_ = iConfig.getParameter("minBX"); + maxBX_ = iConfig.getParameter("maxBX"); + minPt_ = iConfig.getParameter("minPt"); + scalings_ = iConfig.getParameter>("scalings"); + + produces>(); +} + +L1TEGammaFilteredCollectionProducer::~L1TEGammaFilteredCollectionProducer() = default; + +void L1TEGammaFilteredCollectionProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("inputTag", edm::InputTag("L1EGammaClusterEmuProducer")); + desc.add("quality", 0x2); + desc.add("qualIsMask", true); + desc.add("applyQual", true); + desc.add("minBX", -1); + desc.add("maxBX", 1); + desc.add("minPt", 5.0); + desc.add>("scalings", {2.6604, 1.06077, 0.0}); + descriptions.add("L1TEGammaFilteredCollectionProducer", desc); +} + +void L1TEGammaFilteredCollectionProducer::produce(edm::StreamID sid, + edm::Event& iEvent, + const edm::EventSetup& iSetup) const { + auto outEgs = std::make_unique>(); + auto l1Egs = iEvent.getHandle(l1EgToken_); + + int startBX = std::max((*l1Egs).getFirstBX(), minBX_); + int endBX = std::min((*l1Egs).getLastBX(), maxBX_); + + for (int bx = startBX; bx <= endBX; bx++) { + // Loop over all L1 e/gamma objects + for (BXVector::const_iterator iEg = (*l1Egs).begin(bx); iEg != (*l1Egs).end(bx); iEg++) { + double offlineEt = this->getOfflineEt((*iEg).pt()); + bool passQuality(false); + if (applyQual_) { + if (qualIsMask_) + passQuality = ((*iEg).hwQual() & quality_); + else + passQuality = ((*iEg).hwQual() == quality_); + } else + passQuality = true; + + // if quality is passed, put the object in filtered collection + if (passQuality && (offlineEt > minPt_)) { + outEgs->push_back(bx, *iEg); + } + } // l1EG loop ends + } // BX loop ends + iEvent.put(std::move(outEgs)); +} + +double L1TEGammaFilteredCollectionProducer::getOfflineEt(double et) const { + return (scalings_.at(0) + et * scalings_.at(1) + et * et * scalings_.at(2)); +} + +DEFINE_FWK_MODULE(L1TEGammaFilteredCollectionProducer); diff --git a/RecoHGCal/TICL/plugins/BuildFile.xml b/RecoHGCal/TICL/plugins/BuildFile.xml index 00c267848b23e..706b016c875a4 100644 --- a/RecoHGCal/TICL/plugins/BuildFile.xml +++ b/RecoHGCal/TICL/plugins/BuildFile.xml @@ -5,6 +5,8 @@ + + diff --git a/RecoHGCal/TICL/plugins/SeedingRegionAlgoBase.h b/RecoHGCal/TICL/plugins/SeedingRegionAlgoBase.h index ed30439660e78..5721e2df4227b 100644 --- a/RecoHGCal/TICL/plugins/SeedingRegionAlgoBase.h +++ b/RecoHGCal/TICL/plugins/SeedingRegionAlgoBase.h @@ -9,6 +9,7 @@ #include #include "DataFormats/HGCalReco/interface/Common.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" #include "DataFormats/HGCalReco/interface/TICLSeedingRegion.h" #include "FWCore/Framework/interface/ConsumesCollector.h" @@ -30,6 +31,8 @@ namespace ticl { const edm::EventSetup& es, std::vector& result) = 0; + static void fillPSetDescription(edm::ParameterSetDescription& desc) { desc.add("algo_verbosity", 0); } + enum VerbosityLevel { None = 0, Basic, Advanced, Expert, Guru }; protected: diff --git a/RecoHGCal/TICL/plugins/SeedingRegionAlgoFactory.cc b/RecoHGCal/TICL/plugins/SeedingRegionAlgoFactory.cc new file mode 100644 index 0000000000000..5da8aa8c9e83a --- /dev/null +++ b/RecoHGCal/TICL/plugins/SeedingRegionAlgoFactory.cc @@ -0,0 +1,12 @@ +#include "FWCore/ParameterSet/interface/ValidatedPluginFactoryMacros.h" +#include "FWCore/ParameterSet/interface/ValidatedPluginMacros.h" +#include "SeedingRegionAlgoFactory.h" +#include "SeedingRegionByTracks.h" +#include "SeedingRegionGlobal.h" +#include "SeedingRegionByL1.h" + +EDM_REGISTER_VALIDATED_PLUGINFACTORY(SeedingRegionAlgoFactory, "SeedingRegionAlgoFactory"); + +DEFINE_EDM_VALIDATED_PLUGIN(SeedingRegionAlgoFactory, ticl::SeedingRegionByTracks, "SeedingRegionByTracks"); +DEFINE_EDM_VALIDATED_PLUGIN(SeedingRegionAlgoFactory, ticl::SeedingRegionGlobal, "SeedingRegionGlobal"); +DEFINE_EDM_VALIDATED_PLUGIN(SeedingRegionAlgoFactory, ticl::SeedingRegionByL1, "SeedingRegionByL1"); diff --git a/RecoHGCal/TICL/plugins/SeedingRegionAlgoFactory.h b/RecoHGCal/TICL/plugins/SeedingRegionAlgoFactory.h new file mode 100644 index 0000000000000..8cb627809a4d7 --- /dev/null +++ b/RecoHGCal/TICL/plugins/SeedingRegionAlgoFactory.h @@ -0,0 +1,11 @@ +#ifndef RecoHGCAL_TICL_SeedingRegionAlgoFactory_h +#define RecoHGCAL_TICL_SeedingRegionAlgoFactory_h + +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/PluginManager/interface/PluginFactory.h" +#include "SeedingRegionAlgoBase.h" + +using SeedingRegionAlgoFactory = + edmplugin::PluginFactory; + +#endif diff --git a/RecoHGCal/TICL/plugins/SeedingRegionByL1.cc b/RecoHGCal/TICL/plugins/SeedingRegionByL1.cc new file mode 100644 index 0000000000000..6a2c62534960d --- /dev/null +++ b/RecoHGCal/TICL/plugins/SeedingRegionByL1.cc @@ -0,0 +1,68 @@ +/* + Author: Swagata Mukherjee + + Date: Feb 2021 + + TICL is currently seeded by tracks, or just globally. + Here, adding option to seed TICL by L1 e/gamma objects (L1 TkEm). + This is expected to be useful for CPU timing at the HLT. +*/ + +#include "SeedingRegionByL1.h" + +#include +#include +#include + +#include "FWCore/MessageLogger/interface/MessageLogger.h" + +ticl::SeedingRegionByL1::SeedingRegionByL1(const edm::ParameterSet &conf, edm::ConsumesCollector &sumes) + : SeedingRegionAlgoBase(conf, sumes), + l1TkEmsToken_(sumes.consumes>(conf.getParameter("l1TkEmColl"))), + algoVerbosity_(conf.getParameter("algo_verbosity")), + minPt_(conf.getParameter("minPt")), + minAbsEta_(conf.getParameter("minAbsEta")), + maxAbsEta_(conf.getParameter("maxAbsEta")), + endcapScalings_(conf.getParameter>("endcapScalings")), + quality_(conf.getParameter("quality")) {} + +void ticl::SeedingRegionByL1::makeRegions(const edm::Event &ev, + const edm::EventSetup &es, + std::vector &result) { + auto l1TrkEms = ev.getHandle(l1TkEmsToken_); + edm::ProductID l1tkemsId = l1TrkEms.id(); + + for (size_t indx = 0; indx < (*l1TrkEms).size(); indx++) { + const auto &l1TrkEm = (*l1TrkEms)[indx]; + double offlinePt = this->tkEmOfflineEt(l1TrkEm.pt()); + if ((offlinePt < minPt_) || (std::abs(l1TrkEm.eta()) < minAbsEta_) || (std::abs(l1TrkEm.eta()) > maxAbsEta_) || + (l1TrkEm.EGRef()->hwQual() != quality_)) { + continue; + } + + int iSide = int(l1TrkEm.eta() > 0); + result.emplace_back(GlobalPoint(l1TrkEm.p4().X(), l1TrkEm.p4().Y(), l1TrkEm.p4().Z()), + GlobalVector(l1TrkEm.px(), l1TrkEm.py(), l1TrkEm.pz()), + iSide, + indx, + l1tkemsId); + } + + std::sort(result.begin(), result.end(), [](const TICLSeedingRegion &a, const TICLSeedingRegion &b) { + return a.directionAtOrigin.perp2() > b.directionAtOrigin.perp2(); + }); +} + +double ticl::SeedingRegionByL1::tkEmOfflineEt(double et) const { + return (endcapScalings_.at(0) + et * endcapScalings_.at(1) + et * et * endcapScalings_.at(2)); +} + +void ticl::SeedingRegionByL1::fillPSetDescription(edm::ParameterSetDescription &desc) { + desc.add("l1TkEmColl", edm::InputTag("L1TkPhotonsHGC", "EG")); + desc.add("minPt", 10); + desc.add("minAbsEta", 1.479); + desc.add("maxAbsEta", 4.0); + desc.add>("endcapScalings", {3.17445, 1.13219, 0.0}); + desc.add("quality", 5); + SeedingRegionAlgoBase::fillPSetDescription(desc); +} diff --git a/RecoHGCal/TICL/plugins/SeedingRegionByL1.h b/RecoHGCal/TICL/plugins/SeedingRegionByL1.h new file mode 100644 index 0000000000000..6daa705cbad8f --- /dev/null +++ b/RecoHGCal/TICL/plugins/SeedingRegionByL1.h @@ -0,0 +1,42 @@ +// Author: Swagata Mukherjee + +#ifndef RecoHGCal_TICL_SeedingRegionByL1_h +#define RecoHGCal_TICL_SeedingRegionByL1_h +#include +#include + +#include "DataFormats/L1TCorrelator/interface/TkEm.h" +#include "DataFormats/L1TCorrelator/interface/TkEmFwd.h" +#include "FWCore/Framework/interface/ConsumesCollector.h" +#include "FWCore/Framework/interface/ESHandle.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" +#include "FWCore/Utilities/interface/ESGetToken.h" +#include "RecoHGCal/TICL/plugins/SeedingRegionAlgoBase.h" + +namespace ticl { + class SeedingRegionByL1 final : public SeedingRegionAlgoBase { + public: + SeedingRegionByL1(const edm::ParameterSet& conf, edm::ConsumesCollector& sumes); + + void initialize(const edm::EventSetup& es) override{}; + void makeRegions(const edm::Event& ev, const edm::EventSetup& es, std::vector& result) override; + static void fillPSetDescription(edm::ParameterSetDescription& desc); + + private: + edm::EDGetTokenT> l1TkEmsToken_; + int algoVerbosity_ = 0; + double minPt_; // minimum pT of L1 TkEm objects + double minAbsEta_; // minimum |eta| of L1 TkEm objects + double maxAbsEta_; // maximum |eta| of L1 TkEm objects + std::vector endcapScalings_; // pT scaling factors for endcap + int quality_; // hwQual + + double tkEmOfflineEt(double et) const; + }; +} // namespace ticl +#endif diff --git a/RecoHGCal/TICL/plugins/SeedingRegionByTracks.cc b/RecoHGCal/TICL/plugins/SeedingRegionByTracks.cc index 16d69c391f38a..c7b07b757775b 100644 --- a/RecoHGCal/TICL/plugins/SeedingRegionByTracks.cc +++ b/RecoHGCal/TICL/plugins/SeedingRegionByTracks.cc @@ -65,6 +65,15 @@ void SeedingRegionByTracks::makeRegions(const edm::Event &ev, }); } +void SeedingRegionByTracks::fillPSetDescription(edm::ParameterSetDescription &desc) { + desc.add("tracks", edm::InputTag("generalTracks")); + desc.add("cutTk", + "1.48 < abs(eta) < 3.0 && pt > 1. && quality(\"highPurity\") && " + "hitPattern().numberOfLostHits(\"MISSING_OUTER_HITS\") < 5"); + desc.add("propagator", "PropagatorWithMaterial"); + SeedingRegionAlgoBase::fillPSetDescription(desc); +} + void SeedingRegionByTracks::buildFirstLayers() { float zVal = hgcons_->waferZ(1, true); std::pair rMinMax = hgcons_->rangeR(zVal, true); diff --git a/RecoHGCal/TICL/plugins/SeedingRegionByTracks.h b/RecoHGCal/TICL/plugins/SeedingRegionByTracks.h index d8d9f61214c02..fc8f0f539ef22 100644 --- a/RecoHGCal/TICL/plugins/SeedingRegionByTracks.h +++ b/RecoHGCal/TICL/plugins/SeedingRegionByTracks.h @@ -37,6 +37,8 @@ namespace ticl { void makeRegions(const edm::Event& ev, const edm::EventSetup& es, std::vector& result) override; + static void fillPSetDescription(edm::ParameterSetDescription& desc); + private: void buildFirstLayers(); diff --git a/RecoHGCal/TICL/plugins/SeedingRegionGlobal.cc b/RecoHGCal/TICL/plugins/SeedingRegionGlobal.cc index 2e7f0c2a10824..96b09dbf02c27 100644 --- a/RecoHGCal/TICL/plugins/SeedingRegionGlobal.cc +++ b/RecoHGCal/TICL/plugins/SeedingRegionGlobal.cc @@ -26,3 +26,7 @@ void SeedingRegionGlobal::makeRegions(const edm::Event &ev, result.emplace_back(GlobalPoint(0., 0., 0.), GlobalVector(0., 0., 0.), i, -1, edm::ProductID()); } } + +void SeedingRegionGlobal::fillPSetDescription(edm::ParameterSetDescription &desc) { + SeedingRegionAlgoBase::fillPSetDescription(desc); +} diff --git a/RecoHGCal/TICL/plugins/SeedingRegionGlobal.h b/RecoHGCal/TICL/plugins/SeedingRegionGlobal.h index c5031c38f5dda..09d517ffe6d26 100644 --- a/RecoHGCal/TICL/plugins/SeedingRegionGlobal.h +++ b/RecoHGCal/TICL/plugins/SeedingRegionGlobal.h @@ -25,6 +25,8 @@ namespace ticl { void initialize(const edm::EventSetup& es) override{}; void makeRegions(const edm::Event& ev, const edm::EventSetup& es, std::vector& result) override; + + static void fillPSetDescription(edm::ParameterSetDescription& desc); }; } // namespace ticl #endif diff --git a/RecoHGCal/TICL/plugins/TICLSeedingRegionProducer.cc b/RecoHGCal/TICL/plugins/TICLSeedingRegionProducer.cc index b886b69aef8e0..ca4a80c3784e7 100644 --- a/RecoHGCal/TICL/plugins/TICLSeedingRegionProducer.cc +++ b/RecoHGCal/TICL/plugins/TICLSeedingRegionProducer.cc @@ -12,10 +12,13 @@ #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" #include "FWCore/ParameterSet/interface/ParameterSetDescription.h" +#include "FWCore/ParameterSet/interface/PluginDescription.h" #include "FWCore/Framework/interface/ConsumesCollector.h" #include "RecoHGCal/TICL/plugins/SeedingRegionAlgoBase.h" +#include "SeedingRegionByL1.h" #include "SeedingRegionByTracks.h" #include "SeedingRegionGlobal.h" +#include "SeedingRegionAlgoFactory.h" using namespace ticl; @@ -31,37 +34,24 @@ class TICLSeedingRegionProducer : public edm::stream::EDProducer<> { private: std::unique_ptr myAlgo_; - int algoId_; - std::string seedingId_; }; + DEFINE_FWK_MODULE(TICLSeedingRegionProducer); -TICLSeedingRegionProducer::TICLSeedingRegionProducer(const edm::ParameterSet& ps) - : algoId_(ps.getParameter("algoId")) { +TICLSeedingRegionProducer::TICLSeedingRegionProducer(const edm::ParameterSet& ps) { auto sumes = consumesCollector(); - - switch (algoId_) { - case 1: - myAlgo_ = std::make_unique(ps, sumes); - break; - case 2: - myAlgo_ = std::make_unique(ps, sumes); - break; - default: - break; - } + auto seedingPSet = ps.getParameter("seedingPSet"); + auto algoType = seedingPSet.getParameter("type"); + myAlgo_ = SeedingRegionAlgoFactory::get()->create(algoType, seedingPSet, sumes); produces>(); } void TICLSeedingRegionProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; - desc.add("algo_verbosity", 0); - desc.add("tracks", edm::InputTag("generalTracks")); - desc.add("cutTk", - "1.48 < abs(eta) < 3.0 && pt > 1. && quality(\"highPurity\") && " - "hitPattern().numberOfLostHits(\"MISSING_OUTER_HITS\") < 5"); - desc.add("propagator", "PropagatorWithMaterial"); - desc.add("algoId", 1); + + edm::ParameterSetDescription seedingDesc; + seedingDesc.addNode(edm::PluginDescription("type", "SeedingRegionGlobal", true)); + desc.add("seedingPSet", seedingDesc); descriptions.add("ticlSeedingRegionProducer", desc); } diff --git a/RecoHGCal/TICL/python/TICLSeedingRegions_cff.py b/RecoHGCal/TICL/python/TICLSeedingRegions_cff.py index 4b76fd39d322c..e5d55aaec4883 100644 --- a/RecoHGCal/TICL/python/TICLSeedingRegions_cff.py +++ b/RecoHGCal/TICL/python/TICLSeedingRegions_cff.py @@ -5,13 +5,13 @@ # SEEDING REGION ticlSeedingGlobal = _ticlSeedingRegionProducer.clone( - algoId = 2 + seedingPSet = _ticlSeedingRegionProducer.seedingPSet.clone(type="SeedingRegionGlobal") ) ticlSeedingTrk = _ticlSeedingRegionProducer.clone( - algoId = 1 + seedingPSet = _ticlSeedingRegionProducer.seedingPSet.clone(type="SeedingRegionByTracks") ) ticlSeedingGlobalHFNose = _ticlSeedingRegionProducer.clone( - algoId = 2 + seedingPSet = _ticlSeedingRegionProducer.seedingPSet.clone(type="SeedingRegionGlobal") )