From a5bb3e7b3ac774da7719fa19828353be3725c54b Mon Sep 17 00:00:00 2001 From: cramonal Date: Sat, 15 Oct 2022 11:12:56 +0200 Subject: [PATCH 1/5] implementing comments --- .../NanoAOD/plugins/EvaluateMuonMVAID.cc | 59 +++++++++++++++++++ PhysicsTools/NanoAOD/python/muons_cff.py | 39 +++++++++++- PhysicsTools/NanoAOD/python/nanoDQM_cfi.py | 3 + 3 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 PhysicsTools/NanoAOD/plugins/EvaluateMuonMVAID.cc diff --git a/PhysicsTools/NanoAOD/plugins/EvaluateMuonMVAID.cc b/PhysicsTools/NanoAOD/plugins/EvaluateMuonMVAID.cc new file mode 100644 index 0000000000000..9d6d41085140b --- /dev/null +++ b/PhysicsTools/NanoAOD/plugins/EvaluateMuonMVAID.cc @@ -0,0 +1,59 @@ +// +// +// +// + +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/stream/EDProducer.h" + +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" + +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/Utilities/interface/StreamID.h" + +#include "DataFormats/PatCandidates/interface/Muon.h" +#include "DataFormats/PatCandidates/interface/Electron.h" +#include "DataFormats/PatCandidates/interface/Muon.h" + +#include "DataFormats/VertexReco/interface/Vertex.h" +#include "DataFormats/Candidate/interface/VertexCompositePtrCandidate.h" + +#include "RecoVertex/VertexTools/interface/VertexDistance3D.h" +#include "RecoVertex/VertexPrimitives/interface/ConvertToFromReco.h" +#include "RecoVertex/VertexPrimitives/interface/VertexState.h" + +#include "PhysicsTools/PatAlgos/interface/BaseMVAValueMapProducer.h" +#include + +class EvaluateMuonMVAID : public BaseMVAValueMapProducer { +public: + explicit EvaluateMuonMVAID(const edm::ParameterSet& iConfig, const BaseMVACache* cache) + : BaseMVAValueMapProducer(iConfig, cache) {} + + void fillAdditionalVariables(const pat::Muon& m) override { + float norm_chi2; + float n_Valid_hits; + if (m.globalTrack().isNonnull()) { + norm_chi2 = m.globalTrack()->normalizedChi2(); + n_Valid_hits = m.globalTrack()->hitPattern().numberOfValidMuonHits(); + } else if (m.innerTrack().isNonnull()) { + norm_chi2 = m.innerTrack()->normalizedChi2(); + n_Valid_hits = m.innerTrack()->hitPattern().numberOfValidMuonHits(); + } else { + norm_chi2 = -99; + n_Valid_hits = -99; + } + + this->setValue("Muon_norm_chi2_extended", norm_chi2); + this->setValue("Muon_n_Valid_hits_extended", n_Valid_hits); + } + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc = BaseMVAValueMapProducer::getDescription(); + descriptions.add("EvaluateMuonMVAID", desc); + } +}; + +//define this as a plug-in +DEFINE_FWK_MODULE(EvaluateMuonMVAID); diff --git a/PhysicsTools/NanoAOD/python/muons_cff.py b/PhysicsTools/NanoAOD/python/muons_cff.py index bfe7fd4a2c2c0..2c802b9ce633f 100644 --- a/PhysicsTools/NanoAOD/python/muons_cff.py +++ b/PhysicsTools/NanoAOD/python/muons_cff.py @@ -54,6 +54,32 @@ cut = cms.string("pt > 3 && track.isNonnull && isLooseMuon") ) +muonMVAID= cms.EDProducer("EvaluateMuonMVAID", + src = cms.InputTag("linkedObjects","muons"), + weightFile = cms.FileInPath("RecoMuon/MuonIdentification/data/mvaID.onnx"), + isClassifier = cms.bool(False), + backend = cms.string('ONNX'), + name = cms.string("muonMVAID"), + outputTensorName= cms.string("probabilities"), + inputTensorName= cms.string("float_input"), + outputNames = cms.vstring(["probBAD","probGOOD"]), + batch_eval =cms.bool(True), + outputFormulas = cms.vstring(["1.0*at(0)","at(1)"]), + variablesOrder = cms.vstring(["LepGood_global_muon","LepGood_validFraction","Muon_norm_chi2_extended","LepGood_local_chi2","LepGood_kink","LepGood_segmentComp","Muon_n_Valid_hits_extended","LepGood_n_MatchedStations","LepGood_Valid_pixel","LepGood_tracker_layers","LepGood_pt","LepGood_eta"]), + variables = cms.PSet( + LepGood_global_muon = cms.string("isGlobalMuon"), + LepGood_validFraction = cms.string("?innerTrack.isNonnull?innerTrack().validFraction:-99"), + LepGood_local_chi2 = cms.string("combinedQuality().chi2LocalPosition"), + LepGood_kink = cms.string("combinedQuality().trkKink"), + LepGood_segmentComp = cms.string("segmentCompatibility"), + LepGood_n_MatchedStations = cms.string("numberOfMatchedStations()"), + LepGood_Valid_pixel = cms.string("?innerTrack.isNonnull()?innerTrack().hitPattern().numberOfValidPixelHits():-99"), + LepGood_tracker_layers = cms.string("?innerTrack.isNonnull()?innerTrack().hitPattern().trackerLayersWithMeasurement():-99"), + LepGood_pt = cms.string("pt"), + LepGood_eta = cms.string("eta"), + ) +) + muonMVATTH= cms.EDProducer("MuonBaseMVAValueMapProducer", src = cms.InputTag("linkedObjects","muons"), weightFile = cms.FileInPath("PhysicsTools/NanoAOD/data/mu_BDTG_2017.weights.xml"), @@ -129,9 +155,11 @@ highPtId = Var("?passed('CutBasedIdGlobalHighPt')?2:passed('CutBasedIdTrkHighPt')","uint8",doc="high-pT cut-based ID (1 = tracker high pT, 2 = global high pT, which includes tracker high pT)"), pfIsoId = Var("passed('PFIsoVeryLoose')+passed('PFIsoLoose')+passed('PFIsoMedium')+passed('PFIsoTight')+passed('PFIsoVeryTight')+passed('PFIsoVeryVeryTight')","uint8",doc="PFIso ID from miniAOD selector (1=PFIsoVeryLoose, 2=PFIsoLoose, 3=PFIsoMedium, 4=PFIsoTight, 5=PFIsoVeryTight, 6=PFIsoVeryVeryTight)"), tkIsoId = Var("?passed('TkIsoTight')?2:passed('TkIsoLoose')","uint8",doc="TkIso ID (1=TkIsoLoose, 2=TkIsoTight)"), - mvaId = Var("passed('MvaLoose')+passed('MvaMedium')+passed('MvaTight')+passed('MvaVTight')+passed('MvaVVTight')","uint8",doc="Mva ID from miniAOD selector (1=MvaLoose, 2=MvaMedium, 3=MvaTight, 4=MvaVTight, 5=MvaVVTight)"), + mvaId = Var("passed('MvaLoose')+passed('MvaMedium')+passed('MvaTight')+passed('MvaVTight')+passed('MvaVVTight')","uint8",doc="Mva for ID of prompt leptons from miniAOD selector (1=MvaLoose, 2=MvaMedium, 3=MvaTight, 4=MvaVTight, 5=MvaVVTight)"), mvaLowPtId = Var("passed('LowPtMvaLoose')+passed('LowPtMvaMedium')","uint8", doc="Low Pt Mva ID from miniAOD selector (1=LowPtMvaLoose, 2=LowPtMvaMedium)"), miniIsoId = Var("passed('MiniIsoLoose')+passed('MiniIsoMedium')+passed('MiniIsoTight')+passed('MiniIsoVeryTight')","uint8",doc="MiniIso ID from miniAOD selector (1=MiniIsoLoose, 2=MiniIsoMedium, 3=MiniIsoTight, 4=MiniIsoVeryTight)"), + mvaIDMuon = Var("mvaIDValue()",float,doc="MVA-based ID score (from miniAOD)",precision=14), + mvaIDMuon_WP = Var("passed('MvaIDwpMedium')+passed('MvaIDwpTight')","uint8",doc="MVA-based ID selector WPs (1=MVAIDwpMedium,2=MVAIDwpTight)"), multiIsoId = Var("?passed('MultiIsoMedium')?2:passed('MultiIsoLoose')","uint8",doc="MultiIsoId from miniAOD selector (1=MultiIsoLoose, 2=MultiIsoMedium)"), puppiIsoId = Var("passed('PuppiIsoLoose')+passed('PuppiIsoMedium')+passed('PuppiIsoTight')", "uint8", doc="PuppiIsoId from miniAOD selector (1=Loose, 2=Medium, 3=Tight)"), triggerIdLoose = Var("passed('TriggerIdLoose')",bool,doc="TriggerIdLoose ID"), @@ -146,6 +174,12 @@ ) + +for modifier in (run2_nanoAOD_106Xv2 | run3_nanoAOD_122): + modifier.toModify(muonTable.variables,mvaIDMuon=None ) + modifier.toModify(muonTable.variables,mvaIDMuon_WP=None ) + modifier.toModify(muonTable.externalVariables, mvaIDMuon = ExtVar(cms.InputTag("muonMVAID:probGOOD"),float, doc="MVA-based ID score (from nanoAOD)",precision=14)) + # Revert back to AK4 CHS jets for Run 2 run2_nanoAOD_ANY.toModify( ptRatioRelForMu,srcJet="updatedJets" @@ -176,3 +210,6 @@ muonTask = cms.Task(slimmedMuonsUpdated,isoForMu,ptRatioRelForMu,slimmedMuonsWithUserData,finalMuons,finalLooseMuons ) muonMCTask = cms.Task(muonsMCMatchForTable,muonMCTable) muonTablesTask = cms.Task(muonMVATTH,muonMVALowPt,muonTable) +for modifier in (run2_nanoAOD_106Xv2 | run3_nanoAOD_122): + modifier.toModify(muonTablesTask,muonTablesTask.add(muonMVAID)) + diff --git a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py index 4527171ff5e26..d862fa2f0a926 100644 --- a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py +++ b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py @@ -522,6 +522,9 @@ Plot1D('mvaLowPt', 'mvaLowPt', 20, -1, 1, 'Low pt muon ID score'), Plot1D('mvaLowPtId', 'mvaLowPtId', 3, -0.5, 2.5, 'Low Pt Mva ID from miniAOD selector (1=LowPtMvaLoose, 2=LowPtMvaMedium)'), Plot1D('mvaTTH', 'mvaTTH', 20, -1, 1, 'TTH MVA lepton ID score'), + Plot1D('mvaIDMuon', 'mvaIDMuon', 20, -1, 1, 'Score of MVA-based muon ID'), + Plot1D('mvaIDMuon_WP', 'mvaIDMuon_WP', 3, -0.5, 2.5, 'MVA-based ID selector WPs (1=MVAIDwpMedium,2=MVAIDwpTight)'), + Plot1D('mvaIDMuon_nano', 'mvaIDMuon_nano', 20, -1, 1, 'MVA-based ID score (from nanoAOD)'), Plot1D('nStations', 'nStations', 5, -0.5, 4.5, 'number of matched stations with default arbitration (segment & track)'), Plot1D('nTrackerLayers', 'nTrackerLayers', 15, 2.5, 17.5, 'number of layers in the tracker'), Plot1D('jetNDauCharged', 'jetNDauCharged', 20, -0.5, 19.5, 'number of charged daughters of the closest jet'), From 1eacd706344c1afd4e8c926981dd5c16a184f45b Mon Sep 17 00:00:00 2001 From: cramonal Date: Thu, 20 Oct 2022 12:03:35 +0200 Subject: [PATCH 2/5] adding modifications --- PhysicsTools/NanoAOD/plugins/EvaluateMuonMVAID.cc | 13 ------------- PhysicsTools/NanoAOD/python/muons_cff.py | 5 ++++- PhysicsTools/NanoAOD/python/nanoDQM_cff.py | 5 +++++ PhysicsTools/NanoAOD/python/nanoDQM_cfi.py | 1 - 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/PhysicsTools/NanoAOD/plugins/EvaluateMuonMVAID.cc b/PhysicsTools/NanoAOD/plugins/EvaluateMuonMVAID.cc index 9d6d41085140b..526af349a46c9 100644 --- a/PhysicsTools/NanoAOD/plugins/EvaluateMuonMVAID.cc +++ b/PhysicsTools/NanoAOD/plugins/EvaluateMuonMVAID.cc @@ -9,20 +9,7 @@ #include "FWCore/Framework/interface/Event.h" #include "FWCore/Framework/interface/MakerMacros.h" -#include "FWCore/ParameterSet/interface/ParameterSet.h" -#include "FWCore/Utilities/interface/StreamID.h" - -#include "DataFormats/PatCandidates/interface/Muon.h" -#include "DataFormats/PatCandidates/interface/Electron.h" #include "DataFormats/PatCandidates/interface/Muon.h" - -#include "DataFormats/VertexReco/interface/Vertex.h" -#include "DataFormats/Candidate/interface/VertexCompositePtrCandidate.h" - -#include "RecoVertex/VertexTools/interface/VertexDistance3D.h" -#include "RecoVertex/VertexPrimitives/interface/ConvertToFromReco.h" -#include "RecoVertex/VertexPrimitives/interface/VertexState.h" - #include "PhysicsTools/PatAlgos/interface/BaseMVAValueMapProducer.h" #include diff --git a/PhysicsTools/NanoAOD/python/muons_cff.py b/PhysicsTools/NanoAOD/python/muons_cff.py index 2c802b9ce633f..6107b55c0368b 100644 --- a/PhysicsTools/NanoAOD/python/muons_cff.py +++ b/PhysicsTools/NanoAOD/python/muons_cff.py @@ -158,7 +158,7 @@ mvaId = Var("passed('MvaLoose')+passed('MvaMedium')+passed('MvaTight')+passed('MvaVTight')+passed('MvaVVTight')","uint8",doc="Mva for ID of prompt leptons from miniAOD selector (1=MvaLoose, 2=MvaMedium, 3=MvaTight, 4=MvaVTight, 5=MvaVVTight)"), mvaLowPtId = Var("passed('LowPtMvaLoose')+passed('LowPtMvaMedium')","uint8", doc="Low Pt Mva ID from miniAOD selector (1=LowPtMvaLoose, 2=LowPtMvaMedium)"), miniIsoId = Var("passed('MiniIsoLoose')+passed('MiniIsoMedium')+passed('MiniIsoTight')+passed('MiniIsoVeryTight')","uint8",doc="MiniIso ID from miniAOD selector (1=MiniIsoLoose, 2=MiniIsoMedium, 3=MiniIsoTight, 4=MiniIsoVeryTight)"), - mvaIDMuon = Var("mvaIDValue()",float,doc="MVA-based ID score (from miniAOD)",precision=14), + mvaIDMuon = Var("mvaIDValue()",float,doc="MVA-based ID score ",precision=6), mvaIDMuon_WP = Var("passed('MvaIDwpMedium')+passed('MvaIDwpTight')","uint8",doc="MVA-based ID selector WPs (1=MVAIDwpMedium,2=MVAIDwpTight)"), multiIsoId = Var("?passed('MultiIsoMedium')?2:passed('MultiIsoLoose')","uint8",doc="MultiIsoId from miniAOD selector (1=MultiIsoLoose, 2=MultiIsoMedium)"), puppiIsoId = Var("passed('PuppiIsoLoose')+passed('PuppiIsoMedium')+passed('PuppiIsoTight')", "uint8", doc="PuppiIsoId from miniAOD selector (1=Loose, 2=Medium, 3=Tight)"), @@ -175,6 +175,7 @@ + for modifier in (run2_nanoAOD_106Xv2 | run3_nanoAOD_122): modifier.toModify(muonTable.variables,mvaIDMuon=None ) modifier.toModify(muonTable.variables,mvaIDMuon_WP=None ) @@ -210,6 +211,8 @@ muonTask = cms.Task(slimmedMuonsUpdated,isoForMu,ptRatioRelForMu,slimmedMuonsWithUserData,finalMuons,finalLooseMuons ) muonMCTask = cms.Task(muonsMCMatchForTable,muonMCTable) muonTablesTask = cms.Task(muonMVATTH,muonMVALowPt,muonTable) + for modifier in (run2_nanoAOD_106Xv2 | run3_nanoAOD_122): modifier.toModify(muonTablesTask,muonTablesTask.add(muonMVAID)) + diff --git a/PhysicsTools/NanoAOD/python/nanoDQM_cff.py b/PhysicsTools/NanoAOD/python/nanoDQM_cff.py index ba5709a481368..4a92f4a6f2208 100644 --- a/PhysicsTools/NanoAOD/python/nanoDQM_cff.py +++ b/PhysicsTools/NanoAOD/python/nanoDQM_cff.py @@ -18,6 +18,11 @@ plots = _boostedTauPlotsV10 ) +_Muon_plots_preRun3 = copy.deepcopy(nanoDQM.vplots.Muon.plots) +_Muon_plots_preRun3.remove(Plot1D('mvaIDMuon_WP', 'mvaIDMuon_WP', 3, -0.5, 2.5, 'MVA-based ID selector WPs (1=MVAIDwpMedium,2=MVAIDwpTight)')) +(run2_miniAOD_80XLegacy | run2_nanoAOD_92X | run2_nanoAOD_94X2016 | run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94XMiniAODv2 | run2_nanoAOD_102Xv1 | run2_nanoAOD_106Xv1 | run2_nanoAOD_106Xv2 | +run3_nanoAOD_122).toModify(nanoDQM.vplots.Muon.plots, plots = _Muon_plots_preRun3 ) + ## MC nanoDQMMC = nanoDQM.clone() nanoDQMMC.vplots.Electron.sels.Prompt = cms.string("genPartFlav == 1") diff --git a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py index d862fa2f0a926..13d13682e526a 100644 --- a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py +++ b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py @@ -524,7 +524,6 @@ Plot1D('mvaTTH', 'mvaTTH', 20, -1, 1, 'TTH MVA lepton ID score'), Plot1D('mvaIDMuon', 'mvaIDMuon', 20, -1, 1, 'Score of MVA-based muon ID'), Plot1D('mvaIDMuon_WP', 'mvaIDMuon_WP', 3, -0.5, 2.5, 'MVA-based ID selector WPs (1=MVAIDwpMedium,2=MVAIDwpTight)'), - Plot1D('mvaIDMuon_nano', 'mvaIDMuon_nano', 20, -1, 1, 'MVA-based ID score (from nanoAOD)'), Plot1D('nStations', 'nStations', 5, -0.5, 4.5, 'number of matched stations with default arbitration (segment & track)'), Plot1D('nTrackerLayers', 'nTrackerLayers', 15, 2.5, 17.5, 'number of layers in the tracker'), Plot1D('jetNDauCharged', 'jetNDauCharged', 20, -0.5, 19.5, 'number of charged daughters of the closest jet'), From ae53a5320aa9f0dcc1f05d18b85f025c51dbd8c1 Mon Sep 17 00:00:00 2001 From: cramonal Date: Fri, 21 Oct 2022 11:59:06 +0200 Subject: [PATCH 3/5] fix error in DQM plot --- PhysicsTools/NanoAOD/python/nanoDQM_cff.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/PhysicsTools/NanoAOD/python/nanoDQM_cff.py b/PhysicsTools/NanoAOD/python/nanoDQM_cff.py index 4a92f4a6f2208..a12dd9f1bcfc1 100644 --- a/PhysicsTools/NanoAOD/python/nanoDQM_cff.py +++ b/PhysicsTools/NanoAOD/python/nanoDQM_cff.py @@ -19,7 +19,11 @@ ) _Muon_plots_preRun3 = copy.deepcopy(nanoDQM.vplots.Muon.plots) -_Muon_plots_preRun3.remove(Plot1D('mvaIDMuon_WP', 'mvaIDMuon_WP', 3, -0.5, 2.5, 'MVA-based ID selector WPs (1=MVAIDwpMedium,2=MVAIDwpTight)')) + +for plot in _Muon_plots_preRun3: + if plot.name.value() == "mvaIDMuon_WP": + _Muon_plots_preRun3.remove(plot) + (run2_miniAOD_80XLegacy | run2_nanoAOD_92X | run2_nanoAOD_94X2016 | run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94XMiniAODv2 | run2_nanoAOD_102Xv1 | run2_nanoAOD_106Xv1 | run2_nanoAOD_106Xv2 | run3_nanoAOD_122).toModify(nanoDQM.vplots.Muon.plots, plots = _Muon_plots_preRun3 ) From 62a59e23e2ed87ed0a90c9c3b3a835b78b273e08 Mon Sep 17 00:00:00 2001 From: Sebastien Wertz Date: Thu, 27 Oct 2022 11:50:41 +0200 Subject: [PATCH 4/5] store muon mvaID as userFloat, evaluate WPs manually for Run2 --- PhysicsTools/NanoAOD/python/muons_cff.py | 64 +++++++++++++--------- PhysicsTools/NanoAOD/python/nanoDQM_cff.py | 9 --- PhysicsTools/NanoAOD/python/nanoDQM_cfi.py | 2 +- 3 files changed, 39 insertions(+), 36 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/muons_cff.py b/PhysicsTools/NanoAOD/python/muons_cff.py index 6107b55c0368b..88dd9ca4254fa 100644 --- a/PhysicsTools/NanoAOD/python/muons_cff.py +++ b/PhysicsTools/NanoAOD/python/muons_cff.py @@ -30,32 +30,8 @@ srcVtx = cms.InputTag("offlineSlimmedPrimaryVertices"), ) -slimmedMuonsWithUserData = cms.EDProducer("PATMuonUserDataEmbedder", - src = cms.InputTag("slimmedMuonsUpdated"), - userFloats = cms.PSet( - miniIsoChg = cms.InputTag("isoForMu:miniIsoChg"), - miniIsoAll = cms.InputTag("isoForMu:miniIsoAll"), - ptRatio = cms.InputTag("ptRatioRelForMu:ptRatio"), - ptRel = cms.InputTag("ptRatioRelForMu:ptRel"), - jetNDauChargedMVASel = cms.InputTag("ptRatioRelForMu:jetNDauChargedMVASel"), - ), - userCands = cms.PSet( - jetForLepJetVar = cms.InputTag("ptRatioRelForMu:jetForLepJetVar") # warning: Ptr is null if no match is found - ), -) - -finalMuons = cms.EDFilter("PATMuonRefSelector", - src = cms.InputTag("slimmedMuonsWithUserData"), - cut = cms.string("pt > 15 || (pt > 3 && (passed('CutBasedIdLoose') || passed('SoftCutBasedId') || passed('SoftMvaId') || passed('CutBasedIdGlobalHighPt') || passed('CutBasedIdTrkHighPt')))") -) - -finalLooseMuons = cms.EDFilter("PATMuonRefSelector", # for isotrack cleaning - src = cms.InputTag("slimmedMuonsWithUserData"), - cut = cms.string("pt > 3 && track.isNonnull && isLooseMuon") -) - -muonMVAID= cms.EDProducer("EvaluateMuonMVAID", - src = cms.InputTag("linkedObjects","muons"), +muonMVAID = cms.EDProducer("EvaluateMuonMVAID", + src = cms.InputTag("slimmedMuonsUpdated"), weightFile = cms.FileInPath("RecoMuon/MuonIdentification/data/mvaID.onnx"), isClassifier = cms.bool(False), backend = cms.string('ONNX'), @@ -80,6 +56,34 @@ ) ) +slimmedMuonsWithUserData = cms.EDProducer("PATMuonUserDataEmbedder", + src = cms.InputTag("slimmedMuonsUpdated"), + userFloats = cms.PSet( + miniIsoChg = cms.InputTag("isoForMu:miniIsoChg"), + miniIsoAll = cms.InputTag("isoForMu:miniIsoAll"), + ptRatio = cms.InputTag("ptRatioRelForMu:ptRatio"), + ptRel = cms.InputTag("ptRatioRelForMu:ptRel"), + jetNDauChargedMVASel = cms.InputTag("ptRatioRelForMu:jetNDauChargedMVASel"), + ), + userCands = cms.PSet( + jetForLepJetVar = cms.InputTag("ptRatioRelForMu:jetForLepJetVar") # warning: Ptr is null if no match is found + ), +) + +(run2_miniAOD_80XLegacy | run2_nanoAOD_92X | run2_nanoAOD_94X2016 | run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94XMiniAODv2\ + | run2_nanoAOD_102Xv1 | run2_nanoAOD_106Xv1 | run2_nanoAOD_106Xv2 | run3_nanoAOD_122 ).toModify(slimmedMuonsWithUserData.userFloats, + mvaIDMuon = cms.InputTag("muonMVAID:probGood")) + +finalMuons = cms.EDFilter("PATMuonRefSelector", + src = cms.InputTag("slimmedMuonsWithUserData"), + cut = cms.string("pt > 15 || (pt > 3 && (passed('CutBasedIdLoose') || passed('SoftCutBasedId') || passed('SoftMvaId') || passed('CutBasedIdGlobalHighPt') || passed('CutBasedIdTrkHighPt')))") +) + +finalLooseMuons = cms.EDFilter("PATMuonRefSelector", # for isotrack cleaning + src = cms.InputTag("slimmedMuonsWithUserData"), + cut = cms.string("pt > 3 && track.isNonnull && isLooseMuon") +) + muonMVATTH= cms.EDProducer("MuonBaseMVAValueMapProducer", src = cms.InputTag("linkedObjects","muons"), weightFile = cms.FileInPath("PhysicsTools/NanoAOD/data/mu_BDTG_2017.weights.xml"), @@ -173,6 +177,11 @@ ), ) +(run2_miniAOD_80XLegacy | run2_nanoAOD_92X | run2_nanoAOD_94X2016 | run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94XMiniAODv2\ + | run2_nanoAOD_102Xv1 | run2_nanoAOD_106Xv1 | run2_nanoAOD_106Xv2 | run3_nanoAOD_122 ).toModify(muonTable.variables,mvaIDMuon=None).toModify( + muonTable.variables, mvaIDMuon_WP = Var("? userFloat('mvaIDMuon') > 0.49 ? 2 : (? userFloat('mvaIDMuon') > 0.08 ? 1 : 0)", "uint8", doc="MVA-based ID selector WPs (1=MVAIDwpMedium,2=MVAIDwpTight)"), + mvaIDMuon = Var("usedFloat('mvaIDMuon')", float, doc="MVA-based ID score",precision=6)) + @@ -181,6 +190,7 @@ modifier.toModify(muonTable.variables,mvaIDMuon_WP=None ) modifier.toModify(muonTable.externalVariables, mvaIDMuon = ExtVar(cms.InputTag("muonMVAID:probGOOD"),float, doc="MVA-based ID score (from nanoAOD)",precision=14)) + # Revert back to AK4 CHS jets for Run 2 run2_nanoAOD_ANY.toModify( ptRatioRelForMu,srcJet="updatedJets" @@ -212,7 +222,9 @@ muonMCTask = cms.Task(muonsMCMatchForTable,muonMCTable) muonTablesTask = cms.Task(muonMVATTH,muonMVALowPt,muonTable) + for modifier in (run2_nanoAOD_106Xv2 | run3_nanoAOD_122): modifier.toModify(muonTablesTask,muonTablesTask.add(muonMVAID)) + diff --git a/PhysicsTools/NanoAOD/python/nanoDQM_cff.py b/PhysicsTools/NanoAOD/python/nanoDQM_cff.py index a12dd9f1bcfc1..ba5709a481368 100644 --- a/PhysicsTools/NanoAOD/python/nanoDQM_cff.py +++ b/PhysicsTools/NanoAOD/python/nanoDQM_cff.py @@ -18,15 +18,6 @@ plots = _boostedTauPlotsV10 ) -_Muon_plots_preRun3 = copy.deepcopy(nanoDQM.vplots.Muon.plots) - -for plot in _Muon_plots_preRun3: - if plot.name.value() == "mvaIDMuon_WP": - _Muon_plots_preRun3.remove(plot) - -(run2_miniAOD_80XLegacy | run2_nanoAOD_92X | run2_nanoAOD_94X2016 | run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94XMiniAODv2 | run2_nanoAOD_102Xv1 | run2_nanoAOD_106Xv1 | run2_nanoAOD_106Xv2 | -run3_nanoAOD_122).toModify(nanoDQM.vplots.Muon.plots, plots = _Muon_plots_preRun3 ) - ## MC nanoDQMMC = nanoDQM.clone() nanoDQMMC.vplots.Electron.sels.Prompt = cms.string("genPartFlav == 1") diff --git a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py index 13d13682e526a..ae8d5b8600270 100644 --- a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py +++ b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py @@ -522,7 +522,7 @@ Plot1D('mvaLowPt', 'mvaLowPt', 20, -1, 1, 'Low pt muon ID score'), Plot1D('mvaLowPtId', 'mvaLowPtId', 3, -0.5, 2.5, 'Low Pt Mva ID from miniAOD selector (1=LowPtMvaLoose, 2=LowPtMvaMedium)'), Plot1D('mvaTTH', 'mvaTTH', 20, -1, 1, 'TTH MVA lepton ID score'), - Plot1D('mvaIDMuon', 'mvaIDMuon', 20, -1, 1, 'Score of MVA-based muon ID'), + Plot1D('mvaIDMuon', 'mvaIDMuon', 20, 0, 1, 'Score of MVA-based muon ID'), Plot1D('mvaIDMuon_WP', 'mvaIDMuon_WP', 3, -0.5, 2.5, 'MVA-based ID selector WPs (1=MVAIDwpMedium,2=MVAIDwpTight)'), Plot1D('nStations', 'nStations', 5, -0.5, 4.5, 'number of matched stations with default arbitration (segment & track)'), Plot1D('nTrackerLayers', 'nTrackerLayers', 15, 2.5, 17.5, 'number of layers in the tracker'), From e86bd08c00de1edc387ff60fffd3a94f4442d897 Mon Sep 17 00:00:00 2001 From: cramonal Date: Tue, 15 Nov 2022 13:50:40 +0100 Subject: [PATCH 5/5] implement missing comments --- PhysicsTools/NanoAOD/python/muons_cff.py | 34 ++++++++-------------- PhysicsTools/NanoAOD/python/nanoDQM_cfi.py | 4 +-- 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/muons_cff.py b/PhysicsTools/NanoAOD/python/muons_cff.py index 88dd9ca4254fa..2938cf8308bdd 100644 --- a/PhysicsTools/NanoAOD/python/muons_cff.py +++ b/PhysicsTools/NanoAOD/python/muons_cff.py @@ -38,9 +38,9 @@ name = cms.string("muonMVAID"), outputTensorName= cms.string("probabilities"), inputTensorName= cms.string("float_input"), - outputNames = cms.vstring(["probBAD","probGOOD"]), + outputNames = cms.vstring(["probGOOD", "wpMedium", "wpTight"]), batch_eval =cms.bool(True), - outputFormulas = cms.vstring(["1.0*at(0)","at(1)"]), + outputFormulas = cms.vstring(["at(1)", "? at(1) > 0.14 ? 1 : 0", "? at(1) > 0.35 ? 1 : 0"]), variablesOrder = cms.vstring(["LepGood_global_muon","LepGood_validFraction","Muon_norm_chi2_extended","LepGood_local_chi2","LepGood_kink","LepGood_segmentComp","Muon_n_Valid_hits_extended","LepGood_n_MatchedStations","LepGood_Valid_pixel","LepGood_tracker_layers","LepGood_pt","LepGood_eta"]), variables = cms.PSet( LepGood_global_muon = cms.string("isGlobalMuon"), @@ -64,15 +64,17 @@ ptRatio = cms.InputTag("ptRatioRelForMu:ptRatio"), ptRel = cms.InputTag("ptRatioRelForMu:ptRel"), jetNDauChargedMVASel = cms.InputTag("ptRatioRelForMu:jetNDauChargedMVASel"), + mvaIDMuon_wpMedium = cms.InputTag("muonMVAID:wpMedium"), + mvaIDMuon_wpTight = cms.InputTag("muonMVAID:wpTight") ), userCands = cms.PSet( jetForLepJetVar = cms.InputTag("ptRatioRelForMu:jetForLepJetVar") # warning: Ptr is null if no match is found ), ) -(run2_miniAOD_80XLegacy | run2_nanoAOD_92X | run2_nanoAOD_94X2016 | run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94XMiniAODv2\ - | run2_nanoAOD_102Xv1 | run2_nanoAOD_106Xv1 | run2_nanoAOD_106Xv2 | run3_nanoAOD_122 ).toModify(slimmedMuonsWithUserData.userFloats, - mvaIDMuon = cms.InputTag("muonMVAID:probGood")) +(run2_nanoAOD_106Xv2 | run3_nanoAOD_122 ).toModify(slimmedMuonsWithUserData.userFloats, + mvaIDMuon = cms.InputTag("muonMVAID:probGOOD")) + finalMuons = cms.EDFilter("PATMuonRefSelector", src = cms.InputTag("slimmedMuonsWithUserData"), @@ -162,8 +164,8 @@ mvaId = Var("passed('MvaLoose')+passed('MvaMedium')+passed('MvaTight')+passed('MvaVTight')+passed('MvaVVTight')","uint8",doc="Mva for ID of prompt leptons from miniAOD selector (1=MvaLoose, 2=MvaMedium, 3=MvaTight, 4=MvaVTight, 5=MvaVVTight)"), mvaLowPtId = Var("passed('LowPtMvaLoose')+passed('LowPtMvaMedium')","uint8", doc="Low Pt Mva ID from miniAOD selector (1=LowPtMvaLoose, 2=LowPtMvaMedium)"), miniIsoId = Var("passed('MiniIsoLoose')+passed('MiniIsoMedium')+passed('MiniIsoTight')+passed('MiniIsoVeryTight')","uint8",doc="MiniIso ID from miniAOD selector (1=MiniIsoLoose, 2=MiniIsoMedium, 3=MiniIsoTight, 4=MiniIsoVeryTight)"), - mvaIDMuon = Var("mvaIDValue()",float,doc="MVA-based ID score ",precision=6), - mvaIDMuon_WP = Var("passed('MvaIDwpMedium')+passed('MvaIDwpTight')","uint8",doc="MVA-based ID selector WPs (1=MVAIDwpMedium,2=MVAIDwpTight)"), + mvaMuID = Var("mvaIDValue()",float,doc="MVA-based ID score ",precision=6), + mvaMuID_WP = Var("userFloat('mvaIDMuon_wpMedium') + userFloat('mvaIDMuon_wpTight')","uint8",doc="MVA-based ID selector WPs (1=MVAIDwpMedium,2=MVAIDwpTight)"), multiIsoId = Var("?passed('MultiIsoMedium')?2:passed('MultiIsoLoose')","uint8",doc="MultiIsoId from miniAOD selector (1=MultiIsoLoose, 2=MultiIsoMedium)"), puppiIsoId = Var("passed('PuppiIsoLoose')+passed('PuppiIsoMedium')+passed('PuppiIsoTight')", "uint8", doc="PuppiIsoId from miniAOD selector (1=Loose, 2=Medium, 3=Tight)"), triggerIdLoose = Var("passed('TriggerIdLoose')",bool,doc="TriggerIdLoose ID"), @@ -177,18 +179,9 @@ ), ) -(run2_miniAOD_80XLegacy | run2_nanoAOD_92X | run2_nanoAOD_94X2016 | run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94XMiniAODv2\ - | run2_nanoAOD_102Xv1 | run2_nanoAOD_106Xv1 | run2_nanoAOD_106Xv2 | run3_nanoAOD_122 ).toModify(muonTable.variables,mvaIDMuon=None).toModify( - muonTable.variables, mvaIDMuon_WP = Var("? userFloat('mvaIDMuon') > 0.49 ? 2 : (? userFloat('mvaIDMuon') > 0.08 ? 1 : 0)", "uint8", doc="MVA-based ID selector WPs (1=MVAIDwpMedium,2=MVAIDwpTight)"), - mvaIDMuon = Var("usedFloat('mvaIDMuon')", float, doc="MVA-based ID score",precision=6)) - - - -for modifier in (run2_nanoAOD_106Xv2 | run3_nanoAOD_122): - modifier.toModify(muonTable.variables,mvaIDMuon=None ) - modifier.toModify(muonTable.variables,mvaIDMuon_WP=None ) - modifier.toModify(muonTable.externalVariables, mvaIDMuon = ExtVar(cms.InputTag("muonMVAID:probGOOD"),float, doc="MVA-based ID score (from nanoAOD)",precision=14)) +(run2_nanoAOD_106Xv2 | run3_nanoAOD_122).toModify(muonTable.variables,mvaMuID=None).toModify( + muonTable.variables, mvaMuID = Var("userFloat('mvaIDMuon')", float, doc="MVA-based ID score",precision=6)) # Revert back to AK4 CHS jets for Run 2 @@ -220,11 +213,8 @@ muonTask = cms.Task(slimmedMuonsUpdated,isoForMu,ptRatioRelForMu,slimmedMuonsWithUserData,finalMuons,finalLooseMuons ) muonMCTask = cms.Task(muonsMCMatchForTable,muonMCTable) -muonTablesTask = cms.Task(muonMVATTH,muonMVALowPt,muonTable) - +muonTablesTask = cms.Task(muonMVATTH,muonMVALowPt,muonTable,muonMVAID) -for modifier in (run2_nanoAOD_106Xv2 | run3_nanoAOD_122): - modifier.toModify(muonTablesTask,muonTablesTask.add(muonMVAID)) diff --git a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py index ae8d5b8600270..e1dba5ec5da73 100644 --- a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py +++ b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py @@ -522,8 +522,8 @@ Plot1D('mvaLowPt', 'mvaLowPt', 20, -1, 1, 'Low pt muon ID score'), Plot1D('mvaLowPtId', 'mvaLowPtId', 3, -0.5, 2.5, 'Low Pt Mva ID from miniAOD selector (1=LowPtMvaLoose, 2=LowPtMvaMedium)'), Plot1D('mvaTTH', 'mvaTTH', 20, -1, 1, 'TTH MVA lepton ID score'), - Plot1D('mvaIDMuon', 'mvaIDMuon', 20, 0, 1, 'Score of MVA-based muon ID'), - Plot1D('mvaIDMuon_WP', 'mvaIDMuon_WP', 3, -0.5, 2.5, 'MVA-based ID selector WPs (1=MVAIDwpMedium,2=MVAIDwpTight)'), + Plot1D('mvaMuID', 'mvaMuID', 20, 0, 1, 'Score of MVA-based muon ID'), + Plot1D('mvaMuID_WP', 'mvaMuID_WP', 3, -0.5, 2.5, 'MVA-based ID selector WPs (1=MVAIDwpMedium,2=MVAIDwpTight)'), Plot1D('nStations', 'nStations', 5, -0.5, 4.5, 'number of matched stations with default arbitration (segment & track)'), Plot1D('nTrackerLayers', 'nTrackerLayers', 15, 2.5, 17.5, 'number of layers in the tracker'), Plot1D('jetNDauCharged', 'jetNDauCharged', 20, -0.5, 19.5, 'number of charged daughters of the closest jet'),