Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LowPtElectrons: updates for nano v10 #37137

Merged
merged 7 commits into from
May 17, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.cc
Original file line number Diff line number Diff line change
Expand Up @@ -28,23 +28,29 @@ NanoAODBaseCrossCleaner::NanoAODBaseCrossCleaner(const edm::ParameterSet& params
jets_(consumes<edm::View<pat::Jet>>(params.getParameter<edm::InputTag>("jets"))),
muons_(consumes<edm::View<pat::Muon>>(params.getParameter<edm::InputTag>("muons"))),
electrons_(consumes<edm::View<pat::Electron>>(params.getParameter<edm::InputTag>("electrons"))),
lowPtElectronsTag_(params.getParameter<edm::InputTag>("lowPtElectrons")),
lowPtElectrons_(mayConsume<edm::View<pat::Electron>>(lowPtElectronsTag_)),
taus_(consumes<edm::View<pat::Tau>>(params.getParameter<edm::InputTag>("taus"))),
photons_(consumes<edm::View<pat::Photon>>(params.getParameter<edm::InputTag>("photons"))),
jetSel_(params.getParameter<std::string>("jetSel")),
muonSel_(params.getParameter<std::string>("muonSel")),
electronSel_(params.getParameter<std::string>("electronSel")),
lowPtElectronSel_(params.getParameter<std::string>("lowPtElectronSel")),
tauSel_(params.getParameter<std::string>("tauSel")),
photonSel_(params.getParameter<std::string>("photonSel")),
jetName_(params.getParameter<std::string>("jetName")),
muonName_(params.getParameter<std::string>("muonName")),
electronName_(params.getParameter<std::string>("electronName")),
lowPtElectronName_(params.getParameter<std::string>("lowPtElectronName")),
tauName_(params.getParameter<std::string>("tauName")),
photonName_(params.getParameter<std::string>("photonName"))

{
produces<nanoaod::FlatTable>("jets");
produces<nanoaod::FlatTable>("muons");
produces<nanoaod::FlatTable>("electrons");
if (!lowPtElectronsTag_.label().empty())
produces<nanoaod::FlatTable>("lowPtElectrons");
produces<nanoaod::FlatTable>("taus");
produces<nanoaod::FlatTable>("photons");
}
Expand Down Expand Up @@ -86,6 +92,15 @@ void NanoAODBaseCrossCleaner::produce(edm::Event& iEvent, const edm::EventSetup&
}
auto electronsTable = std::make_unique<nanoaod::FlatTable>(electronsIn->size(), electronName_, false, true);

edm::Handle<edm::View<pat::Electron>> lowPtElectronsIn;
std::vector<uint8_t> lowPtEles;
if (!lowPtElectronsTag_.label().empty()) {
iEvent.getByToken(lowPtElectrons_, lowPtElectronsIn);
for (const auto& e : *lowPtElectronsIn) {
lowPtEles.push_back(lowPtElectronSel_(e));
}
}

edm::Handle<edm::View<pat::Tau>> tausIn;
iEvent.getByToken(taus_, tausIn);
std::vector<uint8_t> taus;
Expand Down Expand Up @@ -115,6 +130,13 @@ void NanoAODBaseCrossCleaner::produce(edm::Event& iEvent, const edm::EventSetup&
iEvent.put(std::move(electronsTable), "electrons");
iEvent.put(std::move(tausTable), "taus");
iEvent.put(std::move(photonsTable), "photons");

if (!lowPtElectronsTag_.label().empty()) {
auto lowPtElectronsTable =
std::make_unique<nanoaod::FlatTable>(lowPtElectronsIn->size(), lowPtElectronName_, false, true);
lowPtElectronsTable->addColumn<uint8_t>(name_, lowPtEles, doc_);
iEvent.put(std::move(lowPtElectronsTable), "lowPtElectrons");
}
}

// ------------ method called once each stream before processing any runs, lumis or events ------------
Expand Down
4 changes: 4 additions & 0 deletions PhysicsTools/NanoAOD/plugins/NanoAODBaseCrossCleaner.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,16 +79,20 @@ class NanoAODBaseCrossCleaner : public edm::stream::EDProducer<> {
const edm::EDGetTokenT<edm::View<pat::Jet>> jets_;
const edm::EDGetTokenT<edm::View<pat::Muon>> muons_;
const edm::EDGetTokenT<edm::View<pat::Electron>> electrons_;
edm::InputTag lowPtElectronsTag_;
edm::EDGetTokenT<edm::View<pat::Electron>> lowPtElectrons_;
const edm::EDGetTokenT<edm::View<pat::Tau>> taus_;
const edm::EDGetTokenT<edm::View<pat::Photon>> photons_;
const StringCutObjectSelector<pat::Jet> jetSel_;
const StringCutObjectSelector<pat::Muon> muonSel_;
const StringCutObjectSelector<pat::Electron> electronSel_;
const StringCutObjectSelector<pat::Electron> lowPtElectronSel_;
const StringCutObjectSelector<pat::Tau> tauSel_;
const StringCutObjectSelector<pat::Photon> photonSel_;
const std::string jetName_;
const std::string muonName_;
const std::string electronName_;
const std::string lowPtElectronName_;
const std::string tauName_;
const std::string photonName_;
};
Expand Down
55 changes: 37 additions & 18 deletions PhysicsTools/NanoAOD/python/lowPtElectrons_cff.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,11 @@
################################################################################

from RecoEgamma.EgammaTools.lowPtElectronModifier_cfi import lowPtElectronModifier
from RecoEgamma.EgammaElectronProducers.lowPtGsfElectrons_cfi import lowPtRegressionModifier
modifiedLowPtElectrons = cms.EDProducer(
"ModifiedElectronProducer",
src = cms.InputTag("slimmedLowPtElectrons"),
modifierConfig = cms.PSet(
modifications = cms.VPSet(lowPtElectronModifier,lowPtRegressionModifier)
modifications = cms.VPSet(lowPtElectronModifier)
)
)

Expand All @@ -28,16 +27,6 @@
miniIsoParamsE = PhysicsTools.PatAlgos.producersLayer1.electronProducer_cfi.patElectrons.miniIsoParamsE,
)

from RecoEgamma.EgammaElectronProducers.lowPtGsfElectronID_cfi import lowPtGsfElectronID
lowPtPATElectronID = lowPtGsfElectronID.clone(
usePAT = True,
electrons = "updatedLowPtElectrons",
unbiased = "",
ModelWeights = [
'RecoEgamma/ElectronIdentification/data/LowPtElectrons/LowPtElectrons_ID_2020Nov28.root',
],
)

isoForLowPtEle = cms.EDProducer(
"EleIsoValueMapProducer",
src = cms.InputTag("updatedLowPtElectrons"),
Expand All @@ -52,7 +41,6 @@
"PATElectronUserDataEmbedder",
src = cms.InputTag("updatedLowPtElectrons"),
userFloats = cms.PSet(
ID = cms.InputTag("lowPtPATElectronID"),
miniIsoChg = cms.InputTag("isoForLowPtEle:miniIsoChg"),
miniIsoAll = cms.InputTag("isoForLowPtEle:miniIsoAll"),
),
Expand All @@ -64,7 +52,7 @@
finalLowPtElectrons = cms.EDFilter(
"PATElectronRefSelector",
src = cms.InputTag("updatedLowPtElectronsWithUserData"),
cut = cms.string("pt > 1. && userFloat('ID') > -0.25"),
cut = cms.string("pt > 1. && electronID('ID') > -0.25"),
)

################################################################################
Expand All @@ -73,7 +61,7 @@

lowPtElectronTable = cms.EDProducer(
"SimpleCandidateFlatTableProducer",
src = cms.InputTag("finalLowPtElectrons"),
src = cms.InputTag("linkedObjects","lowPtElectrons"),
cut = cms.string(""),
name= cms.string("LowPtElectron"),
doc = cms.string("slimmedLowPtElectrons after basic selection (" + finalLowPtElectrons.cut.value()+")"),
Expand All @@ -82,9 +70,10 @@
variables = cms.PSet(
# Basic variables
CandVars,
# Overlaps with PF electron
electronIdx = Var("?overlaps('electrons').size()>0?overlaps('electrons')[0].key():-1", int, doc="index of the overlapping PF electron (-1 if none)"),
# BDT scores and WPs
embeddedID = Var("electronID('ID')",float,doc="ID, BDT (raw) score"),
ID = Var("userFloat('ID')",float,doc="New ID, BDT (raw) score"),
ID = Var("electronID('ID')",float,doc="ID, BDT (raw) score"),
unbiased = Var("electronID('unbiased')",float,doc="ElectronSeed, pT- and dxy- agnostic BDT (raw) score"),
ptbiased = Var("electronID('ptbiased')",float,doc="ElectronSeed, pT- and dxy- dependent BDT (raw) score"),
# Isolation
Expand Down Expand Up @@ -177,7 +166,6 @@

lowPtElectronTask = cms.Task(modifiedLowPtElectrons,
updatedLowPtElectrons,
lowPtPATElectronID,
isoForLowPtEle,
updatedLowPtElectronsWithUserData,
finalLowPtElectrons)
Expand All @@ -203,3 +191,34 @@
(_modifiers).toReplaceWith(lowPtElectronTask,cms.Task())
(_modifiers).toReplaceWith(lowPtElectronTablesTask,cms.Task())
(_modifiers).toReplaceWith(lowPtElectronMCTask,cms.Task())

# To preserve "nano v9" functionality ...

from RecoEgamma.EgammaElectronProducers.lowPtGsfElectrons_cfi import lowPtRegressionModifier
run2_nanoAOD_106Xv2.toModify(modifiedLowPtElectrons.modifierConfig,
modifications = cms.VPSet(lowPtElectronModifier,
lowPtRegressionModifier))

run2_nanoAOD_106Xv2.toModify(updatedLowPtElectronsWithUserData.userFloats,
ID = cms.InputTag("lowPtPATElectronID"))

run2_nanoAOD_106Xv2.toModify(finalLowPtElectrons,
cut = "pt > 1. && userFloat('ID') > -0.25")

run2_nanoAOD_106Xv2.toModify(lowPtElectronTable.variables,
embeddedID = Var("electronID('ID')",float,doc="ID, BDT (raw) score"),
ID = Var("userFloat('ID')",float,doc="New ID, BDT (raw) score"))

from RecoEgamma.EgammaElectronProducers.lowPtGsfElectronID_cfi import lowPtGsfElectronID
lowPtPATElectronID = lowPtGsfElectronID.clone(
usePAT = True,
electrons = "updatedLowPtElectrons",
unbiased = "",
ModelWeights = [
'RecoEgamma/ElectronIdentification/data/LowPtElectrons/LowPtElectrons_ID_2020Nov28.root',
],
)

_lowPtElectronTask = cms.Task(lowPtPATElectronID)
_lowPtElectronTask.add(lowPtElectronTask.copy())
run2_nanoAOD_106Xv2.toReplaceWith(lowPtElectronTask,_lowPtElectronTask)
9 changes: 9 additions & 0 deletions PhysicsTools/NanoAOD/python/nanoDQM_cff.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,4 +140,13 @@
(run3_nanoAOD_devel).toModify(nanoDQM.vplots, Electron = None)
(run3_nanoAOD_devel).toModify(nanoDQMMC.vplots, Electron = None)

_modifiers = ( run2_miniAOD_80XLegacy |
run2_nanoAOD_94XMiniAODv1 |
run2_nanoAOD_94XMiniAODv2 |
run2_nanoAOD_94X2016 |
run2_nanoAOD_102Xv1 |
run2_nanoAOD_106Xv1 )
_modifiers.toModify(nanoDQM.vplots, LowPtElectron = None)
_modifiers.toModify(nanoDQMMC.vplots, LowPtElectron = None)

nanoHarvest = cms.Sequence( nanoDQMQTester )
14 changes: 14 additions & 0 deletions PhysicsTools/NanoAOD/python/nano_cff.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
jets=cms.InputTag("finalJets"),
muons=cms.InputTag("finalMuons"),
electrons=cms.InputTag("finalElectrons"),
lowPtElectrons=cms.InputTag("finalLowPtElectrons"),
taus=cms.InputTag("finalTaus"),
photons=cms.InputTag("finalPhotons"),
)
Expand All @@ -47,14 +48,17 @@
jets=cms.InputTag("linkedObjects","jets"),
muons=cms.InputTag("linkedObjects","muons"),
electrons=cms.InputTag("linkedObjects","electrons"),
lowPtElectrons=cms.InputTag("linkedObjects","lowPtElectrons"),
taus=cms.InputTag("linkedObjects","taus"),
photons=cms.InputTag("linkedObjects","photons"),
jetSel=cms.string("pt>15"),
muonSel=cms.string("track.isNonnull && isLooseMuon && isPFMuon && innerTrack.validFraction >= 0.49 && ( isGlobalMuon && globalTrack.normalizedChi2 < 3 && combinedQuality.chi2LocalPosition < 12 && combinedQuality.trkKink < 20 && segmentCompatibility >= 0.303 || segmentCompatibility >= 0.451 )"),
electronSel=cms.string(""),
lowPtElectronSel=cms.string(""),
tauSel=cms.string(""),
photonSel=cms.string(""),
jetName=cms.string("Jet"),muonName=cms.string("Muon"),electronName=cms.string("Electron"),
lowPtElectronName=cms.string("LowPtElectron"),
tauName=cms.string("Tau"),photonName=cms.string("Photon")
)

Expand Down Expand Up @@ -398,3 +402,13 @@ def nanoWmassGenCustomize(process):
etaPrecision="{} ? {} : {}".format(pdgSelection, CandVars.eta.precision.value(), genParticleTable.variables.eta.precision.value())
process.genParticleTable.variables.eta.precision=cms.string(etaPrecision)
return process

# lowPtElectrons do not exsit for old nano campaigns (i.e. before v9)
_modifiers = ( run2_miniAOD_80XLegacy |
run2_nanoAOD_94XMiniAODv1 |
run2_nanoAOD_94XMiniAODv2 |
run2_nanoAOD_94X2016 |
run2_nanoAOD_102Xv1 |
run2_nanoAOD_106Xv1 )
_modifiers.toModify(linkedObjects,lowPtElectrons="")
_modifiers.toModify(simpleCleanerTable,lowPtElectrons="")
59 changes: 59 additions & 0 deletions PhysicsTools/PatAlgos/plugins/PATObjectCrossLinker.cc
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,14 @@ class PATObjectCrossLinker : public edm::stream::EDProducer<> {
C4& itemsMany,
const std::string& nameMany);

template <class C1, class C2, class C3, class C4>
void matchLowPtToElectron(const C1& refProdOne,
C2& itemsOne,
const std::string& nameOne,
const C3& refProdMany,
C4& itemsMany,
const std::string& nameMany);

//virtual void beginRun(edm::Run const&, edm::EventSetup const&) override;
//virtual void endRun(edm::Run const&, edm::EventSetup const&) override;
//virtual void beginLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&) override;
Expand All @@ -79,6 +87,8 @@ class PATObjectCrossLinker : public edm::stream::EDProducer<> {
const edm::EDGetTokenT<edm::View<pat::Jet>> jets_;
const edm::EDGetTokenT<edm::View<pat::Muon>> muons_;
const edm::EDGetTokenT<edm::View<pat::Electron>> electrons_;
edm::InputTag lowPtElectronsTag_;
edm::EDGetTokenT<edm::View<pat::Electron>> lowPtElectrons_;
const edm::EDGetTokenT<edm::View<pat::Tau>> taus_;
const edm::EDGetTokenT<edm::View<pat::Photon>> photons_;
};
Expand All @@ -90,13 +100,17 @@ PATObjectCrossLinker::PATObjectCrossLinker(const edm::ParameterSet& params)
: jets_(consumes<edm::View<pat::Jet>>(params.getParameter<edm::InputTag>("jets"))),
muons_(consumes<edm::View<pat::Muon>>(params.getParameter<edm::InputTag>("muons"))),
electrons_(consumes<edm::View<pat::Electron>>(params.getParameter<edm::InputTag>("electrons"))),
lowPtElectronsTag_(params.getParameter<edm::InputTag>("lowPtElectrons")),
lowPtElectrons_(mayConsume<edm::View<pat::Electron>>(lowPtElectronsTag_)),
taus_(consumes<edm::View<pat::Tau>>(params.getParameter<edm::InputTag>("taus"))),
photons_(consumes<edm::View<pat::Photon>>(params.getParameter<edm::InputTag>("photons")))

{
produces<std::vector<pat::Jet>>("jets");
produces<std::vector<pat::Muon>>("muons");
produces<std::vector<pat::Electron>>("electrons");
if (!lowPtElectronsTag_.label().empty())
produces<std::vector<pat::Electron>>("lowPtElectrons");
produces<std::vector<pat::Tau>>("taus");
produces<std::vector<pat::Photon>>("photons");
}
Expand Down Expand Up @@ -159,6 +173,36 @@ void PATObjectCrossLinker::matchElectronToPhoton(const C1& refProdOne,
}
}

template <class C1, class C2, class C3, class C4>
void PATObjectCrossLinker::matchLowPtToElectron(const C1& refProdOne,
C2& itemsOne,
const std::string& nameOne,
const C3& refProdMany,
C4& itemsMany,
const std::string& nameMany) {
size_t ji = 0;
for (auto& j : itemsOne) {
std::vector<std::pair<size_t, float>> idxs;
size_t mi = 0;
for (auto& m : itemsMany) {
float dr2 = deltaR2(m, j);
if (dr2 < 1.e-6) { // deltaR < 1.e-3
m.addUserCand(nameOne, reco::CandidatePtr(refProdOne.id(), ji, refProdOne.productGetter()));
idxs.push_back(std::make_pair(mi, dr2));
}
mi++;
}
std::sort(idxs.begin(), idxs.end(), [](auto& left, auto& right) { return left.second < right.second; });

edm::PtrVector<reco::Candidate> overlaps(refProdMany.id());
for (auto idx : idxs) {
overlaps.push_back(reco::CandidatePtr(refProdMany.id(), idx.first, refProdMany.productGetter()));
}
j.setOverlaps(nameMany, overlaps);
ji++;
}
}

void PATObjectCrossLinker::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
using namespace edm;
edm::Handle<edm::View<pat::Jet>> jetsIn;
Expand All @@ -182,6 +226,15 @@ void PATObjectCrossLinker::produce(edm::Event& iEvent, const edm::EventSetup& iS
electrons->push_back(e);
auto eleRefProd = iEvent.getRefBeforePut<std::vector<pat::Electron>>("electrons");

edm::Handle<edm::View<pat::Electron>> lowPtElectronsIn;
auto lowPtElectrons = std::make_unique<std::vector<pat::Electron>>();
if (!lowPtElectronsTag_.label().empty()) {
iEvent.getByToken(lowPtElectrons_, lowPtElectronsIn);
for (const auto& e : *lowPtElectronsIn) {
lowPtElectrons->push_back(e);
}
}

edm::Handle<edm::View<pat::Tau>> tausIn;
iEvent.getByToken(taus_, tausIn);
auto taus = std::make_unique<std::vector<pat::Tau>>();
Expand All @@ -202,10 +255,16 @@ void PATObjectCrossLinker::produce(edm::Event& iEvent, const edm::EventSetup& iS
matchOneToMany(jetRefProd, *jets, "jet", phRefProd, *photons, "photons");

matchElectronToPhoton(eleRefProd, *electrons, "electron", phRefProd, *photons, "photons");
if (!lowPtElectronsTag_.label().empty()) {
auto lowPtEleRefProd = iEvent.getRefBeforePut<std::vector<pat::Electron>>("lowPtElectrons");
matchLowPtToElectron(lowPtEleRefProd, *lowPtElectrons, "lowPtElectron", eleRefProd, *electrons, "electrons");
}

iEvent.put(std::move(jets), "jets");
iEvent.put(std::move(muons), "muons");
iEvent.put(std::move(electrons), "electrons");
if (!lowPtElectronsTag_.label().empty())
iEvent.put(std::move(lowPtElectrons), "lowPtElectrons");
iEvent.put(std::move(taus), "taus");
iEvent.put(std::move(photons), "photons");
}
Expand Down