From c5b624abdc10b82a1e4e0e9625f7b7696f991c6e Mon Sep 17 00:00:00 2001 From: Huilin Qu Date: Tue, 13 May 2025 16:53:24 +0200 Subject: [PATCH 1/5] NanoV15-Lite for Run2UL. --- .../NanoAOD/python/boostedTaus_cff.py | 15 ----- .../NanoAOD/python/jetsAK4_Puppi_cff.py | 8 --- PhysicsTools/NanoAOD/python/jetsAK8_cff.py | 65 ------------------- PhysicsTools/NanoAOD/python/nanoDQM_cff.py | 13 ---- PhysicsTools/NanoAOD/python/nano_cff.py | 53 ++++++++------- 5 files changed, 29 insertions(+), 125 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/boostedTaus_cff.py b/PhysicsTools/NanoAOD/python/boostedTaus_cff.py index 1fb58bb74becd..13492fa549f2b 100644 --- a/PhysicsTools/NanoAOD/python/boostedTaus_cff.py +++ b/PhysicsTools/NanoAOD/python/boostedTaus_cff.py @@ -12,10 +12,6 @@ src = cms.InputTag("slimmedTausBoosted"), cut = cms.string("pt > 25 && tauID('decayModeFindingNewDMs') && (tauID('byVVLooseIsolationMVArun2DBoldDMwLT') || tauID('byVVLooseIsolationMVArun2DBnewDMwLT') || tauID('byBoostedDeepTau20161718v2p0VSjetraw') > {})".format(0.82)) ) -run2_nanoAOD_106Xv2.toModify( - finalBoostedTaus, - cut = "pt > 25 && tauID('decayModeFindingNewDMs') && (tauID('byVVLooseIsolationMVArun2DBoldDMwLT') || tauID('byVVLooseIsolationMVArun2DBoldDMdR0p3wLT') || tauID('byVVLooseIsolationMVArun2DBnewDMwLT') || tauID('byBoostedDeepTau20161718v2p0VSjetraw') > {})".format(0.82) -) boostedTauTable = simplePATTauFlatTableProducer.clone( src = cms.InputTag("linkedObjects", "boostedTaus"), @@ -71,17 +67,6 @@ _boostedTauVarsAntiEleMVA, _boostedDeepTauRunIIv2p0Vars ) -_boostedTauVarsWithDr03 = cms.PSet( - _boostedTauVarsBase, - _boostedTauVarsMVAIso, - _boostedTauVarsMVAIsoDr03, - _boostedTauVarsAntiEleMVA, - _boostedDeepTauRunIIv2p0Vars -) -run2_nanoAOD_106Xv2.toModify( - boostedTauTable, - variables = _boostedTauVarsWithDr03 -) boostedTausMCMatchLepTauForTable = tausMCMatchLepTauForTable.clone( src = boostedTauTable.src diff --git a/PhysicsTools/NanoAOD/python/jetsAK4_Puppi_cff.py b/PhysicsTools/NanoAOD/python/jetsAK4_Puppi_cff.py index 092f28684e5bb..4e23365ef97fa 100644 --- a/PhysicsTools/NanoAOD/python/jetsAK4_Puppi_cff.py +++ b/PhysicsTools/NanoAOD/python/jetsAK4_Puppi_cff.py @@ -116,14 +116,6 @@ ) ) -run2_nanoAOD_ANY.toModify( - jetPuppiTable.variables, - btagCSVV2 = Var("bDiscriminator('pfCombinedInclusiveSecondaryVertexV2BJetTags')",float,doc=" pfCombinedInclusiveSecondaryVertexV2 b-tag discriminator (aka CSVV2)",precision=10), - btagDeepB = Var("?(bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb'))>=0?bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb'):-1",float,doc="DeepCSV b+bb tag discriminator",precision=10), - btagDeepCvL = Var("?bDiscriminator('pfDeepCSVJetTags:probc')>=0?bDiscriminator('pfDeepCSVJetTags:probc')/(bDiscriminator('pfDeepCSVJetTags:probc')+bDiscriminator('pfDeepCSVJetTags:probudsg')):-1", float,doc="DeepCSV c vs udsg discriminator",precision=10), - btagDeepCvB = Var("?bDiscriminator('pfDeepCSVJetTags:probc')>=0?bDiscriminator('pfDeepCSVJetTags:probc')/(bDiscriminator('pfDeepCSVJetTags:probc')+bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb')):-1",float,doc="DeepCSV c vs b+bb discriminator",precision=10) -) - run3_nanoAOD_pre142X.toModify( jetPuppiTable.variables, puIdDisc = None, diff --git a/PhysicsTools/NanoAOD/python/jetsAK8_cff.py b/PhysicsTools/NanoAOD/python/jetsAK8_cff.py index ab3dc0c161876..8b5bc434fd5f1 100644 --- a/PhysicsTools/NanoAOD/python/jetsAK8_cff.py +++ b/PhysicsTools/NanoAOD/python/jetsAK8_cff.py @@ -127,45 +127,6 @@ ) ) -run2_nanoAOD_ANY.toModify( - fatJetTable.variables, - btagCSVV2 = Var("bDiscriminator('pfCombinedInclusiveSecondaryVertexV2BJetTags')",float,doc=" pfCombinedInclusiveSecondaryVertexV2 b-tag discriminator (aka CSVV2)",precision=10), - # Remove for V9 - chMultiplicity = None, - neMultiplicity = None, - chHEF = None, - neHEF = None, - chEmEF = None, - neEmEF = None, - muEF = None -) - -(run2_nanoAOD_106Xv2).toModify( - fatJetTable.variables, - # Restore taggers that were decommisionned for Run-3 - btagDeepB = Var("?(bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb'))>=0?bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb'):-1",float,doc="DeepCSV b+bb tag discriminator",precision=10), - btagHbb = Var("bDiscriminator('pfBoostedDoubleSecondaryVertexAK8BJetTags')",float,doc="Higgs to BB tagger discriminator",precision=10), - btagDDBvLV2 = Var("bDiscriminator('pfMassIndependentDeepDoubleBvLV2JetTags:probHbb')",float,doc="DeepDoubleX V2(mass-decorrelated) discriminator for H(Z)->bb vs QCD",precision=10), - btagDDCvLV2 = Var("bDiscriminator('pfMassIndependentDeepDoubleCvLV2JetTags:probHcc')",float,doc="DeepDoubleX V2 (mass-decorrelated) discriminator for H(Z)->cc vs QCD",precision=10), - btagDDCvBV2 = Var("bDiscriminator('pfMassIndependentDeepDoubleCvBV2JetTags:probHcc')",float,doc="DeepDoubleX V2 (mass-decorrelated) discriminator for H(Z)->cc vs H(Z)->bb",precision=10), - deepTag_TvsQCD = Var("bDiscriminator('pfDeepBoostedDiscriminatorsJetTags:TvsQCD')",float,doc="DeepBoostedJet tagger top vs QCD discriminator",precision=10), - deepTag_WvsQCD = Var("bDiscriminator('pfDeepBoostedDiscriminatorsJetTags:WvsQCD')",float,doc="DeepBoostedJet tagger W vs QCD discriminator",precision=10), - deepTag_ZvsQCD = Var("bDiscriminator('pfDeepBoostedDiscriminatorsJetTags:ZvsQCD')",float,doc="DeepBoostedJet tagger Z vs QCD discriminator",precision=10), - deepTag_H = Var("bDiscriminator('pfDeepBoostedJetTags:probHbb')+bDiscriminator('pfDeepBoostedJetTags:probHcc')+bDiscriminator('pfDeepBoostedJetTags:probHqqqq')",float,doc="DeepBoostedJet tagger H(bb,cc,4q) sum",precision=10), - deepTag_QCD = Var("bDiscriminator('pfDeepBoostedJetTags:probQCDbb')+bDiscriminator('pfDeepBoostedJetTags:probQCDcc')+bDiscriminator('pfDeepBoostedJetTags:probQCDb')+bDiscriminator('pfDeepBoostedJetTags:probQCDc')+bDiscriminator('pfDeepBoostedJetTags:probQCDothers')",float,doc="DeepBoostedJet tagger QCD(bb,cc,b,c,others) sum",precision=10), - deepTag_QCDothers = Var("bDiscriminator('pfDeepBoostedJetTags:probQCDothers')",float,doc="DeepBoostedJet tagger QCDothers value",precision=10), - deepTagMD_TvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:TvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger top vs QCD discriminator",precision=10), - deepTagMD_WvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:WvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger W vs QCD discriminator",precision=10), - deepTagMD_ZvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:ZvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger Z vs QCD discriminator",precision=10), - deepTagMD_ZHbbvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:ZHbbvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger Z/H->bb vs QCD discriminator",precision=10), - deepTagMD_ZbbvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:ZbbvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger Z->bb vs QCD discriminator",precision=10), - deepTagMD_HbbvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:HbbvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger H->bb vs QCD discriminator",precision=10), - deepTagMD_ZHccvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:ZHccvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger Z/H->cc vs QCD discriminator",precision=10), - deepTagMD_H4qvsQCD = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:H4qvsQCD')",float,doc="Mass-decorrelated DeepBoostedJet tagger H->4q vs QCD discriminator",precision=10), - deepTagMD_bbvsLight = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:bbvsLight')",float,doc="Mass-decorrelated DeepBoostedJet tagger Z/H/gluon->bb vs light flavour discriminator",precision=10), - deepTagMD_ccvsLight = Var("bDiscriminator('pfMassDecorrelatedDeepBoostedDiscriminatorsJetTags:ccvsLight')",float,doc="Mass-decorrelated DeepBoostedJet tagger Z/H/gluon->cc vs light flavour discriminator",precision=10), -) - ############################################################## ## DeepInfoAK8:Start ## - To be used in nanoAOD_customizeCommon() in nano_cff.py @@ -232,16 +193,6 @@ def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubl jecPayload = cms.untracked.string('AK8PFPuppi') ) - -# ParticleNet legacy jet tagger is already in 106Xv2 MINIAOD, -# add ParticleNet legacy mass regression, new combined tagger + mass regression, and GlobalParT -run2_nanoAOD_106Xv2.toModify( - nanoAOD_addDeepInfoAK8_switch, - nanoAOD_addParticleNetMassLegacy_switch = True, - nanoAOD_addParticleNet_switch = True, - nanoAOD_addGlobalParT_switch = True, -) - ################################################ ## DeepInfoAK8:End ################################################# @@ -270,22 +221,6 @@ def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubl ) ) -run2_nanoAOD_ANY.toModify( - subJetTable.variables, - btagCSVV2 = Var("bDiscriminator('pfCombinedInclusiveSecondaryVertexV2BJetTags')",float,doc=" pfCombinedInclusiveSecondaryVertexV2 b-tag discriminator (aka CSVV2)",precision=10) -) - -(run2_nanoAOD_106Xv2).toModify( - subJetTable.variables, - area = None, - UParTAK4RegPtRawCorr = None, - UParTAK4RegPtRawCorrNeutrino = None, - UParTAK4RegPtRawRes = None, - UParTAK4V1RegPtRawCorr = None, - UParTAK4V1RegPtRawCorrNeutrino = None, - UParTAK4V1RegPtRawRes = None, -) - run3_nanoAOD_pre142X.toModify( subJetTable.variables, btagDeepFlavB = None, diff --git a/PhysicsTools/NanoAOD/python/nanoDQM_cff.py b/PhysicsTools/NanoAOD/python/nanoDQM_cff.py index c1aa5c6d89b7a..3949c2ccc8c82 100644 --- a/PhysicsTools/NanoAOD/python/nanoDQM_cff.py +++ b/PhysicsTools/NanoAOD/python/nanoDQM_cff.py @@ -5,19 +5,6 @@ from PhysicsTools.NanoAOD.nanoDQM_tools_cff import * from PhysicsTools.NanoAOD.nano_eras_cff import * -_boostedTauPlotsV10 = cms.VPSet() -for plot in nanoDQM.vplots.boostedTau.plots: - _boostedTauPlotsV10.append(plot) -_boostedTauPlotsV10.extend([ - Plot1D('idMVAoldDMdR032017v2', 'idMVAoldDMdR032017v2', 11, -0.5, 10.5, 'IsolationMVArun2017v2DBoldDMdR0p3wLT ID working point (2017v2): int 1 = VVLoose, 2 = VLoose, 3 = Loose, 4 = Medium, 5 = Tight, 6 = VTight, 7 = VVTight'), - Plot1D('rawMVAoldDMdR032017v2', 'rawMVAoldDMdR032017v2', 20, -1, 1, 'byIsolationMVArun2017v2DBoldDMdR0p3wLT raw output discriminator (2017v2)') -]) - -(run2_nanoAOD_106Xv2).toModify( - nanoDQM.vplots.boostedTau, - plots = _boostedTauPlotsV10 -) - ## EGamma custom nano _Electron_extra_plots = nanoDQM.vplots.Electron.plots.copy() _Electron_extra_plots.extend([ diff --git a/PhysicsTools/NanoAOD/python/nano_cff.py b/PhysicsTools/NanoAOD/python/nano_cff.py index 37fe0c9648f5f..7d552a805f064 100644 --- a/PhysicsTools/NanoAOD/python/nano_cff.py +++ b/PhysicsTools/NanoAOD/python/nano_cff.py @@ -46,11 +46,6 @@ vertices=cms.InputTag("slimmedSecondaryVertices") ) -# Switch to AK4 CHS jets for Run-2 -run2_nanoAOD_ANY.toModify( - linkedObjects, jets="finalJets" -) - from PhysicsTools.NanoAOD.lhcInfoProducer_cfi import lhcInfoProducer lhcInfoTable = lhcInfoProducer.clone() (~run3_common).toModify( @@ -72,15 +67,6 @@ isoTrackTablesTask,softActivityTablesTask ) -# Replace AK4 Puppi with AK4 CHS for Run-2 -_nanoTableTaskCommonRun2 = nanoTableTaskCommon.copy() -_nanoTableTaskCommonRun2.replace(jetPuppiTask, jetTask) -_nanoTableTaskCommonRun2.replace(jetPuppiForMETTask, jetForMETTask) -_nanoTableTaskCommonRun2.replace(jetPuppiTablesTask, jetTablesTask) -run2_nanoAOD_ANY.toReplaceWith( - nanoTableTaskCommon, _nanoTableTaskCommonRun2 -) - nanoSequenceCommon = cms.Sequence(nanoTableTaskCommon) nanoSequenceOnlyFullSim = cms.Sequence(triggerObjectTablesTask) @@ -101,6 +87,24 @@ nanoSequenceMC = nanoSequenceFS.copy() nanoSequenceMC.insert(nanoSequenceFS.index(nanoSequenceCommon)+1,nanoSequenceOnlyFullSim) + +def RecomputePuppiWeightsALL(proc): + """ + Recompute Puppi weights and PuppiMET and rebuild slimmedJetsPuppi and slimmedJetsAK8. + """ + runOnMC = True + if hasattr(proc, "NANOEDMAODoutput") or hasattr(proc, "NANOAODoutput"): + runOnMC = False + + from PhysicsTools.PatAlgos.tools.puppiJetMETReclusteringFromMiniAOD_cff import puppiJetMETReclusterFromMiniAOD + proc = puppiJetMETReclusterFromMiniAOD(proc, runOnMC=runOnMC, useExistingWeights=False, + reclusterAK4MET=True, + reclusterAK8=True, + ) + + return proc + + # modifier which adds new tauIDs import RecoTauTag.RecoTau.tools.runTauIdMVA as tauIdConfig def nanoAOD_addTauIds(process, idsToRun=[]): @@ -203,12 +207,11 @@ def nanoAOD_customizeCommon(process): process = nanoAOD_activateVID(process) + # recompute Puppi weights and remake AK4, AK8 Puppi jets and PuppiMET run2_nanoAOD_106Xv2.toModify( - nanoAOD_addDeepInfoAK4CHS_switch, nanoAOD_addParticleNet_switch=True, - nanoAOD_addRobustParTAK4Tag_switch=False, - nanoAOD_addUnifiedParTAK4Tag_switch=True, + process, lambda p: RecomputePuppiWeightsALL(p) ) - + # This function is defined in jetsAK4_Puppi_cff.py process = nanoAOD_addDeepInfoAK4(process, addParticleNet=nanoAOD_addDeepInfoAK4_switch.nanoAOD_addParticleNet_switch, @@ -216,6 +219,10 @@ def nanoAOD_customizeCommon(process): addUnifiedParTAK4=nanoAOD_addDeepInfoAK4_switch.nanoAOD_addUnifiedParTAK4Tag_switch ) + # Add PNet for Tau + run2_nanoAOD_106Xv2.toModify( + nanoAOD_addDeepInfoAK4CHS_switch, nanoAOD_addParticleNet_switch=True, + ) # This function is defined in jetsAK4_CHS_cff.py process = nanoAOD_addDeepInfoAK4CHS(process, addDeepBTag=nanoAOD_addDeepInfoAK4CHS_switch.nanoAOD_addDeepBTag_switch, @@ -247,12 +254,10 @@ def nanoAOD_customizeCommon(process): ).toModify( process, lambda p : nanoAOD_addTauIds(p, nanoAOD_tau_switch.idsToAdd.value()) ) - - # Add Unified Tagger for CHS jets (PNet) for Run 2 era, - # but don't add Unified Tagger for PUPPI jets (as different PUPPI tune - # and base jet algorithm) + + # Add Unified Tagger for Run 2 era (run2_nanoAOD_106Xv2).toModify( - nanoAOD_tau_switch, addPNet = True + nanoAOD_tau_switch, addPNet = True, addUParTInfo = True ) # Add Unified Taggers for Run 3 pre 142X (pre v15) era (Unified taggers # are already added to slimmedTaus in miniAOD for newer eras) @@ -271,7 +276,7 @@ def nanoAOD_customizeCommon(process): addUTagInfo = nanoAOD_tau_switch.addUParTInfo.value(), usePUPPIjets = True ) - + nanoAOD_boostedTau_switch = cms.PSet( idsToAdd = cms.vstring() ) From 5d596731c154b49bde8aaa803a2f293844c41969 Mon Sep 17 00:00:00 2001 From: Huilin Qu Date: Mon, 19 May 2025 18:02:18 +0200 Subject: [PATCH 2/5] V15-Lite reNANO for 2022/2023. --- .../NanoAOD/python/jetsAK4_Puppi_cff.py | 6 --- PhysicsTools/NanoAOD/python/jetsAK8_cff.py | 13 ------- PhysicsTools/NanoAOD/python/nanoDQM_cff.py | 37 ------------------- PhysicsTools/NanoAOD/python/nano_cff.py | 15 +++----- 4 files changed, 5 insertions(+), 66 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/jetsAK4_Puppi_cff.py b/PhysicsTools/NanoAOD/python/jetsAK4_Puppi_cff.py index 4e23365ef97fa..f9de92ef220f0 100644 --- a/PhysicsTools/NanoAOD/python/jetsAK4_Puppi_cff.py +++ b/PhysicsTools/NanoAOD/python/jetsAK4_Puppi_cff.py @@ -116,12 +116,6 @@ ) ) -run3_nanoAOD_pre142X.toModify( - jetPuppiTable.variables, - puIdDisc = None, -) - - #jets are not as precise as muons jetPuppiTable.variables.pt.precision=10 diff --git a/PhysicsTools/NanoAOD/python/jetsAK8_cff.py b/PhysicsTools/NanoAOD/python/jetsAK8_cff.py index 8b5bc434fd5f1..3cef6f2e21dee 100644 --- a/PhysicsTools/NanoAOD/python/jetsAK8_cff.py +++ b/PhysicsTools/NanoAOD/python/jetsAK8_cff.py @@ -221,19 +221,6 @@ def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubl ) ) -run3_nanoAOD_pre142X.toModify( - subJetTable.variables, - btagDeepFlavB = None, - btagUParTAK4B = None, - UParTAK4RegPtRawCorr = None, - UParTAK4RegPtRawCorrNeutrino = None, - UParTAK4RegPtRawRes = None, - UParTAK4V1RegPtRawCorr = None, - UParTAK4V1RegPtRawCorrNeutrino = None, - UParTAK4V1RegPtRawRes = None, - btagDeepB = Var("bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb')",float,doc="DeepCSV b+bb tag discriminator",precision=10), -) - #jets are not as precise as muons fatJetTable.variables.pt.precision=10 subJetTable.variables.pt.precision=10 diff --git a/PhysicsTools/NanoAOD/python/nanoDQM_cff.py b/PhysicsTools/NanoAOD/python/nanoDQM_cff.py index 3949c2ccc8c82..b888a23a81702 100644 --- a/PhysicsTools/NanoAOD/python/nanoDQM_cff.py +++ b/PhysicsTools/NanoAOD/python/nanoDQM_cff.py @@ -188,43 +188,6 @@ def _match(name): Plot1D('btagDeepCvB', 'btagDeepCvB', 20, -1, 1, 'DeepCSV c vs b+bb discriminator'), Plot1D('btagDeepCvL', 'btagDeepCvL', 20, -1, 1, 'DeepCSV c vs udsg discriminator') ]) -_Jet_pre142X_plots = cms.VPSet() -for plot in nanoDQM.vplots.Jet.plots: - if 'puIdDisc' not in plot.name.value(): - _Jet_pre142X_plots.append(plot) - -_SubJet_Run2_plots = cms.VPSet() -for plot in nanoDQM.vplots.SubJet.plots: - _SubJet_Run2_plots.append(plot) -_SubJet_Run2_plots.extend([ - Plot1D('btagCSVV2', 'btagCSVV2', 20, -1, 1, ' pfCombinedInclusiveSecondaryVertexV2 b-tag discriminator (aka CSVV2)'), -]) - -_SubJet_pre142X_plots = cms.VPSet() -for plot in nanoDQM.vplots.SubJet.plots: - if ('btagDeepFlavB' not in plot.name.value()) and ('btagUParTAK4B' not in plot.name.value()) and ('UParTAK4Reg' not in plot.name.value()): - _SubJet_pre142X_plots.append(plot) -_SubJet_pre142X_plots.extend([ - Plot1D('btagDeepB', 'btagDeepB', 20, -1, 1, 'Deep B+BB btag discriminator'), -]) - -run2_nanoAOD_ANY.toModify( - nanoDQM.vplots.FatJet, - plots = _FatJet_Run2_plots -).toModify( - nanoDQM.vplots.Jet, - plots = _Jet_Run2_plots -).toModify( - nanoDQM.vplots.SubJet, - plots = _SubJet_Run2_plots -) -run3_nanoAOD_pre142X.toModify( - nanoDQM.vplots.Jet, - plots = _Jet_pre142X_plots -).toModify( - nanoDQM.vplots.SubJet, - plots = _SubJet_pre142X_plots -) _Pileup_pre13X_plots = cms.VPSet() for plot in nanoDQM.vplots.Pileup.plots: diff --git a/PhysicsTools/NanoAOD/python/nano_cff.py b/PhysicsTools/NanoAOD/python/nano_cff.py index 7d552a805f064..6a4e9bc21f3c3 100644 --- a/PhysicsTools/NanoAOD/python/nano_cff.py +++ b/PhysicsTools/NanoAOD/python/nano_cff.py @@ -208,7 +208,7 @@ def nanoAOD_customizeCommon(process): process = nanoAOD_activateVID(process) # recompute Puppi weights and remake AK4, AK8 Puppi jets and PuppiMET - run2_nanoAOD_106Xv2.toModify( + (run2_nanoAOD_106Xv2 | run3_nanoAOD_pre142X).toModify( process, lambda p: RecomputePuppiWeightsALL(p) ) @@ -255,13 +255,8 @@ def nanoAOD_customizeCommon(process): process, lambda p : nanoAOD_addTauIds(p, nanoAOD_tau_switch.idsToAdd.value()) ) - # Add Unified Tagger for Run 2 era - (run2_nanoAOD_106Xv2).toModify( - nanoAOD_tau_switch, addPNet = True, addUParTInfo = True - ) - # Add Unified Taggers for Run 3 pre 142X (pre v15) era (Unified taggers - # are already added to slimmedTaus in miniAOD for newer eras) - run3_nanoAOD_pre142X.toModify( + # Add Unified Tagger for Run2 and Run3 pre-142X + (run2_nanoAOD_106Xv2 | run3_nanoAOD_pre142X).toModify( nanoAOD_tau_switch, addPNet = True, addUParTInfo = True ) @@ -273,8 +268,8 @@ def nanoAOD_customizeCommon(process): # Add Unified Tagger For PUPPI Jets (UParT 2024) nanoAOD_addUTagToTaus(process, - addUTagInfo = nanoAOD_tau_switch.addUParTInfo.value(), - usePUPPIjets = True + addUTagInfo = nanoAOD_tau_switch.addUParTInfo.value(), + usePUPPIjets = True ) nanoAOD_boostedTau_switch = cms.PSet( From 4873a9f6eea708615cc8de4cbe4e0d5ceeed9cd4 Mon Sep 17 00:00:00 2001 From: Huilin Qu Date: Tue, 20 May 2025 19:58:57 +0200 Subject: [PATCH 3/5] Make rePuppi configurable. --- .../python/nanoAOD_rePuppi_cff.py | 3 + PhysicsTools/NanoAOD/python/custom_jme_cff.py | 4 - .../NanoAOD/python/jetsAK4_CHS_cff.py | 10 +- .../NanoAOD/python/jetsAK4_Puppi_cff.py | 11 +- PhysicsTools/NanoAOD/python/jetsAK8_cff.py | 16 +- PhysicsTools/NanoAOD/python/nano_cff.py | 279 +++++++++--------- PhysicsTools/NanoAOD/python/nano_eras_cff.py | 2 + 7 files changed, 176 insertions(+), 149 deletions(-) create mode 100644 Configuration/ProcessModifiers/python/nanoAOD_rePuppi_cff.py diff --git a/Configuration/ProcessModifiers/python/nanoAOD_rePuppi_cff.py b/Configuration/ProcessModifiers/python/nanoAOD_rePuppi_cff.py new file mode 100644 index 0000000000000..8b16565338cab --- /dev/null +++ b/Configuration/ProcessModifiers/python/nanoAOD_rePuppi_cff.py @@ -0,0 +1,3 @@ +import FWCore.ParameterSet.Config as cms + +nanoAOD_rePuppi = cms.Modifier() diff --git a/PhysicsTools/NanoAOD/python/custom_jme_cff.py b/PhysicsTools/NanoAOD/python/custom_jme_cff.py index 7a36f1b6aec1d..f82db20a08589 100644 --- a/PhysicsTools/NanoAOD/python/custom_jme_cff.py +++ b/PhysicsTools/NanoAOD/python/custom_jme_cff.py @@ -1392,10 +1392,6 @@ def RecomputePuppiWeightsMETAK8(proc): ) ) - run3_nanoAOD_pre142X.toModify(btagDiscriminatorsAK8Subjets, - names = cms.vstring('pfDeepCSVJetTags:probb','pfDeepCSVJetTags:probbb') - ) - from PhysicsTools.PatAlgos.tools.puppiJetMETReclusteringFromMiniAOD_cff import setupPuppiAK4AK8METReclustering proc = setupPuppiAK4AK8METReclustering(proc, runOnMC=runOnMC, useExistingWeights=False, reclusterAK4MET=False, # Already setup to recluster AK4 Puppi jets and PuppiMET diff --git a/PhysicsTools/NanoAOD/python/jetsAK4_CHS_cff.py b/PhysicsTools/NanoAOD/python/jetsAK4_CHS_cff.py index 7808d99e8098d..9b79000f18d68 100644 --- a/PhysicsTools/NanoAOD/python/jetsAK4_CHS_cff.py +++ b/PhysicsTools/NanoAOD/python/jetsAK4_CHS_cff.py @@ -366,14 +366,18 @@ def nanoAOD_addDeepInfoAK4CHS(process,addDeepBTag,addDeepFlavour,addParticleNet, print("Will recalculate the following discriminators: "+", ".join(_btagDiscriminators)) updateJetCollection( process, - jetSource = cms.InputTag('slimmedJets'), + jetSource = cms.InputTag('slimmedJets', processName=cms.InputTag.skipCurrentProcess()), jetCorrections = ('AK4PFchs', cms.vstring(['L1FastJet', 'L2Relative', 'L3Absolute','L2L3Residual']), 'None'), btagDiscriminators = _btagDiscriminators, postfix = 'WithDeepInfo', ) process.load("Configuration.StandardSequences.MagneticField_cff") - process.jetCorrFactorsNano.src="selectedUpdatedPatJetsWithDeepInfo" - process.updatedJets.jetSource="selectedUpdatedPatJetsWithDeepInfo" + + from PhysicsTools.PatAlgos.tools.helpers import getPatAlgosToolsTask, addToProcessAndTask + task = getPatAlgosToolsTask(process) + addToProcessAndTask("slimmedJets", process.selectedUpdatedPatJetsWithDeepInfo.clone(), process, task) + del process.selectedUpdatedPatJetsWithDeepInfo + return process nanoAOD_addDeepInfoAK4CHS_switch = cms.PSet( diff --git a/PhysicsTools/NanoAOD/python/jetsAK4_Puppi_cff.py b/PhysicsTools/NanoAOD/python/jetsAK4_Puppi_cff.py index f9de92ef220f0..6230816ed62e3 100644 --- a/PhysicsTools/NanoAOD/python/jetsAK4_Puppi_cff.py +++ b/PhysicsTools/NanoAOD/python/jetsAK4_Puppi_cff.py @@ -26,7 +26,6 @@ jetCorrFactorsSource=cms.VInputTag(cms.InputTag("jetPuppiCorrFactorsNano") ), ) - #HF shower shape recomputation from RecoJets.JetProducers.hfJetShowerShape_cfi import hfJetShowerShape hfJetPuppiShowerShapeforNanoAOD = hfJetShowerShape.clone(jets="updatedJetsPuppi",vertices="offlineSlimmedPrimaryVertices") @@ -147,14 +146,18 @@ def nanoAOD_addDeepInfoAK4(process,addParticleNet,addRobustParTAK4=False,addUnif print("Will recalculate the following discriminators: "+", ".join(_btagDiscriminators)) updateJetCollection( process, - jetSource = cms.InputTag('slimmedJetsPuppi'), + jetSource = cms.InputTag('slimmedJetsPuppi', processName=cms.InputTag.skipCurrentProcess()), jetCorrections = ('AK4PFPuppi', cms.vstring(['L2Relative', 'L3Absolute']), 'None'), btagDiscriminators = _btagDiscriminators, postfix = 'PuppiWithDeepInfo', ) process.load("Configuration.StandardSequences.MagneticField_cff") - process.jetPuppiCorrFactorsNano.src = "selectedUpdatedPatJetsPuppiWithDeepInfo" - process.updatedJetsPuppi.jetSource = "selectedUpdatedPatJetsPuppiWithDeepInfo" + + from PhysicsTools.PatAlgos.tools.helpers import getPatAlgosToolsTask, addToProcessAndTask + task = getPatAlgosToolsTask(process) + addToProcessAndTask("slimmedJetsPuppi", process.selectedUpdatedPatJetsPuppiWithDeepInfo.clone(), process, task) + del process.selectedUpdatedPatJetsPuppiWithDeepInfo + return process nanoAOD_addDeepInfoAK4_switch = cms.PSet( diff --git a/PhysicsTools/NanoAOD/python/jetsAK8_cff.py b/PhysicsTools/NanoAOD/python/jetsAK8_cff.py index 3cef6f2e21dee..b57b806b8aa6e 100644 --- a/PhysicsTools/NanoAOD/python/jetsAK8_cff.py +++ b/PhysicsTools/NanoAOD/python/jetsAK8_cff.py @@ -132,7 +132,7 @@ ## - To be used in nanoAOD_customizeCommon() in nano_cff.py ############################################################### from PhysicsTools.PatAlgos.tools.jetTools import updateJetCollection -def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubleX, addDeepDoubleXV2, addParticleNetMassLegacy, addParticleNet, addGlobalParT, jecPayload): +def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubleX, addDeepDoubleXV2, addParticleNetMassLegacy, addParticleNetLegacy, addParticleNet, addGlobalParT, jecPayload): _btagDiscriminators=[] if addDeepBTag: print("Updating process to run DeepCSV btag to AK8 jets") @@ -149,6 +149,9 @@ def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubl print("Updating process to run ParticleNet joint classification and mass regression") from RecoBTag.ONNXRuntime.pfParticleNetFromMiniAODAK8_cff import _pfParticleNetFromMiniAODAK8JetTagsAll as pfParticleNetFromMiniAODAK8JetTagsAll _btagDiscriminators += pfParticleNetFromMiniAODAK8JetTagsAll + if addParticleNetLegacy: + from RecoBTag.ONNXRuntime.pfParticleNet_cff import _pfParticleNetJetTagsAll + _btagDiscriminators += _pfParticleNetJetTagsAll if addParticleNetMassLegacy: from RecoBTag.ONNXRuntime.pfParticleNet_cff import _pfParticleNetMassRegressionOutputs _btagDiscriminators += _pfParticleNetMassRegressionOutputs @@ -169,7 +172,7 @@ def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubl print("Will recalculate the following discriminators on AK8 jets: "+", ".join(_btagDiscriminators)) updateJetCollection( process, - jetSource = cms.InputTag('slimmedJetsAK8'), + jetSource=cms.InputTag('slimmedJetsAK8', processName=cms.InputTag.skipCurrentProcess()), pvSource = cms.InputTag('offlineSlimmedPrimaryVertices'), svSource = cms.InputTag('slimmedSecondaryVertices'), rParam = 0.8, @@ -178,8 +181,12 @@ def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubl postfix='AK8WithDeepInfo', printWarning = False ) - process.jetCorrFactorsAK8.src="selectedUpdatedPatJetsAK8WithDeepInfo" - process.updatedJetsAK8.jetSource="selectedUpdatedPatJetsAK8WithDeepInfo" + + from PhysicsTools.PatAlgos.tools.helpers import getPatAlgosToolsTask, addToProcessAndTask + task = getPatAlgosToolsTask(process) + addToProcessAndTask("slimmedJetsAK8", process.selectedUpdatedPatJetsAK8WithDeepInfo.clone(), process, task) + del process.selectedUpdatedPatJetsAK8WithDeepInfo + return process nanoAOD_addDeepInfoAK8_switch = cms.PSet( @@ -188,6 +195,7 @@ def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubl nanoAOD_addDeepDoubleX_switch = cms.untracked.bool(False), nanoAOD_addDeepDoubleXV2_switch = cms.untracked.bool(False), nanoAOD_addParticleNetMassLegacy_switch = cms.untracked.bool(False), + nanoAOD_addParticleNetLegacy_switch = cms.untracked.bool(False), nanoAOD_addParticleNet_switch = cms.untracked.bool(False), nanoAOD_addGlobalParT_switch = cms.untracked.bool(False), jecPayload = cms.untracked.string('AK8PFPuppi') diff --git a/PhysicsTools/NanoAOD/python/nano_cff.py b/PhysicsTools/NanoAOD/python/nano_cff.py index 6a4e9bc21f3c3..e8ae50b8b9e4b 100644 --- a/PhysicsTools/NanoAOD/python/nano_cff.py +++ b/PhysicsTools/NanoAOD/python/nano_cff.py @@ -88,203 +88,214 @@ nanoSequenceMC.insert(nanoSequenceFS.index(nanoSequenceCommon)+1,nanoSequenceOnlyFullSim) -def RecomputePuppiWeightsALL(proc): - """ - Recompute Puppi weights and PuppiMET and rebuild slimmedJetsPuppi and slimmedJetsAK8. - """ - runOnMC = True - if hasattr(proc, "NANOEDMAODoutput") or hasattr(proc, "NANOAODoutput"): - runOnMC = False - - from PhysicsTools.PatAlgos.tools.puppiJetMETReclusteringFromMiniAOD_cff import puppiJetMETReclusterFromMiniAOD - proc = puppiJetMETReclusterFromMiniAOD(proc, runOnMC=runOnMC, useExistingWeights=False, - reclusterAK4MET=True, - reclusterAK8=True, - ) - - return proc - - # modifier which adds new tauIDs import RecoTauTag.RecoTau.tools.runTauIdMVA as tauIdConfig -def nanoAOD_addTauIds(process, idsToRun=[]): - if idsToRun: #no-empty list of tauIDs to run - updatedTauName = "slimmedTausUpdated" - tauIdEmbedder = tauIdConfig.TauIDEmbedder(process, debug = False, - updatedTauName = updatedTauName, - postfix = "ForNano", - toKeep = idsToRun) +def nanoAOD_addTauIds(process, idsToRun=[], addPNetCHS=False, addUParTPuppi=False): + originalTauName = 'slimmedTaus::@skipCurrentProcess' + updatedTauName = None + + if idsToRun: # no-empty list of tauIDs to run + updatedTauName = 'slimmedTausUpdated' + tauIdEmbedder = tauIdConfig.TauIDEmbedder(process, debug=False, + originalTauName=originalTauName, + updatedTauName=updatedTauName, + postfix="ForNano", + toKeep=idsToRun) tauIdEmbedder.runTauID() - process.finalTaus.src = updatedTauName - #remember to adjust the selection and tables with added IDs + process.tauTask.add(process.rerunMvaIsolationTaskForNano, getattr(process, updatedTauName)) + originalTauName = updatedTauName + + from PhysicsTools.PatAlgos.patTauHybridProducer_cfi import patTauHybridProducer + if addPNetCHS: + jetCollection = "updatedJets" + TagName = "pfParticleNetFromMiniAODAK4CHSCentralJetTags" + tag_prefix = "byUTagCHS" + updatedTauName = originalTauName.split(':')[0] + 'WithPNetCHS' + # PNet tagger used for CHS jets + from RecoBTag.ONNXRuntime.pfParticleNetFromMiniAODAK4_cff import pfParticleNetFromMiniAODAK4CHSCentralJetTags + Discriminators = [TagName + ":" + tag for tag in pfParticleNetFromMiniAODAK4CHSCentralJetTags.flav_names.value()] - process.tauTask.add( process.rerunMvaIsolationTaskForNano, getattr(process, updatedTauName) ) + # Define "hybridTau" producer + setattr(process, updatedTauName, patTauHybridProducer.clone( + src=originalTauName, + jetSource=jetCollection, + dRMax=0.4, + jetPtMin=15, + jetEtaMax=2.5, + UTagLabel=TagName, + UTagScoreNames=Discriminators, + tagPrefix=tag_prefix, + tauScoreMin=-1, + vsJetMin=0.05, + checkTauScoreIsBest=False, + chargeAssignmentProbMin=0.2, + addGenJetMatch=False, + genJetMatch="" + )) + process.tauTask.add(process.jetTask, getattr(process, updatedTauName)) + originalTauName = updatedTauName - return process + if addUParTPuppi: + jetCollection = "updatedJetsPuppi" + TagName = "pfUnifiedParticleTransformerAK4JetTags" + tag_prefix = "byUTagPUPPI" + updatedTauName = originalTauName.split(':')[0] + 'WithUParTPuppi' + # Unified ParT Tagger used for PUPPI jets + from RecoBTag.ONNXRuntime.pfUnifiedParticleTransformerAK4JetTags_cfi import pfUnifiedParticleTransformerAK4JetTags + Discriminators = [TagName + ":" + tag for tag in pfUnifiedParticleTransformerAK4JetTags.flav_names.value()] -def nanoAOD_addBoostedTauIds(process, idsToRun=[]): - if idsToRun: #no-empty list of tauIDs to run - updatedBoostedTauName = "slimmedTausBoostedNewID" - boostedTauIdEmbedder = tauIdConfig.TauIDEmbedder(process, debug = False, - originalTauName = "slimmedTausBoosted", - updatedTauName = updatedBoostedTauName, - postfix = "BoostedForNano", - toKeep = idsToRun) - boostedTauIdEmbedder.runTauID() - process.finalBoostedTaus.src = updatedBoostedTauName - #remember to adjust the selection and tables with added IDs + # Define "hybridTau" producer + setattr(process, updatedTauName, patTauHybridProducer.clone( + src=originalTauName, + jetSource=jetCollection, + dRMax=0.4, + jetPtMin=15, + jetEtaMax=2.5, + UTagLabel=TagName, + UTagScoreNames=Discriminators, + tagPrefix=tag_prefix, + tauScoreMin=-1, + vsJetMin=0.05, + checkTauScoreIsBest=False, + chargeAssignmentProbMin=0.2, + addGenJetMatch=False, + genJetMatch="" + )) + process.tauTask.add(getattr(process, updatedTauName)) + originalTauName = updatedTauName - process.boostedTauTask.add( process.rerunMvaIsolationTaskBoostedForNano, getattr(process, updatedBoostedTauName)) + if updatedTauName is not None: + process.slimmedTaus = getattr(process, updatedTauName).clone() + process.tauTask.replace(getattr(process, updatedTauName), process.slimmedTaus) + delattr(process, updatedTauName) - return process + # fix circular module dependency in : + for mod in process.producers.keys(): + if 'ParticleNetFromMiniAOD' in mod and 'TagInfos' in mod: + getattr(process, mod).taus = 'slimmedTaus::@skipCurrentProcess' -def nanoAOD_addUTagToTaus(process, addUTagInfo=False, usePUPPIjets=False): - - if addUTagInfo: - originalTauName = process.finalTaus.src.value() - - if usePUPPIjets: # option to use PUPPI jets - jetCollection = "updatedJetsPuppi" - TagName = "pfUnifiedParticleTransformerAK4JetTags" - tag_prefix = "byUTagPUPPI" - updatedTauName = originalTauName+'WithUTagPUPPI' - # Unified ParT Tagger used for PUPPI jets - from RecoBTag.ONNXRuntime.pfUnifiedParticleTransformerAK4JetTags_cfi import pfUnifiedParticleTransformerAK4JetTags - Discriminators = [TagName+":"+tag for tag in pfUnifiedParticleTransformerAK4JetTags.flav_names.value()] - else: # use CHS jets by default - jetCollection = "updatedJets" - TagName = "pfParticleNetFromMiniAODAK4CHSCentralJetTags" - tag_prefix = "byUTagCHS" - updatedTauName = originalTauName+'WithUTagCHS' - # PNet tagger used for CHS jets - from RecoBTag.ONNXRuntime.pfParticleNetFromMiniAODAK4_cff import pfParticleNetFromMiniAODAK4CHSCentralJetTags - Discriminators = [TagName+":"+tag for tag in pfParticleNetFromMiniAODAK4CHSCentralJetTags.flav_names.value()] + return process - # Define "hybridTau" producer - from PhysicsTools.PatAlgos.patTauHybridProducer_cfi import patTauHybridProducer - setattr(process, updatedTauName, patTauHybridProducer.clone( - src = originalTauName, - jetSource = jetCollection, - dRMax = 0.4, - jetPtMin = 15, - jetEtaMax = 2.5, - UTagLabel = TagName, - UTagScoreNames = Discriminators, - tagPrefix = tag_prefix, - tauScoreMin = -1, - vsJetMin = 0.05, - checkTauScoreIsBest = False, - chargeAssignmentProbMin = 0.2, - addGenJetMatch = False, - genJetMatch = "" - )) - process.finalTaus.src = updatedTauName - #remember to adjust the selection and tables with added IDs +def nanoAOD_addBoostedTauIds(process, idsToRun=[]): + if idsToRun: # no-empty list of tauIDs to run + boostedTauIdEmbedder = tauIdConfig.TauIDEmbedder(process, debug=False, + originalTauName="slimmedTausBoosted::@skipCurrentProcess", + updatedTauName="slimmedTausBoostedNewID", + postfix="BoostedForNano", + toKeep=idsToRun) + boostedTauIdEmbedder.runTauID() - process.tauTask.add(process.jetTask, getattr(process, updatedTauName)) + process.slimmedTausBoosted = process.slimmedTausBoostedNewID.clone() + del process.slimmedTausBoostedNewID + process.boostedTauTask.add(process.rerunMvaIsolationTaskBoostedForNano, process.slimmedTausBoosted) return process + from PhysicsTools.SelectorUtils.tools.vid_id_tools import * def nanoAOD_activateVID(process): - switchOnVIDElectronIdProducer(process,DataFormat.MiniAOD,electronTask) + switchOnVIDElectronIdProducer(process, DataFormat.MiniAOD, electronTask) for modname in electron_id_modules_WorkingPoints_nanoAOD.modules: - setupAllVIDIdsInModule(process,modname,setupVIDElectronSelection) + setupAllVIDIdsInModule(process, modname, setupVIDElectronSelection) - process.electronTask.add( process.egmGsfElectronIDTask ) + process.electronTask.add(process.egmGsfElectronIDTask) - switchOnVIDPhotonIdProducer(process,DataFormat.MiniAOD,photonTask) # do not call this to avoid resetting photon IDs in VID, if called before inside makePuppiesFromMiniAOD + # do not call this to avoid resetting photon IDs in VID, if called before inside makePuppiesFromMiniAOD + switchOnVIDPhotonIdProducer(process, DataFormat.MiniAOD, photonTask) for modname in photon_id_modules_WorkingPoints_nanoAOD.modules: - setupAllVIDIdsInModule(process,modname,setupVIDPhotonSelection) + setupAllVIDIdsInModule(process, modname, setupVIDPhotonSelection) - process.photonTask.add( process.egmPhotonIDTask ) + process.photonTask.add(process.egmPhotonIDTask) return process + def nanoAOD_customizeCommon(process): process = nanoAOD_activateVID(process) - # recompute Puppi weights and remake AK4, AK8 Puppi jets and PuppiMET - (run2_nanoAOD_106Xv2 | run3_nanoAOD_pre142X).toModify( - process, lambda p: RecomputePuppiWeightsALL(p) + nanoAOD_rePuppi_switch = cms.PSet( + useExistingWeights=cms.bool(False), + reclusterAK4MET=cms.bool(False), + reclusterAK8=cms.bool(False), + ) + + # recompute Puppi weights, and remake AK4, AK8 Puppi jets and PuppiMET + (run2_nanoAOD_106Xv2 | run3_nanoAOD_pre142X | nanoAOD_rePuppi).toModify( + nanoAOD_rePuppi_switch, useExistingWeights=False, reclusterAK4MET=True, reclusterAK8=True ) + runOnMC = True + if hasattr(process, "NANOEDMAODoutput") or hasattr(process, "NANOAODoutput"): + runOnMC = False + from PhysicsTools.PatAlgos.tools.puppiJetMETReclusteringFromMiniAOD_cff import puppiJetMETReclusterFromMiniAOD + puppiJetMETReclusterFromMiniAOD(process, + runOnMC=runOnMC, + useExistingWeights=nanoAOD_rePuppi_switch.useExistingWeights.value(), + reclusterAK4MET=nanoAOD_rePuppi_switch.reclusterAK4MET.value(), + reclusterAK8=nanoAOD_rePuppi_switch.reclusterAK8.value(), + ) + # This function is defined in jetsAK4_Puppi_cff.py process = nanoAOD_addDeepInfoAK4(process, - addParticleNet=nanoAOD_addDeepInfoAK4_switch.nanoAOD_addParticleNet_switch, - addRobustParTAK4=nanoAOD_addDeepInfoAK4_switch.nanoAOD_addRobustParTAK4Tag_switch, - addUnifiedParTAK4=nanoAOD_addDeepInfoAK4_switch.nanoAOD_addUnifiedParTAK4Tag_switch - ) + addParticleNet=nanoAOD_addDeepInfoAK4_switch.nanoAOD_addParticleNet_switch, + addRobustParTAK4=nanoAOD_addDeepInfoAK4_switch.nanoAOD_addRobustParTAK4Tag_switch, + addUnifiedParTAK4=nanoAOD_addDeepInfoAK4_switch.nanoAOD_addUnifiedParTAK4Tag_switch + ) - # Add PNet for Tau + # Needs to run PNet on CHS jets to update the tau collections run2_nanoAOD_106Xv2.toModify( nanoAOD_addDeepInfoAK4CHS_switch, nanoAOD_addParticleNet_switch=True, ) # This function is defined in jetsAK4_CHS_cff.py - process = nanoAOD_addDeepInfoAK4CHS(process, - addDeepBTag=nanoAOD_addDeepInfoAK4CHS_switch.nanoAOD_addDeepBTag_switch, + process = nanoAOD_addDeepInfoAK4CHS( + process, addDeepBTag=nanoAOD_addDeepInfoAK4CHS_switch.nanoAOD_addDeepBTag_switch, addDeepFlavour=nanoAOD_addDeepInfoAK4CHS_switch.nanoAOD_addDeepFlavourTag_switch, addParticleNet=nanoAOD_addDeepInfoAK4CHS_switch.nanoAOD_addParticleNet_switch, addRobustParTAK4=nanoAOD_addDeepInfoAK4CHS_switch.nanoAOD_addRobustParTAK4Tag_switch, - addUnifiedParTAK4=nanoAOD_addDeepInfoAK4CHS_switch.nanoAOD_addUnifiedParTAK4Tag_switch - ) + addUnifiedParTAK4=nanoAOD_addDeepInfoAK4CHS_switch.nanoAOD_addUnifiedParTAK4Tag_switch) # This function is defined in jetsAK8_cff.py - process = nanoAOD_addDeepInfoAK8(process, - addDeepBTag=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepBTag_switch, + process = nanoAOD_addDeepInfoAK8( + process, addDeepBTag=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepBTag_switch, addDeepBoostedJet=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepBoostedJet_switch, addDeepDoubleX=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepDoubleX_switch, addDeepDoubleXV2=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepDoubleXV2_switch, addParticleNetMassLegacy=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addParticleNetMassLegacy_switch, + addParticleNetLegacy=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addParticleNetLegacy_switch, addParticleNet=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addParticleNet_switch, addGlobalParT=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addGlobalParT_switch, - jecPayload=nanoAOD_addDeepInfoAK8_switch.jecPayload - ) + jecPayload=nanoAOD_addDeepInfoAK8_switch.jecPayload) nanoAOD_tau_switch = cms.PSet( - idsToAdd = cms.vstring(), - addUParTInfo = cms.bool(False), - addPNet = cms.bool(False) + idsToAdd=cms.vstring(), + addPNetCHS=cms.bool(False), + addUParTPuppi=cms.bool(False) ) (run2_nanoAOD_106Xv2).toModify( - nanoAOD_tau_switch, idsToAdd = ["deepTau2018v2p5"] - ).toModify( - process, lambda p : nanoAOD_addTauIds(p, nanoAOD_tau_switch.idsToAdd.value()) + nanoAOD_tau_switch, idsToAdd=["deepTau2018v2p5"] ) - - # Add Unified Tagger for Run2 and Run3 pre-142X (run2_nanoAOD_106Xv2 | run3_nanoAOD_pre142X).toModify( - nanoAOD_tau_switch, addPNet = True, addUParTInfo = True - ) - - # Add Unified Tagger For CHS Jets (PNet 2023) - nanoAOD_addUTagToTaus(process, - addUTagInfo = nanoAOD_tau_switch.addPNet.value(), - usePUPPIjets = False - ) - - # Add Unified Tagger For PUPPI Jets (UParT 2024) - nanoAOD_addUTagToTaus(process, - addUTagInfo = nanoAOD_tau_switch.addUParTInfo.value(), - usePUPPIjets = True + nanoAOD_tau_switch, addPNetCHS=True, addUParTPuppi=True, ) + nanoAOD_addTauIds(process, + idsToRun=nanoAOD_tau_switch.idsToAdd.value(), + addPNetCHS=nanoAOD_tau_switch.addPNetCHS.value(), + addUParTPuppi=nanoAOD_tau_switch.addUParTPuppi.value(), + ) nanoAOD_boostedTau_switch = cms.PSet( - idsToAdd = cms.vstring() + idsToAdd=cms.vstring() ) run2_nanoAOD_106Xv2.toModify( - nanoAOD_boostedTau_switch, idsToAdd = ["mvaIso", "mvaIsoNewDM", "mvaIsoDR0p3", "againstEle", "boostedDeepTauRunIIv2p0"] - ).toModify( - process, lambda p : nanoAOD_addBoostedTauIds(p, nanoAOD_boostedTau_switch.idsToAdd.value()) - ) + nanoAOD_boostedTau_switch, + idsToAdd=["mvaIso", "mvaIsoNewDM", "mvaIsoDR0p3", "againstEle", "boostedDeepTauRunIIv2p0"]) run3_nanoAOD_pre142X.toModify( - nanoAOD_boostedTau_switch, idsToAdd = ["boostedDeepTauRunIIv2p0"] - ).toModify( - process, lambda p : nanoAOD_addBoostedTauIds(p, nanoAOD_boostedTau_switch.idsToAdd.value()) + nanoAOD_boostedTau_switch, idsToAdd=["boostedDeepTauRunIIv2p0"] ) + nanoAOD_addBoostedTauIds(process, nanoAOD_boostedTau_switch.idsToAdd.value()) # Add lepton time-life info from PhysicsTools.NanoAOD.leptonTimeLifeInfo_common_cff import addTimeLifeInfoBase diff --git a/PhysicsTools/NanoAOD/python/nano_eras_cff.py b/PhysicsTools/NanoAOD/python/nano_eras_cff.py index 4f10bad245bfd..c0bc384a79f25 100644 --- a/PhysicsTools/NanoAOD/python/nano_eras_cff.py +++ b/PhysicsTools/NanoAOD/python/nano_eras_cff.py @@ -22,6 +22,8 @@ from Configuration.Eras.Modifier_run3_nanoAOD_2025_cff import run3_nanoAOD_2025 # for 2025 data-taking (and possibly also 2026) from Configuration.Eras.Modifier_run3_nanoAOD_devel_cff import run3_nanoAOD_devel # for development beyond v15 +from Configuration.ProcessModifiers.nanoAOD_rePuppi_cff import nanoAOD_rePuppi + run2_nanoAOD_ANY = ( run2_nanoAOD_106Xv2 ) From 6be423cda4e11fee554ce1c730d188da2ea5ed78 Mon Sep 17 00:00:00 2001 From: Huilin Qu Date: Wed, 21 May 2025 14:37:35 +0200 Subject: [PATCH 4/5] Fix discrepancies in e/mu objects. --- PhysicsTools/NanoAOD/python/electrons_cff.py | 2 +- .../NanoAOD/python/jetsAK4_CHS_cff.py | 1 + PhysicsTools/NanoAOD/python/muons_cff.py | 8 +++- PhysicsTools/NanoAOD/python/nano_cff.py | 7 +++- PhysicsTools/NanoAOD/python/nano_eras_cff.py | 5 +++ PhysicsTools/PatAlgos/plugins/BuildFile.xml | 1 + .../PatAlgos/plugins/LeptonUpdater.cc | 39 ++++++++++++++++--- 7 files changed, 55 insertions(+), 8 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/electrons_cff.py b/PhysicsTools/NanoAOD/python/electrons_cff.py index b2ff9fda3eac9..1b37ca8b07809 100644 --- a/PhysicsTools/NanoAOD/python/electrons_cff.py +++ b/PhysicsTools/NanoAOD/python/electrons_cff.py @@ -540,5 +540,5 @@ def _get_bitmapVIDForEle_docstring(modules,WorkingPoints): run2_egamma.toReplaceWith(electronTask, _electronTask_Run2) # Revert back to AK4 CHS jets for Run2 inputs -run2_nanoAOD_ANY.toModify( +run2_egamma.toModify( ptRatioRelForEle,srcJet="updatedJets") diff --git a/PhysicsTools/NanoAOD/python/jetsAK4_CHS_cff.py b/PhysicsTools/NanoAOD/python/jetsAK4_CHS_cff.py index 9b79000f18d68..09ab1b8b427d0 100644 --- a/PhysicsTools/NanoAOD/python/jetsAK4_CHS_cff.py +++ b/PhysicsTools/NanoAOD/python/jetsAK4_CHS_cff.py @@ -498,6 +498,7 @@ def nanoAOD_refineFastSim_bTagDeepFlav(process): jetUserDataTask = cms.Task(bJetVars,qgtagger,jercVars,pileupJetIdNano) #before cross linking +chsJetUpdateTask = cms.Task(jetCorrFactorsNano,updatedJets) jetTask = cms.Task(jetCorrFactorsNano,updatedJets,jetUserDataTask,updatedJetsWithUserData,finalJets) #after cross linkining diff --git a/PhysicsTools/NanoAOD/python/muons_cff.py b/PhysicsTools/NanoAOD/python/muons_cff.py index 6d9a240e7ff1f..43933bd671964 100644 --- a/PhysicsTools/NanoAOD/python/muons_cff.py +++ b/PhysicsTools/NanoAOD/python/muons_cff.py @@ -15,6 +15,12 @@ pfCandsForMiniIso = cms.InputTag("packedPFCandidates"), miniIsoParams = PhysicsTools.PatAlgos.producersLayer1.muonProducer_cfi.patMuons.miniIsoParams, # so they're in sync recomputeMuonBasicSelectors = cms.bool(False), + recomputeSoftMuonMvaRun3 = cms.bool(False), + softMvaRun3Model = PhysicsTools.PatAlgos.producersLayer1.muonProducer_cfi.patMuons.softMvaRun3Model, +) + +(run2_nanoAOD_106Xv2 | run3_nanoAOD_pre142X).toModify( + slimmedMuonsUpdated, recomputeMuonBasicSelectors=True, recomputeSoftMuonMvaRun3=True, ) isoForMu = cms.EDProducer("MuonIsoValueMapProducer", @@ -305,7 +311,7 @@ # Revert back to AK4 CHS jets for Run 2 -run2_nanoAOD_ANY.toModify( +run2_muon.toModify( ptRatioRelForMu,srcJet="updatedJets" ) diff --git a/PhysicsTools/NanoAOD/python/nano_cff.py b/PhysicsTools/NanoAOD/python/nano_cff.py index e8ae50b8b9e4b..783489f8d0e02 100644 --- a/PhysicsTools/NanoAOD/python/nano_cff.py +++ b/PhysicsTools/NanoAOD/python/nano_cff.py @@ -67,6 +67,11 @@ isoTrackTablesTask,softActivityTablesTask ) +(run2_muon | run2_egamma).toReplaceWith( + nanoTableTaskCommon, + nanoTableTaskCommon.copyAndAdd(chsJetUpdateTask) +) + nanoSequenceCommon = cms.Sequence(nanoTableTaskCommon) nanoSequenceOnlyFullSim = cms.Sequence(triggerObjectTablesTask) @@ -132,7 +137,7 @@ def nanoAOD_addTauIds(process, idsToRun=[], addPNetCHS=False, addUParTPuppi=Fals addGenJetMatch=False, genJetMatch="" )) - process.tauTask.add(process.jetTask, getattr(process, updatedTauName)) + process.tauTask.add(process.chsJetUpdateTask, getattr(process, updatedTauName)) originalTauName = updatedTauName if addUParTPuppi: diff --git a/PhysicsTools/NanoAOD/python/nano_eras_cff.py b/PhysicsTools/NanoAOD/python/nano_eras_cff.py index c0bc384a79f25..11419dd23bf68 100644 --- a/PhysicsTools/NanoAOD/python/nano_eras_cff.py +++ b/PhysicsTools/NanoAOD/python/nano_eras_cff.py @@ -24,8 +24,13 @@ from Configuration.ProcessModifiers.nanoAOD_rePuppi_cff import nanoAOD_rePuppi +# [General Note] +# use `runX_nanoAOD_YYY` only for input-dataset-specific changes +# (e.g., run2_nanoAOD_106Xv2 for 106X MiniAODv2, run3_nanoAOD_pre142X for pre-142X Run3 MiniAODs) run2_nanoAOD_ANY = ( run2_nanoAOD_106Xv2 ) +# use other modifiers for intrinsic era-dependent changes run2_egamma = (run2_egamma_2016 | run2_egamma_2017 | run2_egamma_2018) +run2_muon = (run2_muon_2016 | run2_muon_2017 | run2_muon_2018) diff --git a/PhysicsTools/PatAlgos/plugins/BuildFile.xml b/PhysicsTools/PatAlgos/plugins/BuildFile.xml index 1eb494d19fbd3..f6b957843fe26 100644 --- a/PhysicsTools/PatAlgos/plugins/BuildFile.xml +++ b/PhysicsTools/PatAlgos/plugins/BuildFile.xml @@ -18,6 +18,7 @@ + diff --git a/PhysicsTools/PatAlgos/plugins/LeptonUpdater.cc b/PhysicsTools/PatAlgos/plugins/LeptonUpdater.cc index b50c8a098e40a..cf262c018a86e 100644 --- a/PhysicsTools/PatAlgos/plugins/LeptonUpdater.cc +++ b/PhysicsTools/PatAlgos/plugins/LeptonUpdater.cc @@ -1,4 +1,4 @@ -#include "FWCore/Framework/interface/global/EDProducer.h" +#include "FWCore/Framework/interface/stream/EDProducer.h" #include "FWCore/Framework/interface/Event.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" @@ -6,6 +6,8 @@ #include "FWCore/Utilities/interface/InputTag.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "PhysicsTools/PatUtils/interface/MiniIsolation.h" +#include "PhysicsTools/PatAlgos/interface/SoftMuonMvaRun3Estimator.h" +#include "PhysicsTools/XGBoost/interface/XGBooster.h" #include "DataFormats/Common/interface/View.h" #include "DataFormats/PatCandidates/interface/Muon.h" @@ -18,7 +20,7 @@ namespace pat { template - class LeptonUpdater : public edm::global::EDProducer<> { + class LeptonUpdater : public edm::stream::EDProducer<> { public: explicit LeptonUpdater(const edm::ParameterSet &iConfig) : src_(consumes>(iConfig.getParameter("src"))), @@ -32,14 +34,23 @@ namespace pat { pcToken_ = consumes(iConfig.getParameter("pfCandsForMiniIso")); } recomputeMuonBasicSelectors_ = false; - if (typeid(T) == typeid(pat::Muon)) + recomputeSoftMuonMvaRun3_ = false; + if (typeid(T) == typeid(pat::Muon)) { recomputeMuonBasicSelectors_ = iConfig.getParameter("recomputeMuonBasicSelectors"); + recomputeSoftMuonMvaRun3_ = iConfig.getParameter("recomputeSoftMuonMvaRun3"); + if (recomputeSoftMuonMvaRun3_) { + std::string softMvaRun3Model = iConfig.getParameter("softMvaRun3Model"); + softMuonMvaRun3Booster_ = + std::make_unique(edm::FileInPath(softMvaRun3Model + ".model").fullPath(), + edm::FileInPath(softMvaRun3Model + ".features").fullPath()); + } + } produces>(); } ~LeptonUpdater() override {} - void produce(edm::StreamID, edm::Event &, edm::EventSetup const &) const override; + void produce(edm::Event &, const edm::EventSetup &) override; static void fillDescriptions(edm::ConfigurationDescriptions &descriptions) { edm::ParameterSetDescription desc; @@ -53,6 +64,9 @@ namespace pat { if (typeid(T) == typeid(pat::Muon)) { desc.add("recomputeMuonBasicSelectors", false) ->setComment("Recompute basic cut-based muon selector flags"); + desc.add("recomputeSoftMuonMvaRun3", false)->setComment("Recompute Run3 soft muon MVA value"); + desc.add("softMvaRun3Model", "RecoMuon/MuonIdentification/data/Run2022-20231030-1731-Event0") + ->setComment("Run3 soft muon MVA model path"); desc.addOptional>("miniIsoParams") ->setComment("Parameters used for miniIso (as in PATMuonProducer)"); descriptions.add("muonsUpdated", desc); @@ -76,6 +90,8 @@ namespace pat { void recomputeMuonBasicSelectors(T &, const reco::Vertex &, const bool) const; + void recomputeSoftMuonMvaRun3(T &); + private: // configurables edm::EDGetTokenT> src_; @@ -84,8 +100,10 @@ namespace pat { bool computeMiniIso_; bool fixDxySign_; bool recomputeMuonBasicSelectors_; + bool recomputeSoftMuonMvaRun3_; std::vector miniIsoParams_[2]; edm::EDGetTokenT pcToken_; + std::unique_ptr softMuonMvaRun3Booster_; }; // must do the specialization within the namespace otherwise gcc complains @@ -128,10 +146,18 @@ namespace pat { lep.setSelectors(muon::makeSelectorBitset(lep, &pv, do_hip_mitigation_2016)); } + template + void LeptonUpdater::recomputeSoftMuonMvaRun3(T &lep) {} + + template <> + void LeptonUpdater::recomputeSoftMuonMvaRun3(pat::Muon &muon) { + muon.setSoftMvaRun3Value(computeSoftMvaRun3(*softMuonMvaRun3Booster_, muon)); + } + } // namespace pat template -void pat::LeptonUpdater::produce(edm::StreamID, edm::Event &iEvent, edm::EventSetup const &) const { +void pat::LeptonUpdater::produce(edm::Event &iEvent, edm::EventSetup const &) { edm::Handle> src; iEvent.getByToken(src_, src); @@ -179,6 +205,9 @@ void pat::LeptonUpdater::produce(edm::StreamID, edm::Event &iEvent, edm::Even } if (recomputeMuonBasicSelectors_) recomputeMuonBasicSelectors(lep, pv, do_hip_mitigation_2016); + if (recomputeSoftMuonMvaRun3_) { + recomputeSoftMuonMvaRun3(lep); + } //Fixing the sign of impact parameters if (fixDxySign_) { float signPV = 1.; From 349668f05ebc8a01c722f7be7d05ba6d47e0b0fe Mon Sep 17 00:00:00 2001 From: Huilin Qu Date: Thu, 22 May 2025 00:14:02 +0200 Subject: [PATCH 5/5] Fix btvNano. --- PhysicsTools/NanoAOD/python/custom_btv_cff.py | 6 ++++-- PhysicsTools/NanoAOD/python/custom_jme_cff.py | 6 ++++++ PhysicsTools/NanoAOD/python/nano_cff.py | 14 +++++++++----- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/custom_btv_cff.py b/PhysicsTools/NanoAOD/python/custom_btv_cff.py index 6099c5ec73b4f..53d49d57b1178 100644 --- a/PhysicsTools/NanoAOD/python/custom_btv_cff.py +++ b/PhysicsTools/NanoAOD/python/custom_btv_cff.py @@ -65,8 +65,10 @@ def update_jets_AK4(process): process.updatedPatJetsTransientCorrectedPuppiWithDeepInfo.tagInfoSources.append(cms.InputTag("pfUnifiedParticleTransformerAK4TagInfosPuppiWithDeepInfo")) process.updatedPatJetsTransientCorrectedPuppiWithDeepInfo.addTagInfos = cms.bool(True) - - + # Fix ParticleNetFromMiniAOD input when slimmedTaus is updated + from PhysicsTools.NanoAOD.nano_cff import _fixPNetInputCollection + _fixPNetInputCollection(process) + return process def update_jets_AK8(process): diff --git a/PhysicsTools/NanoAOD/python/custom_jme_cff.py b/PhysicsTools/NanoAOD/python/custom_jme_cff.py index f82db20a08589..3120fb08289d3 100644 --- a/PhysicsTools/NanoAOD/python/custom_jme_cff.py +++ b/PhysicsTools/NanoAOD/python/custom_jme_cff.py @@ -1509,6 +1509,12 @@ def addAK4JetTasks(proc, addAK4CHSJetTasks, addAK4PuppiJetTasks): addAK4PuppiJetTasks = jmeNano_addAK4JetTasks_switch.addAK4Puppi_switch, ) + ########################################################################### + # Fix ParticleNetFromMiniAOD input when slimmedTaus is updated + ########################################################################### + from PhysicsTools.NanoAOD.nano_cff import _fixPNetInputCollection + _fixPNetInputCollection(process) + ########################################################################### # Save Maximum of Pt Hat Max ########################################################################### diff --git a/PhysicsTools/NanoAOD/python/nano_cff.py b/PhysicsTools/NanoAOD/python/nano_cff.py index 783489f8d0e02..556f857f897aa 100644 --- a/PhysicsTools/NanoAOD/python/nano_cff.py +++ b/PhysicsTools/NanoAOD/python/nano_cff.py @@ -93,6 +93,14 @@ nanoSequenceMC.insert(nanoSequenceFS.index(nanoSequenceCommon)+1,nanoSequenceOnlyFullSim) +def _fixPNetInputCollection(process): + # fix circular module dependency in ParticleNetFromMiniAOD TagInfos when slimmedTaus is updated + if hasattr(process, 'slimmedTaus'): + for mod in process.producers.keys(): + if 'ParticleNetFromMiniAOD' in mod and 'TagInfos' in mod: + getattr(process, mod).taus = 'slimmedTaus::@skipCurrentProcess' + + # modifier which adds new tauIDs import RecoTauTag.RecoTau.tools.runTauIdMVA as tauIdConfig def nanoAOD_addTauIds(process, idsToRun=[], addPNetCHS=False, addUParTPuppi=False): @@ -173,11 +181,7 @@ def nanoAOD_addTauIds(process, idsToRun=[], addPNetCHS=False, addUParTPuppi=Fals process.slimmedTaus = getattr(process, updatedTauName).clone() process.tauTask.replace(getattr(process, updatedTauName), process.slimmedTaus) delattr(process, updatedTauName) - - # fix circular module dependency in : - for mod in process.producers.keys(): - if 'ParticleNetFromMiniAOD' in mod and 'TagInfos' in mod: - getattr(process, mod).taus = 'slimmedTaus::@skipCurrentProcess' + _fixPNetInputCollection(process) return process