CMS 3D CMS Logo

nano_cff.py
Go to the documentation of this file.
1 from __future__ import print_function
2 import FWCore.ParameterSet.Config as cms
23 from PhysicsTools.NanoAOD.met_cff import *
31 
32 nanoMetadata = cms.EDProducer("UniqueStringProducer",
33  strings = cms.PSet(
34  tag = cms.string("untagged"),
35  )
36 )
37 
38 linkedObjects = cms.EDProducer("PATObjectCrossLinker",
39  jets=cms.InputTag("finalJetsPuppi"),
40  muons=cms.InputTag("finalMuons"),
41  electrons=cms.InputTag("finalElectrons"),
42  lowPtElectrons=cms.InputTag("finalLowPtElectrons"),
43  taus=cms.InputTag("finalTaus"),
44  photons=cms.InputTag("finalPhotons"),
45 )
46 
47 # Switch to AK4 CHS jets for Run-2
48 run2_nanoAOD_ANY.toModify(linkedObjects, jets="finalJets")
49 
50 simpleCleanerTable = cms.EDProducer("NanoAODSimpleCrossCleaner",
51  name=cms.string("cleanmask"),
52  doc=cms.string("simple cleaning mask with priority to leptons"),
53  jets=cms.InputTag("linkedObjects","jets"),
54  muons=cms.InputTag("linkedObjects","muons"),
55  electrons=cms.InputTag("linkedObjects","electrons"),
56  lowPtElectrons=cms.InputTag("linkedObjects","lowPtElectrons"),
57  taus=cms.InputTag("linkedObjects","taus"),
58  photons=cms.InputTag("linkedObjects","photons"),
59  jetSel=cms.string("pt>15"),
60  muonSel=cms.string("track.isNonnull && isLooseMuon && isPFMuon && innerTrack.validFraction >= 0.49 && ( isGlobalMuon && globalTrack.normalizedChi2 < 3 && combinedQuality.chi2LocalPosition < 12 && combinedQuality.trkKink < 20 && segmentCompatibility >= 0.303 || segmentCompatibility >= 0.451 )"),
61  electronSel=cms.string(""),
62  lowPtElectronSel=cms.string(""),
63  tauSel=cms.string(""),
64  photonSel=cms.string(""),
65  jetName=cms.string("Jet"),muonName=cms.string("Muon"),electronName=cms.string("Electron"),
66  lowPtElectronName=cms.string("LowPtElectron"),
67  tauName=cms.string("Tau"),photonName=cms.string("Photon")
68 )
69 
70 
71 lhcInfoTable = cms.EDProducer("LHCInfoProducer",
72  precision = cms.int32(10),
73 )
74 
75 nanoTableTaskCommon = cms.Task(
76  cms.Task(nanoMetadata),
77  jetPuppiTask, jetPuppiForMETTask, jetAK8Task,
78  extraFlagsProducersTask, muonTask, tauTask, boostedTauTask,
79  electronTask , lowPtElectronTask, photonTask,
80  vertexTask, isoTrackTask, jetAK8LepTask, # must be after all the leptons
81  softActivityTask,
82  cms.Task(linkedObjects),
83  jetPuppiTablesTask, jetAK8TablesTask,
84  muonTablesTask, fsrTablesTask, tauTablesTask, boostedTauTablesTask,
85  electronTablesTask, lowPtElectronTablesTask, photonTablesTask,
86  globalTablesTask, vertexTablesTask, metTablesTask, simpleCleanerTable, extraFlagsTableTask,
87  isoTrackTablesTask,softActivityTablesTask
88 )
89 
90 # Replace AK4 Puppi with AK4 CHS for Run-2
91 _nanoTableTaskCommonRun2 = nanoTableTaskCommon.copy()
92 _nanoTableTaskCommonRun2.replace(jetPuppiTask, jetTask)
93 _nanoTableTaskCommonRun2.replace(jetPuppiForMETTask, jetForMETTask)
94 _nanoTableTaskCommonRun2.replace(jetPuppiTablesTask, jetTablesTask)
95 run2_nanoAOD_ANY.toReplaceWith(nanoTableTaskCommon, _nanoTableTaskCommonRun2)
96 
97 nanoSequenceCommon = cms.Sequence(nanoTableTaskCommon)
98 
99 nanoSequenceOnlyFullSim = cms.Sequence(triggerObjectTablesTask)
100 nanoSequenceOnlyData = cms.Sequence(cms.Sequence(protonTablesTask) + lhcInfoTable)
101 
102 nanoSequence = cms.Sequence(nanoSequenceCommon + nanoSequenceOnlyData + nanoSequenceOnlyFullSim)
103 
104 nanoTableTaskFS = cms.Task(
105  genParticleTask, particleLevelTask, jetMCTask, muonMCTask, electronMCTask, lowPtElectronMCTask, photonMCTask,
106  tauMCTask, boostedTauMCTask,
107  metMCTable, ttbarCatMCProducersTask, globalTablesMCTask, cms.Task(btagWeightTable), ttbarCategoryTableTask,
108  genWeightsTableTask, genVertexTablesTask, genParticleTablesTask, genProtonTablesTask, particleLevelTablesTask
109 )
110 
111 nanoSequenceFS = cms.Sequence(nanoSequenceCommon + cms.Sequence(nanoTableTaskFS))
112 
113 # GenVertex only stored in newer MiniAOD
114 nanoSequenceMC = nanoSequenceFS.copy()
115 nanoSequenceMC.insert(nanoSequenceFS.index(nanoSequenceCommon)+1,nanoSequenceOnlyFullSim)
116 
117 # modifier which adds new tauIDs (currently only deepTauId2017v2p1 is being added)
118 import RecoTauTag.RecoTau.tools.runTauIdMVA as tauIdConfig
119 def nanoAOD_addTauIds(process, idsToRun=[]):
120  if idsToRun: #no-empty list of tauIDs to run
121  updatedTauName = "slimmedTausUpdated"
122  tauIdEmbedder = tauIdConfig.TauIDEmbedder(process, debug = False,
123  updatedTauName = updatedTauName,
124  toKeep = idsToRun)
125  tauIdEmbedder.runTauID()
126  _tauTask = patTauMVAIDsTask.copy()
127  _tauTask.add(process.rerunMvaIsolationTask)
128  _tauTask.add(finalTaus)
129  process.finalTaus.src = updatedTauName
130  #remember to adjust the selection and tables with added IDs
131 
132  process.tauTask = _tauTask.copy()
133 
134  return process
135 
136 def nanoAOD_addBoostedTauIds(process, idsToRun=[]):
137  if idsToRun: #no-empty list of tauIDs to run
138  updatedBoostedTauName = "slimmedTausBoostedNewID"
139  boostedTauIdEmbedder = tauIdConfig.TauIDEmbedder(process, debug = False,
140  originalTauName = "slimmedTausBoosted",
141  updatedTauName = updatedBoostedTauName,
142  postfix = "Boosted",
143  toKeep = idsToRun)
144  boostedTauIdEmbedder.runTauID()
145  _boostedTauTask = process.rerunMvaIsolationTaskBoosted.copy()
146  _boostedTauTask.add(getattr(process, updatedBoostedTauName))
147  _boostedTauTask.add(process.finalBoostedTaus)
148  process.finalBoostedTaus.src = updatedBoostedTauName
149  #remember to adjust the selection and tables with added IDs
150 
151  process.boostedTauTask = _boostedTauTask.copy()
152 
153  return process
154 
155 from PhysicsTools.PatUtils.tools.runMETCorrectionsAndUncertainties import runMetCorAndUncFromMiniAOD
156 def nanoAOD_recalibrateMETs(process,isData):
157  # add DeepMETs
158  nanoAOD_DeepMET_switch = cms.PSet(
159  ResponseTune_Graph = cms.untracked.string('RecoMET/METPUSubtraction/data/deepmet/deepmet_resp_v1_2018.pb')
160  )
161  for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016:
162  modifier.toModify(nanoAOD_DeepMET_switch, ResponseTune_Graph=cms.untracked.string("RecoMET/METPUSubtraction/data/deepmet/deepmet_resp_v1_2016.pb"))
163 
164  print("add DeepMET Producers")
165  process.load('RecoMET.METPUSubtraction.deepMETProducer_cfi')
166  process.deepMETsResolutionTune = process.deepMETProducer.clone()
167  process.deepMETsResponseTune = process.deepMETProducer.clone()
168  process.deepMETsResponseTune.graph_path = nanoAOD_DeepMET_switch.ResponseTune_Graph.value()
169 
170  runMetCorAndUncFromMiniAOD(process,isData=isData)
171  process.nanoSequenceCommon.insert(2,cms.Sequence(process.fullPatMetSequence))
172 
173 
174  from PhysicsTools.PatAlgos.slimming.puppiForMET_cff import makePuppiesFromMiniAOD
175  makePuppiesFromMiniAOD(process,True)
176  process.puppiNoLep.useExistingWeights = True
177  process.puppi.useExistingWeights = True
178  run2_nanoAOD_106Xv1.toModify(process.puppiNoLep, useExistingWeights = False)
179  run2_nanoAOD_106Xv1.toModify(process.puppi, useExistingWeights = False)
180  print("will make Puppies on top of MINIAOD")
181 
182 # makePuppiesFromMiniAOD(process,True) # call this before in the global customizer otherwise it would reset photon IDs in VID
183  nanoAOD_PuppiV15_switch = cms.PSet(
184  recoMetFromPFCs = cms.untracked.bool(False),
185  reclusterJets = cms.untracked.bool(False),
186  )
187  run2_nanoAOD_106Xv1.toModify(nanoAOD_PuppiV15_switch,recoMetFromPFCs=True,reclusterJets=True)
188  if nanoAOD_PuppiV15_switch.reclusterJets:
189  from RecoJets.JetProducers.ak4PFJets_cfi import ak4PFJets
190  from PhysicsTools.PatAlgos.tools.helpers import getPatAlgosToolsTask, addToProcessAndTask
191  task = getPatAlgosToolsTask(process)
192  addToProcessAndTask('ak4PuppiJets', ak4PFJets.clone (src = 'puppi', doAreaFastjet = True, jetPtMin = 10.), process, task)
193  from PhysicsTools.PatAlgos.tools.jetTools import addJetCollection
194  addJetCollection(process,
195  labelName = 'Puppi',
196  jetSource = cms.InputTag('ak4PuppiJets'),
197  algo = 'AK', rParam=0.4,
198  genJetCollection=cms.InputTag('slimmedGenJets'),
199  jetCorrections = ('AK4PFPuppi', ['L1FastJet', 'L2Relative', 'L3Absolute','L2L3Residual'], 'None'),
200  pfCandidates = cms.InputTag('packedPFCandidates'),
201  pvSource = cms.InputTag('offlineSlimmedPrimaryVertices'),
202  svSource = cms.InputTag('slimmedSecondaryVertices'),
203  muSource =cms.InputTag( 'slimmedMuons'),
204  elSource = cms.InputTag('slimmedElectrons'),
205  genParticles= cms.InputTag('prunedGenParticles'),
206  getJetMCFlavour= False
207  )
208 
209  process.patJetsPuppi.addGenPartonMatch = cms.bool(False)
210  process.patJetsPuppi.addGenJetMatch = cms.bool(False)
211 
212  print("nanoAOD_PuppiV15_switch.reclusterJets is true")
213 
214  runMetCorAndUncFromMiniAOD(process,isData=isData,metType="Puppi",postfix="Puppi",jetFlavor="AK4PFPuppi", recoMetFromPFCs=bool(nanoAOD_PuppiV15_switch.recoMetFromPFCs), reclusterJets=bool(nanoAOD_PuppiV15_switch.reclusterJets))
215  process.nanoSequenceCommon.insert(2,cms.Sequence(process.puppiMETSequence+process.fullPatMetSequencePuppi))
216 
217  return process
218 
220 def nanoAOD_activateVID(process):
221 
222  switchOnVIDElectronIdProducer(process,DataFormat.MiniAOD,electronTask)
223  for modname in electron_id_modules_WorkingPoints_nanoAOD.modules:
224  setupAllVIDIdsInModule(process,modname,setupVIDElectronSelection)
225 
226  electronTask_ = process.egmGsfElectronIDTask.copy()
227  electronTask_.add(electronTask.copy())
228  process.electronTask = electronTask_.copy()
229  for modifier in run2_miniAOD_80XLegacy,run2_nanoAOD_94XMiniAODv1,run2_nanoAOD_94XMiniAODv2,run2_nanoAOD_94X2016,run2_nanoAOD_102Xv1,run2_nanoAOD_106Xv1:
230  modifier.toModify(process.electronMVAValueMapProducer, src = "slimmedElectronsUpdated")
231  modifier.toModify(process.egmGsfElectronIDs, physicsObjectSrc = "slimmedElectronsUpdated")
232 
233  switchOnVIDPhotonIdProducer(process,DataFormat.MiniAOD,photonTask) # do not call this to avoid resetting photon IDs in VID, if called before inside makePuppiesFromMiniAOD
234  for modname in photon_id_modules_WorkingPoints_nanoAOD.modules:
235  setupAllVIDIdsInModule(process,modname,setupVIDPhotonSelection)
236 
237  photonTask_ = process.egmPhotonIDTask.copy()
238  photonTask_.add(photonTask.copy())
239  process.photonTask = photonTask_.copy()
240  for modifier in run2_miniAOD_80XLegacy,run2_nanoAOD_94XMiniAODv1,run2_nanoAOD_94XMiniAODv2,run2_nanoAOD_94X2016,run2_nanoAOD_102Xv1:
241  modifier.toModify(process.photonMVAValueMapProducer, src = "slimmedPhotonsTo106X")
242  modifier.toModify(process.egmPhotonIDs, physicsObjectSrc = "slimmedPhotonsTo106X")
243  return process
244 
245 from PhysicsTools.PatUtils.tools.runMETCorrectionsAndUncertainties import runMetCorAndUncFromMiniAOD
246 def nanoAOD_runMETfixEE2017(process,isData):
247  runMetCorAndUncFromMiniAOD(process,isData=isData,
248  fixEE2017 = True,
249  fixEE2017Params = {'userawPt': True, 'ptThreshold':50.0, 'minEtaThreshold':2.65, 'maxEtaThreshold': 3.139},
250  postfix = "FixEE2017")
251  process.nanoSequenceCommon.insert(2,process.fullPatMetSequenceFixEE2017)
252 
253 
255 
256  process = nanoAOD_activateVID(process)
257 
258  # This function is defined in jetsAK4_CHS_cff.py
259  process = nanoAOD_addDeepInfoAK4CHS(process,
260  addDeepBTag=nanoAOD_addDeepInfoAK4CHS_switch.nanoAOD_addDeepBTag_switch,
261  addDeepFlavour=nanoAOD_addDeepInfoAK4CHS_switch.nanoAOD_addDeepFlavourTag_switch
262  )
263 
264  # This function is defined in jetsAK8_cff.py
265  process = nanoAOD_addDeepInfoAK8(process,
266  addDeepBTag=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepBTag_switch,
267  addDeepBoostedJet=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepBoostedJet_switch,
268  addDeepDoubleX=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepDoubleX_switch,
269  addDeepDoubleXV2=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepDoubleXV2_switch,
270  addParticleNet=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addParticleNet_switch,
271  addParticleNetMass=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addParticleNetMass_switch,
272  jecPayload=nanoAOD_addDeepInfoAK8_switch.jecPayload
273  )
274 
275  nanoAOD_tau_switch = cms.PSet(
276  idsToAdd = cms.vstring()
277  )
278  (run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94X2016 | run2_nanoAOD_94XMiniAODv2 | run2_nanoAOD_102Xv1 | run2_nanoAOD_106Xv1).toModify(nanoAOD_tau_switch, idsToAdd = ["deepTau2017v2p1"])
279  (run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94X2016 | run2_nanoAOD_94XMiniAODv2 | run2_nanoAOD_102Xv1 | run2_nanoAOD_106Xv1).toModify(process, lambda p : nanoAOD_addTauIds(p, nanoAOD_tau_switch.idsToAdd.value()))
280  nanoAOD_boostedTau_switch = cms.PSet(
281  idsToAdd = cms.vstring()
282  )
283  run2_nanoAOD_106Xv2.toModify(nanoAOD_boostedTau_switch, idsToAdd = ["2017v2", "dR0p32017v2", "newDM2017v2","againstEle2018"])
284  run2_nanoAOD_106Xv2.toModify(process, lambda p : nanoAOD_addBoostedTauIds(p, nanoAOD_boostedTau_switch.idsToAdd.value()))
285 
286  return process
287 
289  process = nanoAOD_customizeCommon(process)
290  for modifier in run2_miniAOD_80XLegacy,run2_nanoAOD_94X2016,run2_nanoAOD_94XMiniAODv1,run2_nanoAOD_94XMiniAODv2,run2_nanoAOD_102Xv1,run2_nanoAOD_106Xv1:
291  modifier.toModify(process, lambda p: nanoAOD_recalibrateMETs(p,isData=True))
292  for modifier in run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2:
293  modifier.toModify(process, lambda p: nanoAOD_runMETfixEE2017(p,isData=True))
294  return process
295 
296 def nanoAOD_customizeMC(process):
297  process = nanoAOD_customizeCommon(process)
298  for modifier in run2_miniAOD_80XLegacy,run2_nanoAOD_94X2016,run2_nanoAOD_94XMiniAODv1,run2_nanoAOD_94XMiniAODv2,run2_nanoAOD_102Xv1,run2_nanoAOD_106Xv1:
299  modifier.toModify(process, lambda p: nanoAOD_recalibrateMETs(p,isData=False))
300  for modifier in run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2:
301  modifier.toModify(process, lambda p: nanoAOD_runMETfixEE2017(p,isData=False))
302  return process
303 
304 
306  pdgSelection="?(abs(pdgId) == 11|| abs(pdgId)==13 || abs(pdgId)==15 ||abs(pdgId)== 12 || abs(pdgId)== 14 || abs(pdgId)== 16|| abs(pdgId)== 24|| pdgId== 23)"
307  # Keep precision same as default RECO for selected particles
308  ptPrecision="{}?{}:{}".format(pdgSelection, CandVars.pt.precision.value(),genParticleTable.variables.pt.precision.value())
309  process.genParticleTable.variables.pt.precision=cms.string(ptPrecision)
310  phiPrecision="{} ? {} : {}".format(pdgSelection, CandVars.phi.precision.value(), genParticleTable.variables.phi.precision.value())
311  process.genParticleTable.variables.phi.precision=cms.string(phiPrecision)
312  etaPrecision="{} ? {} : {}".format(pdgSelection, CandVars.eta.precision.value(), genParticleTable.variables.eta.precision.value())
313  process.genParticleTable.variables.eta.precision=cms.string(etaPrecision)
314  return process
315 
316 # lowPtElectrons do not exsit for old nano campaigns (i.e. before v9)
317 _modifiers = ( run2_miniAOD_80XLegacy |
318  run2_nanoAOD_94XMiniAODv1 |
319  run2_nanoAOD_94XMiniAODv2 |
320  run2_nanoAOD_94X2016 |
321  run2_nanoAOD_102Xv1 |
322  run2_nanoAOD_106Xv1 )
323 _modifiers.toModify(linkedObjects,lowPtElectrons="")
324 _modifiers.toModify(simpleCleanerTable,lowPtElectrons="")
def switchOnVIDElectronIdProducer(process, dataFormat, task=None)
Electrons.
Definition: vid_id_tools.py:66
def addToProcessAndTask(label, module, process, task)
Definition: helpers.py:28
def setupAllVIDIdsInModule(process, id_module_name, setupFunction, patProducer=None, addUserData=True, task=None)
Definition: vid_id_tools.py:49
def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubleX, addDeepDoubleXV2, addParticleNet, addParticleNetMass, jecPayload)
Definition: jetsAK8_cff.py:182
def nanoAOD_customizeMC(process)
Definition: nano_cff.py:296
def nanoAOD_activateVID(process)
Definition: nano_cff.py:220
def nanoWmassGenCustomize(process)
increasing the precision of selected GenParticles.
Definition: nano_cff.py:305
def nanoAOD_customizeCommon(process)
Definition: nano_cff.py:254
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47
def nanoAOD_recalibrateMETs(process, isData)
Definition: nano_cff.py:156
def nanoAOD_addTauIds(process, idsToRun=[])
Definition: nano_cff.py:119
def nanoAOD_runMETfixEE2017(process, isData)
Definition: nano_cff.py:246
def nanoAOD_addBoostedTauIds(process, idsToRun=[])
Definition: nano_cff.py:136
def nanoAOD_addDeepInfoAK4CHS(process, addDeepBTag, addDeepFlavour)
def getPatAlgosToolsTask(process)
Definition: helpers.py:13
def switchOnVIDPhotonIdProducer(process, dataFormat, task=None)
Photons.
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, reapplyJEC=True, jecUncFile="", computeMETSignificance=True, fixEE2017=False, fixEE2017Params=None, extractDeepMETs=False, postfix="")
def makePuppiesFromMiniAOD(process, createScheduledSequence=False)
def nanoAOD_customizeData(process)
Definition: nano_cff.py:288