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
18 from PhysicsTools.NanoAOD.met_cff import *
23 
24 
25 nanoMetadata = cms.EDProducer("UniqueStringProducer",
26  strings = cms.PSet(
27  tag = cms.string("untagged"),
28  )
29 )
30 
31 linkedObjects = cms.EDProducer("PATObjectCrossLinker",
32  jets=cms.InputTag("finalJets"),
33  muons=cms.InputTag("finalMuons"),
34  electrons=cms.InputTag("finalElectrons"),
35  taus=cms.InputTag("finalTaus"),
36  photons=cms.InputTag("finalPhotons"),
37 )
38 
39 simpleCleanerTable = cms.EDProducer("NanoAODSimpleCrossCleaner",
40  name=cms.string("cleanmask"),
41  doc=cms.string("simple cleaning mask with priority to leptons"),
42  jets=cms.InputTag("linkedObjects","jets"),
43  muons=cms.InputTag("linkedObjects","muons"),
44  electrons=cms.InputTag("linkedObjects","electrons"),
45  taus=cms.InputTag("linkedObjects","taus"),
46  photons=cms.InputTag("linkedObjects","photons"),
47  jetSel=cms.string("pt>15"),
48  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 )"),
49  electronSel=cms.string(""),
50  tauSel=cms.string(""),
51  photonSel=cms.string(""),
52  jetName=cms.string("Jet"),muonName=cms.string("Muon"),electronName=cms.string("Electron"),
53  tauName=cms.string("Tau"),photonName=cms.string("Photon")
54 )
55 
56 btagSFdir="PhysicsTools/NanoAOD/data/btagSF/"
57 
58 btagWeightTable = cms.EDProducer("BTagSFProducer",
59  src = cms.InputTag("linkedObjects","jets"),
60  cut = cms.string("pt > 25. && abs(eta) < 2.5"),
61  discNames = cms.vstring(
62  "pfCombinedInclusiveSecondaryVertexV2BJetTags",
63  "pfDeepCSVJetTags:probb+pfDeepCSVJetTags:probbb", #if multiple MiniAOD branches need to be summed up (e.g., DeepCSV b+bb), separate them using '+' delimiter
64  "pfCombinedMVAV2BJetTags"
65  ),
66  discShortNames = cms.vstring(
67  "CSVV2",
68  "DeepCSVB",
69  "CMVA"
70  ),
71  weightFiles = cms.vstring( #default settings are for 2017 94X. toModify function is called later for other eras.
72  btagSFdir+"CSVv2_94XSF_V2_B_F.csv",
73  btagSFdir+"DeepCSV_94XSF_V2_B_F.csv",
74  "unavailable" #if SFs for an algorithm in an era is unavailable, the corresponding branch will not be stored
75  ),
76  operatingPoints = cms.vstring("3","3","3"), #loose = 0, medium = 1, tight = 2, reshaping = 3
77  measurementTypesB = cms.vstring("iterativefit","iterativefit","iterativefit"), #e.g. "comb", "incl", "ttbar", "iterativefit"
78  measurementTypesC = cms.vstring("iterativefit","iterativefit","iterativefit"),
79  measurementTypesUDSG = cms.vstring("iterativefit","iterativefit","iterativefit"),
80  sysTypes = cms.vstring("central","central","central")
81 )
82 
83 for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016: # to be updated when SF for Summer16MiniAODv3 MC will be available
84  modifier.toModify(btagWeightTable,
85  cut = cms.string("pt > 25. && abs(eta) < 2.4"), #80X corresponds to 2016, |eta| < 2.4
86  weightFiles = cms.vstring( #80X corresponds to 2016 SFs
87  btagSFdir+"CSVv2_Moriond17_B_H.csv",
88  "unavailable",
89  btagSFdir+"cMVAv2_Moriond17_B_H.csv"
90  )
91  )
92 
93 lhcInfoTable = cms.EDProducer("LHCInfoProducer",
94  precision = cms.int32(10),
95 )
96 
97 lheInfoTable = cms.EDProducer("LHETablesProducer",
98  lheInfo = cms.VInputTag(cms.InputTag("externalLHEProducer"), cms.InputTag("source")),
99  precision = cms.int32(14),
100  storeLHEParticles = cms.bool(True)
101 )
102 
103 l1bits=cms.EDProducer("L1TriggerResultsConverter", src=cms.InputTag("gtStage2Digis"), legacyL1=cms.bool(False),
104  storeUnprefireableBit=cms.bool(True), src_ext=cms.InputTag("gtStage2Digis"))
105 (run2_miniAOD_80XLegacy | run2_nanoAOD_94X2016 | run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94XMiniAODv2 | run2_nanoAOD_102Xv1).toModify(l1bits, storeUnprefireableBit=False)
106 
107 nanoSequenceCommon = cms.Sequence(
108  nanoMetadata + jetSequence + muonSequence + tauSequence + electronSequence+photonSequence+vertexSequence+
109  isoTrackSequence + jetLepSequence + # must be after all the leptons
110  linkedObjects +
111  jetTables + muonTables + tauTables + electronTables + photonTables + globalTables +vertexTables+ metTables+simpleCleanerTable + isoTrackTables
112  )
113 nanoSequenceOnlyFullSim = cms.Sequence(triggerObjectTables + l1bits)
114 nanoSequenceOnlyData = cms.Sequence(protonTables + lhcInfoTable)
115 
116 nanoSequence = cms.Sequence(nanoSequenceCommon + nanoSequenceOnlyData + nanoSequenceOnlyFullSim)
117 
118 nanoSequenceFS = cms.Sequence(genParticleSequence + genVertexTables + particleLevelSequence + nanoSequenceCommon + jetMC + muonMC + electronMC + photonMC + tauMC + metMC + ttbarCatMCProducers + globalTablesMC + btagWeightTable + genWeightsTable + genVertexTable + genParticleTables + particleLevelTables + lheInfoTable + ttbarCategoryTable )
119 
120 (run2_nanoAOD_92X | run2_miniAOD_80XLegacy | run2_nanoAOD_94X2016 | run2_nanoAOD_94X2016 | \
121  run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94XMiniAODv2 | \
122  run2_nanoAOD_102Xv1).toReplaceWith(nanoSequenceFS, nanoSequenceFS.copyAndExclude([genVertexTable, genVertexT0Table]))
123 
124 # GenVertex only stored in newer MiniAOD
125 nanoSequenceMC = nanoSequenceFS.copy()
126 nanoSequenceMC.insert(nanoSequenceFS.index(nanoSequenceCommon)+1,nanoSequenceOnlyFullSim)
127 
128 # modify extraFlagsTable to store ecalBadCalibFilter decision which is re-run with updated bad crystal list for 2017 and 2018 samples
129 for modifier in run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2, run2_nanoAOD_102Xv1:
130  modifier.toModify(extraFlagsTable, variables= cms.PSet())
131  modifier.toModify(extraFlagsTable, variables = dict(Flag_ecalBadCalibFilterV2 = ExtVar(cms.InputTag("ecalBadCalibFilterNanoTagger"), bool, doc = "Bad ECAL calib flag (updated xtal list)")))
132 
133 # modifier which adds new tauIDs (currently only deepTauId2017v2p1 is being added)
134 import RecoTauTag.RecoTau.tools.runTauIdMVA as tauIdConfig
135 def nanoAOD_addTauIds(process):
136  updatedTauName = "slimmedTausUpdated"
137  tauIdEmbedder = tauIdConfig.TauIDEmbedder(process, debug = False, updatedTauName = updatedTauName,
138  toKeep = [ "deepTau2017v2p1" ])
139  tauIdEmbedder.runTauID()
140  process.patTauMVAIDsSeq.insert(process.patTauMVAIDsSeq.index(getattr(process, updatedTauName)),
141  process.rerunMvaIsolationSequence)
142  return process
143 
144 from PhysicsTools.PatAlgos.tools.jetTools import updateJetCollection
145 def nanoAOD_addDeepInfo(process,addDeepBTag,addDeepFlavour):
146  _btagDiscriminators=[]
147  if addDeepBTag:
148  print("Updating process to run DeepCSV btag")
149  _btagDiscriminators += ['pfDeepCSVJetTags:probb','pfDeepCSVJetTags:probbb','pfDeepCSVJetTags:probc']
150  if addDeepFlavour:
151  print("Updating process to run DeepFlavour btag")
152  _btagDiscriminators += ['pfDeepFlavourJetTags:probb','pfDeepFlavourJetTags:probbb','pfDeepFlavourJetTags:problepb','pfDeepFlavourJetTags:probc']
153  if len(_btagDiscriminators)==0: return process
154  print("Will recalculate the following discriminators: "+", ".join(_btagDiscriminators))
155  updateJetCollection(
156  process,
157  jetSource = cms.InputTag('slimmedJets'),
158  jetCorrections = ('AK4PFchs', cms.vstring(['L1FastJet', 'L2Relative', 'L3Absolute','L2L3Residual']), 'None'),
159  btagDiscriminators = _btagDiscriminators,
160  postfix = 'WithDeepInfo',
161  )
162  process.load("Configuration.StandardSequences.MagneticField_cff")
163  process.jetCorrFactorsNano.src="selectedUpdatedPatJetsWithDeepInfo"
164  process.updatedJets.jetSource="selectedUpdatedPatJetsWithDeepInfo"
165  return process
166 
167 def nanoAOD_addDeepMET(process, addDeepMETProducer, ResponseTune_Graph):
168  if addDeepMETProducer:
169  # produce DeepMET on the fly if it is not in MiniAOD
170  print("add DeepMET Producers")
171  process.load('RecoMET.METPUSubtraction.deepMETProducer_cfi')
172  process.deepMETsResolutionTune = process.deepMETProducer.clone()
173  process.deepMETsResponseTune = process.deepMETProducer.clone()
174  #process.deepMETsResponseTune.graph_path = 'RecoMET/METPUSubtraction/data/deepmet/deepmet_resp_v1_2018.pb'
175  process.deepMETsResponseTune.graph_path = ResponseTune_Graph.value()
176  process.metTables += process.deepMetTables
177  return process
178 
179 from PhysicsTools.PatUtils.tools.runMETCorrectionsAndUncertainties import runMetCorAndUncFromMiniAOD
180 from PhysicsTools.PatAlgos.slimming.puppiForMET_cff import makePuppiesFromMiniAOD
181 def nanoAOD_recalibrateMETs(process,isData):
182  # add DeepMETs
183  nanoAOD_DeepMET_switch = cms.PSet(
184  nanoAOD_addDeepMET_switch = cms.untracked.bool(True), # decide if DeeMET should be included in Nano
185  nanoAOD_produceDeepMET_switch = cms.untracked.bool(False), # decide if DeepMET should be computed on the fly
186  ResponseTune_Graph = cms.untracked.string('RecoMET/METPUSubtraction/data/deepmet/deepmet_resp_v1_2018.pb')
187  )
188  for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016, run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2, run2_nanoAOD_102Xv1, run2_nanoAOD_106Xv1:
189  # compute DeepMETs in these eras (before 111X)
190  modifier.toModify(nanoAOD_DeepMET_switch, nanoAOD_produceDeepMET_switch = cms.untracked.bool(True))
191  for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016:
192  modifier.toModify(nanoAOD_DeepMET_switch, ResponseTune_Graph=cms.untracked.string("RecoMET/METPUSubtraction/data/deepmet/deepmet_resp_v1_2016.pb"))
193  if nanoAOD_DeepMET_switch.nanoAOD_addDeepMET_switch:
194  process = nanoAOD_addDeepMET(process,
195  addDeepMETProducer=nanoAOD_DeepMET_switch.nanoAOD_produceDeepMET_switch,
196  ResponseTune_Graph=nanoAOD_DeepMET_switch.ResponseTune_Graph)
197 
198  # if included in Nano, and not computed in the fly, then it should be extracted from minAOD
199  extractDeepMETs = nanoAOD_DeepMET_switch.nanoAOD_addDeepMET_switch and not nanoAOD_DeepMET_switch.nanoAOD_produceDeepMET_switch
200 
201  runMetCorAndUncFromMiniAOD(process,isData=isData, extractDeepMETs=extractDeepMETs)
202  process.nanoSequenceCommon.insert(process.nanoSequenceCommon.index(process.jetSequence),cms.Sequence(process.fullPatMetSequence))
203  process.basicJetsForMetForT1METNano = process.basicJetsForMet.clone(
204  src = process.updatedJetsWithUserData.src,
205  skipEM = False,
206  type1JetPtThreshold = 0.0,
207  calcMuonSubtrRawPtAsValueMap = cms.bool(True),
208  )
209  process.jetSequence.insert(process.jetSequence.index(process.updatedJetsWithUserData),cms.Sequence(process.basicJetsForMetForT1METNano))
210  process.updatedJetsWithUserData.userFloats.muonSubtrRawPt = cms.InputTag("basicJetsForMetForT1METNano:MuonSubtrRawPt")
211  process.corrT1METJetTable.src = process.finalJets.src
212  process.corrT1METJetTable.cut = "pt<15 && abs(eta)<9.9"
213  for table in process.jetTable, process.corrT1METJetTable:
214  table.variables.muonSubtrFactor = Var("1-userFloat('muonSubtrRawPt')/(pt()*jecFactor('Uncorrected'))",float,doc="1-(muon-subtracted raw pt)/(raw pt)",precision=6)
215  process.metTables += process.corrT1METJetTable
216 # makePuppiesFromMiniAOD(process,True) # call this before in the global customizer otherwise it would reset photon IDs in VID
217  nanoAOD_PuppiV15_switch = cms.PSet(
218  recoMetFromPFCs = cms.untracked.bool(False),
219  reclusterJets = cms.untracked.bool(False),
220  )
221  run2_nanoAOD_106Xv1.toModify(nanoAOD_PuppiV15_switch,recoMetFromPFCs=True,reclusterJets=True)
222  if nanoAOD_PuppiV15_switch.reclusterJets:
223  from RecoJets.JetProducers.ak4PFJets_cfi import ak4PFJets
224  from PhysicsTools.PatAlgos.tools.helpers import getPatAlgosToolsTask, addToProcessAndTask
225  task = getPatAlgosToolsTask(process)
226  addToProcessAndTask('ak4PuppiJets', ak4PFJets.clone (src = 'puppi', doAreaFastjet = True, jetPtMin = 10.), process, task)
227  from PhysicsTools.PatAlgos.tools.jetTools import addJetCollection
228  addJetCollection(process,
229  labelName = 'Puppi',
230  jetSource = cms.InputTag('ak4PuppiJets'),
231  algo = 'AK', rParam=0.4,
232  genJetCollection=cms.InputTag('slimmedGenJets'),
233  jetCorrections = ('AK4PFPuppi', ['L1FastJet', 'L2Relative', 'L3Absolute','L2L3Residual'], 'None'),
234  pfCandidates = cms.InputTag('packedPFCandidates'),
235  pvSource = cms.InputTag('offlineSlimmedPrimaryVertices'),
236  svSource = cms.InputTag('slimmedSecondaryVertices'),
237  muSource =cms.InputTag( 'slimmedMuons'),
238  elSource = cms.InputTag('slimmedElectrons'),
239  genParticles= cms.InputTag('prunedGenParticles'),
240  getJetMCFlavour= False
241  )
242 
243  process.patJetsPuppi.addGenPartonMatch = cms.bool(False)
244  process.patJetsPuppi.addGenJetMatch = cms.bool(False)
245 
246  runMetCorAndUncFromMiniAOD(process,isData=isData,metType="Puppi",postfix="Puppi",jetFlavor="AK4PFPuppi", recoMetFromPFCs=bool(nanoAOD_PuppiV15_switch.recoMetFromPFCs), reclusterJets=bool(nanoAOD_PuppiV15_switch.reclusterJets))
247  process.nanoSequenceCommon.insert(process.nanoSequenceCommon.index(process.jetSequence),cms.Sequence(process.puppiMETSequence+process.fullPatMetSequencePuppi))
248  return process
249 
251 def nanoAOD_activateVID(process):
252  switchOnVIDElectronIdProducer(process,DataFormat.MiniAOD)
253  for modname in electron_id_modules_WorkingPoints_nanoAOD.modules:
254  setupAllVIDIdsInModule(process,modname,setupVIDElectronSelection)
255  process.electronSequence.insert(process.electronSequence.index(process.bitmapVIDForEle),process.egmGsfElectronIDSequence)
256  for modifier in run2_miniAOD_80XLegacy,run2_nanoAOD_94XMiniAODv1,run2_nanoAOD_94XMiniAODv2,run2_nanoAOD_94X2016,run2_nanoAOD_102Xv1,run2_nanoAOD_106Xv1:
257  modifier.toModify(process.electronMVAValueMapProducer, src = "slimmedElectronsUpdated")
258  modifier.toModify(process.egmGsfElectronIDs, physicsObjectSrc = "slimmedElectronsUpdated")
259 
260  run2_nanoAOD_106Xv2.toModify(process.electronMVAValueMapProducer, src = "slimmedElectrons")
261  run2_nanoAOD_106Xv2.toModify(process.egmGsfElectronIDs, physicsObjectSrc = "slimmedElectrons")
262 
263  switchOnVIDPhotonIdProducer(process,DataFormat.MiniAOD) # do not call this to avoid resetting photon IDs in VID, if called before inside makePuppiesFromMiniAOD
264  for modname in photon_id_modules_WorkingPoints_nanoAOD.modules:
265  setupAllVIDIdsInModule(process,modname,setupVIDPhotonSelection)
266  process.photonSequence.insert(process.photonSequence.index(bitmapVIDForPho),process.egmPhotonIDSequence)
267  for modifier in run2_miniAOD_80XLegacy,run2_nanoAOD_94XMiniAODv1,run2_nanoAOD_94XMiniAODv2,run2_nanoAOD_94X2016,run2_nanoAOD_102Xv1:
268  modifier.toModify(process.photonMVAValueMapProducer, src = "slimmedPhotonsTo106X")
269  modifier.toModify(process.egmPhotonIDs, physicsObjectSrc = "slimmedPhotonsTo106X")
270  return process
271 
272 def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubleX, addDeepDoubleXV2, addParticleNet, jecPayload):
273  _btagDiscriminators=[]
274  if addDeepBTag:
275  print("Updating process to run DeepCSV btag to AK8 jets")
276  _btagDiscriminators += ['pfDeepCSVJetTags:probb','pfDeepCSVJetTags:probbb']
277  if addDeepBoostedJet:
278  print("Updating process to run DeepBoostedJet on datasets before 103X")
279  from RecoBTag.ONNXRuntime.pfDeepBoostedJet_cff import _pfDeepBoostedJetTagsAll as pfDeepBoostedJetTagsAll
280  _btagDiscriminators += pfDeepBoostedJetTagsAll
281  if addParticleNet:
282  print("Updating process to run ParticleNet before it's included in MiniAOD")
283  from RecoBTag.ONNXRuntime.pfParticleNet_cff import _pfParticleNetJetTagsAll as pfParticleNetJetTagsAll
284  _btagDiscriminators += pfParticleNetJetTagsAll
285  if addDeepDoubleX:
286  print("Updating process to run DeepDoubleX on datasets before 104X")
287  _btagDiscriminators += ['pfDeepDoubleBvLJetTags:probHbb', \
288  'pfDeepDoubleCvLJetTags:probHcc', \
289  'pfDeepDoubleCvBJetTags:probHcc', \
290  'pfMassIndependentDeepDoubleBvLJetTags:probHbb', 'pfMassIndependentDeepDoubleCvLJetTags:probHcc', 'pfMassIndependentDeepDoubleCvBJetTags:probHcc']
291  if addDeepDoubleXV2:
292  print("Updating process to run DeepDoubleXv2 on datasets before 11X")
293  _btagDiscriminators += [
294  'pfMassIndependentDeepDoubleBvLV2JetTags:probHbb',
295  'pfMassIndependentDeepDoubleCvLV2JetTags:probHcc',
296  'pfMassIndependentDeepDoubleCvBV2JetTags:probHcc'
297  ]
298  if len(_btagDiscriminators)==0: return process
299  print("Will recalculate the following discriminators on AK8 jets: "+", ".join(_btagDiscriminators))
300  updateJetCollection(
301  process,
302  jetSource = cms.InputTag('slimmedJetsAK8'),
303  pvSource = cms.InputTag('offlineSlimmedPrimaryVertices'),
304  svSource = cms.InputTag('slimmedSecondaryVertices'),
305  rParam = 0.8,
306  jetCorrections = (jecPayload.value(), cms.vstring(['L1FastJet', 'L2Relative', 'L3Absolute', 'L2L3Residual']), 'None'),
307  btagDiscriminators = _btagDiscriminators,
308  postfix='AK8WithDeepInfo',
309  printWarning = False
310  )
311  process.jetCorrFactorsAK8.src="selectedUpdatedPatJetsAK8WithDeepInfo"
312  process.updatedJetsAK8.jetSource="selectedUpdatedPatJetsAK8WithDeepInfo"
313  return process
314 
315 from PhysicsTools.PatUtils.tools.runMETCorrectionsAndUncertainties import runMetCorAndUncFromMiniAOD
316 def nanoAOD_runMETfixEE2017(process,isData):
317  runMetCorAndUncFromMiniAOD(process,isData=isData,
318  fixEE2017 = True,
319  fixEE2017Params = {'userawPt': True, 'ptThreshold':50.0, 'minEtaThreshold':2.65, 'maxEtaThreshold': 3.139},
320  postfix = "FixEE2017")
321  process.nanoSequenceCommon.insert(process.nanoSequenceCommon.index(jetSequence),process.fullPatMetSequenceFixEE2017)
322 
324  makePuppiesFromMiniAOD(process,True)
325  process.puppiNoLep.useExistingWeights = True
326  process.puppi.useExistingWeights = True
327  run2_nanoAOD_106Xv1.toModify(process.puppiNoLep, useExistingWeights = False)
328  run2_nanoAOD_106Xv1.toModify(process.puppi, useExistingWeights = False)
329  process = nanoAOD_activateVID(process)
330  nanoAOD_addDeepInfo_switch = cms.PSet(
331  nanoAOD_addDeepBTag_switch = cms.untracked.bool(False),
332  nanoAOD_addDeepFlavourTag_switch = cms.untracked.bool(False),
333  )
334  run2_miniAOD_80XLegacy.toModify(nanoAOD_addDeepInfo_switch, nanoAOD_addDeepBTag_switch = cms.untracked.bool(True))
335  for modifier in run2_miniAOD_80XLegacy, run2_nanoAOD_94X2016, run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2:
336  modifier.toModify(nanoAOD_addDeepInfo_switch, nanoAOD_addDeepFlavourTag_switch = cms.untracked.bool(True))
337  process = nanoAOD_addDeepInfo(process,
338  addDeepBTag=nanoAOD_addDeepInfo_switch.nanoAOD_addDeepBTag_switch,
339  addDeepFlavour=nanoAOD_addDeepInfo_switch.nanoAOD_addDeepFlavourTag_switch)
340  nanoAOD_addDeepInfoAK8_switch = cms.PSet(
341  nanoAOD_addDeepBTag_switch = cms.untracked.bool(False),
342  nanoAOD_addDeepBoostedJet_switch = cms.untracked.bool(False),
343  nanoAOD_addDeepDoubleX_switch = cms.untracked.bool(False),
344  nanoAOD_addDeepDoubleXV2_switch = cms.untracked.bool(False),
345  nanoAOD_addParticleNet_switch = cms.untracked.bool(False),
346  jecPayload = cms.untracked.string('AK8PFPuppi')
347  )
348  # deepAK8 should not run on 80X, that contains ak8PFJetsCHS jets
349  run2_miniAOD_80XLegacy.toModify(nanoAOD_addDeepInfoAK8_switch,
350  nanoAOD_addDeepBTag_switch = True,
351  jecPayload = 'AK8PFchs')
352  # for 94X and 102X samples: needs to run DeepAK8, DeepDoubleX and ParticleNet
353  (run2_nanoAOD_94X2016 | run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94XMiniAODv2 | run2_nanoAOD_102Xv1).toModify(
354  nanoAOD_addDeepInfoAK8_switch,
355  nanoAOD_addDeepBoostedJet_switch = True,
356  nanoAOD_addDeepDoubleX_switch = True,
357  nanoAOD_addDeepDoubleXV2_switch = True,
358  nanoAOD_addParticleNet_switch = True,
359  )
360  # for 106Xv1: only needs to run ParticleNet and DDXV2; DeepAK8, DeepDoubleX are already in MiniAOD
361  run2_nanoAOD_106Xv1.toModify(
362  nanoAOD_addDeepInfoAK8_switch,
363  nanoAOD_addDeepDoubleXV2_switch = True,
364  nanoAOD_addParticleNet_switch = True,
365  )
366  process = nanoAOD_addDeepInfoAK8(process,
367  addDeepBTag=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepBTag_switch,
368  addDeepBoostedJet=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepBoostedJet_switch,
369  addDeepDoubleX=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepDoubleX_switch,
370  addDeepDoubleXV2=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepDoubleXV2_switch,
371  addParticleNet=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addParticleNet_switch,
372  jecPayload=nanoAOD_addDeepInfoAK8_switch.jecPayload)
373  (run2_nanoAOD_94XMiniAODv1 | run2_nanoAOD_94X2016 | run2_nanoAOD_94XMiniAODv2 | run2_nanoAOD_102Xv1 | run2_nanoAOD_106Xv1).toModify(process, lambda p : nanoAOD_addTauIds(p))
374  return process
375 
377  process = nanoAOD_customizeCommon(process)
378  process = nanoAOD_recalibrateMETs(process,isData=True)
379  for modifier in run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2:
380  modifier.toModify(process, lambda p: nanoAOD_runMETfixEE2017(p,isData=True))
381  return process
382 
383 def nanoAOD_customizeMC(process):
384  process = nanoAOD_customizeCommon(process)
385  process = nanoAOD_recalibrateMETs(process,isData=False)
386  for modifier in run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2:
387  modifier.toModify(process, lambda p: nanoAOD_runMETfixEE2017(p,isData=False))
388  return process
389 
390 
392  pdgSelection="?(abs(pdgId) == 11|| abs(pdgId)==13 || abs(pdgId)==15 ||abs(pdgId)== 12 || abs(pdgId)== 14 || abs(pdgId)== 16|| abs(pdgId)== 24|| pdgId== 23)"
393  # Keep precision same as default RECO for selected particles
394  ptPrecision="{}?{}:{}".format(pdgSelection, CandVars.pt.precision.value(),genParticleTable.variables.pt.precision.value())
395  process.genParticleTable.variables.pt.precision=cms.string(ptPrecision)
396  phiPrecision="{} ? {} : {}".format(pdgSelection, CandVars.phi.precision.value(), genParticleTable.variables.phi.precision.value())
397  process.genParticleTable.variables.phi.precision=cms.string(phiPrecision)
398  etaPrecision="{} ? {} : {}".format(pdgSelection, CandVars.eta.precision.value(), genParticleTable.variables.eta.precision.value())
399  process.genParticleTable.variables.eta.precision=cms.string(etaPrecision)
400  return process
401 
402 
403 _80x_sequence = nanoSequenceCommon.copy()
404 #remove stuff
405 _80x_sequence.remove(isoTrackTables)
406 _80x_sequence.remove(isoTrackSequence)
407 #add stuff
408 _80x_sequence.insert(_80x_sequence.index(jetSequence), extraFlagsProducers)
409 _80x_sequence.insert(_80x_sequence.index(simpleCleanerTable)+1, extraFlagsTable)
410 
411 run2_miniAOD_80XLegacy.toReplaceWith( nanoSequenceCommon, _80x_sequence)
412 
413 _102x_sequence = nanoSequenceCommon.copy()
414 #add stuff
415 _102x_sequence.insert(_102x_sequence.index(jetSequence),extraFlagsProducers102x)
416 _102x_sequence.insert(_102x_sequence.index(simpleCleanerTable)+1,extraFlagsTable)
417 
418 for modifier in run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2, run2_nanoAOD_102Xv1:
419  modifier.toReplaceWith(nanoSequenceCommon, _102x_sequence)
nano_cff.nanoAOD_customizeData
def nanoAOD_customizeData(process)
Definition: nano_cff.py:376
nano_cff.nanoAOD_addDeepInfoAK8
def nanoAOD_addDeepInfoAK8(process, addDeepBTag, addDeepBoostedJet, addDeepDoubleX, addDeepDoubleXV2, addParticleNet, jecPayload)
Definition: nano_cff.py:272
runMETCorrectionsAndUncertainties.runMetCorAndUncFromMiniAOD
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="")
Definition: runMETCorrectionsAndUncertainties.py:2047
helpers.getPatAlgosToolsTask
def getPatAlgosToolsTask(process)
Definition: helpers.py:14
isotracks_cff
ttbarCategorization_cff
taus_cff
genparticles_cff
genVertex_cff
vid_id_tools.switchOnVIDElectronIdProducer
def switchOnVIDElectronIdProducer(process, dataFormat, task=None)
Electrons.
Definition: vid_id_tools.py:66
nano_cff.nanoAOD_addTauIds
def nanoAOD_addTauIds(process)
Definition: nano_cff.py:135
pfDeepBoostedJet_cff
particlelevel_cff
join
static std::string join(char **cmd)
Definition: RemoteFile.cc:17
globals_cff
nano_cff.nanoAOD_recalibrateMETs
def nanoAOD_recalibrateMETs(process, isData)
Definition: nano_cff.py:181
common_cff
vertices_cff
NanoAODEDMEventContent_cff
photons_cff
puppiForMET_cff.makePuppiesFromMiniAOD
def makePuppiesFromMiniAOD(process, createScheduledSequence=False)
Definition: puppiForMET_cff.py:13
common_cff.Var
def Var(expr, valtype, compression=None, doc=None, mcOnly=False, precision=-1)
Definition: common_cff.py:20
nano_cff.nanoAOD_customizeMC
def nanoAOD_customizeMC(process)
Definition: nano_cff.py:383
nano_cff.nanoAOD_activateVID
def nanoAOD_activateVID(process)
Definition: nano_cff.py:251
extraflags_cff
nano_cff.nanoAOD_addDeepInfo
def nanoAOD_addDeepInfo(process, addDeepBTag, addDeepFlavour)
Definition: nano_cff.py:145
genWeightsTable_cfi
jetTools
ak4PFJets_cfi
protons_cff
print
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:46
common_cff.ExtVar
def ExtVar(tag, valtype, compression=None, doc=None, mcOnly=False, precision=-1)
Definition: common_cff.py:31
nano_cff.bool
bool
Definition: nano_cff.py:131
jets_cff
muons_cff
pfParticleNet_cff
nano_cff.nanoWmassGenCustomize
def nanoWmassGenCustomize(process)
increasing the precision of selected GenParticles.
Definition: nano_cff.py:391
helpers
nano_cff.nanoAOD_runMETfixEE2017
def nanoAOD_runMETfixEE2017(process, isData)
Definition: nano_cff.py:316
nano_eras_cff
vid_id_tools.setupAllVIDIdsInModule
def setupAllVIDIdsInModule(process, id_module_name, setupFunction, patProducer=None, addUserData=True, task=None)
Definition: vid_id_tools.py:49
vid_id_tools.switchOnVIDPhotonIdProducer
def switchOnVIDPhotonIdProducer(process, dataFormat, task=None)
Photons.
Definition: vid_id_tools.py:158
format
vid_id_tools
electrons_cff
nano_cff.nanoAOD_addDeepMET
def nanoAOD_addDeepMET(process, addDeepMETProducer, ResponseTune_Graph)
Definition: nano_cff.py:167
triggerObjects_cff
helpers.addToProcessAndTask
def addToProcessAndTask(label, module, process, task)
Definition: helpers.py:29
met_cff
nano_cff.nanoAOD_customizeCommon
def nanoAOD_customizeCommon(process)
Definition: nano_cff.py:323