diff --git a/PhysicsTools/PatAlgos/python/producersLayer1/lowPtElectronProducer_cff.py b/PhysicsTools/PatAlgos/python/producersLayer1/lowPtElectronProducer_cff.py index 4a95b97d76edd..239ac2ce4a64a 100644 --- a/PhysicsTools/PatAlgos/python/producersLayer1/lowPtElectronProducer_cff.py +++ b/PhysicsTools/PatAlgos/python/producersLayer1/lowPtElectronProducer_cff.py @@ -26,8 +26,6 @@ ID = cms.InputTag("lowPtGsfElectronID"), ), - # Embedding of RECO/AOD items - # Embedding of RECO/AOD items embedTrack = True, embedGsfElectronCore = True, @@ -71,10 +69,16 @@ # Schedule rekeying of seed BDT ValueMaps by reco::GsfElectron for run2_miniAOD_UL and bParking from Configuration.ProcessModifiers.run2_miniAOD_UL_cff import run2_miniAOD_UL +from Configuration.Eras.Modifier_run2_miniAOD_devel_cff import run2_miniAOD_devel from Configuration.Eras.Modifier_bParking_cff import bParking + from RecoEgamma.EgammaElectronProducers.lowPtGsfElectronSeedValueMaps_cff import rekeyLowPtGsfElectronSeedValueMaps from RecoEgamma.EgammaElectronProducers.lowPtGsfElectronID_cff import lowPtGsfElectronID +from RecoEgamma.EgammaElectronProducers.lowPtGsfElectrons_cff import lowPtGsfElectrons + _makePatLowPtElectronsTask = makePatLowPtElectronsTask.copy() _makePatLowPtElectronsTask.add(rekeyLowPtGsfElectronSeedValueMaps) _makePatLowPtElectronsTask.add(lowPtGsfElectronID) (bParking | run2_miniAOD_UL).toReplaceWith(makePatLowPtElectronsTask,_makePatLowPtElectronsTask) +( (bParking & run2_miniAOD_UL) | (~bParking & run2_miniAOD_devel) ).toModify( + makePatLowPtElectronsTask, func = lambda t: t.add(lowPtGsfElectrons)) diff --git a/PhysicsTools/PatAlgos/python/selectionLayer1/lowPtElectronSelector_cfi.py b/PhysicsTools/PatAlgos/python/selectionLayer1/lowPtElectronSelector_cfi.py index 7ea6b50afd8b8..f040fd6147284 100644 --- a/PhysicsTools/PatAlgos/python/selectionLayer1/lowPtElectronSelector_cfi.py +++ b/PhysicsTools/PatAlgos/python/selectionLayer1/lowPtElectronSelector_cfi.py @@ -9,9 +9,13 @@ cut = cms.string("pt>1. && electronID('ID')>1.5"), ) +# Modifier for run2_miniAOD_devel +from Configuration.Eras.Modifier_run2_miniAOD_devel_cff import run2_miniAOD_devel +run2_miniAOD_devel.toModify(selectedPatLowPtElectrons,cut = "pt>1. && electronID('ID')>-0.25") + # Modifier for bParking (fully open selection) from Configuration.Eras.Modifier_bParking_cff import bParking -bParking.toModify(selectedPatLowPtElectrons,cut = "") +bParking.toModify(selectedPatLowPtElectrons,cut = "pt>1.") # Modifiers for legacy AOD from Configuration.Eras.Modifier_run2_miniAOD_80XLegacy_cff import run2_miniAOD_80XLegacy diff --git a/RecoEgamma/EgammaElectronProducers/plugins/LowPtGsfElectronFinalizer.cc b/RecoEgamma/EgammaElectronProducers/plugins/LowPtGsfElectronFinalizer.cc new file mode 100644 index 0000000000000..701e0f0a77d81 --- /dev/null +++ b/RecoEgamma/EgammaElectronProducers/plugins/LowPtGsfElectronFinalizer.cc @@ -0,0 +1,65 @@ +#include "CommonTools/CandAlgos/interface/ModifyObjectValueBase.h" +#include "DataFormats/EgammaCandidates/interface/GsfElectron.h" +#include "FWCore/Framework/interface/stream/EDProducer.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/EventSetup.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 LowPtGsfElectronFinalizer : public edm::stream::EDProducer<> { +public: + explicit LowPtGsfElectronFinalizer(const edm::ParameterSet&); + + void produce(edm::Event&, const edm::EventSetup&) override; + + static void fillDescriptions(edm::ConfigurationDescriptions&); + +private: + const edm::EDGetTokenT previousGsfElectrons_; + std::unique_ptr regression_; + + const edm::EDPutTokenT putToken_; +}; + +using edm::InputTag; +using reco::GsfElectronCollection; + +LowPtGsfElectronFinalizer::LowPtGsfElectronFinalizer(const edm::ParameterSet& cfg) + : previousGsfElectrons_{consumes(cfg.getParameter("previousGsfElectronsTag"))}, + putToken_{produces()} { + auto const& iconf = cfg.getParameterSet("regressionConfig"); + auto const& mname = iconf.getParameter("modifierName"); + auto cc = consumesCollector(); + regression_.reset(ModifyObjectValueFactory::get()->create(mname, iconf, cc)); +} + +void LowPtGsfElectronFinalizer::produce(edm::Event& event, const edm::EventSetup& setup) { + // Setup regression for event + regression_->setEvent(event); + regression_->setEventContent(setup); + + // Create new modified electron collection + reco::GsfElectronCollection outputElectrons; + for (auto const& electron : event.get(previousGsfElectrons_)) { + outputElectrons.emplace_back(electron); + auto& newElectron = outputElectrons.back(); + regression_->modifyObject(newElectron); + } + + // Emplace modified electrons to event + event.emplace(putToken_, std::move(outputElectrons)); +} + +void LowPtGsfElectronFinalizer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("previousGsfElectronsTag", {}); + edm::ParameterSetDescription psd; + psd.setUnknown(); + desc.add("regressionConfig", psd); + descriptions.addWithDefaultLabel(desc); +} + +#include "FWCore/Framework/interface/MakerMacros.h" +DEFINE_FWK_MODULE(LowPtGsfElectronFinalizer); diff --git a/RecoEgamma/EgammaElectronProducers/python/lowPtGsfElectronID_cff.py b/RecoEgamma/EgammaElectronProducers/python/lowPtGsfElectronID_cff.py index 15cb46811b4eb..91a9aafe31b01 100644 --- a/RecoEgamma/EgammaElectronProducers/python/lowPtGsfElectronID_cff.py +++ b/RecoEgamma/EgammaElectronProducers/python/lowPtGsfElectronID_cff.py @@ -11,6 +11,8 @@ ) from Configuration.ProcessModifiers.run2_miniAOD_UL_cff import run2_miniAOD_UL +from Configuration.Eras.Modifier_run2_miniAOD_devel_cff import run2_miniAOD_devel +from Configuration.Eras.Modifier_bParking_cff import bParking run2_miniAOD_UL.toModify( lowPtGsfElectronID, rho = "fixedGridRhoFastjetAll", @@ -18,3 +20,11 @@ ModelThresholds = [-99.], Version = "V1", ) +run2_miniAOD_devel.toModify( + lowPtGsfElectronID, + ModelWeights = ["RecoEgamma/ElectronIdentification/data/LowPtElectrons/LowPtElectrons_ID_2020Nov28.root"], +) +(bParking & run2_miniAOD_UL).toModify( + lowPtGsfElectronID, + ModelWeights = ["RecoEgamma/ElectronIdentification/data/LowPtElectrons/LowPtElectrons_ID_2021May17.root"], +) diff --git a/RecoEgamma/EgammaElectronProducers/python/lowPtGsfElectronSequence_cff.py b/RecoEgamma/EgammaElectronProducers/python/lowPtGsfElectronSequence_cff.py index 342eaf1a609e7..9f323046b8e52 100644 --- a/RecoEgamma/EgammaElectronProducers/python/lowPtGsfElectronSequence_cff.py +++ b/RecoEgamma/EgammaElectronProducers/python/lowPtGsfElectronSequence_cff.py @@ -63,7 +63,7 @@ from RecoEgamma.EgammaElectronProducers.lowPtGsfElectronCores_cff import * # Low pT electrons -from RecoEgamma.EgammaElectronProducers.lowPtGsfElectrons_cfi import * +from RecoEgamma.EgammaElectronProducers.lowPtGsfElectrons_cff import lowPtGsfElectrons # Low pT Electron value maps from RecoEgamma.EgammaElectronProducers.lowPtGsfElectronSeedValueMaps_cff import lowPtGsfElectronSeedValueMaps diff --git a/RecoEgamma/EgammaElectronProducers/python/lowPtGsfElectrons_cfi.py b/RecoEgamma/EgammaElectronProducers/python/lowPtGsfElectronsPreRegression_cfi.py similarity index 89% rename from RecoEgamma/EgammaElectronProducers/python/lowPtGsfElectrons_cfi.py rename to RecoEgamma/EgammaElectronProducers/python/lowPtGsfElectronsPreRegression_cfi.py index 8e0cfcd1bee30..e6d2faa55c3da 100644 --- a/RecoEgamma/EgammaElectronProducers/python/lowPtGsfElectrons_cfi.py +++ b/RecoEgamma/EgammaElectronProducers/python/lowPtGsfElectronsPreRegression_cfi.py @@ -5,7 +5,7 @@ from RecoEgamma.EgammaIsolationAlgos.electronTrackIsolations_cfi import trkIsol03CfgV1,trkIsol04CfgV1 from RecoEgamma.EgammaIsolationAlgos.electronTrackIsolations_cfi import trkIsol03CfgV2,trkIsol04CfgV2 -lowPtGsfElectrons = cms.EDProducer( +lowPtGsfElectronsPreRegression = cms.EDProducer( "LowPtGsfElectronProducer", # input collections @@ -63,8 +63,8 @@ ) from Configuration.Eras.Modifier_fastSim_cff import fastSim -fastSim.toModify(lowPtGsfElectrons,ctfTracksTag = cms.InputTag("generalTracksBeforeMixing")) +fastSim.toModify(lowPtGsfElectronsPreRegression,ctfTracksTag = cms.InputTag("generalTracksBeforeMixing")) from Configuration.Eras.Modifier_pp_on_AA_2018_cff import pp_on_AA_2018 -pp_on_AA_2018.toModify(lowPtGsfElectrons.preselection, minSCEtBarrel = 15.0) -pp_on_AA_2018.toModify(lowPtGsfElectrons.preselection, minSCEtEndcaps = 15.0) +pp_on_AA_2018.toModify(lowPtGsfElectronsPreRegression.preselection, minSCEtBarrel = 15.0) +pp_on_AA_2018.toModify(lowPtGsfElectronsPreRegression.preselection, minSCEtEndcaps = 15.0) diff --git a/RecoEgamma/EgammaElectronProducers/python/lowPtGsfElectrons_cff.py b/RecoEgamma/EgammaElectronProducers/python/lowPtGsfElectrons_cff.py new file mode 100644 index 0000000000000..ac32ecc504f42 --- /dev/null +++ b/RecoEgamma/EgammaElectronProducers/python/lowPtGsfElectrons_cff.py @@ -0,0 +1,55 @@ +import FWCore.ParameterSet.Config as cms +from RecoEgamma.EgammaElectronProducers.lowPtGsfElectronsPreRegression_cfi import lowPtGsfElectronsPreRegression + +lowPtGsfElectrons = lowPtGsfElectronsPreRegression.clone() + +################################################################################ +# LowPtGsfElectronProducer above is run by default in RECO +# LowPtGsfElectronFinalizer below is scheduled for run2_miniAOD_UL + +from RecoEgamma.EgammaTools.regressionModifier_cfi import regressionModifier106XUL +_lowPtRegressionModifier = regressionModifier106XUL.clone( + modifierName = 'EGRegressionModifierV3', + rhoTag = 'fixedGridRhoFastjetAll', + eleRegs = dict( + ecalOnlyMean = dict( + lowEtHighEtBoundary = 20., + ebLowEtForestName = "lowPtElectron_eb_ecalOnly_05To50_mean", + ebHighEtForestName = "lowPtElectron_eb_ecalOnly_05To50_mean", + eeLowEtForestName = "lowPtElectron_ee_ecalOnly_05To50_mean", + eeHighEtForestName = "lowPtElectron_ee_ecalOnly_05To50_mean", + ), + ecalOnlySigma = dict( + lowEtHighEtBoundary = 20., + ebLowEtForestName = "lowPtElectron_eb_ecalOnly_05To50_sigma", + ebHighEtForestName = "lowPtElectron_eb_ecalOnly_05To50_sigma", + eeLowEtForestName = "lowPtElectron_ee_ecalOnly_05To50_sigma", + eeHighEtForestName = "lowPtElectron_ee_ecalOnly_05To50_sigma", + ), + epComb = dict( + ecalTrkRegressionConfig = dict( + lowEtHighEtBoundary = 20., + ebLowEtForestName = "lowPtElectron_eb_ecalTrk_05To50_mean", + ebHighEtForestName = "lowPtElectron_eb_ecalTrk_05To50_mean", + eeLowEtForestName = "lowPtElectron_ee_ecalTrk_05To50_mean", + eeHighEtForestName = "lowPtElectron_ee_ecalTrk_05To50_mean", + ), + ecalTrkRegressionUncertConfig = dict( + lowEtHighEtBoundary = 20., + ebLowEtForestName = "lowPtElectron_eb_ecalTrk_05To50_sigma", + ebHighEtForestName = "lowPtElectron_eb_ecalTrk_05To50_sigma", + eeLowEtForestName = "lowPtElectron_ee_ecalTrk_05To50_sigma", + eeHighEtForestName = "lowPtElectron_ee_ecalTrk_05To50_sigma", + ), + ) + ), +) + +from RecoEgamma.EgammaElectronProducers.lowPtGsfElectronFinalizer_cfi import lowPtGsfElectronFinalizer +_lowPtGsfElectrons = lowPtGsfElectronFinalizer.clone( + previousGsfElectronsTag = "lowPtGsfElectrons::@skipCurrentProcess", + regressionConfig = _lowPtRegressionModifier, +) + +from Configuration.ProcessModifiers.run2_miniAOD_UL_cff import run2_miniAOD_UL +run2_miniAOD_UL.toReplaceWith(lowPtGsfElectrons,_lowPtGsfElectrons)