From b57a3e36384bd5bd2a6028cc8297435d3eaace57 Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Fri, 2 Dec 2022 10:39:09 +0100 Subject: [PATCH 1/5] Set jetID version specifically for UL 2016 eras --- PhysicsTools/NanoAOD/python/custom_jme_cff.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/PhysicsTools/NanoAOD/python/custom_jme_cff.py b/PhysicsTools/NanoAOD/python/custom_jme_cff.py index 3272f9f13c43f..969c2dd7a243c 100644 --- a/PhysicsTools/NanoAOD/python/custom_jme_cff.py +++ b/PhysicsTools/NanoAOD/python/custom_jme_cff.py @@ -233,6 +233,12 @@ def AddJetID(proc, jetName="", jetSrc="", jetTableName="", jetTaskName=""): ), ) ) + + run2_jme_2016.toModify( + getattr(proc, tightJetId).filterParams, version = "RUN2UL16{}".format("PUPPI" if isPUPPIJet else "CHS") + ).toModify( + getattr(proc, tightJetIdLepVeto).filterParams, version = "RUN2UL16{}".format("PUPPI" if isPUPPIJet else "CHS") + ) # # Save variables as userInts in each jet @@ -578,6 +584,15 @@ def ReclusterAK4PuppiJets(proc, recoJA, runOnMC): jetName = recoJetInfo.jetUpper patJetFinalColl = recoJetInfo.patJetFinalCollection + # + # Set the jetID for UL 16 era + # + run2_jme_2016.toModify( + proc.tightJetPuppiId.filterParams, version = "RUN2UL16PUPPI" + ).toModify( + proc.tightJetIdLepVeto.filterParams, version = "RUN2UL16PUPPI" + ) + # # Change the input jet source for jetCorrFactorsNano # and updatedJets From 414bc46194dfc73a40cc81b2ac136008fbe4d96e Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Fri, 2 Dec 2022 10:43:57 +0100 Subject: [PATCH 2/5] Increase precision for puId and QGL input variables --- PhysicsTools/NanoAOD/python/custom_jme_cff.py | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/custom_jme_cff.py b/PhysicsTools/NanoAOD/python/custom_jme_cff.py index 969c2dd7a243c..ee35665673498 100644 --- a/PhysicsTools/NanoAOD/python/custom_jme_cff.py +++ b/PhysicsTools/NanoAOD/python/custom_jme_cff.py @@ -144,23 +144,23 @@ nConstPhotons = Var("photonMultiplicity()",int,doc="number of photons in the jet"), ) PUIDVARS = cms.PSet( - puId_dR2Mean = Var("?(pt>=10)?userFloat('puId_dR2Mean'):-1",float,doc="pT^2-weighted average square distance of jet constituents from the jet axis (PileUp ID BDT input variable)", precision=6), - puId_majW = Var("?(pt>=10)?userFloat('puId_majW'):-1",float,doc="major axis of jet ellipsoid in eta-phi plane (PileUp ID BDT input variable)", precision=6), - puId_minW = Var("?(pt>=10)?userFloat('puId_minW'):-1",float,doc="minor axis of jet ellipsoid in eta-phi plane (PileUp ID BDT input variable)", precision=6), - puId_frac01 = Var("?(pt>=10)?userFloat('puId_frac01'):-1",float,doc="fraction of constituents' pT contained within dR <0.1 (PileUp ID BDT input variable)", precision=6), - puId_frac02 = Var("?(pt>=10)?userFloat('puId_frac02'):-1",float,doc="fraction of constituents' pT contained within 0.1< dR <0.2 (PileUp ID BDT input variable)", precision=6), - puId_frac03 = Var("?(pt>=10)?userFloat('puId_frac03'):-1",float,doc="fraction of constituents' pT contained within 0.2< dR <0.3 (PileUp ID BDT input variable)", precision=6), - puId_frac04 = Var("?(pt>=10)?userFloat('puId_frac04'):-1",float,doc="fraction of constituents' pT contained within 0.3< dR <0.4 (PileUp ID BDT input variable)", precision=6), - puId_ptD = Var("?(pt>=10)?userFloat('puId_ptD'):-1",float,doc="pT-weighted average pT of constituents (PileUp ID BDT input variable)", precision=6), - puId_beta = Var("?(pt>=10)?userFloat('puId_beta'):-1",float,doc="fraction of pT of charged constituents associated to PV (PileUp ID BDT input variable)", precision=6), - puId_pull = Var("?(pt>=10)?userFloat('puId_pull'):-1",float,doc="magnitude of pull vector (PileUp ID BDT input variable)", precision=6), - puId_jetR = Var("?(pt>=10)?userFloat('puId_jetR'):-1",float,doc="fraction of jet pT carried by the leading constituent (PileUp ID BDT input variable)", precision=6), - puId_jetRchg = Var("?(pt>=10)?userFloat('puId_jetRchg'):-1",float,doc="fraction of jet pT carried by the leading charged constituent (PileUp ID BDT input variable)", precision=6), + puId_dR2Mean = Var("?(pt>=10)?userFloat('puId_dR2Mean'):-1",float,doc="pT^2-weighted average square distance of jet constituents from the jet axis (PileUp ID BDT input variable)", precision=14), + puId_majW = Var("?(pt>=10)?userFloat('puId_majW'):-1",float,doc="major axis of jet ellipsoid in eta-phi plane (PileUp ID BDT input variable)", precision=14), + puId_minW = Var("?(pt>=10)?userFloat('puId_minW'):-1",float,doc="minor axis of jet ellipsoid in eta-phi plane (PileUp ID BDT input variable)", precision=14), + puId_frac01 = Var("?(pt>=10)?userFloat('puId_frac01'):-1",float,doc="fraction of constituents' pT contained within dR <0.1 (PileUp ID BDT input variable)", precision=14), + puId_frac02 = Var("?(pt>=10)?userFloat('puId_frac02'):-1",float,doc="fraction of constituents' pT contained within 0.1< dR <0.2 (PileUp ID BDT input variable)", precision=14), + puId_frac03 = Var("?(pt>=10)?userFloat('puId_frac03'):-1",float,doc="fraction of constituents' pT contained within 0.2< dR <0.3 (PileUp ID BDT input variable)", precision=14), + puId_frac04 = Var("?(pt>=10)?userFloat('puId_frac04'):-1",float,doc="fraction of constituents' pT contained within 0.3< dR <0.4 (PileUp ID BDT input variable)", precision=14), + puId_ptD = Var("?(pt>=10)?userFloat('puId_ptD'):-1",float,doc="pT-weighted average pT of constituents (PileUp ID BDT input variable)", precision=14), + puId_beta = Var("?(pt>=10)?userFloat('puId_beta'):-1",float,doc="fraction of pT of charged constituents associated to PV (PileUp ID BDT input variable)", precision=14), + puId_pull = Var("?(pt>=10)?userFloat('puId_pull'):-1",float,doc="magnitude of pull vector (PileUp ID BDT input variable)", precision=14), + puId_jetR = Var("?(pt>=10)?userFloat('puId_jetR'):-1",float,doc="fraction of jet pT carried by the leading constituent (PileUp ID BDT input variable)", precision=14), + puId_jetRchg = Var("?(pt>=10)?userFloat('puId_jetRchg'):-1",float,doc="fraction of jet pT carried by the leading charged constituent (PileUp ID BDT input variable)", precision=14), puId_nCharged = Var("?(pt>=10)?userInt('puId_nCharged'):-1",int,doc="number of charged constituents (PileUp ID BDT input variable)"), ) QGLVARS = cms.PSet( - qgl_axis2 = Var("?(pt>=10)?userFloat('qgl_axis2'):-1",float,doc="ellipse minor jet axis (Quark vs Gluon likelihood input variable)", precision=10), - qgl_ptD = Var("?(pt>=10)?userFloat('qgl_ptD'):-1",float,doc="pT-weighted average pT of constituents (Quark vs Gluon likelihood input variable)", precision=10), + qgl_axis2 = Var("?(pt>=10)?userFloat('qgl_axis2'):-1",float,doc="ellipse minor jet axis (Quark vs Gluon likelihood input variable)", precision=14), + qgl_ptD = Var("?(pt>=10)?userFloat('qgl_ptD'):-1",float,doc="pT-weighted average pT of constituents (Quark vs Gluon likelihood input variable)", precision=14), qgl_mult = Var("?(pt>=10)?userInt('qgl_mult'):-1", int,doc="PF candidates multiplicity (Quark vs Gluon likelihood input variable)"), ) BTAGVARS = cms.PSet( @@ -233,7 +233,7 @@ def AddJetID(proc, jetName="", jetSrc="", jetTableName="", jetTaskName=""): ), ) ) - + run2_jme_2016.toModify( getattr(proc, tightJetId).filterParams, version = "RUN2UL16{}".format("PUPPI" if isPUPPIJet else "CHS") ).toModify( From b6ad81ffe1c17f9f2b704eb3b29839a25f1328ef Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Fri, 2 Dec 2022 11:04:51 +0100 Subject: [PATCH 3/5] Fix isPUPPIJet bug for JetID. Add gluon raw score for particleNet AK4. Minor edits for JetCalo. --- PhysicsTools/NanoAOD/python/custom_jme_cff.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/custom_jme_cff.py b/PhysicsTools/NanoAOD/python/custom_jme_cff.py index ee35665673498..0cb22d4e7c321 100644 --- a/PhysicsTools/NanoAOD/python/custom_jme_cff.py +++ b/PhysicsTools/NanoAOD/python/custom_jme_cff.py @@ -105,7 +105,7 @@ nanoInfo_recojets = { "ak4calo" : { "name": "JetCalo", - "doc" : "AK4 Calo jets with JECs applied", + "doc" : "AK4 Calo jets (slimmedCaloJets)", }, "ak4pf" : { "name" : "JetPF", @@ -183,6 +183,7 @@ particleNetAK4_CvsL = Var("?(pt>=15)?bDiscriminator('pfParticleNetAK4DiscriminatorsJetTags:CvsL'):-1",float,doc="ParticleNetAK4 tagger c vs udsg discriminator",precision=10), particleNetAK4_CvsB = Var("?(pt>=15)?bDiscriminator('pfParticleNetAK4DiscriminatorsJetTags:CvsB'):-1",float,doc="ParticleNetAK4 tagger c vs b discriminator",precision=10), particleNetAK4_QvsG = Var("?(pt>=15)?bDiscriminator('pfParticleNetAK4DiscriminatorsJetTags:QvsG'):-1",float,doc="ParticleNetAK4 tagger uds vs g discriminator",precision=10), + particleNetAK4_G = Var("?(pt>=15)?bDiscriminator('pfParticleNetAK4DiscriminatorsJetTags:probg'):-1",float,doc="ParticleNetAK4 tagger g raw score",precision=10), particleNetAK4_puIdDisc = Var("?(pt>=15)?1-bDiscriminator('pfParticleNetAK4JetTags:probpu'):-1",float,doc="ParticleNetAK4 tagger pileup jet discriminator",precision=10), ) @@ -205,7 +206,7 @@ def AddJetID(proc, jetName="", jetSrc="", jetTableName="", jetTaskName=""): Setup modules to calculate PF jet ID """ - isPUPPIJet = True if "Puppi" in jetName else False + isPUPPIJet = True if "PUPPI" in jetName.upper() else False looseJetId = "looseJetId{}".format(jetName) setattr(proc, looseJetId, proc.looseJetId.clone( @@ -392,6 +393,7 @@ def AddParticleNetAK4Scores(proc, jetTableName=""): getattr(proc, jetTableName).variables.particleNetAK4_CvsL = PARTICLENETAK4VARS.particleNetAK4_CvsL getattr(proc, jetTableName).variables.particleNetAK4_CvsB = PARTICLENETAK4VARS.particleNetAK4_CvsB getattr(proc, jetTableName).variables.particleNetAK4_QvsG = PARTICLENETAK4VARS.particleNetAK4_QvsG + getattr(proc, jetTableName).variables.particleNetAK4_G = PARTICLENETAK4VARS.particleNetAK4_G getattr(proc, jetTableName).variables.particleNetAK4_puIdDisc = PARTICLENETAK4VARS.particleNetAK4_puIdDisc return proc @@ -486,6 +488,9 @@ def SavePatJets(proc, jetName, payload, patJetFinalColl, jetTablePrefix, jetTabl if runOnMC: jetTableDocDefault += "For jets with pt < {ptcut:.0f} GeV, only those matched to gen jets are stored.".format(ptcut=ptcut) + if doCalo: + jetTableDocDefault = jetTableDoc + jetTableName = "jet{}Table".format(jetName) setattr(proc,jetTableName, simpleCandidateFlatTableProducer.clone( src = cms.InputTag(finalJetsForTable), @@ -698,6 +703,7 @@ def ReclusterAK4PuppiJets(proc, recoJA, runOnMC): proc.jetPuppiTable.variables.particleNetAK4_CvsL = PARTICLENETAK4VARS.particleNetAK4_CvsL proc.jetPuppiTable.variables.particleNetAK4_CvsB = PARTICLENETAK4VARS.particleNetAK4_CvsB proc.jetPuppiTable.variables.particleNetAK4_QvsG = PARTICLENETAK4VARS.particleNetAK4_QvsG + proc.jetPuppiTable.variables.particleNetAK4_G = PARTICLENETAK4VARS.particleNetAK4_G proc.jetPuppiTable.variables.particleNetAK4_puIdDisc = PARTICLENETAK4VARS.particleNetAK4_puIdDisc # @@ -872,6 +878,7 @@ def ReclusterAK4CHSJets(proc, recoJA, runOnMC): proc.jetTable.variables.particleNetAK4_CvsL = PARTICLENETAK4VARS.particleNetAK4_CvsL proc.jetTable.variables.particleNetAK4_CvsB = PARTICLENETAK4VARS.particleNetAK4_CvsB proc.jetTable.variables.particleNetAK4_QvsG = PARTICLENETAK4VARS.particleNetAK4_QvsG + proc.jetTable.variables.particleNetAK4_G = PARTICLENETAK4VARS.particleNetAK4_G proc.jetTable.variables.particleNetAK4_puIdDisc = PARTICLENETAK4VARS.particleNetAK4_puIdDisc #Adding hf shower shape producer to the jet sequence. By default this producer is not automatically rerun at the NANOAOD step From 85c4ff8d8cacaabc10a8c80e6d8d1dcf5c9ccd78 Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Fri, 2 Dec 2022 11:12:58 +0100 Subject: [PATCH 4/5] Setup DQM for JMENano --- .../Configuration/python/DQMOfflineMC_cff.py | 2 + .../Configuration/python/DQMOffline_cff.py | 2 + DQMOffline/Configuration/python/autoDQM.py | 4 + PhysicsTools/NanoAOD/python/nanojmeDQM_cff.py | 197 ++++++++++++++++++ 4 files changed, 205 insertions(+) create mode 100644 PhysicsTools/NanoAOD/python/nanojmeDQM_cff.py diff --git a/DQMOffline/Configuration/python/DQMOfflineMC_cff.py b/DQMOffline/Configuration/python/DQMOfflineMC_cff.py index 0dfa065e9425f..89023a8d61850 100644 --- a/DQMOffline/Configuration/python/DQMOfflineMC_cff.py +++ b/DQMOffline/Configuration/python/DQMOfflineMC_cff.py @@ -33,3 +33,5 @@ from PhysicsTools.NanoAOD.nanoDQM_cff import nanoDQMMC DQMOfflineNanoAOD.replace(nanoDQM, nanoDQMMC) #PostDQMOfflineNanoAOD.replace(nanoDQM, nanoDQMMC) +from PhysicsTools.NanoAOD.nanojmeDQM_cff import nanojmeDQMMC +DQMOfflineNanoJME.replace(nanojmeDQM, nanojmeDQMMC) \ No newline at end of file diff --git a/DQMOffline/Configuration/python/DQMOffline_cff.py b/DQMOffline/Configuration/python/DQMOffline_cff.py index e6a3b577b712f..80bbde7e7504f 100644 --- a/DQMOffline/Configuration/python/DQMOffline_cff.py +++ b/DQMOffline/Configuration/python/DQMOffline_cff.py @@ -275,3 +275,5 @@ #PostDQMOfflineNanoAOD = cms.Sequence(nanoDQM) from PhysicsTools.NanoAOD.nanogenDQM_cff import nanogenDQM DQMOfflineNanoGen = cms.Sequence(nanogenDQM) +from PhysicsTools.NanoAOD.nanojmeDQM_cff import nanojmeDQM +DQMOfflineNanoJME = cms.Sequence(nanojmeDQM) \ No newline at end of file diff --git a/DQMOffline/Configuration/python/autoDQM.py b/DQMOffline/Configuration/python/autoDQM.py index 7e9fb164a556a..726552f0e363b 100644 --- a/DQMOffline/Configuration/python/autoDQM.py +++ b/DQMOffline/Configuration/python/autoDQM.py @@ -206,6 +206,10 @@ 'PostDQMOffline', 'DQMHarvestNanoAOD'], + 'nanojmeDQM': ['DQMOfflineNanoJME', + 'PostDQMOffline', + 'DQMHarvestNanoAOD'], + 'pfDQM': ['DQMOfflinePF+DQMOfflinePFExtended', 'PostDQMOffline', 'DQMHarvestPF'], diff --git a/PhysicsTools/NanoAOD/python/nanojmeDQM_cff.py b/PhysicsTools/NanoAOD/python/nanojmeDQM_cff.py new file mode 100644 index 0000000000000..8cd5909a3aa72 --- /dev/null +++ b/PhysicsTools/NanoAOD/python/nanojmeDQM_cff.py @@ -0,0 +1,197 @@ +import FWCore.ParameterSet.Config as cms +import copy + +from PhysicsTools.NanoAOD.nanoDQM_cfi import nanoDQM +from PhysicsTools.NanoAOD.nanoDQM_tools_cff import * +from PhysicsTools.NanoAOD.nano_eras_cff import * + +nanojmeDQM = nanoDQM.clone() + +#============================================ +# +# Add more variables for AK4 Puppi jets +# +#============================================ +nanojmeDQM.vplots.Jet.plots.extend([ + Plot1D('nConstChHads', 'nConstChHads', 20, 14.5, 34.5, 'number of charged hadrons in the jet'), + Plot1D('nConstElecs', 'nConstElecs', 3, -0.5, 2.5, 'number of electrons in the jet'), + Plot1D('nConstHFEMs', 'nConstHFEMs', 1, -0.5, 0.5, 'number of HF EMs in the jet'), + Plot1D('nConstHFHads', 'nConstHFHads', 1, -0.5, 0.5, 'number of HF Hadrons in the jet'), + Plot1D('nConstMuons', 'nConstMuons', 2, -0.5, 1.5, 'number of muons in the jet'), + Plot1D('nConstNeuHads', 'nConstNeuHads', 8, 1.5, 9.5, 'number of neutral hadrons in the jet'), + Plot1D('nConstPhotons', 'nConstPhotons', 16, 5.5, 21.5, 'number of photons in the jet'), + Plot1D('puId_dR2Mean','puId_dR2Mean', 120, -1, 0.2, "pT^2-weighted average square distance of jet constituents from the jet axis (PileUp ID BDT input variable)"), + Plot1D('puId_majW','puId_majW', 70, -1, 0.4, "major axis of jet ellipsoid in eta-phi plane (PileUp ID BDT input variable)"), + Plot1D('puId_minW','puId_minW', 70, -1, 0.4, "minor axis of jet ellipsoid in eta-phi plane (PileUp ID BDT input variable)"), + Plot1D('puId_frac01','puId_frac01', 22, -1, 1, "fraction of constituents' pT contained within dR <0.1 (PileUp ID BDT input variable)"), + Plot1D('puId_frac02','puId_frac02', 22, -1, 1, "fraction of constituents' pT contained within 0.1< dR <0.2 (PileUp ID BDT input variable)"), + Plot1D('puId_frac03','puId_frac03', 22, -1, 1, "fraction of constituents' pT contained within 0.2< dR <0.3 (PileUp ID BDT input variable)"), + Plot1D('puId_frac04','puId_frac04', 22, -1, 1, "fraction of constituents' pT contained within 0.3< dR <0.4 (PileUp ID BDT input variable)"), + Plot1D('puId_ptD','puId_ptD', 20, -1, 1, "pT-weighted average pT of constituents (PileUp ID BDT input variable)"), + Plot1D('puId_beta','puId_beta', 50, -1, 1, "fraction of pT of charged constituents associated to PV (PileUp ID BDT input variable)"), + Plot1D('puId_pull','puId_pull', 208, -1, 0.04, "magnitude of pull vector (PileUp ID BDT input variable)"), + Plot1D('puId_jetR','puId_jetR', 50, -1, 1, "fraction of jet pT carried by the leading constituent (PileUp ID BDT input variable)"), + Plot1D('puId_jetRchg','puId_jetRchg', 50, -1, 1, "fraction of jet pT carried by the leading charged constituent (PileUp ID BDT input variable)"), + Plot1D('puId_nCharged','puId_nCharged', 40, -0.5, 39.5, "number of charged constituents (PileUp ID BDT input variable)"), + Plot1D('qgl_axis2','qgl_axis2', 60, -1, 0.5, "ellipse minor jet axis (Quark vs Gluon likelihood input variable)"), + Plot1D('qgl_ptD','qgl_ptD', 40, -1, 1, "pT-weighted average pT of constituents (Quark vs Gluon likelihood input variable)"), + Plot1D('qgl_mult','qgl_mult', 61, -1.5, 59.5, "PF candidates multiplicity (Quark vs Gluon likelihood input variable)"), + Plot1D('btagDeepFlavG','btagDeepFlavG',20, -1, 1, "DeepFlavour gluon tag raw score"), + Plot1D('btagDeepFlavUDS','btagDeepFlavUDS',20, -1, 1, "DeepFlavour uds tag raw score"), + Plot1D('btagDeepFlavQG','btagDeepFlavQG',20, -1, 1, "DeepJet g vs uds discriminator"), + Plot1D('particleNetAK4_B','particleNetAK4_B',20, -1, 1, "ParticleNetAK4 tagger b vs all (udsg, c) discriminator"), + Plot1D('particleNetAK4_CvsL','particleNetAK4_CvsL',20, -1, 1, "ParticleNetAK4 tagger c vs udsg discriminator"), + Plot1D('particleNetAK4_CvsB','particleNetAK4_CvsB',20, -1, 1, "ParticleNetAK4 tagger c vs b discriminator"), + Plot1D('particleNetAK4_QvsG','particleNetAK4_QvsG',20, -1, 1, "ParticleNetAK4 tagger uds vs g discriminator"), + Plot1D('particleNetAK4_G','particleNetAK4_G',20, -1, 1, "ParticleNetAK4 tagger g raw score"), + Plot1D('particleNetAK4_puIdDisc','particleNetAK4_puIdDisc',20, -1, 1, "ParticleNetAK4 tagger pileup jet discriminator"), + Plot1D('hfEmEF', 'hfEmEF', 20, 0, 1, 'electromagnetic energy fraction in HF'), + Plot1D('hfHEF', 'hfHEF', 20, 0, 1, 'hadronic energy fraction in HF'), +]) + +#============================================ +# +# Setup for AK4 CHS jets +# +#============================================ +_ak4chsplots = cms.VPSet( + Count1D('_size', 20, -0.5, 19.5, 'AK4 PF CHS jets with JECs applied.') +) +for plot in nanojmeDQM.vplots.Jet.plots: + if plot.name.value()=="_size": continue + _ak4chsplots.append(plot) + _ak4chsplots.extend([ + Plot1D('chFPV1EF', 'chFPV1EF', 20, 0, 2, 'charged fromPV==1 Energy Fraction (component of the total charged Energy Fraction).'), + Plot1D('chFPV2EF', 'chFPV2EF', 20, 0, 2, 'charged fromPV==2 Energy Fraction (component of the total charged Energy Fraction).'), + Plot1D('chFPV3EF', 'chFPV3EF', 20, 0, 2, 'charged fromPV==3 Energy Fraction (component of the total charged Energy Fraction).'), + ]) + +nanojmeDQM.vplots.JetCHS = cms.PSet( + sels = nanojmeDQM.vplots.Jet.sels, + plots = _ak4chsplots +) + +#============================================ +# +# Add more variables for AK8 Puppi jets +# +#============================================ +nanojmeDQM.vplots.FatJet.plots.extend([ + Plot1D('nConstChHads', 'nConstChHads', 20, 14.5, 34.5, 'number of charged hadrons in the jet'), + Plot1D('nConstElecs', 'nConstElecs', 3, -0.5, 2.5, 'number of electrons in the jet'), + Plot1D('nConstHFEMs', 'nConstHFEMs', 1, -0.5, 0.5, 'number of HF EMs in the jet'), + Plot1D('nConstHFHads', 'nConstHFHads', 1, -0.5, 0.5, 'number of HF Hadrons in the jet'), + Plot1D('nConstMuons', 'nConstMuons', 2, -0.5, 1.5, 'number of muons in the jet'), + Plot1D('nConstNeuHads', 'nConstNeuHads', 8, 1.5, 9.5, 'number of neutral hadrons in the jet'), + Plot1D('nConstPhotons', 'nConstPhotons', 16, 5.5, 21.5, 'number of photons in the jet'), + Plot1D('neEmEF', 'neEmEF', 20, 0.3, 0.4, 'neutral Electromagnetic Energy Fraction'), + Plot1D('neHEF', 'neHEF', 20, 0.01, 0.2, 'neutral Hadron Energy Fraction'), +]) + +#============================================ +# +# Setup for AK8 Puppi jets for JEC studies +# +#============================================ +nanojmeDQM.vplots.FatJetForJEC = cms.PSet( + sels = cms.PSet( + CentralPt30 = cms.string('abs(eta) < 2.4 && pt > 30'), + ForwardPt30 = cms.string('abs(eta) > 2.4 && pt > 30') + ), + plots = cms.VPSet( + Count1D('_size', 20, -0.5, 19.5, 'AK8 PF Puppi jets with JECs applied. Reclustered for JEC studies so only minimal info stored.'), + Plot1D('area', 'area', 20, 0.2, 0.8, 'jet catchment area, for JECs'), + Plot1D('eta', 'eta', 20, -6, 6, 'eta'), + Plot1D('jetId', 'jetId', 8, -0.5, 7.5, 'Jet ID flags bit1 is loose (always false in 2017 since it does not exist), bit2 is tight, bit3 is tightLepVeto'), + Plot1D('mass', 'mass', 20, 0, 200, 'mass'), + Plot1D('phi', 'phi', 20, -3.14159, 3.14159, 'phi'), + Plot1D('pt', 'pt', 20, 0, 400, 'pt'), + Plot1D('rawFactor', 'rawFactor', 20, -0.5, 0.5, '1 - Factor to get back to raw pT'), + Plot1D('nConstChHads', 'nConstChHads', 20, 14.5, 34.5, 'number of charged hadrons in the jet'), + Plot1D('nConstElecs', 'nConstElecs', 3, -0.5, 2.5, 'number of electrons in the jet'), + Plot1D('nConstHFEMs', 'nConstHFEMs', 1, -0.5, 0.5, 'number of HF EMs in the jet'), + Plot1D('nConstHFHads', 'nConstHFHads', 1, -0.5, 0.5, 'number of HF Hadrons in the jet'), + Plot1D('nConstMuons', 'nConstMuons', 2, -0.5, 1.5, 'number of muons in the jet'), + Plot1D('nConstNeuHads', 'nConstNeuHads', 8, 1.5, 9.5, 'number of neutral hadrons in the jet'), + Plot1D('nConstPhotons', 'nConstPhotons', 16, 5.5, 21.5, 'number of photons in the jet'), + Plot1D('nConstituents', 'nConstituents', 20, 0, 80, 'Number of particles in the jet'), + Plot1D('nElectrons', 'nElectrons', 5, -0.5, 4.5, 'number of electrons in the jet'), + Plot1D('nMuons', 'nMuons', 4, -0.5, 3.5, 'number of muons in the jet'), + Plot1D('hadronFlavour', 'hadronFlavour', 6, -0.5, 5.5, 'flavour from hadron ghost clustering'), + Plot1D('partonFlavour', 'partonFlavour', 40, -9.5, 30.5, 'flavour from parton matching'), + Plot1D('chEmEF', 'chEmEF', 20, 0, 1, 'charged Electromagnetic Energy Fraction'), + Plot1D('chHEF', 'chHEF', 20, 0, 2, 'charged Hadron Energy Fraction'), + Plot1D('neEmEF', 'neEmEF', 20, 0.3, 0.4, 'neutral Electromagnetic Energy Fraction'), + Plot1D('neHEF', 'neHEF', 20, 0.01, 0.2, 'neutral Hadron Energy Fraction'), + Plot1D('hfEmEF', 'hfEmEF', 20, 0, 1, 'electromagnetic energy fraction in HF'), + Plot1D('hfHEF', 'hfHEF', 20, 0, 1, 'hadronic energy fraction in HF'), + Plot1D('muEF', 'muEF', 20, -1, 1, 'muon Energy Fraction'), + NoPlot('genJetIdx'), + ), +) + +#============================================ +# +# Setup for AK8 CHS jets +# +#============================================ +_ak8chsplots = cms.VPSet( + Count1D('_size', 20, -0.5, 19.5, 'AK8 CHS jets with JECs applied.') +) +for plot in nanojmeDQM.vplots.FatJetForJEC.plots: + if plot.name.value()=="_size": continue + _ak8chsplots.append(plot) + +nanojmeDQM.vplots.FatJetCHS = cms.PSet( + sels = nanojmeDQM.vplots.FatJetForJEC.sels, + plots = _ak8chsplots, +) + +#============================================ +# +# Setup for AK4 Calo jets +# +#============================================ +nanojmeDQM.vplots.JetCalo = cms.PSet( + sels = cms.PSet( + CentralPt30 = cms.string('abs(eta) < 2.4 && pt > 30'), + ForwardPt30 = cms.string('abs(eta) > 2.4 && pt > 30') + ), + plots = cms.VPSet( + Count1D('_size', 20, -0.5, 19.5, 'AK4 Calo jets (slimmedCaloJets)'), + Plot1D('area', 'area', 20, 0.2, 0.8, 'jet catchment area'), + Plot1D('eta', 'eta', 20, -6, 6, 'eta'), + Plot1D('mass', 'mass', 20, 0, 200, 'mass'), + Plot1D('phi', 'phi', 20, -3.14159, 3.14159, 'phi'), + Plot1D('pt', 'pt', 20, 0, 400, 'pt'), + Plot1D('rawFactor', 'rawFactor', 20, -0.5, 0.5, '1 - Factor to get back to raw pT'), + Plot1D('emf', 'emf', 20, 0, 1, 'electromagnetic energy fraction'), + Plot1D('hadronFlavour', 'hadronFlavour', 6, -0.5, 5.5, 'flavour from hadron ghost clustering'), + Plot1D('partonFlavour', 'partonFlavour', 40, -9.5, 30.5, 'flavour from parton matching'), + NoPlot('genJetIdx'), + ), +) + + +##MC +nanojmeDQMMC = nanojmeDQM.clone() +#nanojmeDQMMC.vplots.Electron.sels.Prompt = cms.string("genPartFlav == 1") +nanojmeDQMMC.vplots.LowPtElectron.sels.Prompt = cms.string("genPartFlav == 1") +nanojmeDQMMC.vplots.Muon.sels.Prompt = cms.string("genPartFlav == 1") +nanojmeDQMMC.vplots.Photon.sels.Prompt = cms.string("genPartFlav == 1") +nanojmeDQMMC.vplots.Tau.sels.Prompt = cms.string("genPartFlav == 5") +nanojmeDQMMC.vplots.Jet.sels.Prompt = cms.string("genJetIdx != 1") +nanojmeDQMMC.vplots.Jet.sels.PromptB = cms.string("genJetIdx != 1 && hadronFlavour == 5") +nanojmeDQMMC.vplots.JetCHS.sels.Prompt = cms.string("genJetIdx != 1") +nanojmeDQMMC.vplots.JetCHS.sels.PromptB = cms.string("genJetIdx != 1 && hadronFlavour == 5") + +from DQMServices.Core.DQMQualityTester import DQMQualityTester +nanoDQMQTester = DQMQualityTester( + qtList = cms.untracked.FileInPath('PhysicsTools/NanoAOD/test/dqmQualityTests.xml'), + prescaleFactor = cms.untracked.int32(1), + testInEventloop = cms.untracked.bool(False), + qtestOnEndLumi = cms.untracked.bool(False), + verboseQT = cms.untracked.bool(True) +) + +nanojmeHarvest = cms.Sequence( nanoDQMQTester ) From c3641470283b27dbefe9a137d342197510d1fb6e Mon Sep 17 00:00:00 2001 From: Nurfikri Norjoharuddeen Date: Fri, 2 Dec 2022 13:36:31 +0100 Subject: [PATCH 5/5] Setup Run2, Run3 era dependent JMENanoDQM --- PhysicsTools/NanoAOD/python/nanojmeDQM_cff.py | 65 +++++++++++++++++-- 1 file changed, 59 insertions(+), 6 deletions(-) diff --git a/PhysicsTools/NanoAOD/python/nanojmeDQM_cff.py b/PhysicsTools/NanoAOD/python/nanojmeDQM_cff.py index 8cd5909a3aa72..17ebe27b943dd 100644 --- a/PhysicsTools/NanoAOD/python/nanojmeDQM_cff.py +++ b/PhysicsTools/NanoAOD/python/nanojmeDQM_cff.py @@ -12,7 +12,14 @@ # Add more variables for AK4 Puppi jets # #============================================ -nanojmeDQM.vplots.Jet.plots.extend([ +_ak4puppiplots = cms.VPSet( + Count1D('_size', 20, -0.5, 19.5, 'AK4 PF Puppi jets with JECs applied.') +) +for plot in nanojmeDQM.vplots.Jet.plots: + if plot.name.value()=="_size": continue + _ak4puppiplots.append(plot) + +_ak4puppiplots.extend([ Plot1D('nConstChHads', 'nConstChHads', 20, 14.5, 34.5, 'number of charged hadrons in the jet'), Plot1D('nConstElecs', 'nConstElecs', 3, -0.5, 2.5, 'number of electrons in the jet'), Plot1D('nConstHFEMs', 'nConstHFEMs', 1, -0.5, 0.5, 'number of HF EMs in the jet'), @@ -57,7 +64,7 @@ _ak4chsplots = cms.VPSet( Count1D('_size', 20, -0.5, 19.5, 'AK4 PF CHS jets with JECs applied.') ) -for plot in nanojmeDQM.vplots.Jet.plots: +for plot in _ak4puppiplots: if plot.name.value()=="_size": continue _ak4chsplots.append(plot) _ak4chsplots.extend([ @@ -66,11 +73,24 @@ Plot1D('chFPV3EF', 'chFPV3EF', 20, 0, 2, 'charged fromPV==3 Energy Fraction (component of the total charged Energy Fraction).'), ]) -nanojmeDQM.vplots.JetCHS = cms.PSet( +#============================================ +# +# Setup all extra AK4 collections. Will remove +# collection depending on era. +# +#============================================ +nanojmeDQM.vplots.Jet.plots = _ak4puppiplots #Puppi is default "Jet collection" for Run-3 +nanojmeDQM.vplots.JetPuppi = cms.PSet( # This is for the Run-2 extra "JetPuppi" collection + sels = nanojmeDQM.vplots.Jet.sels, + plots = _ak4puppiplots +) +nanojmeDQM.vplots.JetCHS = cms.PSet( # This is for the Run-3 extra "JetCHS" collection sels = nanojmeDQM.vplots.Jet.sels, plots = _ak4chsplots ) + + #============================================ # # Add more variables for AK8 Puppi jets @@ -172,7 +192,6 @@ ), ) - ##MC nanojmeDQMMC = nanojmeDQM.clone() #nanojmeDQMMC.vplots.Electron.sels.Prompt = cms.string("genPartFlav == 1") @@ -182,8 +201,42 @@ nanojmeDQMMC.vplots.Tau.sels.Prompt = cms.string("genPartFlav == 5") nanojmeDQMMC.vplots.Jet.sels.Prompt = cms.string("genJetIdx != 1") nanojmeDQMMC.vplots.Jet.sels.PromptB = cms.string("genJetIdx != 1 && hadronFlavour == 5") -nanojmeDQMMC.vplots.JetCHS.sels.Prompt = cms.string("genJetIdx != 1") -nanojmeDQMMC.vplots.JetCHS.sels.PromptB = cms.string("genJetIdx != 1 && hadronFlavour == 5") + +#============================================ +# +# Era dependent customization +# +#============================================ +# +# Run 3 +# +(~run2_nanoAOD_ANY).toModify( + nanojmeDQM.vplots.Jet, + plots = _ak4puppiplots, +).toModify( + nanojmeDQM.vplots, + JetPuppi = None # Remove "JetPuppi" from DQM +) +(~run2_nanoAOD_ANY).toModify( + nanojmeDQMMC.vplots.JetCHS.sels, + Prompt = nanojmeDQMMC.vplots.Jet.sels.Prompt, + PromptB = nanojmeDQMMC.vplots.Jet.sels.PromptB +) +# +# Run 2 +# +run2_nanoAOD_ANY.toModify( + nanojmeDQM.vplots.Jet, + plots = _ak4chsplots, # +).toModify( + nanojmeDQM.vplots, + JetCHS = None # Remove "JetCHS" from DQM +) +run2_nanoAOD_ANY.toModify( + nanojmeDQMMC.vplots.JetPuppi.sels, + Prompt = nanojmeDQMMC.vplots.Jet.sels.Prompt, + PromptB = nanojmeDQMMC.vplots.Jet.sels.PromptB +) from DQMServices.Core.DQMQualityTester import DQMQualityTester nanoDQMQTester = DQMQualityTester(