Skip to content

Commit

Permalink
Merge pull request cms-sw#59 from gpetruc/miniIso_80X
Browse files Browse the repository at this point in the history
Recompute miniIso on the fly for 80X miniAODs
  • Loading branch information
gpetruc committed Oct 31, 2017
2 parents 81b65a2 + 0330dab commit c86cc79
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 34 deletions.
49 changes: 35 additions & 14 deletions PhysicsTools/NanoAOD/python/electrons_cff.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,32 @@
from Configuration.Eras.Modifier_run2_miniAOD_80XLegacy_cff import run2_miniAOD_80XLegacy
from Configuration.Eras.Modifier_run2_nanoAOD_92X_cff import run2_nanoAOD_92X
from PhysicsTools.NanoAOD.common_cff import *
import PhysicsTools.PatAlgos.producersLayer1.electronProducer_cfi
from math import ceil,log

# this below is used only in some eras
slimmedElectronsUpdated = cms.EDProducer("PATElectronUpdater",
src = cms.InputTag("slimmedElectrons"),
vertices = cms.InputTag("offlineSlimmedPrimaryVertices"),
computeMiniIso = cms.bool(False),
pfCandsForMiniIso = cms.InputTag("packedPFCandidates"),
miniIsoParamsB = PhysicsTools.PatAlgos.producersLayer1.electronProducer_cfi.patElectrons.miniIsoParamsB, # so they're in sync
miniIsoParamsE = PhysicsTools.PatAlgos.producersLayer1.electronProducer_cfi.patElectrons.miniIsoParamsE, # so they're in sync
)
run2_miniAOD_80XLegacy.toModify( slimmedElectronsUpdated, computeMiniIso = True )

from PhysicsTools.SelectorUtils.tools.vid_id_tools import setupVIDSelection
from RecoEgamma.ElectronIdentification.egmGsfElectronIDs_cff import *

electronMVAValueMapProducer.srcMiniAOD = cms.InputTag("slimmedElectrons")
run2_miniAOD_80XLegacy.toModify(electronMVAValueMapProducer, srcMiniAOD = "slimmedElectronsUpdated")
run2_nanoAOD_92X.toModify(electronMVAValueMapProducer, srcMiniAOD = "slimmedElectronsUpdated")

egmGsfElectronIDs.physicsObjectIDs = cms.VPSet()
egmGsfElectronIDs.physicsObjectSrc = cms.InputTag('slimmedElectrons')
run2_miniAOD_80XLegacy.toModify(egmGsfElectronIDs, physicsObjectSrc = "slimmedElectronsUpdated")
run2_nanoAOD_92X.toModify(egmGsfElectronIDs, physicsObjectSrc = "slimmedElectronsUpdated")

_electron_id_vid_modules=[
'RecoEgamma.ElectronIdentification.Identification.cutBasedElectronID_Summer16_80X_V1_cff',
'RecoEgamma.ElectronIdentification.Identification.cutBasedElectronHLTPreselecition_Summer16_V1_cff',
Expand Down Expand Up @@ -36,6 +55,8 @@
src = cms.InputTag("slimmedElectrons"),
WorkingPoints = _bitmapVIDForEle_WorkingPoints,
)
run2_miniAOD_80XLegacy.toModify(bitmapVIDForEle, src = "slimmedElectronsUpdated")
run2_nanoAOD_92X.toModify(bitmapVIDForEle, src = "slimmedElectronsUpdated")

isoForEle = cms.EDProducer("EleIsoValueMapProducer",
src = cms.InputTag("slimmedElectrons"),
Expand All @@ -45,21 +66,29 @@
EAFile_MiniIso = cms.FileInPath("RecoEgamma/ElectronIdentification/data/Spring15/effAreaElectrons_cone03_pfNeuHadronsAndPhotons_25ns.txt"),
EAFile_PFIso = cms.FileInPath("RecoEgamma/ElectronIdentification/data/Summer16/effAreaElectrons_cone03_pfNeuHadronsAndPhotons_80X.txt"),
)
run2_miniAOD_80XLegacy.toModify(isoForEle, src = "slimmedElectronsUpdated")
run2_nanoAOD_92X.toModify(isoForEle, src = "slimmedElectronsUpdated")

ptRatioRelForEle = cms.EDProducer("ElectronJetVarProducer",
srcJet = cms.InputTag("slimmedJets"),
srcLep = cms.InputTag("slimmedElectrons"),
srcVtx = cms.InputTag("offlineSlimmedPrimaryVertices"),
)
run2_miniAOD_80XLegacy.toModify(ptRatioRelForEle, srcLep = "slimmedElectronsUpdated")
run2_nanoAOD_92X.toModify(ptRatioRelForEle, srcLep = "slimmedElectronsUpdated")

from EgammaAnalysis.ElectronTools.calibratedElectronsRun2_cfi import calibratedPatElectrons
calibratedPatElectrons.correctionFile = cms.string("PhysicsTools/NanoAOD/data/80X_ichepV1_2016_ele") # hack, should go somewhere in EgammaAnalysis
calibratedPatElectrons.semiDeterministic = cms.bool(True)
run2_miniAOD_80XLegacy.toModify(calibratedPatElectrons, electrons = "slimmedElectronsUpdated")
run2_nanoAOD_92X.toModify(calibratedPatElectrons, electrons = "slimmedElectronsUpdated")

energyCorrForEle = cms.EDProducer("ElectronEnergyVarProducer",
srcRaw = cms.InputTag("slimmedElectrons"),
srcCorr = cms.InputTag("calibratedPatElectrons"),
)
run2_miniAOD_80XLegacy.toModify(energyCorrForEle, srcRaw = "slimmedElectronsUpdated")
run2_nanoAOD_92X.toModify(energyCorrForEle, srcRaw = "slimmedElectronsUpdated")


slimmedElectronsWithUserData = cms.EDProducer("PATElectronUserDataEmbedder",
Expand Down Expand Up @@ -93,19 +122,13 @@
jetForLepJetVar = cms.InputTag("ptRatioRelForEle:jetForLepJetVar") # warning: Ptr is null if no match is found
),
)

# this below is used only in some eras
slimmedElectronsWithDZ = cms.EDProducer("PATElectronUpdater",
src = cms.InputTag("slimmedElectronsWithUserData"),
vertices = cms.InputTag("offlineSlimmedPrimaryVertices")
)
run2_miniAOD_80XLegacy.toModify(slimmedElectronsWithUserData, src = "slimmedElectronsUpdated")
run2_nanoAOD_92X.toModify(slimmedElectronsWithUserData, src = "slimmedElectronsUpdated")

finalElectrons = cms.EDFilter("PATElectronRefSelector",
src = cms.InputTag("slimmedElectronsWithUserData"),
cut = cms.string("pt > 5 ")
)
run2_miniAOD_80XLegacy.toModify(finalElectrons, src = "slimmedElectronsWithDZ")
run2_nanoAOD_92X.toModify(finalElectrons, src = "slimmedElectronsWithDZ")

electronMVATTH= cms.EDProducer("EleBaseMVAValueMapProducer",
src = cms.InputTag("linkedObjects","electrons"),
Expand Down Expand Up @@ -139,7 +162,6 @@
variables = cms.PSet(CandVars,
jetIdx = Var("?hasUserCand('jet')?userCand('jet').key():-1", int, doc="index of the associated jet (-1 if none)"),
photonIdx = Var("?overlaps('photons').size()>0?overlaps('photons')[0].key():-1", int, doc="index of the associated photon (-1 if none)"),
#ptErr = Var("gsfTrack().ptError()",float,doc="pt error of the GSF track",precision=6),
energyErr = Var("p4Error('P4_COMBINATION')*userFloat('eCorr')",float,doc="energy error of the cluster-track combination",precision=6),
eCorr = Var("userFloat('eCorr')",float,doc="ratio of the calibrated energy/miniaod energy"),
dz = Var("dB('PVDZ')",float,doc="dz (with sign) wrt first PV, in cm",precision=10),
Expand Down Expand Up @@ -176,7 +198,7 @@
mvaTTH = ExtVar(cms.InputTag("electronMVATTH"),float, doc="TTH MVA lepton ID score",precision=14),
),
)
electronTable.variables.pt = Var("pt*userFloat('eCorr')", float, precision=-1)
electronTable.variables.pt = Var("pt*userFloat('eCorr')", float, precision=-1, doc="p_{T} after energy correction & smearing")

electronsMCMatchForTable = cms.EDProducer("MCMatcher", # cut on deltaR, deltaPt/Pt; pick best by deltaR
src = electronTable.src, # final reco collection
Expand All @@ -203,7 +225,6 @@
electronTables = cms.Sequence (electronMVATTH + electronTable)
electronMC = cms.Sequence(electronsMCMatchForTable + electronMCTable)

_withDZ_sequence = electronSequence.copy()
_withDZ_sequence.replace(finalElectrons, slimmedElectronsWithDZ+finalElectrons)
run2_nanoAOD_92X.toReplaceWith(electronSequence, _withDZ_sequence)
run2_miniAOD_80XLegacy.toReplaceWith(electronSequence, _withDZ_sequence)
_withUpdate_sequence = cms.Sequence(slimmedElectronsUpdated + electronSequence.copy())
run2_nanoAOD_92X.toReplaceWith(electronSequence, _withUpdate_sequence)
run2_miniAOD_80XLegacy.toReplaceWith(electronSequence, _withUpdate_sequence)
32 changes: 21 additions & 11 deletions PhysicsTools/NanoAOD/python/muons_cff.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,34 @@
from Configuration.Eras.Modifier_run2_miniAOD_80XLegacy_cff import run2_miniAOD_80XLegacy
from Configuration.Eras.Modifier_run2_nanoAOD_92X_cff import run2_nanoAOD_92X
from PhysicsTools.NanoAOD.common_cff import *
import PhysicsTools.PatAlgos.producersLayer1.muonProducer_cfi

# this below is used only in some eras
slimmedMuonsUpdated = cms.EDProducer("PATMuonUpdater",
src = cms.InputTag("slimmedMuons"),
vertices = cms.InputTag("offlineSlimmedPrimaryVertices"),
computeMiniIso = cms.bool(False),
pfCandsForMiniIso = cms.InputTag("packedPFCandidates"),
miniIsoParams = PhysicsTools.PatAlgos.producersLayer1.muonProducer_cfi.patMuons.miniIsoParams, # so they're in sync
)
run2_miniAOD_80XLegacy.toModify( slimmedMuonsUpdated, computeMiniIso = True )

isoForMu = cms.EDProducer("MuonIsoValueMapProducer",
src = cms.InputTag("slimmedMuons"),
relative = cms.bool(False),
rho_MiniIso = cms.InputTag("fixedGridRhoFastjetAll"),
EAFile_MiniIso = cms.FileInPath("PhysicsTools/NanoAOD/data/effAreaMuons_cone03_pfNeuHadronsAndPhotons_80X.txt"),
)
run2_miniAOD_80XLegacy.toModify(isoForMu, src = "slimmedMuonsUpdated")
run2_nanoAOD_92X.toModify(isoForMu, src = "slimmedMuonsUpdated")

ptRatioRelForMu = cms.EDProducer("MuonJetVarProducer",
srcJet = cms.InputTag("slimmedJets"),
srcLep = cms.InputTag("slimmedMuons"),
srcVtx = cms.InputTag("offlineSlimmedPrimaryVertices"),
)
run2_miniAOD_80XLegacy.toModify(ptRatioRelForMu, srcLep = "slimmedMuonsUpdated")
run2_nanoAOD_92X.toModify(ptRatioRelForMu, srcLep = "slimmedMuonsUpdated")

slimmedMuonsWithUserData = cms.EDProducer("PATMuonUserDataEmbedder",
src = cms.InputTag("slimmedMuons"),
Expand All @@ -29,18 +44,13 @@
jetForLepJetVar = cms.InputTag("ptRatioRelForMu:jetForLepJetVar") # warning: Ptr is null if no match is found
),
)
# this below is used only in some eras
slimmedMuonsWithDZ = cms.EDProducer("PATMuonUpdater",
src = cms.InputTag("slimmedMuonsWithUserData"),
vertices = cms.InputTag("offlineSlimmedPrimaryVertices")
)
run2_miniAOD_80XLegacy.toModify(slimmedMuonsWithUserData, src = "slimmedMuonsUpdated")
run2_nanoAOD_92X.toModify(slimmedMuonsWithUserData, src = "slimmedMuonsUpdated")

finalMuons = cms.EDFilter("PATMuonRefSelector",
src = cms.InputTag("slimmedMuonsWithUserData"),
cut = cms.string("pt > 3 && track.isNonnull && isLooseMuon")
)
run2_miniAOD_80XLegacy.toModify(finalMuons, src = "slimmedMuonsWithDZ")
run2_nanoAOD_92X.toModify(finalMuons, src = "slimmedMuonsWithDZ")

muonMVATTH= cms.EDProducer("MuonBaseMVAValueMapProducer",
src = cms.InputTag("linkedObjects","muons"),
Expand Down Expand Up @@ -127,7 +137,7 @@
muonMC = cms.Sequence(muonsMCMatchForTable + muonMCTable)
muonTables = cms.Sequence(muonMVATTH + muonTable + muonIDTable)

_withDZ_sequence = muonSequence.copy()
_withDZ_sequence.replace(finalMuons, slimmedMuonsWithDZ+finalMuons)
run2_nanoAOD_92X.toReplaceWith(muonSequence, _withDZ_sequence)
run2_miniAOD_80XLegacy.toReplaceWith(muonSequence, _withDZ_sequence)
_withUpdate_sequence = muonSequence.copy()
_withUpdate_sequence.replace(isoForMu, slimmedMuonsUpdated+isoForMu)
run2_nanoAOD_92X.toReplaceWith(muonSequence, _withUpdate_sequence)
run2_miniAOD_80XLegacy.toReplaceWith(muonSequence, _withUpdate_sequence)
12 changes: 6 additions & 6 deletions PhysicsTools/NanoAOD/python/nanoDQM_cfi.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,16 +75,16 @@
Plot1D('eta', 'eta', 20, -4, 4, 'eta'),
Plot1D('mass', 'mass', 20, 0, 300, 'mass'),
Plot1D('msoftdrop', 'msoftdrop', 20, -300, 300, 'Soft drop mass'),
Plot1D('n2b1', 'n2b1', 20, 0, 1, 'N2 (beta=1)'),
Plot1D('n3b1', 'n3b1', 20, 0, 5, 'N3 (beta=1)'),
Plot1D('phi', 'phi', 20, -3.14159, 3.14159, 'phi'),
Plot1D('pt', 'pt', 20, 0, 800, 'pt'),
NoPlot('subJetIdx1'),
NoPlot('subJetIdx2'),
Plot1D('tau1', 'tau1', 20, 0.00, 1.0, 'Nsubjettiness (1 axis)'),
Plot1D('tau2', 'tau2', 20, 0.00, 1.0, 'Nsubjettiness (2 axis)'),
Plot1D('tau3', 'tau3', 20, 0.00, 1.0, 'Nsubjettiness (3 axis)'),
Plot1D('tau4', 'tau4', 20, 0.00, 1.0, 'Nsubjettiness (4 axis)'),
Plot1D('n2b1', 'n2b1', 20, 0.00, 1.0, 'N2 (beta=1)'),
Plot1D('n3b1', 'n3b1', 20, 0.00, 5.0, 'N3 (beta=1)'),
Plot1D('tau1', 'tau1', 20, 0, 1, 'Nsubjettiness (1 axis)'),
Plot1D('tau2', 'tau2', 20, 0, 1, 'Nsubjettiness (2 axis)'),
Plot1D('tau3', 'tau3', 20, 0, 1, 'Nsubjettiness (3 axis)'),
Plot1D('tau4', 'tau4', 20, 0, 1, 'Nsubjettiness (4 axis)'),
)
),
Flag = cms.PSet(
Expand Down
54 changes: 51 additions & 3 deletions PhysicsTools/PatAlgos/plugins/LeptonUpdater.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
#include "FWCore/Utilities/interface/InputTag.h"
#include "PhysicsTools/PatUtils/interface/MiniIsolation.h"
#include "DataFormats/Common/interface/View.h"

#include "DataFormats/PatCandidates/interface/Muon.h"
#include "DataFormats/PatCandidates/interface/Electron.h"
#include "DataFormats/PatCandidates/interface/PackedCandidate.h"

namespace pat {

Expand All @@ -19,8 +21,14 @@ namespace pat {

explicit LeptonUpdater(const edm::ParameterSet & iConfig) :
src_(consumes<std::vector<T>>(iConfig.getParameter<edm::InputTag>("src"))),
vertices_(consumes<std::vector<reco::Vertex>>(iConfig.getParameter<edm::InputTag>("vertices")))
vertices_(consumes<std::vector<reco::Vertex>>(iConfig.getParameter<edm::InputTag>("vertices"))),
computeMiniIso_(iConfig.getParameter<bool>("computeMiniIso"))
{
//for mini-isolation calculation
if (computeMiniIso_) {
readMiniIsoParams(iConfig);
pcToken_ = consumes<pat::PackedCandidateCollection >(iConfig.getParameter<edm::InputTag>("pfCandsForMiniIso"));
}
produces<std::vector<T>>();
}

Expand All @@ -32,16 +40,33 @@ namespace pat {
edm::ParameterSetDescription desc;
desc.add<edm::InputTag>("src")->setComment("Lepton collection");
desc.add<edm::InputTag>("vertices")->setComment("Vertex collection");
if (typeid(T) == typeid(pat::Muon)) descriptions.add("muonsUpdated", desc);
else if (typeid(T) == typeid(pat::Electron)) descriptions.add("electronsUpdated", desc);
desc.add<bool>("computeMiniIso", false)->setComment("Recompute miniIsolation");
desc.addOptional<edm::InputTag>("pfCandsForMiniIso", edm::InputTag("packedPFCandidates"))->setComment("PackedCandidate collection used for miniIso");
if (typeid(T) == typeid(pat::Muon)) {
desc.addOptional<std::vector<double>>("miniIsoParams")->setComment("Parameters used for miniIso (as in PATMuonProducer)");
descriptions.add("muonsUpdated", desc);
} else if (typeid(T) == typeid(pat::Electron)) {
desc.addOptional<std::vector<double>>("miniIsoParamsB")->setComment("Parameters used for miniIso in the barrel (as in PATElectronProducer)");
desc.addOptional<std::vector<double>>("miniIsoParamsE")->setComment("Parameters used for miniIso in the endcap (as in PATElectronProducer)");
descriptions.add("electronsUpdated", desc);
}
}

void setDZ(T & lep, const reco::Vertex & pv) const {}

void readMiniIsoParams(const edm::ParameterSet & iConfig) {
miniIsoParams_[0] = iConfig.getParameter<std::vector<double> >("miniIsoParams");
if(miniIsoParams_[0].size() != 9) throw cms::Exception("ParameterError", "miniIsoParams must have exactly 9 elements.\n");
}
const std::vector<double> & miniIsoParams(const T &lep) const { return miniIsoParams_[0]; }

private:
// configurables
edm::EDGetTokenT<std::vector<T>> src_;
edm::EDGetTokenT<std::vector<reco::Vertex>> vertices_;
bool computeMiniIso_;
std::vector<double> miniIsoParams_[2];
edm::EDGetTokenT<pat::PackedCandidateCollection> pcToken_;
};

// must do the specialization within the namespace otherwise gcc complains
Expand All @@ -58,6 +83,18 @@ namespace pat {
aMuon.setDB( track->dz(pv.position()), std::hypot(track->dzError(), pv.zError()), pat::Muon::PVDZ );
}

template<>
void LeptonUpdater<pat::Electron>::readMiniIsoParams(const edm::ParameterSet & iConfig) {
miniIsoParams_[0] = iConfig.getParameter<std::vector<double> >("miniIsoParamsB");
miniIsoParams_[1] = iConfig.getParameter<std::vector<double> >("miniIsoParamsE");
if(miniIsoParams_[0].size() != 9) throw cms::Exception("ParameterError", "miniIsoParamsB must have exactly 9 elements.\n");
if(miniIsoParams_[1].size() != 9) throw cms::Exception("ParameterError", "miniIsoParamsE must have exactly 9 elements.\n");
}
template<>
const std::vector<double> & LeptonUpdater<pat::Electron>::miniIsoParams(const pat::Electron &lep) const {
return miniIsoParams_[lep.isEE()];
}

} // namespace

template<typename T>
Expand All @@ -69,11 +106,22 @@ void pat::LeptonUpdater<T>::produce(edm::StreamID, edm::Event& iEvent, edm::Even
iEvent.getByToken(vertices_, vertices);
const reco::Vertex & pv = vertices->front();

edm::Handle<pat::PackedCandidateCollection> pc;
if(computeMiniIso_) iEvent.getByToken(pcToken_, pc);

std::unique_ptr<std::vector<T>> out(new std::vector<T>(*src));

for (unsigned int i = 0, n = src->size(); i < n; ++i) {
T & lep = (*out)[i];
setDZ(lep, pv);
if (computeMiniIso_) {
const auto & params = miniIsoParams(lep);
pat::PFIsolation miniiso = pat::getMiniPFIsolation(pc.product(), lep.p4(),
params[0], params[1], params[2],
params[3], params[4], params[5],
params[6], params[7], params[8]);
lep.setMiniPFIsolation(miniiso);
}
}

iEvent.put(std::move(out));
Expand Down

0 comments on commit c86cc79

Please sign in to comment.