CMS 3D CMS Logo

custom_jme_cff.py
Go to the documentation of this file.
1 import FWCore.ParameterSet.Config as cms
2 
4 from PhysicsTools.NanoAOD.simplePATJetFlatTableProducer_cfi import simplePATJetFlatTableProducer
5 
6 from RecoJets.JetProducers.hfJetShowerShape_cfi import hfJetShowerShape
7 from RecoJets.JetProducers.PileupJetID_cfi import pileupJetIdCalculator, pileupJetId
8 from RecoJets.JetProducers.PileupJetID_cfi import _chsalgos_81x, _chsalgos_94x, _chsalgos_102x
9 
10 from PhysicsTools.NanoAOD.common_cff import Var, P4Vars
11 from PhysicsTools.NanoAOD.jetsAK4_CHS_cff import jetTable, jetCorrFactorsNano, updatedJets, finalJets, qgtagger
12 from PhysicsTools.NanoAOD.jetsAK4_Puppi_cff import jetPuppiTable, jetPuppiCorrFactorsNano, updatedJetsPuppi, updatedJetsPuppiWithUserData
13 from PhysicsTools.NanoAOD.jetMC_cff import genJetTable, genJetFlavourAssociation, genJetFlavourTable
14 
15 from PhysicsTools.PatAlgos.tools.jetCollectionTools import GenJetAdder, RecoJetAdder
16 from PhysicsTools.PatAlgos.tools.jetTools import supportedJetAlgos
17 from PhysicsTools.PatAlgos.tools.jetTools import updateJetCollection
18 
19 bTagCSVV2 = ['pfCombinedInclusiveSecondaryVertexV2BJetTags']
20 bTagDeepCSV = ['pfDeepCSVJetTags:probb','pfDeepCSVJetTags:probbb','pfDeepCSVJetTags:probc','pfDeepCSVJetTags:probudsg']
21 bTagDeepJet = [
22  'pfDeepFlavourJetTags:probb','pfDeepFlavourJetTags:probbb','pfDeepFlavourJetTags:problepb',
23  'pfDeepFlavourJetTags:probc','pfDeepFlavourJetTags:probuds','pfDeepFlavourJetTags:probg'
24 ]
25 from RecoBTag.ONNXRuntime.pfParticleNetAK4_cff import _pfParticleNetAK4JetTagsAll
26 from RecoBTag.ONNXRuntime.pfParticleNetFromMiniAODAK4_cff import _pfParticleNetFromMiniAODAK4PuppiCentralJetTagsAll
27 from RecoBTag.ONNXRuntime.pfParticleNetFromMiniAODAK4_cff import _pfParticleNetFromMiniAODAK4PuppiForwardJetTagsAll
28 from RecoBTag.ONNXRuntime.pfParticleTransformerAK4_cff import _pfParticleTransformerAK4JetTagsAll
29 from RecoBTag.ONNXRuntime.pfUnifiedParticleTransformerAK4_cff import _pfUnifiedParticleTransformerAK4JetTagsAll
30 bTagDiscriminatorsForAK4 = cms.PSet(foo = cms.vstring(
31  bTagDeepJet+
32  _pfParticleNetFromMiniAODAK4PuppiCentralJetTagsAll+_pfParticleNetFromMiniAODAK4PuppiForwardJetTagsAll+
33  _pfParticleTransformerAK4JetTagsAll + _pfUnifiedParticleTransformerAK4JetTagsAll
34 ))
35 run2_nanoAOD_ANY.toModify(
36  bTagDiscriminatorsForAK4,
37  foo = bTagCSVV2+bTagDeepCSV+bTagDeepJet+_pfParticleNetAK4JetTagsAll
38 )
39 bTagDiscriminatorsForAK4 = bTagDiscriminatorsForAK4.foo.value()
40 
41 from RecoBTag.ONNXRuntime.pfDeepBoostedJet_cff import _pfDeepBoostedJetTagsAll
42 from RecoBTag.ONNXRuntime.pfParticleNet_cff import _pfParticleNetJetTagsAll
43 
44 btagHbb = ['pfBoostedDoubleSecondaryVertexAK8BJetTags']
45 btagDDX = [
46  'pfDeepDoubleBvLJetTags:probHbb',
47  'pfDeepDoubleCvLJetTags:probHcc',
48  'pfDeepDoubleCvBJetTags:probHcc',
49  'pfMassIndependentDeepDoubleBvLJetTags:probHbb',
50  'pfMassIndependentDeepDoubleCvLJetTags:probHcc',
51  'pfMassIndependentDeepDoubleCvBJetTags:probHcc'
52 ]
53 btagDDXV2 = [
54  'pfMassIndependentDeepDoubleBvLV2JetTags:probHbb',
55  'pfMassIndependentDeepDoubleCvLV2JetTags:probHcc',
56  'pfMassIndependentDeepDoubleCvBV2JetTags:probHcc'
57 ]
58 
59 #
60 # By default, these collections are saved in NanoAODs:
61 # - ak4gen (GenJet in NanoAOD), slimmedGenJets in MiniAOD
62 # - ak8gen (GenJetAK8 in NanoAOD), slimmedGenJetsAK8 in MiniAOD
63 # Below is a list of genjets that we can save in NanoAOD. Set
64 # "enabled" to true if you want to store the jet collection
65 config_genjets = [
66  {
67  "jet" : "ak6gen",
68  "enabled" : False,
69  },
70 ]
71 config_genjets = list(filter(lambda k: k['enabled'], config_genjets))
72 #
73 # GenJets info in NanoAOD
74 #
75 nanoInfo_genjets = {
76  "ak6gen" : {
77  "name" : "GenJetAK6",
78  "doc" : "AK6 Gen jets (made with visible genparticles) with pt > 3 GeV", # default genjets pt cut after clustering is 3 GeV
79  },
80 }
81 #
82 # By default, these collections are saved in the main NanoAODs:
83 # - ak4pfpuppi (Jet in NanoAOD), slimmedJetsPuppi in MiniAOD
84 # - ak8pfpuppi (FatJet in NanoAOD), slimmedJetsAK8 in MiniAOD
85 # Below is a list of recojets that we can save in NanoAOD. Set
86 # "enabled" to true if you want to store the recojet collection.
87 #
88 config_recojets = [
89  {
90  "jet" : "ak4calo",
91  "enabled" : True,
92  "inputCollection" : "slimmedCaloJets", #Exist in MiniAOD
93  "genJetsCollection": "AK4GenJetsNoNu",
94  },
95  {
96  "jet" : "ak4pf",
97  "enabled" : False,
98  "inputCollection" : "",
99  "genJetsCollection": "AK4GenJetsNoNu",
100  "minPtFastjet" : 0.,
101  },
102  {
103  "jet" : "ak8pf",
104  "enabled" : False,
105  "inputCollection" : "",
106  "genJetsCollection": "AK8GenJetsNoNu",
107  "minPtFastjet" : 0.,
108  },
109 ]
110 config_recojets = list(filter(lambda k: k['enabled'], config_recojets))
111 #
112 # RecoJets info in NanoAOD
113 #
114 nanoInfo_recojets = {
115  "ak4calo" : {
116  "name": "JetCalo",
117  "doc" : "AK4 Calo jets (slimmedCaloJets)",
118  },
119  "ak4pf" : {
120  "name" : "JetPF",
121  "doc" : "AK4 PF jets",
122  "ptcut" : "",
123  },
124  "ak8pf" : {
125  "name" : "FatJetPF",
126  "doc" : "AK8 PF jets",
127  "ptcut" : "",
128  },
129 }
130 
131 GENJETVARS = cms.PSet(P4Vars,
132  nConstituents = jetPuppiTable.variables.nConstituents,
133 )
134 PFJETVARS = cms.PSet(P4Vars,
135  rawFactor = jetPuppiTable.variables.rawFactor,
136  area = jetPuppiTable.variables.area,
137  chHEF = jetPuppiTable.variables.chHEF,
138  neHEF = jetPuppiTable.variables.neHEF,
139  chEmEF = jetPuppiTable.variables.chEmEF,
140  neEmEF = jetPuppiTable.variables.neEmEF,
141  muEF = jetPuppiTable.variables.muEF,
142  hfHEF = Var("HFHadronEnergyFraction()",float,doc="hadronic Energy Fraction in HF",precision= 6),
143  hfEmEF = Var("HFEMEnergyFraction()",float,doc="electromagnetic Energy Fraction in HF",precision= 6),
144  nMuons = jetPuppiTable.variables.nMuons,
145  nElectrons = jetPuppiTable.variables.nElectrons,
146  nConstituents = jetPuppiTable.variables.nConstituents,
147  chHadMultiplicity = Var("chargedHadronMultiplicity()","int16",doc="(Puppi-weighted) number of charged hadrons in the jet"),
148  neHadMultiplicity = Var("neutralHadronMultiplicity()","int16",doc="(Puppi-weighted) number of neutral hadrons in the jet"),
149  hfHadMultiplicity = Var("HFHadronMultiplicity()", "int16",doc="(Puppi-weighted) number of HF hadrons in the jet"),
150  hfEMMultiplicity = Var("HFEMMultiplicity()","int16",doc="(Puppi-weighted) number of HF EMs in the jet"),
151  muMultiplicity = Var("muonMultiplicity()","int16",doc="(Puppi-weighted) number of muons in the jet"),
152  elMultiplicity = Var("electronMultiplicity()","int16",doc="(Puppi-weighted) number of electrons in the jet"),
153  phoMultiplicity = Var("photonMultiplicity()","int16",doc="(Puppi-weighted) number of photons in the jet"),
154  #MC-only variables
155  partonFlavour = Var("partonFlavour()", "int16", doc="flavour from parton matching"),
156  hadronFlavour = Var("hadronFlavour()", "uint8", doc="flavour from hadron ghost clustering"),
157  genJetIdx = Var("?genJetFwdRef().backRef().isNonnull()?genJetFwdRef().backRef().key():-1", "int16", doc="index of matched gen jet"),
158 )
159 PUIDVARS = cms.PSet(
160  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),
161  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),
162  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),
163  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),
164  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),
165  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),
166  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),
167  puId_ptD = Var("?(pt>=10)?userFloat('puId_ptD'):-1",float,doc="pT-weighted average pT of constituents (PileUp ID BDT input variable)", precision=14),
168  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),
169  puId_pull = Var("?(pt>=10)?userFloat('puId_pull'):-1",float,doc="magnitude of pull vector (PileUp ID BDT input variable)", precision=14),
170  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),
171  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),
172  puId_nCharged = Var("?(pt>=10)?userInt('puId_nCharged'):-1","int16",doc="number of charged constituents (PileUp ID BDT input variable)"),
173 )
174 QGLVARS = cms.PSet(
175  qgl_axis2 = Var("?(pt>=10)?userFloat('qgl_axis2'):-1",float,doc="ellipse minor jet axis (Quark vs Gluon likelihood input variable)", precision=14),
176  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),
177  qgl_mult = Var("?(pt>=10)?userInt('qgl_mult'):-1", "int16",doc="PF candidates multiplicity (Quark vs Gluon likelihood input variable)"),
178 )
179 BTAGVARS = cms.PSet(
180  btagDeepB = Var("?(pt>=15)&&((bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb'))>=0)?bDiscriminator('pfDeepCSVJetTags:probb')+bDiscriminator('pfDeepCSVJetTags:probbb'):-1",float,doc="DeepCSV b+bb tag discriminator",precision=10),
181  btagDeepCvL = Var("?(pt>=15)&&(bDiscriminator('pfDeepCSVJetTags:probc')>=0)?bDiscriminator('pfDeepCSVJetTags:probc')/(bDiscriminator('pfDeepCSVJetTags:probc')+bDiscriminator('pfDeepCSVJetTags:probudsg')):-1", float,doc="DeepCSV c vs udsg discriminator",precision=10),
182  btagDeepCvB = Var("?(pt>=15)&&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),
183 )
184 DEEPJETVARS = cms.PSet(
185  btagDeepFlavB = Var("?(pt>=15)?bDiscriminator('pfDeepFlavourJetTags:probb')+bDiscriminator('pfDeepFlavourJetTags:probbb')+bDiscriminator('pfDeepFlavourJetTags:problepb'):-1",float,doc="DeepJet b+bb+lepb tag discriminator",precision=10),
186  btagDeepFlavC = Var("?(pt>=15)?bDiscriminator('pfDeepFlavourJetTags:probc'):-1",float,doc="DeepFlavour charm tag raw score",precision=10),
187  btagDeepFlavG = Var("?(pt>=15)?bDiscriminator('pfDeepFlavourJetTags:probg'):-1",float,doc="DeepFlavour gluon tag raw score",precision=10),
188  btagDeepFlavUDS = Var("?(pt>=15)?bDiscriminator('pfDeepFlavourJetTags:probuds'):-1",float,doc="DeepFlavour uds tag raw score",precision=10),
189  btagDeepFlavCvL = Var("?(pt>=15)&&(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probuds')+bDiscriminator('pfDeepFlavourJetTags:probg'))>0?bDiscriminator('pfDeepFlavourJetTags:probc')/(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probuds')+bDiscriminator('pfDeepFlavourJetTags:probg')):-1",float,doc="DeepJet c vs uds+g discriminator",precision=10),
190  btagDeepFlavCvB = Var("?(pt>=15)&&(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probb')+bDiscriminator('pfDeepFlavourJetTags:probbb')+bDiscriminator('pfDeepFlavourJetTags:problepb'))>0?bDiscriminator('pfDeepFlavourJetTags:probc')/(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probb')+bDiscriminator('pfDeepFlavourJetTags:probbb')+bDiscriminator('pfDeepFlavourJetTags:problepb')):-1",float,doc="DeepJet c vs b+bb+lepb discriminator",precision=10),
191  btagDeepFlavQG = Var("?(pt>=15)&&(bDiscriminator('pfDeepFlavourJetTags:probg')+bDiscriminator('pfDeepFlavourJetTags:probuds'))>0?bDiscriminator('pfDeepFlavourJetTags:probg')/(bDiscriminator('pfDeepFlavourJetTags:probg')+bDiscriminator('pfDeepFlavourJetTags:probuds')):-1",float,doc="DeepJet g vs uds discriminator",precision=10),
192 )
193 ROBUSTPARTAK4VARS = cms.PSet(
194  btagRobustParTAK4B = Var("?(pt>=15)?bDiscriminator('pfParticleTransformerAK4JetTags:probb')+bDiscriminator('pfParticleTransformerAK4JetTags:probbb')+bDiscriminator('pfParticleTransformerAK4JetTags:problepb'):-1",float,doc="RobustParTAK4 b+bb+lepb tag discriminator",precision=10),
195  btagRobustParTAK4C = Var("?(pt>=15)?bDiscriminator('pfParticleTransformerAK4JetTags:probc'):-1",float,doc="RobustParTAK4 charm tag raw score",precision=10),
196  btagRobustParTAK4G = Var("?(pt>=15)?bDiscriminator('pfParticleTransformerAK4JetTags:probg'):-1",float,doc="RobustParTAK4 gluon tag raw score",precision=10),
197  btagRobustParTAK4UDS = Var("?(pt>=15)?bDiscriminator('pfParticleTransformerAK4JetTags:probuds'):-1",float,doc="RobustParTAK4 uds tag raw score",precision=10),
198  btagRobustParTAK4CvL = Var("?(pt>=15)&&(bDiscriminator('pfParticleTransformerAK4JetTags:probc')+bDiscriminator('pfParticleTransformerAK4JetTags:probuds')+bDiscriminator('pfParticleTransformerAK4JetTags:probg'))>0?bDiscriminator('pfParticleTransformerAK4JetTags:probc')/(bDiscriminator('pfParticleTransformerAK4JetTags:probc')+bDiscriminator('pfParticleTransformerAK4JetTags:probuds')+bDiscriminator('pfParticleTransformerAK4JetTags:probg')):-1",float,doc="RobustParTAK4 c vs uds+g discriminator",precision=10),
199  btagRobustParTAK4CvB = Var("?(pt>=15)&&(bDiscriminator('pfParticleTransformerAK4JetTags:probc')+bDiscriminator('pfParticleTransformerAK4JetTags:probb')+bDiscriminator('pfParticleTransformerAK4JetTags:probbb')+bDiscriminator('pfParticleTransformerAK4JetTags:problepb'))>0?bDiscriminator('pfParticleTransformerAK4JetTags:probc')/(bDiscriminator('pfParticleTransformerAK4JetTags:probc')+bDiscriminator('pfParticleTransformerAK4JetTags:probb')+bDiscriminator('pfParticleTransformerAK4JetTags:probbb')+bDiscriminator('pfParticleTransformerAK4JetTags:problepb')):-1",float,doc="RobustParTAK4 c vs b+bb+lepb discriminator",precision=10),
200  btagRobustParTAK4QG = Var("?(pt>=15)&&(bDiscriminator('pfParticleTransformerAK4JetTags:probg')+bDiscriminator('pfParticleTransformerAK4JetTags:probuds'))>0?bDiscriminator('pfParticleTransformerAK4JetTags:probg')/(bDiscriminator('pfParticleTransformerAK4JetTags:probg')+bDiscriminator('pfParticleTransformerAK4JetTags:probuds')):-1",float,doc="RobustParTAK4 g vs uds discriminator",precision=10),
201 )
202 UNIFIEDPARTAK4VARS = cms.PSet(
203  btagUParTAK4B = Var("?pt>15 && bDiscriminator('pfUnifiedParticleTransformerAK4DiscriminatorsJetTags:BvsAll')>0?bDiscriminator('pfUnifiedParticleTransformerAK4DiscriminatorsJetTags:BvsAll'):-1",float,precision=10,doc="UnifiedParTAK4 b vs. udscg"),
204  btagUParTAK4CvL = Var("?pt>15 && bDiscriminator('pfUnifiedParticleTransformerAK4DiscriminatorsJetTags:CvsL')>0?bDiscriminator('pfUnifiedParticleTransformerAK4DiscriminatorsJetTags:CvsL'):-1",float,precision=10,doc="UnifiedParTAK4 c vs. udsg"),
205  btagUParTAK4CvB = Var("?pt>15 && bDiscriminator('pfUnifiedParticleTransformerAK4DiscriminatorsJetTags:CvsB')>0?bDiscriminator('pfUnifiedParticleTransformerAK4DiscriminatorsJetTags:CvsB'):-1",float,precision=10,doc="UnifiedParTAK4 c vs. b"),
206  btagUParTAK4QvG = Var("?pt>15 && bDiscriminator('pfUnifiedParticleTransformerAK4DiscriminatorsJetTags:QvsG')>0?bDiscriminator('pfUnifiedParticleTransformerAK4DiscriminatorsJetTags:QvsG'):-1",float,precision=10,doc="UnifiedParTAK4 q (udsbc) vs. g"),
207  btagUParTAK4TauVJet = Var("?pt>15 && bDiscriminator('pfUnifiedParticleTransformerAK4DiscriminatorsJetTags:TauVsJet')>0?bDiscriminator('pfUnifiedParticleTransformerAK4DiscriminatorsJetTags:TauVsJet'):-1",float,precision=10,doc="UnifiedParTAK4 tau vs. jet"),
208  UParTAK4RegPtRawCorr = Var("?pt>15 && bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:ptcorr')>0?bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:ptcorr'):-1",float,precision=10,doc="UnifiedParTAK4 universal flavor-aware visible pT regression (no neutrinos), correction relative to raw jet pT"),
209  UParTAK4RegPtRawCorrNeutrino = Var("?pt>15 && bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:ptnu')>0?bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:ptnu'):-1",float,precision=10,doc="UnifiedParTAK4 universal flavor-aware pT regression neutrino correction, relative to visible. To apply full regression, multiply raw jet pT by both UParTAK4RegPtRawCorr and UParTAK4RegPtRawCorrNeutrino."),
210  UParTAK4RegPtRawRes = Var("?pt>15 && 0.5*(bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:ptreshigh')-bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:ptreslow')) > 0?0.5*(bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:ptreshigh')-bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:ptreslow')):-1",float,precision=10,doc="UnifiedParTAK4 universal flavor-aware jet pT resolution estimator, (q84 - q16)/2"),
211 )
212 PARTICLENETAK4VARS = cms.PSet(
213  particleNetAK4_B = Var("?(pt>=15)?bDiscriminator('pfParticleNetAK4DiscriminatorsJetTags:BvsAll'):-1",float,doc="ParticleNetAK4 tagger b vs all (udsg, c) discriminator",precision=10),
214  particleNetAK4_CvsL = Var("?(pt>=15)?bDiscriminator('pfParticleNetAK4DiscriminatorsJetTags:CvsL'):-1",float,doc="ParticleNetAK4 tagger c vs udsg discriminator",precision=10),
215  particleNetAK4_CvsB = Var("?(pt>=15)?bDiscriminator('pfParticleNetAK4DiscriminatorsJetTags:CvsB'):-1",float,doc="ParticleNetAK4 tagger c vs b discriminator",precision=10),
216  particleNetAK4_QvsG = Var("?(pt>=15)?bDiscriminator('pfParticleNetAK4DiscriminatorsJetTags:QvsG'):-1",float,doc="ParticleNetAK4 tagger uds vs g discriminator",precision=10),
217  particleNetAK4_G = Var("?(pt>=15)?bDiscriminator('pfParticleNetAK4JetTags:probg'):-1",float,doc="ParticleNetAK4 tagger g raw score",precision=10),
218  particleNetAK4_puIdDisc = Var("?(pt>=15)?1-bDiscriminator('pfParticleNetAK4JetTags:probpu'):-1",float,doc="ParticleNetAK4 tagger pileup jet discriminator",precision=10),
219 )
220 
221 CALOJETVARS = cms.PSet(P4Vars,
222  area = jetPuppiTable.variables.area,
223  rawFactor = jetPuppiTable.variables.rawFactor,
224  emf = Var("emEnergyFraction()", float, doc = "electromagnetic energy fraction", precision = 10),
225 )
226 
227 
228 #******************************************
229 #
230 #
231 # Reco Jets related functions
232 #
233 #
234 #******************************************
235 def AddJetID(proc, jetName="", jetSrc="", jetTableName="", jetTaskName=""):
236  """
237  Setup modules to calculate PF jet ID
238  """
239 
240  isPUPPIJet = True if "PUPPI" in jetName.upper() else False
241 
242  looseJetId = "looseJetId{}".format(jetName)
243  setattr(proc, looseJetId, proc.looseJetId.clone(
244  src = jetSrc,
245  filterParams = proc.looseJetId.filterParams.clone(
246  version = "WINTER16"
247  ),
248  )
249  )
250 
251  tightJetId = "tightJetId{}".format(jetName)
252  setattr(proc, tightJetId, proc.tightJetId.clone(
253  src = jetSrc,
254  filterParams = proc.tightJetId.filterParams.clone(
255  version = "RUN3WINTER22{}".format("PUPPI" if isPUPPIJet else "CHS")
256  ),
257  )
258  )
259 
260  tightJetIdLepVeto = "tightJetIdLepVeto{}".format(jetName)
261  setattr(proc, tightJetIdLepVeto, proc.tightJetIdLepVeto.clone(
262  src = jetSrc,
263  filterParams = proc.tightJetIdLepVeto.filterParams.clone(
264  version = "RUN3WINTER22{}".format("PUPPI" if isPUPPIJet else "CHS")
265  ),
266  )
267  )
268 
269  run3_jme_Winter22runsBCDEprompt.toModify(
270  getattr(proc, tightJetId).filterParams, version = "RUN3WINTER22{}runsBCDEprompt".format("PUPPI" if isPUPPIJet else "CHS")
271  ).toModify(
272  getattr(proc, tightJetIdLepVeto).filterParams, version = "RUN3WINTER22{}runsBCDEprompt".format("PUPPI" if isPUPPIJet else "CHS")
273  )
274 
275  (run2_jme_2017 | run2_jme_2018 | run3_nanoAOD_122 | run3_nanoAOD_124).toModify(
276  getattr(proc, tightJetId).filterParams, version = "RUN2UL{}".format("PUPPI" if isPUPPIJet else "CHS")
277  ).toModify(
278  getattr(proc, tightJetIdLepVeto).filterParams, version = "RUN2UL{}".format("PUPPI" if isPUPPIJet else "CHS")
279  )
280 
281  run2_jme_2016.toModify(
282  getattr(proc, tightJetId).filterParams, version = "RUN2UL16{}".format("PUPPI" if isPUPPIJet else "CHS")
283  ).toModify(
284  getattr(proc, tightJetIdLepVeto).filterParams, version = "RUN2UL16{}".format("PUPPI" if isPUPPIJet else "CHS")
285  )
286 
287  #
288  # Save variables as userInts in each jet
289  #
290  patJetWithUserData = "{}WithUserData".format(jetSrc)
291  getattr(proc, patJetWithUserData).userInts.tightId = cms.InputTag(tightJetId)
292  getattr(proc, patJetWithUserData).userInts.tightIdLepVeto = cms.InputTag(tightJetIdLepVeto)
293 
294  #
295  # Specfiy variables in the jetTable to save in NanoAOD
296  #
297  getattr(proc, jetTableName).variables.jetId = Var("userInt('tightId')*2+4*userInt('tightIdLepVeto')",int,doc="Jet ID flags bit1 is loose (always false in 2017 since it does not exist), bit2 is tight, bit3 is tightLepVeto")
298 
299  getattr(proc,jetTaskName).add(getattr(proc, tightJetId))
300  getattr(proc,jetTaskName).add(getattr(proc, tightJetIdLepVeto))
301 
302  return proc
303 
304 def AddPileUpJetIDVars(proc, jetName="", jetSrc="", jetTableName="", jetTaskName=""):
305  """
306  Setup modules to calculate pileup jet ID input variables for PF jet
307  """
308 
309  #
310  # Calculate pileup jet ID variables
311  #
312  puJetIdVarsCalculator = "puJetIdCalculator{}".format(jetName)
313  setattr(proc, puJetIdVarsCalculator, pileupJetIdCalculator.clone(
314  jets = jetSrc,
315  vertexes = "offlineSlimmedPrimaryVertices",
316  inputIsCorrected = True,
317  applyJec = False,
318  srcConstituentWeights = "packedpuppi" if "PUPPI" in jetName.upper() else ""
319  )
320  )
321  getattr(proc,jetTaskName).add(getattr(proc, puJetIdVarsCalculator))
322 
323  #
324  # Get the variables
325  #
326  puJetIDVar = "puJetIDVar{}".format(jetName)
327  setattr(proc, puJetIDVar, cms.EDProducer("PileupJetIDVarProducer",
328  srcJet = cms.InputTag(jetSrc),
329  srcPileupJetId = cms.InputTag(puJetIdVarsCalculator)
330  )
331  )
332  getattr(proc,jetTaskName).add(getattr(proc, puJetIDVar))
333 
334  #
335  # Save variables as userFloats and userInts for each jet
336  #
337  patJetWithUserData = "{}WithUserData".format(jetSrc)
338  getattr(proc,patJetWithUserData).userFloats.puId_dR2Mean = cms.InputTag("{}:dR2Mean".format(puJetIDVar))
339  getattr(proc,patJetWithUserData).userFloats.puId_majW = cms.InputTag("{}:majW".format(puJetIDVar))
340  getattr(proc,patJetWithUserData).userFloats.puId_minW = cms.InputTag("{}:minW".format(puJetIDVar))
341  getattr(proc,patJetWithUserData).userFloats.puId_frac01 = cms.InputTag("{}:frac01".format(puJetIDVar))
342  getattr(proc,patJetWithUserData).userFloats.puId_frac02 = cms.InputTag("{}:frac02".format(puJetIDVar))
343  getattr(proc,patJetWithUserData).userFloats.puId_frac03 = cms.InputTag("{}:frac03".format(puJetIDVar))
344  getattr(proc,patJetWithUserData).userFloats.puId_frac04 = cms.InputTag("{}:frac04".format(puJetIDVar))
345  getattr(proc,patJetWithUserData).userFloats.puId_ptD = cms.InputTag("{}:ptD".format(puJetIDVar))
346  getattr(proc,patJetWithUserData).userFloats.puId_beta = cms.InputTag("{}:beta".format(puJetIDVar))
347  getattr(proc,patJetWithUserData).userFloats.puId_pull = cms.InputTag("{}:pull".format(puJetIDVar))
348  getattr(proc,patJetWithUserData).userFloats.puId_jetR = cms.InputTag("{}:jetR".format(puJetIDVar))
349  getattr(proc,patJetWithUserData).userFloats.puId_jetRchg = cms.InputTag("{}:jetRchg".format(puJetIDVar))
350  getattr(proc,patJetWithUserData).userInts.puId_nCharged = cms.InputTag("{}:nCharged".format(puJetIDVar))
351 
352  #
353  # Specfiy variables in the jet table to save in NanoAOD
354  #
355  getattr(proc,jetTableName).variables.puId_dR2Mean = PUIDVARS.puId_dR2Mean
356  getattr(proc,jetTableName).variables.puId_majW = PUIDVARS.puId_majW
357  getattr(proc,jetTableName).variables.puId_minW = PUIDVARS.puId_minW
358  getattr(proc,jetTableName).variables.puId_frac01 = PUIDVARS.puId_frac01
359  getattr(proc,jetTableName).variables.puId_frac02 = PUIDVARS.puId_frac02
360  getattr(proc,jetTableName).variables.puId_frac03 = PUIDVARS.puId_frac03
361  getattr(proc,jetTableName).variables.puId_frac04 = PUIDVARS.puId_frac04
362  getattr(proc,jetTableName).variables.puId_ptD = PUIDVARS.puId_ptD
363  getattr(proc,jetTableName).variables.puId_beta = PUIDVARS.puId_beta
364  getattr(proc,jetTableName).variables.puId_pull = PUIDVARS.puId_pull
365  getattr(proc,jetTableName).variables.puId_jetR = PUIDVARS.puId_jetR
366  getattr(proc,jetTableName).variables.puId_jetRchg = PUIDVARS.puId_jetRchg
367  getattr(proc,jetTableName).variables.puId_nCharged = PUIDVARS.puId_nCharged
368 
369  return proc
370 
371 def AddQGLTaggerVars(proc, jetName="", jetSrc="", jetTableName="", jetTaskName="", calculateQGLVars=False):
372  """
373  Schedule the QGTagger module to calculate input variables to the QG likelihood
374  """
375 
376  isPUPPIJet = True if "PUPPI" in jetName.upper() else False
377 
378  QGLTagger="qgtagger{}".format(jetName)
379  patJetWithUserData="{}WithUserData".format(jetSrc)
380 
381  if calculateQGLVars:
382  setattr(proc, QGLTagger, qgtagger.clone(
383  srcJets = jetSrc,
384  computeLikelihood = False,
385  )
386  )
387  if isPUPPIJet:
388  getattr(proc,QGLTagger).srcConstituentWeights = cms.InputTag("packedpuppi")
389 
390  #
391  # Save variables as userFloats and userInts for each jet
392  #
393  getattr(proc,patJetWithUserData).userFloats.qgl_axis2 = cms.InputTag(QGLTagger+":axis2")
394  getattr(proc,patJetWithUserData).userFloats.qgl_ptD = cms.InputTag(QGLTagger+":ptD")
395  getattr(proc,patJetWithUserData).userInts.qgl_mult = cms.InputTag(QGLTagger+":mult")
396 
397  #
398  # Specfiy variables in the jet table to save in NanoAOD
399  #
400  getattr(proc,jetTableName).variables.qgl_axis2 = QGLVARS.qgl_axis2
401  getattr(proc,jetTableName).variables.qgl_ptD = QGLVARS.qgl_ptD
402  getattr(proc,jetTableName).variables.qgl_mult = QGLVARS.qgl_mult
403 
404  if calculateQGLVars:
405  getattr(proc,jetTaskName).add(getattr(proc, QGLTagger))
406 
407  return proc
408 
409 def AddBTaggingScores(proc, jetTableName=""):
410  """
411  Store b-tagging scores from various algortihm
412  """
413 
414  getattr(proc, jetTableName).variables.btagDeepFlavB = DEEPJETVARS.btagDeepFlavB
415  getattr(proc, jetTableName).variables.btagDeepFlavCvL = DEEPJETVARS.btagDeepFlavCvL
416  getattr(proc, jetTableName).variables.btagDeepFlavCvB = DEEPJETVARS.btagDeepFlavCvB
417 
418  run2_nanoAOD_ANY.toModify(
419  getattr(proc, jetTableName).variables,
420  btagCSVV2 = Var("bDiscriminator('pfCombinedInclusiveSecondaryVertexV2BJetTags')",float,doc=" pfCombinedInclusiveSecondaryVertexV2 b-tag discriminator (aka CSVV2)",precision=10),
421  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),
422  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),
423  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)
424  )
425 
426  return proc
427 
428 def AddDeepJetGluonLQuarkScores(proc, jetTableName=""):
429  """
430  Store DeepJet raw score in jetTable for gluon and light quark
431  """
432 
433  getattr(proc, jetTableName).variables.btagDeepFlavG = DEEPJETVARS.btagDeepFlavG
434  getattr(proc, jetTableName).variables.btagDeepFlavUDS = DEEPJETVARS.btagDeepFlavUDS
435  getattr(proc, jetTableName).variables.btagDeepFlavQG = DEEPJETVARS.btagDeepFlavQG
436 
437  return proc
438 
439 def AddRobustParTAK4Scores(proc, jetTableName=""):
440  """
441  Store RobustParTAK4 scores in jetTable
442  """
443 
444  getattr(proc, jetTableName).variables.btagRobustParTAK4B = ROBUSTPARTAK4VARS.btagRobustParTAK4B
445  getattr(proc, jetTableName).variables.btagRobustParTAK4CvL = ROBUSTPARTAK4VARS.btagRobustParTAK4CvL
446  getattr(proc, jetTableName).variables.btagRobustParTAK4CvB = ROBUSTPARTAK4VARS.btagRobustParTAK4CvB
447 
448  return proc
449 
450 def AddUnifiedParTAK4Scores(proc, jetTableName=""):
451  """
452  Store RobustParTAK4 scores in jetTable
453  """
454 
455  getattr(proc, jetTableName).variables.btagUParTAK4B = UNIFIEDPARTAK4VARS.btagUParTAK4B
456  getattr(proc, jetTableName).variables.btagUParTAK4CvL = UNIFIEDPARTAK4VARS.btagUParTAK4CvL
457  getattr(proc, jetTableName).variables.btagUParTAK4CvB = UNIFIEDPARTAK4VARS.btagUParTAK4CvB
458  getattr(proc, jetTableName).variables.btagUParTAK4TauVJet = UNIFIEDPARTAK4VARS.btagUParTAK4TauVJet
459  getattr(proc, jetTableName).variables.UParTAK4RegPtRawCorr = UNIFIEDPARTAK4VARS.UParTAK4RegPtRawCorr
460  getattr(proc, jetTableName).variables.UParTAK4RegPtRawCorrNeutrino = UNIFIEDPARTAK4VARS.UParTAK4RegPtRawCorrNeutrino
461  getattr(proc, jetTableName).variables.UParTAK4RegPtRawRes = UNIFIEDPARTAK4VARS.UParTAK4RegPtRawRes
462 
463  return proc
464 
465 def AddParticleNetAK4Scores(proc, jetTableName=""):
466  """
467  Store ParticleNetAK4 scores in jetTable
468  """
469 
470  getattr(proc, jetTableName).variables.particleNetAK4_B = PARTICLENETAK4VARS.particleNetAK4_B
471  getattr(proc, jetTableName).variables.particleNetAK4_CvsL = PARTICLENETAK4VARS.particleNetAK4_CvsL
472  getattr(proc, jetTableName).variables.particleNetAK4_CvsB = PARTICLENETAK4VARS.particleNetAK4_CvsB
473  getattr(proc, jetTableName).variables.particleNetAK4_QvsG = PARTICLENETAK4VARS.particleNetAK4_QvsG
474  getattr(proc, jetTableName).variables.particleNetAK4_G = PARTICLENETAK4VARS.particleNetAK4_G
475  getattr(proc, jetTableName).variables.particleNetAK4_puIdDisc = PARTICLENETAK4VARS.particleNetAK4_puIdDisc
476 
477  return proc
478 
479 def AddNewPatJets(proc, recoJetInfo, runOnMC):
480  """
481  Add patJet into custom nanoAOD
482  """
483 
484  jetName = recoJetInfo.jetUpper
485  payload = recoJetInfo.jetCorrPayload
486  doPF = recoJetInfo.doPF
487  doCalo = recoJetInfo.doCalo
488  patJetFinalColl = recoJetInfo.patJetFinalCollection
489 
490  nanoInfoForJet = nanoInfo_recojets[recoJetInfo.jet]
491  jetTablePrefix = nanoInfoForJet["name"]
492  jetTableDoc = nanoInfoForJet["doc"]
493  ptcut = nanoInfoForJet["ptcut"] if "ptcut" in nanoInfoForJet else 8
494  doPUIDVar = nanoInfoForJet["doPUIDVar"] if "doPUIDVar" in nanoInfoForJet else False
495  doQGL = nanoInfoForJet["doQGL"] if "doQGL" in nanoInfoForJet else False
496  doBTag = nanoInfoForJet["doBTag"] if "doBTag" in nanoInfoForJet else False
497 
498  SavePatJets(proc,
499  jetName, payload, patJetFinalColl, jetTablePrefix, jetTableDoc, doPF, doCalo,
500  ptcut=ptcut, doPUIDVar=doPUIDVar, doQGL=doQGL, doBTag=doBTag, runOnMC=runOnMC
501  )
502 
503  return proc
504 
505 def SavePatJets(proc, jetName, payload, patJetFinalColl, jetTablePrefix, jetTableDoc,
506  doPF, doCalo, ptcut, doPUIDVar=False, doQGL=False, doBTag=False, runOnMC=False):
507  """
508  Schedule modules for a given patJet collection and save its variables into custom NanoAOD
509  """
510 
511  #
512  # Setup jet correction factors
513  #
514  jetCorrFactors = "jetCorrFactorsNano{}".format(jetName)
515  setattr(proc, jetCorrFactors, jetCorrFactorsNano.clone(
516  src = patJetFinalColl,
517  payload = payload,
518  )
519  )
520 
521  #
522  # Update jets
523  #
524  srcJets = "updatedJets{}".format(jetName)
525  setattr(proc, srcJets, updatedJets.clone(
526  jetSource = patJetFinalColl,
527  jetCorrFactorsSource = [jetCorrFactors],
528  )
529  )
530 
531  #
532  # Setup UserDataEmbedder
533  #
534  srcJetsWithUserData = "updatedJets{}WithUserData".format(jetName)
535  setattr(proc, srcJetsWithUserData, cms.EDProducer("PATJetUserDataEmbedder",
536  src = cms.InputTag(srcJets),
537  userFloats = cms.PSet(),
538  userInts = cms.PSet(),
539  )
540  )
541 
542  #
543  # Filter jets with pt cut
544  #
545  finalJetsCut = "(pt >= {ptcut:.0f})".format(ptcut=ptcut)
546  if runOnMC:
547  finalJetsCut = "(pt >= {ptcut:.0f}) || ((pt < {ptcut:.0f}) && (genJetFwdRef().backRef().isNonnull()))".format(ptcut=ptcut)
548 
549  finalJetsForTable = "finalJets{}".format(jetName)
550  setattr(proc, finalJetsForTable, finalJets.clone(
551  src = srcJetsWithUserData,
552  cut = finalJetsCut
553  )
554  )
555 
556  #
557  # Save jets in table
558  #
559  tableContent = PFJETVARS
560  if doCalo:
561  tableContent = CALOJETVARS
562 
563  jetTableCutDefault = "" #Don't apply any cuts for the table.
564 
565  jetTableDocDefault = jetTableDoc + " with JECs applied. Jets with pt >= {ptcut:.0f} GeV are stored.".format(ptcut=ptcut)
566  if runOnMC:
567  jetTableDocDefault += "For jets with pt < {ptcut:.0f} GeV, only those matched to gen jets are stored.".format(ptcut=ptcut)
568 
569  if doCalo:
570  jetTableDocDefault = jetTableDoc
571 
572  jetTableName = "jet{}Table".format(jetName)
573  setattr(proc,jetTableName, simplePATJetFlatTableProducer.clone(
574  src = cms.InputTag(finalJetsForTable),
575  cut = cms.string(jetTableCutDefault),
576  name = cms.string(jetTablePrefix),
577  doc = cms.string(jetTableDocDefault),
578  variables = cms.PSet(tableContent)
579  )
580  )
581  getattr(proc,jetTableName).variables.pt.precision=10
582  getattr(proc,jetTableName).variables.rawFactor.precision=10
583 
584  #
585  # Save MC-only jet variables in table
586  #
587  jetMCTableName = "jet{}MCTable".format(jetName)
588  setattr(proc, jetMCTableName, simplePATJetFlatTableProducer.clone(
589  src = cms.InputTag(finalJetsForTable),
590  cut = getattr(proc,jetTableName).cut,
591  name = cms.string(jetTablePrefix),
592  extension = cms.bool(True), # this is an extension table
593  variables = cms.PSet(
594  partonFlavour = PFJETVARS.partonFlavour,
595  hadronFlavour = PFJETVARS.hadronFlavour,
596  genJetIdx = PFJETVARS.genJetIdx,
597  )
598  )
599  )
600 
601  #
602  # Define the jet modules Task first
603  #
604  jetTaskName = "jet{}Task".format(jetName)
605  setattr(proc, jetTaskName, cms.Task(
606  getattr(proc,jetCorrFactors),
607  getattr(proc,srcJets),
608  getattr(proc,srcJetsWithUserData),
609  getattr(proc,finalJetsForTable)
610  )
611  )
612  proc.nanoTableTaskCommon.add(getattr(proc,jetTaskName))
613 
614  #
615  # Define the jet tables Task
616  #
617  jetTableTaskName = "jet{}TablesTask".format(jetName)
618  setattr(proc, jetTableTaskName, cms.Task(getattr(proc,jetTableName)))
619  proc.nanoTableTaskCommon.add(getattr(proc,jetTableTaskName))
620 
621  jetMCTableTaskName = "jet{}MCTablesTask".format(jetName)
622  setattr(proc, jetMCTableTaskName, cms.Task(getattr(proc,jetMCTableName)))
623  if runOnMC:
624  proc.nanoTableTaskFS.add(getattr(proc,jetMCTableTaskName))
625 
626  #
627  # Schedule plugins to calculate Jet ID, PileUp Jet ID input variables, and Quark-Gluon Likehood input variables.
628  #
629  if doPF:
630  proc = AddJetID(proc, jetName=jetName, jetSrc=srcJets, jetTableName=jetTableName, jetTaskName=jetTaskName)
631  if doPUIDVar:
632  proc = AddPileUpJetIDVars(proc, jetName=jetName, jetSrc=srcJets, jetTableName=jetTableName, jetTaskName=jetTaskName)
633  if doQGL:
634  proc = AddQGLTaggerVars(proc,jetName=jetName, jetSrc=srcJets, jetTableName=jetTableName, jetTaskName=jetTaskName, calculateQGLVars=True)
635 
636  #
637  # Save b-tagging algorithm scores. Should only be done for jet collection with b-tagging
638  # calculated when reclustered or collection saved with b-tagging info in MiniAOD
639  #
640  if doBTag:
641  AddBTaggingScores(proc,jetTableName=jetTableName)
642  AddDeepJetGluonLQuarkScores(proc,jetTableName=jetTableName)
643  AddParticleNetAK4Scores(proc,jetTableName=jetTableName)
644  AddRobustParTAK4Scores(proc,jetTableName=jetTableName)
645  AddUnifiedParTAK4Scores(proc,jetTableName=jetTableName)
646 
647  return proc
648 
649 
650 def ReclusterAK4PuppiJets(proc, recoJA, runOnMC):
651  """
652  Recluster AK4 Puppi jets and replace slimmedJetsPuppi
653  that is used as default to save AK4 Puppi jets in NanoAODs.
654  """
655  print("custom_jme_cff::ReclusterAK4PuppiJets: Recluster AK4 PF Puppi jets")
656 
657  #
658  # Recluster AK4 Puppi jets
659  #
660  cfg = {
661  "jet" : "ak4pfpuppi",
662  "inputCollection" : "",
663  "genJetsCollection": "AK4GenJetsNoNu",
664  "bTagDiscriminators": bTagDiscriminatorsForAK4,
665  "minPtFastjet" : 0.,
666  }
667  recoJetInfo = recoJA.addRecoJetCollection(proc, **cfg)
668 
669  jetName = recoJetInfo.jetUpper
670  patJetFinalColl = recoJetInfo.patJetFinalCollection
671 
672  #
673  # Set the jetID for UL 16 era
674  #
675  run2_jme_2016.toModify(
676  proc.tightJetPuppiId.filterParams, version = "RUN2UL16PUPPI"
677  ).toModify(
678  proc.tightJetIdLepVeto.filterParams, version = "RUN2UL16PUPPI"
679  )
680 
681  #
682  # Change the input jet source for jetCorrFactorsNano
683  # and updatedJets
684  #
685  proc.jetPuppiCorrFactorsNano.src=patJetFinalColl
686  proc.updatedJetsPuppi.jetSource=patJetFinalColl
687 
688  #
689  # Change pt cut
690  #
691  finalJetsPuppiCut = ""
692  if runOnMC:
693  finalJetsPuppiCut = "(pt >= 8) || ((pt < 8) && (genJetFwdRef().backRef().isNonnull()))"
694  else:
695  finalJetsPuppiCut = "(pt >= 8)"
696 
697  proc.finalJetsPuppi.cut = finalJetsPuppiCut
698  #
699  # Add a minimum pt cut for corrT1METJets.
700  #
701  proc.corrT1METJetPuppiTable.cut = "pt>=8 && pt<15 && abs(eta)<9.9"
702 
703  #
704  # Jet table
705  #
706  # For Run-2 eras, the main AK4 jet collection in NanoAOD is the CHS collection
707  run2_nanoAOD_ANY.toModify(
708  proc.jetTable, name = "Jet"
709  ).toModify(
710  # So need to change the table name for AK4 puppi here
711  proc.jetPuppiTable,
712  name = "JetPuppi",
713  src = cms.InputTag("finalJetsPuppi")
714  )
715 
716  #
717  # Jet table documentation
718  #
719  jetPuppiTableDoc = "AK4 PF Puppi jets with JECs applied. Jets with pt >= 8 GeV are stored."
720  if runOnMC:
721  jetPuppiTableDoc += "For jets with pt < 8 GeV, only those matched to AK4 Gen jets are stored."
722  proc.jetPuppiTable.doc = jetPuppiTableDoc
723 
724  proc.jetPuppiTable.variables.rawFactor.precision = 10
725 
726  #
727  # Add variables
728  #
729  proc.jetPuppiTable.variables.chHadMultiplicity = PFJETVARS.chHadMultiplicity
730  proc.jetPuppiTable.variables.neHadMultiplicity = PFJETVARS.neHadMultiplicity
731  proc.jetPuppiTable.variables.hfHadMultiplicity = PFJETVARS.hfHadMultiplicity
732  proc.jetPuppiTable.variables.hfEMMultiplicity = PFJETVARS.hfEMMultiplicity
733  proc.jetPuppiTable.variables.muMultiplicity = PFJETVARS.muMultiplicity
734  proc.jetPuppiTable.variables.elMultiplicity = PFJETVARS.elMultiplicity
735  proc.jetPuppiTable.variables.phoMultiplicity = PFJETVARS.phoMultiplicity
736 
737  #
738  # Add variables for pileup jet ID studies.
739  #
740 
741  proc = AddPileUpJetIDVars(proc,
742  jetName = jetName,
743  jetSrc = "updatedJetsPuppi",
744  jetTableName = "jetPuppiTable",
745  jetTaskName = "jetPuppiTask"
746  )
747  #
748  # Add variables for quark guon likelihood tagger studies.
749  # Save variables as userFloats and userInts in each jet
750  #
751  proc = AddQGLTaggerVars(proc,
752  jetName = jetName,
753  jetSrc = "updatedJetsPuppi",
754  jetTableName = "jetPuppiTable",
755  jetTaskName = "jetPuppiTask",
756  calculateQGLVars=True
757  )
758  #
759  # Save DeepJet b-tagging and c-tagging variables
760  #
761  proc.jetPuppiTable.variables.btagDeepFlavB = DEEPJETVARS.btagDeepFlavB
762  proc.jetPuppiTable.variables.btagDeepFlavCvL = DEEPJETVARS.btagDeepFlavCvL
763  proc.jetPuppiTable.variables.btagDeepFlavCvB = DEEPJETVARS.btagDeepFlavCvB
764  #
765  # Save DeepJet raw score for gluon and light quarks
766  #
767  proc.jetPuppiTable.variables.btagDeepFlavG = DEEPJETVARS.btagDeepFlavG
768  proc.jetPuppiTable.variables.btagDeepFlavUDS = DEEPJETVARS.btagDeepFlavUDS
769  proc.jetPuppiTable.variables.btagDeepFlavQG = DEEPJETVARS.btagDeepFlavQG
770  #
771  # Save RobustParTAK4 b-tagging and c-tagging variables
772  #
773  proc.jetPuppiTable.variables.btagRobustParTAK4B = ROBUSTPARTAK4VARS.btagRobustParTAK4B
774  proc.jetPuppiTable.variables.btagRobustParTAK4CvL = ROBUSTPARTAK4VARS.btagRobustParTAK4CvL
775  proc.jetPuppiTable.variables.btagRobustParTAK4CvB = ROBUSTPARTAK4VARS.btagRobustParTAK4CvB
776  #
777  # Save UnifiedParTAK4 b-tagging and c-tagging variables
778  #
779  proc.jetPuppiTable.variables.btagUParTAK4B = UNIFIEDPARTAK4VARS.btagUParTAK4B
780  proc.jetPuppiTable.variables.btagUParTAK4CvL = UNIFIEDPARTAK4VARS.btagUParTAK4CvL
781  proc.jetPuppiTable.variables.btagUParTAK4CvB = UNIFIEDPARTAK4VARS.btagUParTAK4CvB
782  proc.jetPuppiTable.variables.btagUParTAK4TauVJet = UNIFIEDPARTAK4VARS.btagUParTAK4TauVJet
783  proc.jetPuppiTable.variables.UParTAK4RegPtRawCorr = UNIFIEDPARTAK4VARS.UParTAK4RegPtRawCorr
784  proc.jetPuppiTable.variables.UParTAK4RegPtRawCorrNeutrino = UNIFIEDPARTAK4VARS.UParTAK4RegPtRawCorrNeutrino
785  proc.jetPuppiTable.variables.UParTAK4RegPtRawRes = UNIFIEDPARTAK4VARS.UParTAK4RegPtRawRes
786  #
787  # For Run-2 eras, don't need to save the low pt AK4 Puppi jet table for MET
788  #
789  run2_nanoAOD_ANY.toReplaceWith(
790  proc.jetPuppiForMETTask,
791  proc.jetPuppiForMETTask.copyAndExclude([proc.corrT1METJetPuppiTable])
792  )
793 
794  #
795  # Save MC-only jet variables in jet table
796  #
797  if runOnMC:
798  jetMCTableName = "jet{}MCTable".format(jetName)
799  setattr(proc, jetMCTableName, proc.jetMCTable.clone(
800  src = proc.jetPuppiTable.src,
801  name = proc.jetPuppiTable.name
802  )
803  )
804  getattr(proc,jetMCTableName).variables.genJetIdx = PFJETVARS.genJetIdx
805 
806  jetMCTableTaskName = "jet{}MCTablesTask".format(jetName)
807  setattr(proc, jetMCTableTaskName, cms.Task(getattr(proc,jetMCTableName)))
808 
809  run2_nanoAOD_ANY.toReplaceWith(
810  proc.nanoTableTaskFS,
811  proc.nanoTableTaskFS.copyAndAdd( getattr(proc,jetMCTableTaskName))
812  )
813 
814  return proc
815 
816 def ReclusterAK4CHSJets(proc, recoJA, runOnMC):
817  """
818  Recluster AK4 CHS jets and replace slimmedJets that is used as default to
819  save AK4 CHS jets in NanoAODs (for Run-2).
820  """
821  print("custom_jme_cff::ReclusterAK4CHSJets: Recluster AK4 PF CHS jets")
822 
823  from RecoBTag.ONNXRuntime.pfParticleNetFromMiniAODAK4_cff import _pfParticleNetFromMiniAODAK4CHSCentralJetTagsAll
824  from RecoBTag.ONNXRuntime.pfParticleNetFromMiniAODAK4_cff import _pfParticleNetFromMiniAODAK4CHSForwardJetTagsAll
825 
826  bTagDiscriminatorsForAK4CHS = cms.PSet(
827  foo = cms.vstring(_pfParticleNetFromMiniAODAK4CHSCentralJetTagsAll+_pfParticleNetFromMiniAODAK4CHSForwardJetTagsAll)
828  )
829  bTagDiscriminatorsForAK4CHS = bTagDiscriminatorsForAK4CHS.foo.value()
830 
831  #
832  # Recluster AK4 CHS jets
833  #
834  cfg = {
835  "jet" : "ak4pfchs",
836  "inputCollection" : "",
837  "genJetsCollection": "AK4GenJetsNoNu",
838  "bTagDiscriminators": bTagDiscriminatorsForAK4CHS,
839  "minPtFastjet" : 0.,
840  }
841  recoJetInfo = recoJA.addRecoJetCollection(proc, **cfg)
842 
843  jetName = recoJetInfo.jetUpper
844  patJetFinalColl = recoJetInfo.patJetFinalCollection
845 
846  #
847  # Change the input jet source for jetCorrFactorsNano
848  # and updatedJets
849  #
850  proc.jetCorrFactorsNano.src=patJetFinalColl
851  proc.updatedJets.jetSource=patJetFinalColl
852 
853  #
854  # Change pt cut
855  #
856  finalJetsCut = ""
857  if runOnMC:
858  finalJetsCut = "(pt >= 10) || ((pt < 10) && (genJetFwdRef().backRef().isNonnull()))"
859  else:
860  finalJetsCut = "(pt >= 10)"
861 
862  proc.finalJets.cut = finalJetsCut
863  #
864  # Add a minimum pt cut for corrT1METJets.
865  #
866  proc.corrT1METJetTable.cut = "pt>=10 && pt<15 && abs(eta)<9.9"
867 
868  #
869  # Jet table cut
870  #
871  jetTableCut = "" # must not have any cut at the jetTable for AK4 CHS as it has been cross-cleaned
872  proc.jetTable.src = cms.InputTag("finalJets")
873  proc.jetTable.cut = jetTableCut
874  proc.jetMCTable.cut = jetTableCut
875  proc.jetTable.name = "JetCHS"
876 
877  #
878  # For Run-2 eras, the main AK4 jet collection in NanoAOD is the CHS collection
879  #
880  run2_nanoAOD_ANY.toModify(
881  proc.jetTable,
882  src = cms.InputTag("linkedObjects","jets"),
883  name = "Jet"
884  )
885 
886  #
887  # Jet table documentation
888  #
889  jetTableDoc = "AK4 PF CHS jets with JECs applied. Jets with pt >= 10 GeV are stored."
890  if runOnMC:
891  jetTableDoc += "For jets with pt < 10 GeV, only those matched to AK4 Gen jets are stored."
892  proc.jetTable.doc = jetTableDoc
893 
894  proc.jetTable.variables.rawFactor.precision = 10
895 
896  #
897  # Add variables
898  #
899  proc.jetTable.variables.chHadMultiplicity = PFJETVARS.chHadMultiplicity
900  proc.jetTable.variables.neHadMultiplicity = PFJETVARS.neHadMultiplicity
901  proc.jetTable.variables.hfHadMultiplicity = PFJETVARS.hfHadMultiplicity
902  proc.jetTable.variables.hfEMMultiplicity = PFJETVARS.hfEMMultiplicity
903  proc.jetTable.variables.muMultiplicity = PFJETVARS.muMultiplicity
904  proc.jetTable.variables.elMultiplicity = PFJETVARS.elMultiplicity
905  proc.jetTable.variables.phoMultiplicity = PFJETVARS.phoMultiplicity
906 
907  #
908  # Add charged energy fraction from other primary vertices
909  #
910  proc.updatedJetsWithUserData.userFloats.chFPV1EF = cms.InputTag("jercVars:chargedFromPV1EnergyFraction")
911  proc.updatedJetsWithUserData.userFloats.chFPV2EF = cms.InputTag("jercVars:chargedFromPV2EnergyFraction")
912  proc.updatedJetsWithUserData.userFloats.chFPV3EF = cms.InputTag("jercVars:chargedFromPV3EnergyFraction")
913  proc.jetTable.variables.chFPV1EF = Var("userFloat('chFPV1EF')", float, doc="charged fromPV==1 Energy Fraction (component of the total charged Energy Fraction).", precision= 6)
914  proc.jetTable.variables.chFPV2EF = Var("userFloat('chFPV2EF')", float, doc="charged fromPV==2 Energy Fraction (component of the total charged Energy Fraction).", precision= 6)
915  proc.jetTable.variables.chFPV3EF = Var("userFloat('chFPV3EF')", float, doc="charged fromPV==3 Energy Fraction (component of the total charged Energy Fraction).", precision= 6)
916 
917  #
918  # Remove these tagger branches since for CHS, we just want to store
919  # one tagger only.
920  #
921  for varNames in proc.jetTable.variables.parameterNames_():
922  if "btagDeepFlav" in varNames or "btagRobustParT" in varNames or "btagUParT" in varNames:
923  delattr(proc.jetTable.variables, varNames)
924 
925  proc.jetTable.variables.btagPNetB = Var("?pt>15 && bDiscriminator('pfParticleNetFromMiniAODAK4CHSCentralDiscriminatorsJetTags:BvsAll')>0?bDiscriminator('pfParticleNetFromMiniAODAK4CHSCentralDiscriminatorsJetTags:BvsAll'):-1",float,precision=10,doc="ParticleNet b vs. udscg")
926  proc.jetTable.variables.btagPNetCvL = Var("?pt>15 && bDiscriminator('pfParticleNetFromMiniAODAK4CHSCentralDiscriminatorsJetTags:CvsL')>0?bDiscriminator('pfParticleNetFromMiniAODAK4CHSCentralDiscriminatorsJetTags:CvsL'):-1",float,precision=10,doc="ParticleNet c vs. udsg")
927  proc.jetTable.variables.btagPNetCvB = Var("?pt>15 && bDiscriminator('pfParticleNetFromMiniAODAK4CHSCentralDiscriminatorsJetTags:CvsB')>0?bDiscriminator('pfParticleNetFromMiniAODAK4CHSCentralDiscriminatorsJetTags:CvsB'):-1",float,precision=10,doc="ParticleNet c vs. b")
928  proc.jetTable.variables.btagPNetQvG = Var("?pt>15 && abs(eta())<2.5?bDiscriminator('pfParticleNetFromMiniAODAK4CHSCentralDiscriminatorsJetTags:QvsG'):bDiscriminator('pfParticleNetFromMiniAODAK4CHSForwardDiscriminatorsJetTags:QvsG')",float,precision=10,doc="ParticleNet q (udsbc) vs. g")
929  proc.jetTable.variables.btagPNetTauVJet = Var("?pt>15 && bDiscriminator('pfParticleNetFromMiniAODAK4CHSCentralDiscriminatorsJetTags:TauVsJet')>0?bDiscriminator('pfParticleNetFromMiniAODAK4CHSCentralDiscriminatorsJetTags:TauVsJet'):-1",float,precision=10,doc="ParticleNet tau vs. jet")
930  proc.jetTable.variables.PNetRegPtRawCorr = Var("?pt>15 && abs(eta())<2.5?bDiscriminator('pfParticleNetFromMiniAODAK4CHSCentralJetTags:ptcorr'):bDiscriminator('pfParticleNetFromMiniAODAK4CHSForwardJetTags:ptcorr')",float,precision=10,doc="ParticleNet universal flavor-aware visible pT regression (no neutrinos), correction relative to raw jet pT")
931  proc.jetTable.variables.PNetRegPtRawCorrNeutrino = Var("?pt>15 && abs(eta())<2.5?bDiscriminator('pfParticleNetFromMiniAODAK4CHSCentralJetTags:ptnu'):bDiscriminator('pfParticleNetFromMiniAODAK4CHSForwardJetTags:ptnu')",float,precision=10,doc="ParticleNet universal flavor-aware pT regression neutrino correction, relative to visible. To apply full regression, multiply raw jet pT by both PNetRegPtRawCorr and PNetRegPtRawCorrNeutrino.")
932  proc.jetTable.variables.PNetRegPtRawRes = Var("?pt>15 && abs(eta())<2.5?0.5*(bDiscriminator('pfParticleNetFromMiniAODAK4CHSCentralJetTags:ptreshigh')-bDiscriminator('pfParticleNetFromMiniAODAK4CHSCentralJetTags:ptreslow')):0.5*(bDiscriminator('pfParticleNetFromMiniAODAK4CHSForwardJetTags:ptreshigh')-bDiscriminator('pfParticleNetFromMiniAODAK4CHSForwardJetTags:ptreslow'))",float,precision=10,doc="ParticleNet universal flavor-aware jet pT resolution estimator, (q84 - q16)/2")
933 
934 
935  #Adding hf shower shape producer to the jet sequence. By default this producer is not automatically rerun at the NANOAOD step
936  #The following lines make sure it is.
937  hfJetShowerShapeforCustomNanoAOD = "hfJetShowerShapeforCustomNanoAOD"
938  setattr(proc, hfJetShowerShapeforCustomNanoAOD, hfJetShowerShape.clone(jets="updatedJets", vertices="offlineSlimmedPrimaryVertices") )
939  proc.jetUserDataTask.add(getattr(proc, hfJetShowerShapeforCustomNanoAOD))
940  proc.updatedJetsWithUserData.userFloats.hfsigmaEtaEta = cms.InputTag('hfJetShowerShapeforCustomNanoAOD:sigmaEtaEta')
941  proc.updatedJetsWithUserData.userFloats.hfsigmaPhiPhi = cms.InputTag('hfJetShowerShapeforCustomNanoAOD:sigmaPhiPhi')
942  proc.updatedJetsWithUserData.userInts.hfcentralEtaStripSize = cms.InputTag('hfJetShowerShapeforCustomNanoAOD:centralEtaStripSize')
943  proc.updatedJetsWithUserData.userInts.hfadjacentEtaStripsSize = cms.InputTag('hfJetShowerShapeforCustomNanoAOD:adjacentEtaStripsSize')
944  proc.jetTable.variables.hfsigmaEtaEta = Var("userFloat('hfsigmaEtaEta')",float,doc="sigmaEtaEta for HF jets (noise discriminating variable)",precision=10)
945  proc.jetTable.variables.hfsigmaPhiPhi = Var("userFloat('hfsigmaPhiPhi')",float,doc="sigmaPhiPhi for HF jets (noise discriminating variable)",precision=10)
946  proc.jetTable.variables.hfcentralEtaStripSize = Var("userInt('hfcentralEtaStripSize')", int, doc="eta size of the central tower strip in HF (noise discriminating variable) ")
947  proc.jetTable.variables.hfadjacentEtaStripsSize = Var("userInt('hfadjacentEtaStripsSize')", int, doc="eta size of the strips next to the central tower strip in HF (noise discriminating variable) ")
948 
949  #
950  # Since AK4 Puppi jet is the main AK4 jet collection for Run-3, disable
951  # b-jets/c-jets NN-based mass regression for AK4 CHS.
952  #
953  (~run2_nanoAOD_ANY).toReplaceWith(
954  proc.jetUserDataTask,
955  proc.jetUserDataTask.copyAndExclude([proc.bJetVars])
956  ).toReplaceWith(
957  proc.jetTablesTask,
958  proc.jetTablesTask.copyAndExclude([proc.bjetNN, proc.cjetNN])
959  ).toModify(proc.updatedJetsWithUserData.userFloats,
960  leadTrackPt = None,
961  leptonPtRelv0 = None,
962  leptonPtRelInvv0 = None,
963  leptonDeltaR = None,
964  vtxPt = None,
965  vtxMass = None,
966  vtx3dL = None,
967  vtx3deL = None,
968  ptD = None,
969  ).toModify(
970  proc.updatedJetsWithUserData.userInts,
971  vtxNtrk = None,
972  leptonPdgId = None
973  ).toModify(
974  proc.jetTable, externalVariables = cms.PSet()
975  ).toReplaceWith(
976  #
977  # For Run-3, don't need to save the low pt AK4 CHS jet table for MET
978  #
979  proc.jetForMETTask,
980  proc.jetForMETTask.copyAndExclude([proc.corrT1METJetTable])
981  )
982 
983  #
984  # Save MC-only jet variables in jet table
985  #
986  if runOnMC:
987  jetMCTableName = "jet{}MCTable".format(jetName)
988  setattr(proc, jetMCTableName, proc.jetMCTable.clone(
989  src = proc.jetTable.src,
990  name = proc.jetTable.name
991  )
992  )
993  getattr(proc,jetMCTableName).variables.genJetIdx = PFJETVARS.genJetIdx
994 
995  jetMCTableTaskName = "jet{}MCTablesTask".format(jetName)
996  setattr(proc, jetMCTableTaskName, cms.Task(getattr(proc,jetMCTableName)))
997 
998  (~run2_nanoAOD_ANY).toReplaceWith(
999  proc.nanoTableTaskFS,
1000  proc.nanoTableTaskFS.copyAndAdd(getattr(proc,jetMCTableTaskName))
1001  )
1002 
1003  return proc
1004 
1005 def AddNewAK8PuppiJetsForJEC(proc, recoJA, runOnMC):
1006  """
1007  Store a separate AK8 Puppi jet collection for JEC studies.
1008  Only minimal info are stored
1009  """
1010  print("custom_jme_cff::AddNewAK8PuppiJetsForJEC: Make a new AK8 PF Puppi jet collection for JEC studies")
1011 
1012  #
1013  # Recluster AK8 Puppi jets
1014  #
1015  cfg = {
1016  "jet" : "ak8pfpuppi",
1017  "inputCollection" : "",
1018  "genJetsCollection": "AK8GenJetsNoNu",
1019  "minPtFastjet" : 0., # Remove any pt threshold at the jet clustering stage.
1020  }
1021  recoJetInfo = recoJA.addRecoJetCollection(proc, **cfg)
1022 
1023  jetName = recoJetInfo.jetUpper
1024  payload = recoJetInfo.jetCorrPayload
1025 
1026  patJetFinalColl = recoJetInfo.patJetFinalCollection
1027  jetTablePrefix = "FatJetForJEC"
1028  jetTableDoc = "AK8 PF Puppi jets with JECs applied. Reclustered for JEC studies so only minimal info stored."
1029  ptcut = 15
1030 
1031  SavePatJets(proc,
1032  jetName, payload, patJetFinalColl, jetTablePrefix, jetTableDoc, doPF=True,
1033  doCalo=False, ptcut=ptcut, doPUIDVar=False, doQGL=False, doBTag=False, runOnMC=runOnMC
1034  )
1035 
1036  return proc
1037 
1038 def AddNewAK8CHSJets(proc, recoJA, runOnMC):
1039  """
1040  Store an AK8 CHS jet collection for JEC studies.
1041  """
1042  print("custom_jme_cff::AddNewAK8CHSJets: Make a new AK8 PF CHS jet collection for JEC studies")
1043 
1044  #
1045  # Recluster AK8 CHS jets
1046  #
1047  cfg = {
1048  "jet" : "ak8pfchs",
1049  "inputCollection" : "",
1050  "genJetsCollection": "AK8GenJetsNoNu",
1051  "minPtFastjet" : 0., # Remove any pt threshold at the jet clustering stage.
1052  }
1053  recoJetInfo = recoJA.addRecoJetCollection(proc, **cfg)
1054 
1055  jetName = recoJetInfo.jetUpper
1056  payload = recoJetInfo.jetCorrPayload
1057 
1058  patJetFinalColl = recoJetInfo.patJetFinalCollection
1059  jetTablePrefix = "FatJetCHS"
1060  jetTableDoc = "AK8 PF CHS jets with JECs applied. Reclustered for JEC studies so only minimal info stored."
1061  ptcut = 15
1062 
1063  SavePatJets(proc,
1064  jetName, payload, patJetFinalColl, jetTablePrefix, jetTableDoc, doPF=True,
1065  doCalo=False, ptcut=ptcut, doPUIDVar=False, doQGL=False, doBTag=False, runOnMC=runOnMC
1066  )
1067 
1068  return proc
1069 
1071  """
1072  Add more variables for AK8 PFPUPPI jets
1073  """
1074 
1075  proc.fatJetTable.variables.rawFactor.precision = 10
1076 
1077  #
1078  # These variables are not stored for AK8PFPUPPI (slimmedJetsAK8)
1079  # in MiniAOD if their pt < 170 GeV. Hence the conditional fill.
1080  #
1081  proc.fatJetTable.variables.chHEF = Var("?isPFJet()?chargedHadronEnergyFraction():-1", float, doc="charged Hadron Energy Fraction", precision = 6)
1082  proc.fatJetTable.variables.neHEF = Var("?isPFJet()?neutralHadronEnergyFraction():-1", float, doc="neutral Hadron Energy Fraction", precision = 6)
1083  proc.fatJetTable.variables.chEmEF = Var("?isPFJet()?chargedEmEnergyFraction():-1", float, doc="charged Electromagnetic Energy Fraction", precision = 6)
1084  proc.fatJetTable.variables.neEmEF = Var("?isPFJet()?neutralEmEnergyFraction():-1", float, doc="neutral Electromagnetic Energy Fraction", precision = 6)
1085  proc.fatJetTable.variables.muEF = Var("?isPFJet()?muonEnergyFraction():-1", float, doc="muon Energy Fraction", precision = 6)
1086  proc.fatJetTable.variables.hfHEF = Var("?isPFJet()?HFHadronEnergyFraction():-1", float, doc="energy fraction in forward hadronic calorimeter", precision = 6)
1087  proc.fatJetTable.variables.hfEmEF = Var("?isPFJet()?HFEMEnergyFraction():-1", float, doc="energy fraction in forward EM calorimeter", precision = 6)
1088  proc.fatJetTable.variables.chHadMultiplicity = Var("?isPFJet()?chargedHadronMultiplicity():-1","int16", doc="(Puppi-weighted) number of charged hadrons in the jet")
1089  proc.fatJetTable.variables.neHadMultiplicity = Var("?isPFJet()?neutralHadronMultiplicity():-1","int16", doc="(Puppi-weighted) number of neutral hadrons in the jet")
1090  proc.fatJetTable.variables.hfHadMultiplicity = Var("?isPFJet()?HFHadronMultiplicity():-1", "int16", doc="(Puppi-weighted) number of HF Hadrons in the jet")
1091  proc.fatJetTable.variables.hfEMMultiplicity = Var("?isPFJet()?HFEMMultiplicity():-1", "int16", doc="(Puppi-weighted) number of HF EMs in the jet")
1092  proc.fatJetTable.variables.muMultiplicity = Var("?isPFJet()?muonMultiplicity():-1", "int16", doc="(Puppi-weighted) number of muons in the jet")
1093  proc.fatJetTable.variables.elMultiplicity = Var("?isPFJet()?electronMultiplicity():-1", "int16", doc="(Puppi-weighted) number of electrons in the jet")
1094  proc.fatJetTable.variables.phoMultiplicity = Var("?isPFJet()?photonMultiplicity():-1", "int16", doc="(Puppi-weighted) number of photons in the jet")
1095 
1096  return proc
1097 #******************************************
1098 #
1099 #
1100 # Gen Jets related functions
1101 #
1102 #
1103 #******************************************
1104 def AddNewGenJets(proc, genJetInfo):
1105  """
1106  Add genJet into custom nanoAOD
1107  """
1108 
1109  genJetName = genJetInfo.jetUpper
1110  genJetAlgo = genJetInfo.jetAlgo
1111  genJetSize = genJetInfo.jetSize
1112  genJetSizeNr = genJetInfo.jetSizeNr
1113  genJetFinalColl = "{}{}{}".format(genJetAlgo.upper(), genJetSize, "GenJetsNoNu")
1114  genJetTablePrefix = nanoInfo_genjets[genJetInfo.jet]["name"]
1115  genJetTableDoc = nanoInfo_genjets[genJetInfo.jet]["doc"]
1116 
1117  SaveGenJets(proc, genJetName, genJetAlgo, genJetSizeNr, genJetFinalColl, genJetTablePrefix, genJetTableDoc, runOnMC=False)
1118 
1119  return proc
1120 
1121 def SaveGenJets(proc, genJetName, genJetAlgo, genJetSizeNr, genJetFinalColl, genJetTablePrefix, genJetTableDoc, runOnMC=False):
1122  """
1123  Schedule modules for a given genJet collection and save its variables into custom NanoAOD
1124  """
1125 
1126  genJetTableName = "jet{}Table".format(genJetName)
1127  setattr(proc, genJetTableName, genJetTable.clone(
1128  src = genJetFinalColl,
1129  cut = "", # No cut specified here. Save all gen jets after clustering
1130  name = genJetTablePrefix,
1131  doc = genJetTableDoc,
1132  variables = GENJETVARS
1133  )
1134  )
1135 
1136  genJetFlavourAssociationName = "genJet{}FlavourAssociation".format(genJetName)
1137  setattr(proc, genJetFlavourAssociationName, genJetFlavourAssociation.clone(
1138  jets = getattr(proc,genJetTableName).src,
1139  jetAlgorithm = supportedJetAlgos[genJetAlgo],
1140  rParam = genJetSizeNr,
1141  )
1142  )
1143 
1144  genJetFlavourTableName = "genJet{}FlavourTable".format(genJetName)
1145  setattr(proc, genJetFlavourTableName, genJetFlavourTable.clone(
1146  name = getattr(proc,genJetTableName).name,
1147  src = getattr(proc,genJetTableName).src,
1148  cut = getattr(proc,genJetTableName).cut,
1149  jetFlavourInfos = genJetFlavourAssociationName,
1150  )
1151  )
1152 
1153  genJetTaskName = "genJet{}Task".format(genJetName)
1154  setattr(proc, genJetTaskName, cms.Task(
1155  getattr(proc,genJetTableName),
1156  getattr(proc,genJetFlavourAssociationName),
1157  getattr(proc,genJetFlavourTableName)
1158  )
1159  )
1160  proc.jetMCTask.add(getattr(proc,genJetTaskName))
1161 
1162  return proc
1163 
1164 def ReclusterAK4GenJets(proc, genJA):
1165  """
1166  Recluster AK4 Gen jets and replace
1167  slimmedGenJets that is used as default
1168  to save AK4 Gen jets in NanoAODs.
1169  """
1170  print("custom_jme_cff::ReclusterAK4GenJets: Recluster AK4 Gen jets")
1171 
1172  #
1173  # Recluster AK4 Gen jet
1174  #
1175  cfg = {
1176  "jet" : "ak4gen",
1177  "minPtFastjet" : 5.
1178  }
1179  genJetInfo = genJA.addGenJetCollection(proc, **cfg)
1180 
1181  genJetName = genJetInfo.jetUpper
1182  genJetAlgo = genJetInfo.jetAlgo
1183  genJetSize = genJetInfo.jetSize
1184  genJetSizeNr = genJetInfo.jetSizeNr
1185  selectedGenJets = "{}{}{}".format(genJetAlgo.upper(), genJetSize, "GenJetsNoNu")
1186 
1187  #
1188  # Change jet source to the newly clustered jet collection. Set very low pt cut for jets
1189  # to be stored in the GenJet Table
1190  #
1191  proc.genJetTable.src = selectedGenJets
1192  proc.genJetTable.cut = "" # No cut specified here. Save all gen jets after clustering
1193  proc.genJetTable.doc = "AK4 Gen jets (made with visible genparticles) with pt > 5 GeV"
1194 
1195  genJetFlavourAssociationName = "genJet{}FlavourAssociation".format(genJetName)
1196  setattr(proc, genJetFlavourAssociationName, genJetFlavourAssociation.clone(
1197  jets = proc.genJetTable.src,
1198  jetAlgorithm = supportedJetAlgos[genJetAlgo],
1199  rParam = genJetSizeNr,
1200  )
1201  )
1202  proc.jetMCTask.add(getattr(proc, genJetFlavourAssociationName))
1203  return proc
1204 
1205 def AddNewAK8GenJetsForJEC(proc, genJA):
1206  """
1207  Make a separate AK8 Gen jet collection for JEC studies.
1208  """
1209  print("custom_jme_cff::AddNewAK8GenJetsForJEC: Add new AK8 Gen jets for JEC studies")
1210 
1211  #
1212  # Recluster AK8 Gen jet
1213  #
1214  cfg = {
1215  "jet" : "ak8gen",
1216  "minPtFastjet" : 10.
1217  }
1218  genJetInfo = genJA.addGenJetCollection(proc, **cfg)
1219 
1220  genJetName = genJetInfo.jetUpper
1221  genJetAlgo = genJetInfo.jetAlgo
1222  genJetSize = genJetInfo.jetSize
1223  genJetSizeNr = genJetInfo.jetSizeNr
1224  genJetFinalColl = "{}{}{}".format(genJetAlgo.upper(), genJetSize, "GenJetsNoNu")
1225  genJetTablePrefix = "GenJetAK8ForJEC"
1226  genJetTableDoc = "AK8 Gen jets (made with visible genparticles) with pt > 10 GeV. Reclustered for JEC studies."
1227 
1228  SaveGenJets(proc, genJetName, genJetAlgo, genJetSizeNr, genJetFinalColl, genJetTablePrefix, genJetTableDoc, runOnMC=False)
1229 
1230  return proc
1231 
1233  proc.genJetTable.variables.nConstituents = GENJETVARS.nConstituents
1234  return proc
1235 
1237  proc.genJetAK8Table.variables.nConstituents = GENJETVARS.nConstituents
1238  return proc
1239 
1241  # Remove the genjet pt selection when saving the genJetIdx, which is
1242  # the default in main Nano
1243  proc.jetMCTable.variables.genJetIdx = PFJETVARS.genJetIdx
1244  return proc
1245 
1246 #===========================================================================
1247 #
1248 # Misc. functions
1249 #
1250 #===========================================================================
1252  """
1253  Remove default pt cuts for all jets set in jets_cff.py
1254  """
1255 
1256  proc.finalJets.cut = "" # 15 -> 10
1257  proc.finalJetsPuppi.cut = "" # 15 -> 10
1258  proc.finalJetsAK8.cut = "" # 170 -> 170
1259  proc.genJetTable.cut = "" # 10 -> 8
1260  proc.genJetFlavourTable.cut = "" # 10 -> 8
1261  proc.genJetAK8Table.cut = "" # 100 -> 80
1262  proc.genJetAK8FlavourTable.cut = "" # 100 -> 80
1263 
1264  return proc
1265 
1267  """
1268  Setup packedpuppi and packedpuppiNoLep to recompute puppi weights
1269  """
1270  if hasattr(proc,"packedpuppi"):
1271  proc.packedpuppi.useExistingWeights = False
1272  if hasattr(proc,"packedpuppiNoLep"):
1273  proc.packedpuppiNoLep.useExistingWeights = False
1274  return proc
1275 
1277  """
1278  Recompute PuppiMET. This is useful when puppi weights are recomputed.
1279  """
1280  runOnMC=True
1281  if hasattr(proc,"NANOEDMAODoutput") or hasattr(proc,"NANOAODoutput"):
1282  runOnMC = False
1283 
1284  from PhysicsTools.PatUtils.tools.runMETCorrectionsAndUncertainties import runMetCorAndUncFromMiniAOD
1285  runMetCorAndUncFromMiniAOD(proc, isData=not(runOnMC),
1286  jetCollUnskimmed='updatedJetsPuppi',metType='Puppi',postfix='Puppi',jetFlavor='AK4PFPuppi',
1287  puppiProducerLabel='packedpuppi',puppiProducerForMETLabel='packedpuppiNoLep',
1288  recoMetFromPFCs=True
1289  )
1290  return proc
1291 
1293  """
1294  Recompute Puppi weights PuppiMET.
1295  """
1296  proc = RecomputePuppiWeights(proc)
1297  proc = RecomputePuppiMET(proc)
1298  return proc
1299 
1300 #===========================================================================
1301 #
1302 # CUSTOMIZATION function
1303 #
1304 #===========================================================================
1306 
1307  runOnMC=True
1308  if hasattr(process,"NANOEDMAODoutput") or hasattr(process,"NANOAODoutput"):
1309  runOnMC = False
1310 
1313  process = RemoveAllJetPtCuts(process)
1314 
1315 
1320  genJA = GenJetAdder()
1321  if runOnMC:
1322 
1325  process = AddVariablesForAK8GenJets(process)
1326 
1329  process = AddNewAK8GenJetsForJEC(process, genJA)
1330 
1333  process = ModifyAK4JetMCTable(process)
1334 
1337  process = ReclusterAK4GenJets(process, genJA)
1338  process = AddVariablesForAK4GenJets(process)
1339 
1342  for jetConfig in config_genjets:
1343  cfg = { k : v for k, v in jetConfig.items() if k != "enabled"}
1344  genJetInfo = genJA.addGenJetCollection(process, **cfg)
1345  AddNewGenJets(process, genJetInfo)
1346 
1347 
1352  recoJA = RecoJetAdder(runOnMC=runOnMC)
1353 
1356  process = AddVariablesForAK8PuppiJets(process)
1357 
1360  process = AddNewAK8PuppiJetsForJEC(process, recoJA, runOnMC)
1361 
1364  process = ReclusterAK4CHSJets(process, recoJA, runOnMC)
1365 
1368  process = ReclusterAK4PuppiJets(process, recoJA, runOnMC)
1369 
1372  for jetConfig in config_recojets:
1373  cfg = { k : v for k, v in jetConfig.items() if k != "enabled"}
1374  recoJetInfo = recoJA.addRecoJetCollection(process, **cfg)
1375  AddNewPatJets(process, recoJetInfo, runOnMC)
1376 
1377 
1382  def addAK4JetTasks(proc, addAK4CHSJetTasks, addAK4PuppiJetTasks):
1383  if addAK4CHSJetTasks:
1384  proc.nanoTableTaskCommon.add(proc.jetTask)
1385  proc.nanoTableTaskCommon.add(proc.jetTablesTask)
1386  proc.nanoTableTaskCommon.add(proc.jetForMETTask)
1387  if addAK4PuppiJetTasks:
1388  proc.nanoTableTaskCommon.add(proc.jetPuppiTask)
1389  proc.nanoTableTaskCommon.add(proc.jetPuppiTablesTask)
1390  proc.nanoTableTaskCommon.add(proc.jetPuppiForMETTask)
1391  return proc
1392 
1393  jmeNano_addAK4JetTasks_switch = cms.PSet(
1394  jmeNano_addAK4CHS_switch = cms.untracked.bool(True),
1395  jmeNano_addAK4Puppi_switch = cms.untracked.bool(False)
1396  )
1397  run2_nanoAOD_ANY.toModify(jmeNano_addAK4JetTasks_switch,
1398  jmeNano_addAK4CHS_switch = False,
1399  jmeNano_addAK4Puppi_switch = True
1400  )
1401  process = addAK4JetTasks(process,
1402  addAK4CHSJetTasks = jmeNano_addAK4JetTasks_switch.jmeNano_addAK4CHS_switch,
1403  addAK4PuppiJetTasks = jmeNano_addAK4JetTasks_switch.jmeNano_addAK4Puppi_switch,
1404  )
1405 
1406 
1409  if runOnMC:
1410  process.puTable.savePtHatMax = True
1411 
1412 
1415  if runOnMC:
1416  process.genWeightsTable.keepAllPSWeights = True
1417 
1418  return process
def AddBTaggingScores(proc, jetTableName="")
def ReclusterAK4CHSJets(proc, recoJA, runOnMC)
def AddUnifiedParTAK4Scores(proc, jetTableName="")
def Var(expr, valtype, doc=None, precision=-1, lazyEval=False)
Definition: common_cff.py:17
def AddQGLTaggerVars(proc, jetName="", jetSrc="", jetTableName="", jetTaskName="", calculateQGLVars=False)
def RemoveAllJetPtCuts(proc)
def AddNewPatJets(proc, recoJetInfo, runOnMC)
def RecomputePuppiWeightsAndMET(proc)
def AddRobustParTAK4Scores(proc, jetTableName="")
def runMetCorAndUncFromMiniAOD(process, metType="PF", jetCollUnskimmed="slimmedJets", photonColl="slimmedPhotons", electronColl="slimmedElectrons", muonColl="slimmedMuons", tauColl="slimmedTaus", pfCandColl="packedPFCandidates", jetFlavor="AK4PFchs", jetCleaning="LepClean", isData=False, manualJetConfig=False, reclusterJets=None, jetSelection="pt>15 && abs(eta)<9.9", recoMetFromPFCs=None, jetCorLabelL3="ak4PFCHSL1FastL2L3Corrector", jetCorLabelRes="ak4PFCHSL1FastL2L3ResidualCorrector", CHS=False, puppiProducerLabel="puppi", puppiProducerForMETLabel="puppiNoLep", reapplyJEC=True, jecUncFile="", computeMETSignificance=True, fixEE2017=False, fixEE2017Params=None, extractDeepMETs=False, campaign="", era="", postfix="")
def ModifyAK4JetMCTable(proc)
def ReclusterAK4GenJets(proc, genJA)
def AddNewAK8CHSJets(proc, recoJA, runOnMC)
def AddNewAK8GenJetsForJEC(proc, genJA)
def SavePatJets(proc, jetName, payload, patJetFinalColl, jetTablePrefix, jetTableDoc, doPF, doCalo, ptcut, doPUIDVar=False, doQGL=False, doBTag=False, runOnMC=False)
def ReclusterAK4PuppiJets(proc, recoJA, runOnMC)
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47
def RecomputePuppiWeights(proc)
def AddDeepJetGluonLQuarkScores(proc, jetTableName="")
def AddJetID(proc, jetName="", jetSrc="", jetTableName="", jetTaskName="")
def AddNewAK8PuppiJetsForJEC(proc, recoJA, runOnMC)
def AddNewGenJets(proc, genJetInfo)
def SaveGenJets(proc, genJetName, genJetAlgo, genJetSizeNr, genJetFinalColl, genJetTablePrefix, genJetTableDoc, runOnMC=False)
def AddVariablesForAK4GenJets(proc)
def AddVariablesForAK8PuppiJets(proc)
def AddParticleNetAK4Scores(proc, jetTableName="")
void add(std::map< std::string, TH1 *> &h, TH1 *hist)
def AddVariablesForAK8GenJets(proc)
def AddPileUpJetIDVars(proc, jetName="", jetSrc="", jetTableName="", jetTaskName="")
def PrepJMECustomNanoAOD(process)
def RecomputePuppiMET(proc)