CMS 3D CMS Logo

runMETCorrectionsAndUncertainties.py
Go to the documentation of this file.
1 from __future__ import print_function
2 import FWCore.ParameterSet.Config as cms
3 
5 import PhysicsTools.PatAlgos.tools.helpers as configtools
6 from PhysicsTools.PatAlgos.tools.helpers import getPatAlgosToolsTask, addToProcessAndTask
7 from PhysicsTools.PatAlgos.tools.jetTools import switchJetCollection
8 
9 
10 def isValidInputTag(input):
11  input_str = input
12  if isinstance(input, cms.InputTag):
13  input_str = input.value()
14  if input is None or input_str == '""':
15  return False
16  else:
17  return True
18 
19 
21 
22  _label='RunMETCorrectionsAndUncertainties'
23  _defaultParameters=dicttypes.SortedKeysDict()
24 
25  def __init__(self):
26  ConfigToolBase.__init__(self)
27  self.addParameter(self._defaultParameters, 'metType', "PF",
28  "Type of considered MET (only PF and Puppi supported so far)", Type=str)
29  self.addParameter(self._defaultParameters, 'correctionLevel', [""],
30  "level of correction : available corrections for pfMet are T0, T1, T2, Txy and Smear; irrelevant entry for MVAMet)",
31  allowedValues=["T0","T1","T2","Txy","Smear",""])
32  self.addParameter(self._defaultParameters, 'computeUncertainties', True,
33  "enable/disable the uncertainty computation", Type=bool)
34  self.addParameter(self._defaultParameters, 'produceIntermediateCorrections', False,
35  "enable/disable the production of all correction schemes (only for the most common)", Type=bool)
36  self.addParameter(self._defaultParameters, 'electronCollection', cms.InputTag('selectedPatElectrons'),
37  "Input electron collection", Type=cms.InputTag, acceptNoneValue=True)
38 # empty default InputTag for photons to avoid double-counting wrt. cleanPatElectrons collection
39  self.addParameter(self._defaultParameters, 'photonCollection', cms.InputTag('selectedPatPhotons'),
40  "Input photon collection", Type=cms.InputTag, acceptNoneValue=True)
41  self.addParameter(self._defaultParameters, 'muonCollection', cms.InputTag('selectedPatMuons'),
42  "Input muon collection", Type=cms.InputTag, acceptNoneValue=True)
43  self.addParameter(self._defaultParameters, 'tauCollection', cms.InputTag('selectedPatTaus'),
44  "Input tau collection", Type=cms.InputTag, acceptNoneValue=True)
45  self.addParameter(self._defaultParameters, 'jetCollectionUnskimmed', cms.InputTag('patJets'),
46  "Input unskimmed jet collection for T1 MET computation", Type=cms.InputTag, acceptNoneValue=True)
47  self.addParameter(self._defaultParameters, 'pfCandCollection', cms.InputTag('particleFlow'),
48  "pf Candidate collection", Type=cms.InputTag, acceptNoneValue=True)
49  self.addParameter(self._defaultParameters, 'autoJetCleaning', 'LepClean',
50  "Enable the jet cleaning for the uncertainty computation: Full for tau/photons/jet cleaning, Partial for jet cleaning, LepClean for jet cleaning with muon and electrons only, None or Manual for no cleaning", Type=str)
51  self.addParameter(self._defaultParameters, 'jetFlavor', 'AK4PFchs',
52  "Use AK4PF/AK4PFchs for PFJets,AK4Calo for CaloJets", Type=str)
53  self.addParameter(self._defaultParameters, 'jetCorrectionType', 'L1L2L3-L1',
54  "Use L1L2L3-L1 for the standard L1 removal / L1L2L3-RC for the random-cone correction", Type=str)
55 
56  self.addParameter(self._defaultParameters, 'jetCorLabelUpToL3', "ak4PFCHSL1FastL2L3Corrector", "Use ak4PFL1FastL2L3Corrector (ak4PFCHSL1FastL2L3Corrector) for PFJets with (without) charged hadron subtraction, ak4CaloL1FastL2L3Corrector for CaloJets", Type=str)
57  self.addParameter(self._defaultParameters, 'jetCorLabelL3Res', "ak4PFCHSL1FastL2L3ResidualCorrector", "Use ak4PFL1FastL2L3ResidualCorrector (ak4PFCHSL1FastL2L3ResidualCorrector) for PFJets with (without) charged hadron subtraction, ak4CaloL1FastL2L3ResidualCorrector for CaloJets", Type=str)
58 
59 # the file is used only for local running
60  self.addParameter(self._defaultParameters, 'jecUncertaintyFile', '',
61  "Extra JES uncertainty file", Type=str)
62  self.addParameter(self._defaultParameters, 'jecUncertaintyTag', None,
63  "JES uncertainty Tag", acceptNoneValue=True) # Type=str,
64 
65  self.addParameter(self._defaultParameters, 'mvaMetLeptons',["Electrons","Muons"],
66  "Leptons to be used for recoil computation in the MVA MET, available values are: Electrons, Muons, Taus, Photons", allowedValues=["Electrons","Muons","Taus","Photons",""])
67 
68  self.addParameter(self._defaultParameters, 'addToPatDefaultSequence', False,
69  "Flag to enable/disable that metUncertaintySequence is inserted into patDefaultSequence", Type=bool)
70  self.addParameter(self._defaultParameters, 'manualJetConfig', False,
71  "Enable jet configuration options", Type=bool)
72  self.addParameter(self._defaultParameters, 'jetSelection', 'pt>15 && abs(eta)<9.9',
73  "Advanced jet kinematic selection", Type=str)
74  self.addParameter(self._defaultParameters, 'recoMetFromPFCs', False,
75  "Recompute the MET from scratch using the pfCandidate collection", Type=bool)
76  self.addParameter(self._defaultParameters, 'reapplyJEC', True,
77  "Flag to enable/disable JEC update", Type=bool)
78  self.addParameter(self._defaultParameters, 'reclusterJets', False,
79  "Flag to enable/disable the jet reclustering", Type=bool)
80  self.addParameter(self._defaultParameters, 'computeMETSignificance', True,
81  "Flag to enable/disable the MET significance computation", Type=bool)
82  self.addParameter(self._defaultParameters, 'CHS', False,
83  "Flag to enable/disable the CHS jets", Type=bool)
84  self.addParameter(self._defaultParameters, 'runOnData', False,
85  "Switch for data/MC processing", Type=bool)
86  self.addParameter(self._defaultParameters, 'onMiniAOD', False,
87  "Switch on miniAOD configuration", Type=bool)
88  self.addParameter(self._defaultParameters, 'postfix', '',
89  "Technical parameter to identify the resulting sequence and its modules (allows multiple calls in a job)", Type=str)
90  self.addParameter(self._defaultParameters,'fixEE2017', False,
91  "Exclude jets and PF candidates with EE noise characteristics (fix for 2017 run)", Type=bool)
92  self.addParameter(self._defaultParameters,'fixEE2017Params', {'userawPt': True, 'ptThreshold': 50.0, 'minEtaThreshold': 2.65, 'maxEtaThreshold': 3.139},
93  "Parameters dict for fixEE2017: userawPt, ptThreshold, minEtaThreshold, maxEtaThreshold", Type=dict)
94  self.addParameter(self._defaultParameters, 'extractDeepMETs', False,
95  "Extract DeepMETs from miniAOD, instead of recomputing them.", Type=bool)
96 
97  #private parameters
98  self.addParameter(self._defaultParameters, 'Puppi', False,
99  "Puppi algorithm (private)", Type=bool)
100 
101 
102 
103  self._parameters = copy.deepcopy(self._defaultParameters)
104  self._comment = ""
105 
107  return self._defaultParameters
108 
109 #=========================================================================================
110  def __call__(self, process,
111  metType =None,
112  correctionLevel =None,
113  computeUncertainties =None,
114  produceIntermediateCorrections = None,
115  electronCollection =None,
116  photonCollection =None,
117  muonCollection =None,
118  tauCollection =None,
119  jetCollectionUnskimmed =None,
120  pfCandCollection =None,
121  autoJetCleaning =None,
122  jetFlavor =None,
123  jetCorr =None,
124  jetCorLabelUpToL3 =None,
125  jetCorLabelL3Res =None,
126  jecUncertaintyFile =None,
127  jecUncertaintyTag =None,
128  mvaMetLeptons =None,
129  addToPatDefaultSequence =None,
130  manualJetConfig =None,
131  jetSelection =None,
132  recoMetFromPFCs =None,
133  reapplyJEC =None,
134  reclusterJets =None,
135  computeMETSignificance =None,
136  CHS =None,
137  runOnData =None,
138  onMiniAOD =None,
139  fixEE2017 =None,
140  fixEE2017Params =None,
141  extractDeepMETs =None,
142  postfix =None):
143  electronCollection = self.initializeInputTag(electronCollection, 'electronCollection')
144  photonCollection = self.initializeInputTag(photonCollection, 'photonCollection')
145  muonCollection = self.initializeInputTag(muonCollection, 'muonCollection')
146  tauCollection = self.initializeInputTag(tauCollection, 'tauCollection')
147  jetCollectionUnskimmed = self.initializeInputTag(jetCollectionUnskimmed, 'jetCollectionUnskimmed')
148  pfCandCollection = self.initializeInputTag(pfCandCollection, 'pfCandCollection')
149  if metType is None :
150  metType = self._defaultParameters['metType'].value
151  if correctionLevel is None :
152  correctionLevel = self._defaultParameters['correctionLevel'].value
153  if computeUncertainties is None :
154  computeUncertainties = self._defaultParameters['computeUncertainties'].value
155  if produceIntermediateCorrections is None :
156  produceIntermediateCorrections = self._defaultParameters['produceIntermediateCorrections'].value
157  if electronCollection is None :
158  electronCollection = self._defaultParameters['electronCollection'].value
159  if photonCollection is None :
160  photonCollection = self._defaultParameters['photonCollection'].value
161  if muonCollection is None :
162  muonCollection = self._defaultParameters['muonCollection'].value
163  if tauCollection is None :
164  tauCollection = self._defaultParameters['tauCollection'].value
165  if jetCollectionUnskimmed is None :
166  jetCollectionUnskimmed = self._defaultParameters['jetCollectionUnskimmed'].value
167  if pfCandCollection is None :
168  pfCandCollection = self._defaultParameters['pfCandCollection'].value
169  if autoJetCleaning is None :
170  autoJetCleaning = self._defaultParameters['autoJetCleaning'].value
171  if jetFlavor is None :
172  jetFlavor = self._defaultParameters['jetFlavor'].value
173  if jetCorr is None :
174  jetCorr = self._defaultParameters['jetCorrectionType'].value
175  if jetCorLabelUpToL3 is None:
176  jetCorLabelUpToL3 = self._defaultParameters['jetCorLabelUpToL3'].value
177  if jetCorLabelL3Res is None:
178  jetCorLabelL3Res = self._defaultParameters['jetCorLabelL3Res'].value
179  if jecUncertaintyFile is None:
180  jecUncertaintyFile = self._defaultParameters['jecUncertaintyFile'].value
181  if jecUncertaintyTag is None:
182  jecUncertaintyTag = self._defaultParameters['jecUncertaintyTag'].value
183 
184  if mvaMetLeptons is None:
185  mvaMetLeptons = self._defaultParameters['mvaMetLeptons'].value
186 
187  if addToPatDefaultSequence is None :
188  addToPatDefaultSequence = self._defaultParameters['addToPatDefaultSequence'].value
189  if manualJetConfig is None :
190  manualJetConfig = self._defaultParameters['manualJetConfig'].value
191  if jetSelection is None :
192  jetSelection = self._defaultParameters['jetSelection'].value
193  recoMetFromPFCsIsNone = (recoMetFromPFCs is None)
194  if recoMetFromPFCs is None :
195  recoMetFromPFCs = self._defaultParameters['recoMetFromPFCs'].value
196  if reapplyJEC is None :
197  reapplyJEC = self._defaultParameters['reapplyJEC'].value
198  reclusterJetsIsNone = (reclusterJets is None)
199  if reclusterJets is None :
200  reclusterJets = self._defaultParameters['reclusterJets'].value
201  if computeMETSignificance is None :
202  computeMETSignificance = self._defaultParameters['computeMETSignificance'].value
203  if CHS is None :
204  CHS = self._defaultParameters['CHS'].value
205  if runOnData is None :
206  runOnData = self._defaultParameters['runOnData'].value
207  if onMiniAOD is None :
208  onMiniAOD = self._defaultParameters['onMiniAOD'].value
209  if postfix is None :
210  postfix = self._defaultParameters['postfix'].value
211  if fixEE2017 is None :
212  fixEE2017 = self._defaultParameters['fixEE2017'].value
213  if fixEE2017Params is None :
214  fixEE2017Params = self._defaultParameters['fixEE2017Params'].value
215  if extractDeepMETs is None :
216  extractDeepMETs = self._defaultParameters['extractDeepMETs'].value
217 
218  self.setParameter('metType',metType),
219  self.setParameter('correctionLevel',correctionLevel),
220  self.setParameter('computeUncertainties',computeUncertainties),
221  self.setParameter('produceIntermediateCorrections',produceIntermediateCorrections),
222  self.setParameter('electronCollection',electronCollection),
223  self.setParameter('photonCollection',photonCollection),
224  self.setParameter('muonCollection',muonCollection),
225  self.setParameter('tauCollection',tauCollection),
226  self.setParameter('jetCollectionUnskimmed',jetCollectionUnskimmed),
227  self.setParameter('pfCandCollection',pfCandCollection),
228 
229  self.setParameter('autoJetCleaning',autoJetCleaning),
230  self.setParameter('jetFlavor',jetFlavor),
231 
232  #optional
233  self.setParameter('jecUncertaintyFile',jecUncertaintyFile),
234  self.setParameter('jecUncertaintyTag',jecUncertaintyTag),
235 
236  self.setParameter('mvaMetLeptons',mvaMetLeptons),
237 
238  self.setParameter('addToPatDefaultSequence',addToPatDefaultSequence),
239  self.setParameter('jetSelection',jetSelection),
240  self.setParameter('recoMetFromPFCs',recoMetFromPFCs),
241  self.setParameter('reclusterJets',reclusterJets),
242  self.setParameter('computeMETSignificance',computeMETSignificance),
243  self.setParameter('reapplyJEC',reapplyJEC),
244  self.setParameter('CHS',CHS),
245  self.setParameter('runOnData',runOnData),
246  self.setParameter('onMiniAOD',onMiniAOD),
247  self.setParameter('postfix',postfix),
248  self.setParameter('fixEE2017',fixEE2017),
249  self.setParameter('fixEE2017Params',fixEE2017Params),
250  self.setParameter('extractDeepMETs',extractDeepMETs),
251 
252  #if mva/puppi MET, autoswitch to std jets
253  if metType == "MVA" or metType == "Puppi":
254  self.setParameter('CHS',False),
255 
256  #enabling puppi flag
257  self.setParameter('Puppi',self._defaultParameters['Puppi'].value)
258  if metType == "Puppi":
259  self.setParameter('metType',"PF")
260  self.setParameter('Puppi',True)
261 
262  #jet energy scale uncertainty needs
263  if manualJetConfig:
264  self.setParameter('CHS',CHS)
265  self.setParameter('jetCorLabelUpToL3',jetCorLabelUpToL3)
266  self.setParameter('jetCorLabelL3Res',jetCorLabelL3Res)
267  self.setParameter('reclusterJets',reclusterJets)
268  else:
269  #internal jet configuration
270  self.jetConfiguration()
271 
272  #defaults for 2017 fix
273  #(don't need to recluster, just uses a subset of the input jet coll)
274  if fixEE2017:
275  if recoMetFromPFCsIsNone: self.setParameter('recoMetFromPFCs',True)
276  if reclusterJetsIsNone: self.setParameter('reclusterJets',False)
277 
278  #met reprocessing and jet reclustering
279  if recoMetFromPFCs and reclusterJetsIsNone and not fixEE2017:
280  self.setParameter('reclusterJets',True)
281 
282  #ZD: puppi jet reclustering breaks the puppi jets
283  #overwriting of jet reclustering parameter for puppi
284  if self._parameters["Puppi"].value and not onMiniAOD:
285  self.setParameter('reclusterJets',False)
286 
287  self.apply(process)
288 
289 
290  def toolCode(self, process):
291  metType = self._parameters['metType'].value
292  correctionLevel = self._parameters['correctionLevel'].value
293  computeUncertainties = self._parameters['computeUncertainties'].value
294  produceIntermediateCorrections = self._parameters['produceIntermediateCorrections'].value
295  electronCollection = self._parameters['electronCollection'].value
296  photonCollection = self._parameters['photonCollection'].value
297  muonCollection = self._parameters['muonCollection'].value
298  tauCollection = self._parameters['tauCollection'].value
299  jetCollectionUnskimmed = self._parameters['jetCollectionUnskimmed'].value
300  pfCandCollection = self._parameters['pfCandCollection'].value
301  autoJetCleaning = self._parameters['autoJetCleaning'].value
302  jetFlavor = self._parameters['jetFlavor'].value
303  jetCorLabelUpToL3 = self._parameters['jetCorLabelUpToL3'].value
304  jetCorLabelL3Res = self._parameters['jetCorLabelL3Res'].value
305  jecUncertaintyFile = self._parameters['jecUncertaintyFile'].value
306  jecUncertaintyTag = self._parameters['jecUncertaintyTag'].value
307 
308  mvaMetLeptons = self._parameters['mvaMetLeptons'].value
309  addToPatDefaultSequence = self._parameters['addToPatDefaultSequence'].value
310  jetSelection = self._parameters['jetSelection'].value
311  recoMetFromPFCs = self._parameters['recoMetFromPFCs'].value
312  reapplyJEC = self._parameters['reapplyJEC'].value
313  reclusterJets = self._parameters['reclusterJets'].value
314  computeMETSignificance = self._parameters['computeMETSignificance'].value
315  onMiniAOD = self._parameters['onMiniAOD'].value
316  postfix = self._parameters['postfix'].value
317  fixEE2017 = self._parameters['fixEE2017'].value
318  fixEE2017Params = self._parameters['fixEE2017Params'].value
319  extractDeepMETs = self._parameters['extractDeepMETs'].value
320 
321  #prepare jet configuration
322  jetUncInfos = { "jCorrPayload":jetFlavor, "jCorLabelUpToL3":jetCorLabelUpToL3,
323  "jCorLabelL3Res":jetCorLabelL3Res, "jecUncFile":jecUncertaintyFile,
324  "jecUncTag":"Uncertainty" }
325 
326  if (jecUncertaintyFile!="" and jecUncertaintyTag==None):
327  jetUncInfos[ "jecUncTag" ] = ""
328  elif(jecUncertaintyTag!=None):
329  jetUncInfos[ "jecUncTag" ] = jecUncertaintyTag
330 
331  patMetModuleSequence = cms.Sequence()
332 
333  # 2017 EE fix will modify pf cand and jet collections used downstream
334  if fixEE2017:
335  pfCandCollection, jetCollectionUnskimmed = self.runFixEE2017(process,
336  fixEE2017Params,
337  jetCollectionUnskimmed,
338  pfCandCollection,
339  [electronCollection,muonCollection,tauCollection,photonCollection],
340  patMetModuleSequence,
341  postfix,
342  )
343 
344  # recompute the MET (and thus the jets as well for correction) from scratch
345  if recoMetFromPFCs:
346  self.recomputeRawMetFromPfcs(process,
347  pfCandCollection,
348  onMiniAOD,
349  patMetModuleSequence,
350  postfix)
351 
352  elif onMiniAOD: #raw MET extraction if running on miniAODs
353  self.extractMET(process, "raw", patMetModuleSequence, postfix)
354 
355  #jet AK4 reclustering if needed for JECs
356 
357  if reclusterJets:
358  jetCollectionUnskimmed = self.ak4JetReclustering(process, pfCandCollection,
359  patMetModuleSequence, postfix)
360 
361  # or reapplication of jecs
362  if onMiniAOD:
363  if not reclusterJets and reapplyJEC:
364  jetCollectionUnskimmed = self.updateJECs(process, jetCollectionUnskimmed, patMetModuleSequence, postfix)
365 
366 
367  #getting the jet collection that will be used for corrections
368  #and uncertainty computation
369  jetCollection = self.getJetCollectionForCorsAndUncs(process,
370  jetCollectionUnskimmed,
371  jetSelection,
372  autoJetCleaning,
373  patMetModuleSequence,
374  postfix)
375 
376  #pre-preparation to run over miniAOD
377  if onMiniAOD:
378  self.miniAODConfigurationPre(process, patMetModuleSequence, pfCandCollection, postfix)
379  else:
380  from PhysicsTools.PatUtils.pfeGammaToCandidate_cfi import pfeGammaToCandidate
381  task = getPatAlgosToolsTask(process)
382  addToProcessAndTask("pfeGammaToCandidate", pfeGammaToCandidate.clone(
383  electrons = copy.copy(electronCollection),
384  photons = copy.copy(photonCollection)),
385  process, task)
386  if hasattr(process,"patElectrons") and process.patElectrons.electronSource == cms.InputTag("reducedEgamma","reducedGedGsfElectrons"):
387  process.pfeGammaToCandidate.electron2pf = "reducedEgamma:reducedGsfElectronPfCandMap"
388  if hasattr(process,"patPhotons") and process.patPhotons.photonSource == cms.InputTag("reducedEgamma","reducedGedPhotons"):
389  process.pfeGammaToCandidate.photon2pf = "reducedEgamma:reducedPhotonPfCandMap"
390 
391  #default MET production
392  self.produceMET(process, metType,patMetModuleSequence, postfix)
393 
394 
395 
396  #preparation to run over miniAOD (met reproduction)
397  if onMiniAOD:
398  self.miniAODConfiguration(process,
399  pfCandCollection,
400  jetCollection,
401  patMetModuleSequence,
402  postfix
403  )
404 
405  # correct the MET
406  patMetCorrectionSequence, metModName = self.getCorrectedMET(process, metType, correctionLevel,
407  produceIntermediateCorrections,
408  jetCollection,
409  patMetModuleSequence, postfix )
410 
411  #fix the default jets for the type1 computation to those used to compute the uncertainties
412  #in order to be consistent with what is done in the correction and uncertainty step
413  #particularly true for miniAODs
414  if "T1" in metModName:
415  getattr(process,"patPFMetT1T2Corr"+postfix).src = jetCollection
416  getattr(process,"patPFMetT2Corr"+postfix).src = jetCollection
417  #ZD:puppi currently doesn't have the L1 corrections in the GT
418  if self._parameters["Puppi"].value:
419  getattr(process,"patPFMetT1T2Corr"+postfix).offsetCorrLabel = cms.InputTag("")
420  getattr(process,"patPFMetT2Corr"+postfix).offsetCorrLabel = cms.InputTag("")
421  if "Smear" in metModName:
422  getattr(process,"patSmearedJets"+postfix).src = jetCollection
423  if self._parameters["Puppi"].value:
424  getattr(process,"patPFMetT1T2SmearCorr"+postfix).offsetCorrLabel = cms.InputTag("")
425 
426 
427  #compute the uncertainty on the MET
428  patMetUncertaintySequence = cms.Sequence()
429  tmpUncSequence =cms.Sequence()
430  if not hasattr(process, "patMetUncertaintySequence"+postfix):
431  if self._parameters["Puppi"].value:
432  patMetUncertaintySequence=cms.Sequence(getattr(process, "ak4PFPuppiL1FastL2L3CorrectorChain")+getattr(process, "ak4PFPuppiL1FastL2L3ResidualCorrectorChain"))
433  else:
434  patMetUncertaintySequence=cms.Sequence(getattr(process, "ak4PFCHSL1FastL2L3CorrectorChain")+getattr(process, "ak4PFCHSL1FastL2L3ResidualCorrectorChain"))
435  patShiftedModuleSequence = cms.Sequence()
436  if computeUncertainties:
437  tmpUncSequence,patShiftedModuleSequence = self.getMETUncertainties(process, metType, metModName,
438  electronCollection,
439  photonCollection,
440  muonCollection,
441  tauCollection,
442  pfCandCollection,
443  jetCollection,
444  jetUncInfos,
445  postfix)
446 
447  if not hasattr(process, "patMetCorrectionSequence"+postfix):
448  setattr(process, "patMetCorrectionSequence"+postfix, patMetCorrectionSequence)
449  if not hasattr(process, "patMetUncertaintySequence"+postfix):
450  patMetUncertaintySequence += tmpUncSequence
451  setattr(process, "patMetUncertaintySequence"+postfix, patMetUncertaintySequence)
452  else:
453  if not len(configtools.listModules(tmpUncSequence))==0:
454  setattr(process, metModName+"patMetUncertaintySequence"+postfix , tmpUncSequence)
455  tmpSeq = getattr(process, "patMetUncertaintySequence"+postfix)
456  tmpSeq += getattr(process, metModName+"patMetUncertaintySequence"+postfix)
457 
458  if not hasattr(process, "patShiftedModuleSequence"+postfix):
459  setattr(process, "patShiftedModuleSequence"+postfix, patShiftedModuleSequence)
460  else:
461  if not len(configtools.listModules(patShiftedModuleSequence))==0:
462  setattr(process, metModName+"patShiftedModuleSequence"+postfix , patShiftedModuleSequence)
463  tmpSeq = getattr(process, "patShiftedModuleSequence"+postfix)
464  tmpSeq += getattr(process, metModName+"patShiftedModuleSequence"+postfix)
465 
466  if not hasattr(process, "patMetModuleSequence"+postfix):
467  setattr(process, "patMetModuleSequence"+postfix, patMetModuleSequence)
468 
469  #prepare and fill the final sequence containing all the sub-sequence
470  fullPatMetSequence = cms.Sequence()
471  fullPatMetSequence += getattr(process, "patMetModuleSequence"+postfix)
472  fullPatMetSequence += getattr(process, "patMetCorrectionSequence"+postfix)
473  fullPatMetSequence += getattr(process, "patMetUncertaintySequence"+postfix)
474  fullPatMetSequence += getattr(process, "patShiftedModuleSequence"+postfix)
475 
476  #adding the slimmed MET
477  if hasattr(process, "patCaloMet"):
478  fullPatMetSequence +=getattr(process, "patCaloMet")
479  # include deepMETsResolutionTune and deepMETsResponseTune into fullPatMetSequence
480  if hasattr(process, "deepMETsResolutionTune"):
481  fullPatMetSequence +=getattr(process, "deepMETsResolutionTune")
482  if hasattr(process, "deepMETsResponseTune"):
483  fullPatMetSequence += getattr(process, "deepMETsResponseTune")
484  if hasattr(process, "slimmedMETs"+postfix):
485  fullPatMetSequence +=getattr(process, "slimmedMETs"+postfix)
486 
487  setattr(process,"fullPatMetSequence"+postfix,fullPatMetSequence)
488 
489  #removing the non used jet selectors
490  configtools.removeIfInSequence(process, "selectedPatJetsForMetT1T2Corr", "patPFMetT1T2CorrSequence", postfix )
491 
492  #last modification for miniAODs
493  self.miniAODConfigurationPost(process, postfix)
494 
495  # insert the fullPatMetSequence into patDefaultSequence if needed
496  if addToPatDefaultSequence:
497  if not hasattr(process, "patDefaultSequence"):
498  raise ValueError("PAT default sequence is not defined !!")
499  process.patDefaultSequence += getattr(process, "fullPatMetSequence"+postfix)
500 
501 #====================================================================================================
502  def produceMET(self, process, metType, metModuleSequence, postfix):
503 
504  task = getPatAlgosToolsTask(process)
505 
506  if metType == "PF" and not hasattr(process, 'pat'+metType+'Met'):
507  process.load("PhysicsTools.PatUtils.patPFMETCorrections_cff")
508  task.add(process.producePatPFMETCorrectionsTask)
509  task.add(process.patPFMetT2SmearCorrTask)
510  task.add(process.patPFMetTxyCorrTask)
511  task.add(process.jetCorrectorsTask)
512 
513  _myPatMet = 'pat'+metType+'Met'+postfix
514  if postfix != "" and metType == "PF" and not hasattr(process, _myPatMet):
515  noClonesTmp = [ "particleFlowDisplacedVertex", "pfCandidateToVertexAssociation" ]
516  configtools.cloneProcessingSnippet(process, getattr(process,"producePatPFMETCorrections"), postfix, noClones = noClonesTmp, addToTask = True)
517  addToProcessAndTask(_myPatMet, getattr(process,'patPFMet').clone(), process, task)
518  getattr(process, _myPatMet).metSource = cms.InputTag("pfMet"+postfix)
519  getattr(process, _myPatMet).srcPFCands = copy.copy(self.getvalue("pfCandCollection"))
520  from Configuration.ProcessModifiers.run2_miniAOD_UL_cff import run2_miniAOD_UL
521  from Configuration.Eras.Modifier_run2_nanoAOD_106Xv1_cff import run2_nanoAOD_106Xv1
522  (run2_miniAOD_UL|run2_nanoAOD_106Xv1).toModify( getattr(process, _myPatMet), srcPFCands = "puppiForMET" if self.getvalue("Puppi") else copy.copy(self.getvalue("pfCandCollection")) )
523  if metType == "PF":
524  from Configuration.ProcessModifiers.run2_miniAOD_UL_cff import run2_miniAOD_UL
525  from Configuration.Eras.Modifier_run2_nanoAOD_106Xv1_cff import run2_nanoAOD_106Xv1
526  (run2_miniAOD_UL|run2_nanoAOD_106Xv1).toModify(getattr(process, _myPatMet), srcLeptons = \
527  cms.VInputTag( copy.copy(self.getvalue("electronCollection")) if self.getvalue("onMiniAOD") else cms.InputTag("pfeGammaToCandidate","electrons"),
528  copy.copy(self.getvalue("muonCollection")),
529  copy.copy(self.getvalue("photonCollection")) if self.getvalue("onMiniAOD") else cms.InputTag("pfeGammaToCandidate","photons")
530  ))
531 
532  if self.getvalue("runOnData"):
533  getattr(process, _myPatMet).addGenMET = False
534 
535 
536  #MM: FIXME MVA
537  if metType == "MVA": # and not hasattr(process, 'pat'+metType+'Met'):
538  # process.load("PhysicsTools.PatUtils.patPFMETCorrections_cff")
539  mvaMetProducer = self.createMVAMETModule(process)
540  addToProcessAndTask('pfMVAMet'+postfix, mvaMetProducer, process, task)
541  addToProcessAndTask(_myPatMet,
542  getattr(process,'patPFMet' ).clone(metSource = cms.InputTag('pfMVAMet')),
543  process, task)
544 
545  metModuleSequence += getattr(process, _myPatMet )
546 
547 #====================================================================================================
548  def getCorrectedMET(self, process, metType, correctionLevel,produceIntermediateCorrections,
549  jetCollection, metModuleSequence, postfix ):
550 
551  # default outputs
552  patMetCorrectionSequence = cms.Sequence()
553  metModName = "pat"+metType+"Met"+postfix
554 
555  if metType == "MVA": #corrections are irrelevant for the MVA MET (except jet smearing?)
556  return patMetCorrectionSequence, metModName
557 
558  corNames = { #not really needed but in case we have changes in the future....
559  "T0":"T0pc",
560  "T1":"T1",
561  "T2":"T2",
562  "Txy":"Txy",
563  "Smear":"Smear",
564  }
565 
566 
567  #if empty correction level, no need to try something
568  for cor in correctionLevel:
569  if cor not in corNames.keys():
570  if cor != "":
571  print("ERROR : ",cor," is not a proper MET correction name! aborting the MET correction production")
572  return patMetCorrectionSequence, metModName
573 
574  corModNames = {
575  "T0": "patPFMetT0CorrSequence"+postfix,
576  "T1": "patPFMetT1T2CorrSequence"+postfix,
577  "T2": "patPFMetT2CorrSequence"+postfix,
578  "Txy": "patPFMetTxyCorrSequence"+postfix,
579  "Smear": "patPFMetSmearCorrSequence"+postfix,
580  "T2Smear": "patPFMetT2SmearCorrSequence"+postfix
581  }
582 
583  if postfix != "":
584  noClonesTmp = [ "particleFlowDisplacedVertex", "pfCandidateToVertexAssociation" ]
585  if not hasattr(process, "patPFMetT0CorrSequence"+postfix):
586  configtools.cloneProcessingSnippet(process, getattr(process,"patPFMetT0CorrSequence"), postfix, noClones = noClonesTmp, addToTask = True)
587  if not hasattr(process, "patPFMetT1T2CorrSequence"+postfix):
588  configtools.cloneProcessingSnippet(process, getattr(process,"patPFMetT1T2CorrSequence"), postfix, addToTask = True)
589  if not hasattr(process, "patPFMetT2CorrSequence"+postfix):
590  configtools.cloneProcessingSnippet(process, getattr(process,"patPFMetT2CorrSequence"), postfix, addToTask = True)
591  if not hasattr(process, "patPFMetTxyCorrSequence"+postfix):
592  configtools.cloneProcessingSnippet(process, getattr(process,"patPFMetTxyCorrSequence"), postfix, addToTask = True)
593  if not hasattr(process, "patPFMetSmearCorrSequence"+postfix):
594  configtools.cloneProcessingSnippet(process, getattr(process,"patPFMetSmearCorrSequence"), postfix, addToTask = True)
595  if not hasattr(process, "patPFMetT2SmearCorrSequence"+postfix):
596  configtools.cloneProcessingSnippet(process, getattr(process,"patPFMetT2SmearCorrSequence"), postfix, addToTask = True)
597 
598  corModules = {}
599  for mod in corModNames.keys():
600  corModules[mod] = getattr(process, corModNames[mod] )
601 
602  corTags = {
603  #"T0":cms.InputTag('patPFMetT0Corr'+postfix),
604  #"T1":cms.InputTag('patPFMetT1T2Corr'+postfix, 'type1'),
605  #"T2":cms.InputTag('patPFMetT2Corr'+postfix, 'type2'),
606  #"Txy": cms.InputTag('patPFMetTxyCorr'+postfix),
607  #"Smear":cms.InputTag('patPFMetT1T2SmearCorr'+postfix, 'type1'),
608  #"T2Smear":cms.InputTag('patPFMetT2SmearCorr'+postfix, 'type2')
609  "T0":['patPFMetT0Corr'+postfix,''],
610  "T1":['patPFMetT1T2Corr'+postfix, 'type1'],
611  "T2":['patPFMetT2Corr'+postfix, 'type2'],
612  "Txy": ['patPFMetTxyCorr'+postfix,''],
613  "Smear":['patPFMetT1T2SmearCorr'+postfix, 'type1'],
614  "T2Smear":['patPFMetT2SmearCorr'+postfix, 'type2']
615  }
616 
617  corScheme=""
618  corrections = []
619  correctionSequence = []
620  for cor in correctionLevel:
621  corScheme += corNames[cor]
622  corrections.append(cms.InputTag(corTags[cor][0],corTags[cor][1]))
623  correctionSequence.append(corModules[cor])
624 
625  #T2 and smearing corModuleTag switch, specific case
626  if "T2" in correctionLevel and "Smear" in correctionLevel:
627  corrections.append(cms.InputTag(corTags["T2Smear"][0],corTags["T2Smear"][1]))
628  correctionSequence.append(corModules["T2Smear"])
629 
630  #if both are here, consider smeared corJets for the full T1+Smear correction
631  if "T1" in correctionLevel and "Smear" in correctionLevel:
632  corrections.remove(cms.InputTag(corTags["T1"][0],corTags["T1"][1]))
633 
634  #Txy parameter tuning
635  if "Txy" in correctionLevel:
636  self.tuneTxyParameters(process, corScheme, postfix)
637  getattr(process, "patPFMetTxyCorr"+postfix).srcPFlow = self._parameters["pfCandCollection"].value
638  from Configuration.ProcessModifiers.run2_miniAOD_UL_cff import run2_miniAOD_UL
639  from Configuration.Eras.Modifier_run2_nanoAOD_106Xv1_cff import run2_nanoAOD_106Xv1
640  (run2_miniAOD_UL|run2_nanoAOD_106Xv1).toModify( getattr(process, "patPFMetTxyCorr"+postfix), srcPFlow = "puppiForMET" if self.getvalue("Puppi") else self._parameters["pfCandCollection"].value )
641 
642 
643  #Enable MET significance if the type1 MET is computed
644  if "T1" in correctionLevel:
645  _myPatMet = "pat"+metType+"Met"+postfix
646  getattr(process, _myPatMet).computeMETSignificance = cms.bool(self.getvalue("computeMETSignificance"))
647  getattr(process, _myPatMet).srcPFCands = copy.copy(self.getvalue("pfCandCollection"))
648  from Configuration.ProcessModifiers.run2_miniAOD_UL_cff import run2_miniAOD_UL
649  from Configuration.Eras.Modifier_run2_nanoAOD_106Xv1_cff import run2_nanoAOD_106Xv1
650  (run2_miniAOD_UL|run2_nanoAOD_106Xv1).toModify(getattr(process, _myPatMet), srcPFCands = "puppiForMET" if self.getvalue("Puppi") else copy.copy(self.getvalue("pfCandCollection")) )
651  (run2_miniAOD_UL|run2_nanoAOD_106Xv1).toModify(getattr(process, _myPatMet), srcLeptons = \
652  cms.VInputTag(copy.copy(self.getvalue("electronCollection")) if self.getvalue("onMiniAOD") else
653  cms.InputTag("pfeGammaToCandidate","electrons"),
654  copy.copy(self.getvalue("muonCollection")),
655  copy.copy(self.getvalue("photonCollection")) if self.getvalue("onMiniAOD") else
656  cms.InputTag("pfeGammaToCandidate","photons")))
657  if postfix=="NoHF":
658  getattr(process, _myPatMet).computeMETSignificance = cms.bool(False)
659  if self.getvalue("runOnData"):
660  from RecoMET.METProducers.METSignificanceParams_cfi import METSignificanceParams_Data
661  getattr(process, _myPatMet).parameters = METSignificanceParams_Data
662  if self.getvalue("Puppi"):
663  getattr(process, _myPatMet).srcPFCands = cms.InputTag('puppiForMET')
664  getattr(process, _myPatMet).srcJets = cms.InputTag('cleanedPatJets'+postfix)
665  getattr(process, _myPatMet).srcJetSF = 'AK4PFPuppi'
666  getattr(process, _myPatMet).srcJetResPt = 'AK4PFPuppi_pt'
667  getattr(process, _myPatMet).srcJetResPhi = 'AK4PFPuppi_phi'
668 
669  #MET significance bypass for the patMETs from AOD
670  if not self._parameters["onMiniAOD"].value and not postfix=="NoHF":
671  _myPatMet = "patMETs"+postfix
672  getattr(process, _myPatMet).computeMETSignificance = cms.bool(self.getvalue("computeMETSignificance"))
673  getattr(process, _myPatMet).srcPFCands= copy.copy(self.getvalue("pfCandCollection"))
674  from Configuration.ProcessModifiers.run2_miniAOD_UL_cff import run2_miniAOD_UL
675  from Configuration.Eras.Modifier_run2_nanoAOD_106Xv1_cff import run2_nanoAOD_106Xv1
676  (run2_miniAOD_UL|run2_nanoAOD_106Xv1).toModify(getattr(process, _myPatMet), srcPFCands= "puppiForMET" if self.getvalue("Puppi") else copy.copy(self.getvalue("pfCandCollection")))
677  (run2_miniAOD_UL|run2_nanoAOD_106Xv1).toModify(getattr(process, _myPatMet), srcLeptons = \
678  cms.VInputTag(copy.copy(self.getvalue("electronCollection")) if self.getvalue("onMiniAOD") else
679  cms.InputTag("pfeGammaToCandidate","electrons"),
680  copy.copy(self.getvalue("muonCollection")),
681  copy.copy(self.getvalue("photonCollection")) if self.getvalue("onMiniAOD") else
682  cms.InputTag("pfeGammaToCandidate","photons")))
683 
684  if hasattr(process, "patCaloMet"):
685  getattr(process, "patCaloMet").computeMETSignificance = cms.bool(False)
686 
687  task = getPatAlgosToolsTask(process)
688 
689  #T1 parameter tuning when CHS jets are not used
690  if "T1" in correctionLevel and not self._parameters["CHS"].value:
691  addToProcessAndTask("corrPfMetType1"+postfix, getattr(process, "corrPfMetType1" ).clone(), process, task)
692  getattr(process, "corrPfMetType1"+postfix).src = cms.InputTag("ak4PFJets"+postfix)
693  getattr(process, "corrPfMetType1"+postfix).jetCorrLabel = cms.InputTag("ak4PFL1FastL2L3Corrector")
694  getattr(process, "corrPfMetType1"+postfix).jetCorrLabelRes = cms.InputTag("ak4PFL1FastL2L3ResidualCorrector")
695  getattr(process, "corrPfMetType1"+postfix).offsetCorrLabel = cms.InputTag("ak4PFL1FastjetCorrector")
696  getattr(process, "basicJetsForMet"+postfix).offsetCorrLabel = cms.InputTag("ak4PFL1FastjetCorrector")
697 
698  if "T1" in correctionLevel and self._parameters["Puppi"].value:
699  addToProcessAndTask("corrPfMetType1"+postfix, getattr(process, "corrPfMetType1" ).clone(), process, task)
700  getattr(process, "corrPfMetType1"+postfix).src = cms.InputTag("ak4PFJets"+postfix)
701  getattr(process, "corrPfMetType1"+postfix).jetCorrLabel = cms.InputTag("ak4PFPuppiL1FastL2L3Corrector")
702  getattr(process, "corrPfMetType1"+postfix).jetCorrLabelRes = cms.InputTag("ak4PFPuppiL1FastL2L3ResidualCorrector")
703  getattr(process, "corrPfMetType1"+postfix).offsetCorrLabel = cms.InputTag("ak4PFPuppiL1FastjetCorrector")
704  getattr(process, "basicJetsForMet"+postfix).offsetCorrLabel = cms.InputTag("L1FastJet")
705 
706  if "T1" in correctionLevel and self._parameters["CHS"].value and self._parameters["reclusterJets"].value:
707  getattr(process, "corrPfMetType1"+postfix).src = cms.InputTag("ak4PFJetsCHS"+postfix)
708 
709  #create the main MET producer
710  metModName = "pat"+metType+"Met"+corScheme+postfix
711 
712  sequenceName=""
713  corMetProducer=None
714  if metType == "PF":
715  corMetProducer = cms.EDProducer("CorrectedPATMETProducer",
716  src = cms.InputTag('pat'+metType+'Met' + postfix),
717  srcCorrections = cms.VInputTag(corrections)
718  )
719  sequenceName="patMetCorrectionSequence"
720 
721  #MM: FIXME MVA
722  #if metType == "MVA":
723  # return patMetCorrectionSequence, metModName #FIXME
724  # corMetProducer = self.createMVAMETModule(process)
725  # sequenceName="pfMVAMEtSequence"
726 
727  addToProcessAndTask(metModName, corMetProducer, process, task)
728 
729  # adding the full sequence only if it does not exist
730  if not hasattr(process, sequenceName+postfix):
731 
732  for corModule in correctionSequence:
733  patMetCorrectionSequence += corModule
734 
735  setattr(process, sequenceName+postfix, patMetCorrectionSequence)
736 
737  else: #if it exists, only add the missing correction modules, no need to redo everything
738  patMetCorrectionSequence = getattr(process, "patMetCorrectionSequence"+postfix)#cms.Sequence()
739 
740  #setattr(process, sequenceName+postfix,patMetCorrectionSequence)
741  for cor in corModNames.keys():
742  if not configtools.contains(patMetCorrectionSequence, corTags[cor][0]) and cor in correctionLevel:
743  patMetCorrectionSequence += corModules[cor]
744 
745  #plug the main patMetproducer
746  patMetCorrectionSequence += getattr(process, metModName)
747 
748  #create the intermediate MET steps
749  #and finally add the met producers in the sequence for scheduled mode
750  if produceIntermediateCorrections:
751  interMets = self.addIntermediateMETs(process, metType, correctionLevel, corScheme, corTags,corNames, postfix)
752  for met in interMets.keys():
753  addToProcessAndTask(met, interMets[met], process, task)
754  patMetCorrectionSequence += getattr(process, met)
755 
756  return patMetCorrectionSequence, metModName
757 
758 
759 #====================================================================================================
760  def addIntermediateMETs(self, process, metType, correctionLevel, corScheme, corTags, corNames, postfix):
761  interMets = {}
762 
763  # we don't want to duplicate an exisiting module if we ask for a simple 1-corr scheme
764  if len(correctionLevel) == 1:
765  return interMets
766 
767  #ugly, but it works
768  nCor=len(correctionLevel)+1
769  ids = [0]*nCor
770  for i in range(nCor**nCor):
771  tmp=i
772  exists=False
773  corName=""
774  corrections = []
775  for j in range(nCor):
776  ids[j] = tmp%nCor
777  tmp = tmp//nCor
778 
779  if j != 0 and ids[j-1] < ids[j]:
780  exists=True
781  for k in range(0,j):
782  if ids[k] == ids[j] and ids[k]!=0:
783  exists=True
784 
785  if exists or sum(ids[j] for j in range(nCor))==0:
786  continue
787 
788  for cor in range(nCor):
789  cid = ids[nCor-cor-1]
790  cKey = correctionLevel[cid-1]
791  if cid ==0:#empty correction
792  continue
793  else :
794  corName += corNames[cKey]
795  corrections.append( cms.InputTag(corTags[ cKey ][0], corTags[ cKey ][1]) )
796 
797  if corName == corScheme:
798  continue
799 
800  corName='pat'+metType+'Met' + corName + postfix
801  if configtools.contains(getattr(process,"patMetCorrectionSequence"+postfix), corName ) and hasattr(process, corName):
802  continue
803 
804  interMets[corName] = cms.EDProducer("CorrectedPATMETProducer",
805  src = cms.InputTag('pat'+metType+'Met' + postfix),
806  srcCorrections = cms.VInputTag(corrections)
807  )
808 
809 
810  return interMets
811 
812 
813 #====================================================================================================
814  def getMETUncertainties(self, process, metType, metModName, electronCollection,
815  photonCollection, muonCollection, tauCollection,
816  pfCandCollection, jetCollection, jetUncInfos,
817  postfix):
818 
819 
820  # uncertainty sequence
821  metUncSequence = cms.Sequence()
822  shiftedModuleSequence = cms.Sequence()
823 
824  task = getPatAlgosToolsTask(process)
825 
826  #===================================================================================
827  # jet energy resolution shifts
828  #===================================================================================
829  if not isValidInputTag(jetCollection): #or jetCollection=="":
830  print("INFO : jet collection %s does not exists, no energy resolution shifting will be performed in MET uncertainty tools" % jetCollection)
831  else:
832  preId=""
833  if "Smear" in metModName:
834  preId="Smeared"
835 
836  metJERUncModules = self.getVariations(process, metModName, "Jet",preId, jetCollection, "Res", metUncSequence, postfix=postfix )
837 
838  for mod in metJERUncModules.keys():
839  addToProcessAndTask(mod, metJERUncModules[mod], process, task)
840  shiftedModuleSequence += getattr(process, mod)
841 
842  #===================================================================================
843  # Unclustered energy candidates
844  #===================================================================================
845  if not hasattr(process, "pfCandsForUnclusteredUnc"+postfix):
846 
847  #Jet projection ==
848  pfCandsNoJets = cms.EDProducer("CandPtrProjector",
849  src = pfCandCollection,
850  veto = copy.copy(jetCollection),
851  useDeltaRforFootprint = cms.bool(False)
852  )
853  if self.getvalue("Puppi"):
854  from Configuration.ProcessModifiers.run2_miniAOD_UL_cff import run2_miniAOD_UL
855  from Configuration.Eras.Modifier_run2_nanoAOD_106Xv1_cff import run2_nanoAOD_106Xv1
856  (run2_miniAOD_UL|run2_nanoAOD_106Xv1).toModify(pfCandsNoJets, src = cms.InputTag('puppiForMET'))
857  (run2_miniAOD_UL|run2_nanoAOD_106Xv1).toModify(pfCandsNoJets, useDeltaRforFootprint = True)
858  addToProcessAndTask("pfCandsNoJets"+postfix, pfCandsNoJets, process, task)
859  metUncSequence += getattr(process, "pfCandsNoJets"+postfix)
860 
861  #electron projection ==
862  pfCandsNoJetsNoEle = cms.EDProducer("CandPtrProjector",
863  src = cms.InputTag("pfCandsNoJets"+postfix),
864  veto = copy.copy(electronCollection),
865  useDeltaRforFootprint = cms.bool(False)
866  )
867  if not self.getvalue("onMiniAOD"):
868  from Configuration.ProcessModifiers.run2_miniAOD_UL_cff import run2_miniAOD_UL
869  from Configuration.Eras.Modifier_run2_nanoAOD_106Xv1_cff import run2_nanoAOD_106Xv1
870  (run2_miniAOD_UL|run2_nanoAOD_106Xv1).toModify(pfCandsNoJetsNoEle, useDeltaRforFootprint = True)
871  (run2_miniAOD_UL|run2_nanoAOD_106Xv1).toModify(pfCandsNoJetsNoEle, veto = cms.InputTag("pfeGammaToCandidate","electrons"))
872  addToProcessAndTask("pfCandsNoJetsNoEle"+postfix, pfCandsNoJetsNoEle, process, task)
873  metUncSequence += getattr(process, "pfCandsNoJetsNoEle"+postfix)
874 
875  #muon projection ==
876  pfCandsNoJetsNoEleNoMu = cms.EDProducer("CandPtrProjector",
877  src = cms.InputTag("pfCandsNoJetsNoEle"+postfix),
878  veto = copy.copy(muonCollection),
879  useDeltaRforFootprint = cms.bool(False)
880  )
881  if not self.getvalue("onMiniAOD"):
882  from Configuration.ProcessModifiers.run2_miniAOD_UL_cff import run2_miniAOD_UL
883  from Configuration.Eras.Modifier_run2_nanoAOD_106Xv1_cff import run2_nanoAOD_106Xv1
884  (run2_miniAOD_UL|run2_nanoAOD_106Xv1).toModify(pfCandsNoJetsNoEleNoMu, useDeltaRforFootprint = True)
885  addToProcessAndTask("pfCandsNoJetsNoEleNoMu"+postfix, pfCandsNoJetsNoEleNoMu, process, task)
886  metUncSequence += getattr(process, "pfCandsNoJetsNoEleNoMu"+postfix)
887 
888  #tau projection ==
889  pfCandsNoJetsNoEleNoMuNoTau = cms.EDProducer("CandPtrProjector",
890  src = cms.InputTag("pfCandsNoJetsNoEleNoMu"+postfix),
891  veto = copy.copy(tauCollection),
892  useDeltaRforFootprint = cms.bool(False)
893  )
894  if self.getvalue("Puppi"):
895  from Configuration.ProcessModifiers.run2_miniAOD_UL_cff import run2_miniAOD_UL
896  from Configuration.Eras.Modifier_run2_nanoAOD_106Xv1_cff import run2_nanoAOD_106Xv1
897  (run2_miniAOD_UL|run2_nanoAOD_106Xv1).toModify(pfCandsNoJetsNoEleNoMuNoTau, useDeltaRforFootprint = True)
898  addToProcessAndTask("pfCandsNoJetsNoEleNoMuNoTau"+postfix, pfCandsNoJetsNoEleNoMuNoTau, process, task)
899  metUncSequence += getattr(process, "pfCandsNoJetsNoEleNoMuNoTau"+postfix)
900 
901  #photon projection ==
902  pfCandsForUnclusteredUnc = cms.EDProducer("CandPtrProjector",
903  src = cms.InputTag("pfCandsNoJetsNoEleNoMuNoTau"+postfix),
904  veto = copy.copy(photonCollection),
905  useDeltaRforFootprint = cms.bool(False)
906  )
907  if not self.getvalue("onMiniAOD"):
908  from Configuration.ProcessModifiers.run2_miniAOD_UL_cff import run2_miniAOD_UL
909  from Configuration.Eras.Modifier_run2_nanoAOD_106Xv1_cff import run2_nanoAOD_106Xv1
910  (run2_miniAOD_UL|run2_nanoAOD_106Xv1).toModify(pfCandsForUnclusteredUnc, useDeltaRforFootprint = True)
911  (run2_miniAOD_UL|run2_nanoAOD_106Xv1).toModify(pfCandsForUnclusteredUnc, veto = cms.InputTag("pfeGammaToCandidate","photons"))
912  addToProcessAndTask("pfCandsForUnclusteredUnc"+postfix, pfCandsForUnclusteredUnc, process, task)
913  metUncSequence += getattr(process, "pfCandsForUnclusteredUnc"+postfix)
914 
915  #===================================================================================
916  # energy shifts
917  #===================================================================================
918  # PFMuons, PFElectrons, PFPhotons, and PFTaus will be used
919  # to calculate MET Uncertainties.
920  #===================================================================================
921  #--------------
922  # PFElectrons :
923  #--------------
924  pfElectrons = cms.EDFilter("CandPtrSelector",
925  src = electronCollection,
926  cut = cms.string("pt > 5 && isPF && gsfTrack.isAvailable() && gsfTrack.hitPattern().numberOfLostHits(\'MISSING_INNER_HITS\') < 2")
927  )
928  addToProcessAndTask("pfElectrons"+postfix, pfElectrons, process, task)
929  metUncSequence += getattr(process, "pfElectrons"+postfix)
930  #--------------------------------------------------------------------
931  # PFTaus :
932  #---------
933  pfTaus = cms.EDFilter("PATTauRefSelector",
934  src = tauCollection,
935  cut = cms.string('pt > 18.0 & abs(eta) < 2.6 & tauID("decayModeFinding") > 0.5 & isPFTau')
936  )
937  addToProcessAndTask("pfTaus"+postfix, pfTaus, process, task)
938  metUncSequence += getattr(process, "pfTaus"+postfix)
939  #---------------------------------------------------------------------
940  # PFMuons :
941  #----------
942  pfMuons = cms.EDFilter("CandPtrSelector",
943  src = muonCollection,
944  cut = cms.string("pt > 5.0 && isPFMuon && abs(eta) < 2.4")
945  )
946  addToProcessAndTask("pfMuons"+postfix, pfMuons, process, task)
947  metUncSequence += getattr(process, "pfMuons"+postfix)
948  #---------------------------------------------------------------------
949  # PFPhotons :
950  #------------
951  if self._parameters["Puppi"].value or not self._parameters["onMiniAOD"].value:
952  cutforpfNoPileUp = cms.string("")
953  else:
954  cutforpfNoPileUp = cms.string("fromPV > 1")
955 
956  pfNoPileUp = cms.EDFilter("CandPtrSelector",
957  src = pfCandCollection,
958  cut = cutforpfNoPileUp
959  )
960  addToProcessAndTask("pfNoPileUp"+postfix, pfNoPileUp, process, task)
961  metUncSequence += getattr(process, "pfNoPileUp"+postfix)
962 
963  pfPhotons = cms.EDFilter("CandPtrSelector",
964  src = cms.InputTag("pfNoPileUp"+postfix),
965  cut = cms.string("abs(pdgId) = 22")
966  )
967  addToProcessAndTask("pfPhotons"+postfix, pfPhotons, process, task)
968  metUncSequence += getattr(process, "pfPhotons"+postfix)
969  #-------------------------------------------------------------------------
970  # Collections which have only PF Objects for calculating MET uncertainties
971  #-------------------------------------------------------------------------
972  electronCollection = cms.InputTag("pfElectrons"+postfix)
973  muonCollection = cms.InputTag("pfMuons"+postfix)
974  tauCollection = cms.InputTag("pfTaus"+postfix)
975  photonCollection = cms.InputTag("pfPhotons"+postfix)
976 
977 
978  objectCollections = { "Jet":jetCollection,
979  "Electron":electronCollection,
980  "Photon":photonCollection,
981  "Muon":muonCollection,
982  "Unclustered":cms.InputTag("pfCandsForUnclusteredUnc"+postfix),
983  "Tau":tauCollection,
984  }
985 
986  for obj in objectCollections.keys():
987  if not isValidInputTag(objectCollections[obj]): # or objectCollections[obj]=="":
988  print("INFO : %s collection %s does not exists, no energy scale shifting will be performed in MET uncertainty tools" %(obj, objectCollections[obj]))
989  else:
990  metObjUncModules = self.getVariations(process, metModName, obj,"", objectCollections[obj], "En", metUncSequence, jetUncInfos, postfix )
991 
992  #adding the shifted MET produced to the proper patMetModuleSequence
993  for mod in metObjUncModules.keys():
994  addToProcessAndTask(mod, metObjUncModules[mod], process, task)
995  shiftedModuleSequence += getattr(process, mod)
996 
997  #return the sequence containing the shifted collections producers
998  return metUncSequence, shiftedModuleSequence
999 
1000 #====================================================================================================
1001  def createEnergyScaleShiftedUpModule(self, process,identifier, objectCollection,
1002  varyByNsigmas, jetUncInfos=None, postfix=""):
1003 
1004  shiftedModuleUp = None
1005 
1006  if identifier == "Electron":
1007  shiftedModuleUp = cms.EDProducer("ShiftedParticleProducer",
1008  src = objectCollection,
1009  uncertainty = cms.string('((abs(y)<1.479)?(0.006+0*x):(0.015+0*x))'),
1010  shiftBy = cms.double(+1.*varyByNsigmas)
1011  )
1012 
1013  if identifier == "Photon":
1014  shiftedModuleUp = cms.EDProducer("ShiftedParticleProducer",
1015  src = objectCollection,
1016  uncertainty = cms.string('((abs(y)<1.479)?(0.01+0*x):(0.025+0*x))'),
1017  shiftBy = cms.double(+1.*varyByNsigmas)
1018  )
1019 
1020  if identifier == "Muon":
1021  shiftedModuleUp = cms.EDProducer("ShiftedParticleProducer",
1022  src = objectCollection,
1023  uncertainty = cms.string('((x<100)?(0.002+0*y):(0.05+0*y))'),
1024  shiftBy = cms.double(+1.*varyByNsigmas)
1025  )
1026 
1027  if identifier == "Tau":
1028  shiftedModuleUp = cms.EDProducer("ShiftedParticleProducer",
1029  src = objectCollection,
1030  uncertainty = cms.string('0.03+0*x*y'),
1031  shiftBy = cms.double(+1.*varyByNsigmas)
1032  )
1033 
1034  if identifier == "Unclustered":
1035  shiftedModuleUp = cms.EDProducer("ShiftedParticleProducer",
1036  src = objectCollection,
1037  binning = cms.VPSet(
1038  # charged PF hadrons - tracker resolution
1039  cms.PSet(
1040  binSelection = cms.string('charge!=0'),
1041  binUncertainty = cms.string('sqrt(pow(0.00009*x,2)+pow(0.0085/sqrt(sin(2*atan(exp(-y)))),2))')
1042  ),
1043  # neutral PF hadrons - HCAL resolution
1044  cms.PSet(
1045  binSelection = cms.string('pdgId==130'),
1046  energyDependency = cms.bool(True),
1047  binUncertainty = cms.string('((abs(y)<1.3)?(min(0.25,sqrt(0.64/x+0.0025))):(min(0.30,sqrt(1.0/x+0.0016))))')
1048  ),
1049  # photon - ECAL resolution
1050  cms.PSet(
1051  binSelection = cms.string('pdgId==22'),
1052  energyDependency = cms.bool(True),
1053  binUncertainty = cms.string('sqrt(0.0009/x+0.000001)+0*y')
1054  ),
1055  # HF particules - HF resolution
1056  cms.PSet(
1057  binSelection = cms.string('pdgId==1 || pdgId==2'),
1058  energyDependency = cms.bool(True),
1059  binUncertainty = cms.string('sqrt(1./x+0.0025)+0*y')
1060  ),
1061  ),
1062  shiftBy = cms.double(+1.*varyByNsigmas)
1063  )
1064 
1065  if identifier == "Jet":
1066  moduleType="ShiftedPATJetProducer"
1067  #MM: FIXME MVA
1068  #if self._parameters["metType"].value == "MVA":
1069  # moduleType="ShiftedPFJetProducer"
1070 
1071  if jetUncInfos["jecUncFile"] == "":
1072  shiftedModuleUp = cms.EDProducer(moduleType,
1073  src = objectCollection,
1074  jetCorrUncertaintyTag = cms.string(jetUncInfos["jecUncTag"] ),
1075  addResidualJES = cms.bool(True),
1076  jetCorrLabelUpToL3 = cms.InputTag(jetUncInfos["jCorLabelUpToL3"] ),
1077  jetCorrLabelUpToL3Res = cms.InputTag(jetUncInfos["jCorLabelL3Res"] ),
1078  jetCorrPayloadName = cms.string(jetUncInfos["jCorrPayload"] ),
1079  shiftBy = cms.double(+1.*varyByNsigmas),
1080  )
1081  else:
1082  shiftedModuleUp = cms.EDProducer(moduleType,
1083  src = objectCollection,
1084  jetCorrInputFileName = cms.FileInPath(jetUncInfos["jecUncFile"] ),
1085  jetCorrUncertaintyTag = cms.string(jetUncInfos["jecUncTag"] ),
1086  addResidualJES = cms.bool(True),
1087  jetCorrLabelUpToL3 = cms.InputTag(jetUncInfos["jCorLabelUpToL3"] ),
1088  jetCorrLabelUpToL3Res = cms.InputTag(jetUncInfos["jCorLabelL3Res"] ),
1089  jetCorrPayloadName = cms.string(jetUncInfos["jCorrPayload"] ),
1090  shiftBy = cms.double(+1.*varyByNsigmas),
1091  )
1092 
1093 
1094  return shiftedModuleUp
1095 
1096 
1097 #====================================================================================================
1098 
1099 
1100 #====================================================================================================
1101  def removePostfix(self, name, postfix):
1102 
1103  if postfix=="":
1104  return name
1105 
1106  baseName = name
1107  if baseName[-len(postfix):] == postfix:
1108  baseName = baseName[0:-len(postfix)]
1109  else:
1110  raise Exception("Tried to remove postfix %s from %s, but it wasn't there" % (postfix, baseName))
1111 
1112  return baseName
1113 
1114 #====================================================================================================
1115  def tuneTxyParameters(self, process, corScheme, postfix):
1117  xyTags = {
1118  "Txy_50ns":metCors.patMultPhiCorrParams_Txy_50ns,
1119  "T1Txy_50ns":metCors.patMultPhiCorrParams_T1Txy_50ns,
1120  "T0pcTxy_50ns":metCors.patMultPhiCorrParams_T0pcTxy_50ns,
1121  "T0pcT1Txy_50ns":metCors.patMultPhiCorrParams_T0pcT1Txy_50ns,
1122  "T1T2Txy_50ns":metCors.patMultPhiCorrParams_T1T2Txy_50ns,
1123  "T0pcT1T2Txy_50ns":metCors.patMultPhiCorrParams_T0pcT1T2Txy_50ns,
1124  "T1SmearTxy_50ns":metCors.patMultPhiCorrParams_T1SmearTxy_50ns,
1125  "T1T2SmearTxy_50ns":metCors.patMultPhiCorrParams_T1T2SmearTxy_50ns,
1126  "T0pcT1SmearTxy_50ns":metCors.patMultPhiCorrParams_T0pcT1SmearTxy_50ns,
1127  "T0pcT1T2SmearTxy_50ns":metCors.patMultPhiCorrParams_T0pcT1T2SmearTxy_50ns,
1128 
1129  "Txy_25ns":metCors.patMultPhiCorrParams_Txy_25ns,
1130  "T1Txy_25ns":metCors.patMultPhiCorrParams_T1Txy_25ns,
1131  "T0pcTxy_25ns":metCors.patMultPhiCorrParams_T0pcTxy_25ns,
1132  "T0pcT1Txy_25ns":metCors.patMultPhiCorrParams_T0pcT1Txy_25ns,
1133  "T1T2Txy_25ns":metCors.patMultPhiCorrParams_T1T2Txy_25ns,
1134  "T0pcT1T2Txy_25ns":metCors.patMultPhiCorrParams_T0pcT1T2Txy_25ns,
1135  "T1SmearTxy_25ns":metCors.patMultPhiCorrParams_T1SmearTxy_25ns,
1136  "T1T2SmearTxy_25ns":metCors.patMultPhiCorrParams_T1T2SmearTxy_25ns,
1137  "T0pcT1SmearTxy_25ns":metCors.patMultPhiCorrParams_T0pcT1SmearTxy_25ns,
1138  "T0pcT1T2SmearTxy_25ns":metCors.patMultPhiCorrParams_T0pcT1T2SmearTxy_25ns
1139  }
1140 
1141  getattr(process, "patPFMetTxyCorr"+postfix).parameters = xyTags[corScheme+"_25ns"]
1142 
1143 
1144 #====================================================================================================
1145  def getVariations(self, process, metModName, identifier,preId, objectCollection, varType,
1146  metUncSequence, jetUncInfos=None, postfix="" ):
1147 
1148  # temporary hardcoded varyByNSigma value
1149  varyByNsigmas=1
1150 
1151  # remove the postfix to put it at the end
1152  baseName = self.removePostfix(metModName, postfix)
1153 
1154  #default shifted MET producers
1155  shiftedMetProducers = {preId+identifier+varType+'Up':None, preId+identifier+varType+'Down':None}
1156 
1157  #create the shifted collection producers=========================================
1158  shiftedCollModules = {'Up':None, 'Down':None}
1159 
1160  if identifier=="Jet" and varType=="Res":
1161  smear=False
1162  if "Smear" in metModName:
1163  smear=True
1164  else:
1165  smear=True
1166  varyByNsigmas=101
1167 
1168  shiftedCollModules['Up'] = self.createShiftedJetResModule(process, smear, objectCollection, +1.*varyByNsigmas,
1169  "Up", postfix)
1170  shiftedCollModules['Down'] = self.createShiftedJetResModule(process, smear, objectCollection, -1.*varyByNsigmas,
1171  "Down", postfix)
1172  else:
1173  shiftedCollModules['Up'] = self.createEnergyScaleShiftedUpModule(process, identifier, objectCollection, varyByNsigmas, jetUncInfos, postfix)
1174  shiftedCollModules['Down'] = shiftedCollModules['Up'].clone( shiftBy = cms.double(-1.*varyByNsigmas) )
1175 
1176  if identifier=="Jet" and varType=="Res":
1177  smear=False
1178  if "Smear" in metModName:
1179  objectCollection=cms.InputTag("selectedPatJetsForMetT1T2SmearCorr"+postfix)
1180 
1181 
1182 
1183  #and the MET producers
1184  if identifier=="Jet" and varType=="Res" and self._parameters["runOnData"].value:
1185  shiftedMetProducers = self.copyCentralMETProducer(process, shiftedCollModules, identifier, metModName, varType, postfix)
1186  else:
1187  shiftedMetProducers = self.createShiftedModules(process, shiftedCollModules, identifier, preId, objectCollection,
1188  metModName, varType, metUncSequence, postfix)
1189 
1190  return shiftedMetProducers
1191 
1192 
1193 #========================================================================================
1194  def copyCentralMETProducer(self, process, shiftedCollModules, identifier, metModName, varType, postfix):
1195 
1196  # remove the postfix to put it at the end
1197  shiftedMetProducers = {}
1198  baseName = self.removePostfix(metModName, postfix)
1199  for mod in shiftedCollModules.keys():
1200  modName = baseName+identifier+varType+mod+postfix
1201  shiftedMETModule = getattr(process, metModName).clone()
1202  shiftedMetProducers[ modName ] = shiftedMETModule
1203 
1204  return shiftedMetProducers
1205 
1206 
1207 #========================================================================================
1208  def createShiftedJetResModule(self, process, smear, objectCollection, varyByNsigmas, varDir, postfix ):
1209 
1210  smearedJetModule = self.createSmearedJetModule(process, objectCollection, smear, varyByNsigmas, varDir, postfix)
1211 
1212  return smearedJetModule
1213 
1214 
1215 #========================================================================================
1216  def createShiftedModules(self, process, shiftedCollModules, identifier, preId, objectCollection,
1217  metModName, varType, metUncSequence, postfix):
1218 
1219  shiftedMetProducers = {}
1220 
1221  task = getPatAlgosToolsTask(process)
1222 
1223  # remove the postfix to put it at the end
1224  baseName = self.removePostfix(metModName, postfix)
1225 
1226  #adding the shifted collection producers to the sequence, create the shifted MET correction Modules and add them as well
1227  for mod in shiftedCollModules.keys():
1228  modName = "shiftedPat"+preId+identifier+varType+mod+postfix
1229  #MM: FIXME MVA
1230  #if "MVA" in metModName and identifier == "Jet": #dummy fix
1231  # modName = "uncorrectedshiftedPat"+preId+identifier+varType+mod+postfix
1232  if not hasattr(process, modName):
1233  addToProcessAndTask(modName, shiftedCollModules[mod], process, task)
1234  metUncSequence += getattr(process, modName)
1235 
1236  #removing the uncorrected
1237  modName = "shiftedPat"+preId+identifier+varType+mod+postfix
1238 
1239  #PF MET =================================================================================
1240  if "PF" in metModName:
1241  #create the MET shifts and add them to the sequence
1242  shiftedMETCorrModule = self.createShiftedMETModule(process, objectCollection, modName)
1243  modMETShiftName = "shiftedPatMETCorr"+preId+identifier+varType+mod+postfix
1244  if not hasattr(process, modMETShiftName):
1245  addToProcessAndTask(modMETShiftName, shiftedMETCorrModule, process, task)
1246  metUncSequence += getattr(process, modMETShiftName)
1247 
1248  #and finally prepare the shifted MET producers
1249  modName = baseName+identifier+varType+mod+postfix
1250  shiftedMETModule = getattr(process, metModName).clone(
1251  src = cms.InputTag( metModName ),
1252  srcCorrections = cms.VInputTag( cms.InputTag(modMETShiftName) )
1253  )
1254  shiftedMetProducers[ modName ] = shiftedMETModule
1255 
1256  #MM: FIXME MVA
1257  #MVA MET, duplication of the MVA MET producer ============================================
1258  #if "MVA" in metModName:
1259  # print "name: ",metModName, modName
1260  # shiftedMETModule = self.createMVAMETModule(process, identifier, modName, True)
1261  # modName = baseName+identifier+varType+mod+postfix
1262  # setattr(process, modName, shiftedMETModule)
1263  # shiftedMetProducers[ modName ] = shiftedMETModule
1264  #
1265  # #pileupjetId and =====
1266  # if identifier == "Jet":
1267  # #special collection replacement for the MVAMET for the jet case ======
1268  # origCollection = cms.InputTag("calibratedAK4PFJetsForPFMVAMEt"+postfix) #self._parameters["jetCollection"].value
1269  # newCollection = cms.InputTag("uncorrectedshiftedPat"+preId+identifier+varType+mod+postfix)
1270  # moduleName = "shiftedPat"+preId+identifier+varType+mod+postfix
1271  # corrShiftedModule = getattr(process,"calibratedAK4PFJetsForPFMVAMEt").clone(
1272  # src=newCollection
1273  # )
1274 
1275  # setattr(process, moduleName, corrShiftedModule)
1276  # metUncSequence += getattr(process, moduleName)
1277 
1278  # puJetIdProducer = getattr(process, "puJetIdForPFMVAMEt").clone(
1279  # jets = moduleName
1280  # )
1281  # puJetIdName = "puJetIdForPFMVAMEt"+preId+identifier+varType+mod+postfix
1282  # setattr(process, puJetIdName, puJetIdProducer)
1283  # metUncSequence += getattr(process, puJetIdName)
1284  # shiftedMETModule.srcMVAPileupJetId = cms.InputTag(puJetIdName,"fullDiscriminant")
1285 
1286  #==========================================================================================
1287 
1288  return shiftedMetProducers
1289 
1290 
1291 #========================================================================================
1292  def createShiftedMETModule(self, process, originCollection, shiftedCollection):
1293 
1294  shiftedModule = cms.EDProducer("ShiftedParticleMETcorrInputProducer",
1295  srcOriginal = originCollection,
1296  srcShifted = cms.InputTag(shiftedCollection),
1297  )
1298 
1299  return shiftedModule
1300 
1301 #========================================================================================
1302  def createMVAMETModule(self, process, identifier="", shiftedCollection="", isShifted=False, postfix="" ):
1303 
1304  task = getPatAlgosToolsTask(process)
1305 
1306  if not hasattr(process, "pfMVAMEt"):
1307  process.load("RecoMET.METPUSubtraction.mvaPFMET_cff")
1308 
1309  #retrieve collections
1310  electronCollection = self._parameters["electronCollection"].value
1311  muonCollection = self._parameters["electronCollection"].value
1312  photonCollection = self._parameters["photonCollection"].value
1313  tauCollection = self._parameters["tauCollection"].value
1314  pfCandCollection = self._parameters["pfCandCollection"].value
1315  corJetCollection = cms.InputTag("calibratedAK4PFJetsForPFMVAMEt"+postfix)
1316  uncorJetCollection = cms.InputTag("ak4PFJets")
1317 
1318  #shift if needed===
1319  if isShifted:
1320  if identifier == "Electron":
1321  electronCollection = cms.InputTag(shiftedCollection)
1322  if identifier == "Muon":
1323  muonCollection = cms.InputTag(shiftedCollection)
1324  if identifier == "Tau":
1325  tauCollection = cms.InputTag(shiftedCollection)
1326  if identifier == "Photon":
1327  photonCollection = cms.InputTag(shiftedCollection)
1328  if identifier == "Unclustered":
1329  pfCandCollection = cms.InputTag(shiftedCollection)
1330  if identifier == "Jet":
1331  corJetCollection = cms.InputTag(shiftedCollection)
1332  uncorJetCollection = cms.InputTag("uncorrected"+shiftedCollection)
1333 
1334 
1335  #leptons
1336  mvaMetLeptons = self._parameters["mvaMetLeptons"].value
1337  leptons = cms.VInputTag([])
1338  if "Electrons" in mvaMetLeptons and isValidInputTag(electronCollection):
1339  leptons.append = electronCollection
1340  if "Muons" in mvaMetLeptons and isValidInputTag(muonCollection):
1341  leptons.append = muonCollection
1342  if "Photons" in mvaMetLeptons and isValidInputTag(photonCollection):
1343  leptons.append = photonCollection
1344  if "Taus" in mvaMetLeptons and isValidInputTag(tauCollection):
1345  leptons.append = tauCollection
1346 
1347 
1348  mvaMetProducer=getattr(process, "pfMVAMEt").clone(
1349  srcCorrJets = corJetCollection,
1350  srcUncorrJets = uncorJetCollection,
1351  srcPFCandidates = pfCandCollection,
1352  srcLeptons = leptons,
1353  )
1354 
1355  return mvaMetProducer
1356 
1357 #========================================================================================
1358  def getUnclusteredVariationsForMVAMET(self, process, var, val, metUncSequence, postfix ):
1359 
1360  if not hasattr(process, "pfCandsNotInJetsForMetCorr"):
1361  process.load("JetMETCorrections.Type1MET.correctionTerms.PfMetType1Type2_cff")
1362 
1363  #MM: it's bloody stupid to make it that way....
1364  # compute the shifted particles ====
1365  unclCandModule = cms.EDProducer("ShiftedPFCandidateProducer",
1366  src = cms.InputTag('pfCandsNotInJetsForMetCorr'),
1367  shiftBy = cms.double(val),
1368  uncertainty = cms.double(0.10)
1369  )
1370  setattr(process, "pfCandsNotInJetsUnclusteredEn"+var+postfix, unclCandModule)
1371  metUncSequence += getattr(process, "pfCandsNotInJetsUnclusteredEn"+var+postfix)
1372 
1373 
1374 
1375  #replace the old unclustered particles by the shifted ones....
1376  pfCandCollection = self._parameters["pfCandCollection"].value
1377 
1378  #top projection on jets
1379  pfCandsNotInJets = cms.EDProducer("CandPtrProjector",
1380  src = pfCandCollection,
1381  veto = cms.InputTag("ak4PFJets")
1382  )
1383  setattr(process, "pfCandsNotInJetsUnclusteredEn"+var+postfix, pfCandsNotInJets)
1384  metUncSequence += getattr(process,"pfCandsNotInJetsUnclusteredEn"+var+postfix)
1385 
1386  fullShiftedModule = self.createShiftedObjectModuleForMVAMET(pfCandCollection, cms.InputTag("pfCandsNotInJetsUnclusteredEn"+var+postfix), 0.01 )
1387  setattr(process, "pfCandidatesEn"+var+postfix, fullShiftedModule)
1388  metUncSequence += getattr(process, "pfCandidatesEn"+var+postfix)
1389 
1390  # duplication of the MVA MET producer ============================================
1391  shiftedMETModule = self.createMVAMETModule(process, "Unclustered", "pfCandidatesEn"+var+postfix, True)
1392  return shiftedMETModule
1393 
1394 #========================================================================================
1395  def createShiftedObjectModuleForMVAMET(self, origCollection, shiftedCollection, dr=0.5):
1396  fullShiftedModule = cms.EDProducer("ShiftedPFCandidateProducerByMatchedObject",
1397  srcPFCandidates = origCollection,
1398  srcUnshiftedObjects = origCollection,
1399  dRmatch_PFCandidate = cms.double(dr),
1400  srcShiftedObjects = shiftedCollection
1401  )
1402  return fullShiftedModule
1403 
1404 #========================================================================================
1405  def createSmearedJetModule(self, process, jetCollection, smear, varyByNsigmas, varDir, postfix):
1406 
1407  smearedJetModule = None
1408 
1409  modName = "pat"
1410  selJetModName= "selectedPatJetsForMetT1T2"
1411  if smear:
1412  modName += "SmearedJets"
1413  selJetModName += "SmearCorr"
1414  else:
1415  modName += "Jets"
1416 
1417 
1418  if varDir != "":
1419  modName += "Res"+varDir
1420  selJetModName += "Res"+varDir
1421 
1422  modName += postfix
1423  selJetModName += postfix
1424 
1425  genJetsCollection=cms.InputTag('ak4GenJetsNoNu')
1426  if self._parameters["onMiniAOD"].value:
1427  genJetsCollection=cms.InputTag("slimmedGenJets")
1428 
1429  if "PF" == self._parameters["metType"].value:
1430  smearedJetModule = getattr(process, "patSmearedJets"+postfix).clone(
1431  src = jetCollection,
1432  enabled = cms.bool(smear),
1433  variation = cms.int32( int(varyByNsigmas) ),
1434  genJets = genJetsCollection,
1435  )
1436 
1437  if self._parameters["Puppi"].value:
1438  smearedJetModule.algo = cms.string('AK4PFPuppi')
1439  smearedJetModule.algopt = cms.string('AK4PFPuppi_pt')
1440 
1441  #MM: FIXME MVA
1442  #if "MVA" == self._parameters["metType"].value:
1443  # from RecoMET.METProducers.METSigParams_cfi import *
1444 
1445  # genJetsCollection=cms.InputTag('ak4GenJetsNoNu')
1446  # if self._parameters["onMiniAOD"].value:
1447  # genJetsCollection=cms.InputTag("slimmedGenJets")
1448 
1449  # smearedJetModule = cms.EDProducer("SmearedPFJetProducer",
1450  # src = cms.InputTag('ak4PFJets'),
1451  # jetCorrLabel = cms.InputTag("ak4PFL1FastL2L3Corrector"),
1452  # dRmaxGenJetMatch = cms.string('min(0.5, 0.1 + 0.3*exp(-0.05*(genJetPt - 10.)))'),
1453  # sigmaMaxGenJetMatch = cms.double(3.),
1454  # inputFileName = cms.FileInPath('PhysicsTools/PatUtils/data/pfJetResolutionMCtoDataCorrLUT.root'),
1455  # lutName = cms.string('pfJetResolutionMCtoDataCorrLUT'),
1456  # jetResolutions = METSignificance_params,
1457  # skipRawJetPtThreshold = cms.double(10.), # GeV
1458  # skipCorrJetPtThreshold = cms.double(1.e-2),
1459  # srcGenJets = genJetsCollection,
1460  # shiftBy = cms.double(varyByNsigmas),
1461  # #verbosity = cms.int32(1)
1462  # )
1463 
1464  return smearedJetModule
1465 
1466 
1467 ### Utilities ====================================================================
1468  def labelsInSequence(process, sequenceLabel, postfix=""):
1469  result = [ m.label()[:-len(postfix)] for m in listModules( getattr(process,sequenceLabel+postfix))]
1470  result.extend([ m.label()[:-len(postfix)] for m in listSequences( getattr(process,sequenceLabel+postfix))] )
1471  if postfix == "":
1472  result = [ m.label() for m in listModules( getattr(process,sequenceLabel+postfix))]
1473  result.extend([ m.label() for m in listSequences( getattr(process,sequenceLabel+postfix))] )
1474  return result
1475 
1476  def initializeInputTag(self, input, default):
1477  retVal = None
1478  if input is None:
1479  retVal = self._defaultParameters[default].value
1480  elif isinstance(input, str):
1481  retVal = cms.InputTag(input)
1482  else:
1483  retVal = input
1484  return retVal
1485 
1486 
1487  def recomputeRawMetFromPfcs(self, process, pfCandCollection, onMiniAOD, patMetModuleSequence, postfix):
1488 
1489  task = getPatAlgosToolsTask(process)
1490 
1491  #RECO MET
1492  if not hasattr(process, "pfMet"+postfix) and self._parameters["metType"].value == "PF":
1493  #common to AOD/mAOD processing
1494  #raw MET
1495  from RecoMET.METProducers.PFMET_cfi import pfMet
1496  addToProcessAndTask("pfMet"+postfix, pfMet.clone(), process, task)
1497  getattr(process, "pfMet"+postfix).calculateSignificance = False
1498  getattr(process, "pfMet"+postfix).src = pfCandCollection
1499  from Configuration.ProcessModifiers.run2_miniAOD_UL_cff import run2_miniAOD_UL
1500  from Configuration.Eras.Modifier_run2_nanoAOD_106Xv1_cff import run2_nanoAOD_106Xv1
1501  (run2_miniAOD_UL|run2_nanoAOD_106Xv1).toModify( getattr(process, "pfMet"+postfix), src = "puppiForMET" if self.getvalue("Puppi") else pfCandCollection )
1502  patMetModuleSequence += getattr(process, "pfMet"+postfix)
1503 
1504  #PAT METs
1505  process.load("PhysicsTools.PatAlgos.producersLayer1.metProducer_cff")
1506  task.add(process.makePatMETsTask)
1507  configtools.cloneProcessingSnippet(process, getattr(process,"patMETCorrections"), postfix, addToTask = True)
1508 
1509  #T1 pfMet for AOD to mAOD only
1510  if not onMiniAOD: #or self._parameters["Puppi"].value:
1511  #correction duplication needed
1512  getattr(process, "pfMetT1"+postfix).src = cms.InputTag("pfMet"+postfix)
1513  patMetModuleSequence += getattr(process, "pfMetT1"+postfix)
1514  _myPatMet = 'patMETs'+postfix
1515  addToProcessAndTask(_myPatMet, getattr(process,'patMETs' ).clone(), process, task)
1516  getattr(process, _myPatMet).metSource = cms.InputTag("pfMetT1"+postfix)
1517  getattr(process, _myPatMet).computeMETSignificance = cms.bool(self.getvalue("computeMETSignificance"))
1518  from Configuration.ProcessModifiers.run2_miniAOD_UL_cff import run2_miniAOD_UL
1519  from Configuration.Eras.Modifier_run2_nanoAOD_106Xv1_cff import run2_nanoAOD_106Xv1
1520  (run2_miniAOD_UL|run2_nanoAOD_106Xv1).toModify(getattr(process, _myPatMet), srcLeptons = \
1521  cms.VInputTag(copy.copy(self.getvalue("electronCollection")) if self.getvalue("onMiniAOD") else
1522  cms.InputTag("pfeGammaToCandidate","electrons"),
1523  copy.copy(self.getvalue("muonCollection")),
1524  copy.copy(self.getvalue("photonCollection")) if self.getvalue("onMiniAOD") else
1525  cms.InputTag("pfeGammaToCandidate","photons")))
1526  if postfix=="NoHF":
1527  getattr(process, _myPatMet).computeMETSignificance = cms.bool(False)
1528 
1529  if self.getvalue("Puppi"):
1530  getattr(process, _myPatMet).srcPFCands = cms.InputTag('puppiForMET')
1531  getattr(process, _myPatMet).srcJets = cms.InputTag('cleanedPatJets'+postfix)
1532  getattr(process, _myPatMet).srcJetSF = cms.string('AK4PFPuppi')
1533  getattr(process, _myPatMet).srcJetResPt = cms.string('AK4PFPuppi_pt')
1534  getattr(process, _myPatMet).srcJetResPhi = cms.string('AK4PFPuppi_phi')
1535 
1536 
1537  def extractMET(self, process, correctionLevel, patMetModuleSequence, postfix):
1538 
1539  task = getPatAlgosToolsTask(process)
1540 
1541  pfMet = cms.EDProducer("RecoMETExtractor",
1542  metSource= cms.InputTag("slimmedMETs" if not self._parameters["Puppi"].value else "slimmedMETsPuppi",processName=cms.InputTag.skipCurrentProcess()),
1543  correctionLevel = cms.string(correctionLevel)
1544  )
1545  if(correctionLevel=="raw"):
1546  addToProcessAndTask("pfMet"+postfix, pfMet, process, task)
1547  patMetModuleSequence += getattr(process, "pfMet"+postfix)
1548  else:
1549  addToProcessAndTask("met"+correctionLevel+postfix, pfMet, process, task)
1550  patMetModuleSequence += getattr(process, "met"+correctionLevel+postfix)
1551 
1552  if not hasattr(process, "genMetExtractor"+postfix) and not self._parameters["runOnData"].value:
1553  genMetExtractor = cms.EDProducer("GenMETExtractor",
1554  metSource= cms.InputTag("slimmedMETs",processName=cms.InputTag.skipCurrentProcess())
1555  )
1556  addToProcessAndTask("genMetExtractor"+postfix, genMetExtractor, process, task)
1557  patMetModuleSequence += getattr(process, "genMetExtractor"+postfix)
1558 
1559 
1560  def updateJECs(self,process,jetCollection, patMetModuleSequence, postfix):
1561  from PhysicsTools.PatAlgos.producersLayer1.jetUpdater_cff import updatedPatJetCorrFactors
1562 
1563  patJetCorrFactorsReapplyJEC = updatedPatJetCorrFactors.clone(
1564  src = jetCollection if not self._parameters["Puppi"].value else cms.InputTag("slimmedJetsPuppi"),
1565  levels = ['L1FastJet',
1566  'L2Relative',
1567  'L3Absolute'],
1568  payload = 'AK4PFchs' if not self._parameters["Puppi"].value else 'AK4PFPuppi' ) # always CHS from miniAODs, except for puppi
1569 
1570  if self._parameters["runOnData"].value:
1571  patJetCorrFactorsReapplyJEC.levels.append("L2L3Residual")
1572 
1573  from PhysicsTools.PatAlgos.producersLayer1.jetUpdater_cff import updatedPatJets
1574  patJetsReapplyJEC = updatedPatJets.clone(
1575  jetSource = jetCollection if not self._parameters["Puppi"].value else cms.InputTag("slimmedJetsPuppi"),
1576  jetCorrFactorsSource = cms.VInputTag(cms.InputTag("patJetCorrFactorsReapplyJEC"+postfix))
1577  )
1578 
1579  task = getPatAlgosToolsTask(process)
1580  addToProcessAndTask("patJetCorrFactorsReapplyJEC"+postfix, patJetCorrFactorsReapplyJEC, process, task)
1581  addToProcessAndTask("patJetsReapplyJEC"+postfix, patJetsReapplyJEC.clone(), process, task)
1582 
1583  patMetModuleSequence += getattr(process,"patJetCorrFactorsReapplyJEC"+postfix)
1584  patMetModuleSequence += getattr(process,"patJetsReapplyJEC"+postfix)
1585 
1586  return cms.InputTag("patJetsReapplyJEC"+postfix)
1587 
1588 
1589  def getJetCollectionForCorsAndUncs(self, process, jetCollectionUnskimmed,
1590  jetSelection, autoJetCleaning,patMetModuleSequence, postfix):
1591 
1592  task = getPatAlgosToolsTask(process)
1593 
1594  basicJetsForMet = cms.EDProducer("PATJetCleanerForType1MET",
1595  src = jetCollectionUnskimmed,
1596  jetCorrEtaMax = cms.double(9.9),
1597  jetCorrLabel = cms.InputTag("L3Absolute"),
1598  jetCorrLabelRes = cms.InputTag("L2L3Residual"),
1599  offsetCorrLabel = cms.InputTag("L1FastJet"),
1600  skipEM = cms.bool(True),
1601  skipEMfractionThreshold = cms.double(0.9),
1602  skipMuonSelection = cms.string('isGlobalMuon | isStandAloneMuon'),
1603  skipMuons = cms.bool(True),
1604  type1JetPtThreshold = cms.double(15.0)
1605  )
1606  addToProcessAndTask("basicJetsForMet"+postfix, basicJetsForMet, process, task)
1607  patMetModuleSequence += getattr(process, "basicJetsForMet"+postfix)
1608 
1609  from PhysicsTools.PatAlgos.selectionLayer1.jetSelector_cfi import selectedPatJets
1610  jetSelector = selectedPatJets.clone(
1611  src = cms.InputTag("basicJetsForMet"+postfix),
1612  cut = cms.string(jetSelection)
1613  )
1614  addToProcessAndTask("jetSelectorForMet"+postfix, jetSelector, process, task)
1615  patMetModuleSequence += getattr(process, "jetSelectorForMet"+postfix)
1616 
1617  jetCollection = self.jetCleaning(process, "jetSelectorForMet"+postfix, autoJetCleaning, patMetModuleSequence, postfix)
1618 
1619  return jetCollection
1620 
1621 
1622  def ak4JetReclustering(self,process, pfCandCollection, patMetModuleSequence, postfix):
1623 
1624  task = getPatAlgosToolsTask(process)
1625 
1626  chs = self._parameters["CHS"].value
1627  jetColName="ak4PFJets"
1628  CHSname=""
1629  pfCandColl=pfCandCollection
1630  if chs:
1631  CHSname="chs"
1632  jetColName="ak4PFJetsCHS"
1633 
1634  pfCHS=None
1635  if self._parameters["onMiniAOD"].value:
1636  pfCHS = cms.EDFilter("CandPtrSelector", src = pfCandCollection, cut = cms.string("fromPV"))
1637  pfCandColl = cms.InputTag("pfNoPileUpJME"+postfix)
1638  addToProcessAndTask("pfNoPileUpJME"+postfix, pfCHS, process, task)
1639  patMetModuleSequence += getattr(process, "pfNoPileUpJME"+postfix)
1640  else:
1641  addToProcessAndTask("tmpPFCandCollPtr"+postfix,
1642  cms.EDProducer("PFCandidateFwdPtrProducer",
1643  src = pfCandCollection ),
1644  process, task)
1645  process.load("CommonTools.ParticleFlow.pfNoPileUpJME_cff")
1646  task.add(process.pfNoPileUpJMETask)
1647  configtools.cloneProcessingSnippet(process, getattr(process,"pfNoPileUpJMESequence"), postfix, addToTask = True )
1648  getattr(process, "pfPileUpJME"+postfix).PFCandidates = cms.InputTag("tmpPFCandCollPtr"+postfix)
1649  addToProcessAndTask("pfNoPileUpJME"+postfix,
1650  getattr(process, "pfNoPileUpJME"+postfix).clone(
1651  bottomCollection = cms.InputTag("tmpPFCandCollPtr"+postfix) ),
1652  process, task )
1653  pfCandColl = cms.InputTag("pfNoPileUpJME"+postfix)
1654  patMetModuleSequence += getattr(process, "tmpPFCandCollPtr"+postfix)
1655  patMetModuleSequence += getattr(process, "pfNoPileUpJME"+postfix)
1656 
1657  jetColName+=postfix
1658  if not hasattr(process, jetColName):
1659  #process.load("RecoJets.JetProducers.ak4PFJets_cfi")
1660  #task.add(process.ak4PFJets)
1661  from RecoJets.JetProducers.ak4PFJets_cfi import ak4PFJets
1662  #if chs:
1663  addToProcessAndTask(jetColName, ak4PFJets.clone(), process, task)
1664  getattr(process, jetColName).src = pfCandColl
1665  getattr(process, jetColName).doAreaFastjet = True
1666 
1667  #puppi
1668  if self._parameters["Puppi"].value:
1669  getattr(process, jetColName).src = cms.InputTag("puppi")
1670 
1671  patMetModuleSequence += getattr(process, jetColName)
1672 
1673  corLevels=['L1FastJet', 'L2Relative', 'L3Absolute']
1674  if self._parameters["runOnData"].value:
1675  corLevels.append("L2L3Residual")
1676 
1677  switchJetCollection(process,
1678  jetSource = cms.InputTag(jetColName),
1679  jetCorrections = ('AK4PF'+CHSname, corLevels , ''),
1680  postfix=postfix
1681  )
1682 
1683  getattr(process,"patJets"+postfix).addGenJetMatch = False
1684  getattr(process,"patJets"+postfix).addGenPartonMatch = False
1685  getattr(process,"patJets"+postfix).addPartonJetMatch = False
1686  getattr(process,"patJets"+postfix).embedGenPartonMatch = False
1687  getattr(process,"patJets"+postfix).embedGenJetMatch = False
1688  if self._parameters['onMiniAOD'].value:
1689  del getattr(process,"patJets"+postfix).JetFlavourInfoSource
1690  del getattr(process,"patJets"+postfix).JetPartonMapSource
1691  del getattr(process,"patJets"+postfix).genPartonMatch
1692  del getattr(process,"patJets"+postfix).genJetMatch
1693  getattr(process,"patJets"+postfix).getJetMCFlavour = False
1694 
1695  getattr(process,"patJetCorrFactors"+postfix).src=cms.InputTag(jetColName)
1696  getattr(process,"patJetCorrFactors"+postfix).primaryVertices= cms.InputTag("offlineSlimmedPrimaryVertices")
1697  if self._parameters["Puppi"].value:
1698  getattr(process,"patJetCorrFactors"+postfix).payload=cms.string('AK4PFPuppi')
1699  patMetModuleSequence += getattr(process, "patJetCorrFactors"+postfix)
1700  patMetModuleSequence += getattr(process, "patJets"+postfix)
1701 
1702  return cms.InputTag("patJets"+postfix)
1703 
1704 
1705 
1706  def miniAODConfigurationPre(self, process, patMetModuleSequence, pfCandCollection, postfix):
1707 
1708  #extractor for caloMET === temporary for the beginning of the data taking
1709  self.extractMET(process,"rawCalo",patMetModuleSequence,postfix)
1710  caloMetName="metrawCalo" if hasattr(process,"metrawCalo") else "metrawCalo"+postfix
1711  from PhysicsTools.PatAlgos.tools.metTools import addMETCollection
1712  addMETCollection(process,
1713  labelName = "patCaloMet",
1714  metSource = caloMetName
1715  )
1716  getattr(process,"patCaloMet").addGenMET = False
1717 
1718  # extract DeepMETs (ResponseTune and ResolutionTune) from miniAOD
1719  if self._parameters["extractDeepMETs"].value:
1720  self.extractMET(process, "rawDeepResponseTune", patMetModuleSequence, postfix)
1721  deepMetResponseTuneName = "metrawDeepResponseTune" if hasattr(process, "metrawDeepResponseTune") else "metrawDeepResponseTune"+postfix
1722  addMETCollection(process,
1723  labelName = "deepMETsResponseTune",
1724  metSource = deepMetResponseTuneName
1725  )
1726  getattr(process, "deepMETsResponseTune").addGenMET = False
1727  getattr(process, "deepMETsResponseTune").computeMETSignificance = cms.bool(False)
1728 
1729  self.extractMET(process, "rawDeepResolutionTune", patMetModuleSequence, postfix)
1730  deepMetResolutionTuneName = "metrawDeepResolutionTune" if hasattr(process, "metrawDeepResolutionTune") else "metrawDeepResolutionTune"+postfix
1731  addMETCollection(process,
1732  labelName = "deepMETsResolutionTune",
1733  metSource = deepMetResolutionTuneName
1734  )
1735  getattr(process, "deepMETsResolutionTune").addGenMET = False
1736  getattr(process, "deepMETsResolutionTune").computeMETSignificance = cms.bool(False)
1737 
1738  ##adding the necessary chs and track met configuration
1739  task = getPatAlgosToolsTask(process)
1740 
1741  pfCHS = cms.EDFilter("CandPtrSelector", src = cms.InputTag("packedPFCandidates"), cut = cms.string("fromPV(0)>0"))
1742  addToProcessAndTask("pfCHS", pfCHS, process, task)
1743  pfMetCHS = cms.EDProducer("PFMETProducer",
1744  src = cms.InputTag('pfCHS'),
1745  alias = cms.string('pfMet'),
1746  globalThreshold = cms.double(0.0),
1747  calculateSignificance = cms.bool(False),
1748  )
1749 
1750  addToProcessAndTask("pfMetCHS", pfMetCHS, process, task)
1751 
1752  addMETCollection(process,
1753  labelName = "patCHSMet",
1754  metSource = "pfMetCHS"
1755  )
1756 
1757  process.patCHSMet.computeMETSignificant = cms.bool(False)
1758  process.patCHSMet.addGenMET = cms.bool(False)
1759 
1760  patMetModuleSequence += getattr(process, "pfCHS")
1761  patMetModuleSequence += getattr(process, "pfMetCHS")
1762  patMetModuleSequence += getattr(process, "patCHSMet")
1763 
1764  pfTrk = cms.EDFilter("CandPtrSelector", src = cms.InputTag("packedPFCandidates"), cut = cms.string("fromPV(0) > 0 && charge()!=0"))
1765  addToProcessAndTask("pfTrk", pfTrk, process, task)
1766  pfMetTrk = cms.EDProducer("PFMETProducer",
1767  src = cms.InputTag('pfTrk'),
1768  alias = cms.string('pfMet'),
1769  globalThreshold = cms.double(0.0),
1770  calculateSignificance = cms.bool(False),
1771  )
1772 
1773  addToProcessAndTask("pfMetTrk", pfMetTrk, process, task)
1774 
1775  addMETCollection(process,
1776  labelName = "patTrkMet",
1777  metSource = "pfMetTrk"
1778  )
1779 
1780  process.patTrkMet.computeMETSignificant = cms.bool(False)
1781  process.patTrkMet.addGenMET = cms.bool(False)
1782 
1783  patMetModuleSequence += getattr(process, "pfTrk")
1784  patMetModuleSequence += getattr(process, "pfMetTrk")
1785  patMetModuleSequence += getattr(process, "patTrkMet")
1786 
1787 
1788  def miniAODConfigurationPost(self, process, postfix):
1789 
1790  if self._parameters["metType"].value == "PF":
1791  if hasattr(process, "patPFMetTxyCorr"+postfix):
1792  getattr(process, "patPFMetTxyCorr"+postfix).vertexCollection = cms.InputTag("offlineSlimmedPrimaryVertices")
1793 
1794  if self._parameters['computeUncertainties'].value and not self._parameters["runOnData"]:
1795  getattr(process, "shiftedPatJetResDown"+postfix).genJets = cms.InputTag("slimmedGenJets")
1796  getattr(process, "shiftedPatJetResUp"+postfix).genJets = cms.InputTag("slimmedGenJets")
1797 
1798 
1799  def miniAODConfiguration(self, process, pfCandCollection, jetCollection,
1800  patMetModuleSequence, postfix ):
1801  if self._parameters["metType"].value == "PF": # not hasattr(process, "pfMet"+postfix)
1802  if "T1" in self._parameters['correctionLevel'].value:
1803  getattr(process, "patPFMet"+postfix).srcJets = jetCollection
1804  getattr(process, "patPFMet"+postfix).srcLeptons = cms.VInputTag(self._parameters["electronCollection"].value,
1805  self._parameters["muonCollection"].value,
1806  self._parameters["photonCollection"].value,
1807  )
1808  getattr(process, "patPFMet"+postfix).addGenMET = False
1809  if not self._parameters["runOnData"].value:
1810  getattr(process, "patPFMet"+postfix).addGenMET = True
1811  getattr(process, "patPFMet"+postfix).genMETSource = cms.InputTag("genMetExtractor"+postfix)
1812 
1813 
1814  if "Smear" in self._parameters['correctionLevel'].value:
1815  getattr(process, "patSmearedJets"+postfix).genJets = cms.InputTag("slimmedGenJets")
1816 
1817  if not hasattr(process, "slimmedMETs"+postfix) and self._parameters["metType"].value == "PF":
1818 
1819  task = getPatAlgosToolsTask(process)
1820 
1821  from PhysicsTools.PatAlgos.slimming.slimmedMETs_cfi import slimmedMETs
1822  addToProcessAndTask("slimmedMETs"+postfix, slimmedMETs.clone(), process, task)
1823  getattr(process,"slimmedMETs"+postfix).src = cms.InputTag("patPFMetT1"+postfix)
1824  getattr(process,"slimmedMETs"+postfix).rawVariation = cms.InputTag("patPFMet"+postfix)
1825  getattr(process,"slimmedMETs"+postfix).t1Uncertainties = cms.InputTag("patPFMetT1%s"+postfix)
1826  getattr(process,"slimmedMETs"+postfix).t01Variation = cms.InputTag("patPFMetT0pcT1"+postfix)
1827  getattr(process,"slimmedMETs"+postfix).t1SmearedVarsAndUncs = cms.InputTag("patPFMetT1Smear%s"+postfix)
1828 
1829  getattr(process,"slimmedMETs"+postfix).tXYUncForRaw = cms.InputTag("patPFMetTxy"+postfix)
1830  getattr(process,"slimmedMETs"+postfix).tXYUncForT1 = cms.InputTag("patPFMetT1Txy"+postfix)
1831  getattr(process,"slimmedMETs"+postfix).tXYUncForT01 = cms.InputTag("patPFMetT0pcT1Txy"+postfix)
1832  getattr(process,"slimmedMETs"+postfix).tXYUncForT1Smear = cms.InputTag("patPFMetT1SmearTxy"+postfix)
1833  getattr(process,"slimmedMETs"+postfix).tXYUncForT01Smear = cms.InputTag("patPFMetT0pcT1SmearTxy"+postfix)
1834 
1835  getattr(process,"slimmedMETs"+postfix).runningOnMiniAOD = True
1836  getattr(process,"slimmedMETs"+postfix).t01Variation = cms.InputTag("slimmedMETs" if not self._parameters["Puppi"].value else "slimmedMETsPuppi",processName=cms.InputTag.skipCurrentProcess())
1837 
1838  if hasattr(process, "deepMETsResolutionTune") and hasattr(process, "deepMETsResponseTune"):
1839  # process includes producing/extracting deepMETsResolutionTune and deepMETsResponseTune
1840  # add them to the slimmedMETs
1841  getattr(process,"slimmedMETs"+postfix).addDeepMETs = True
1842 
1843  #smearing and type0 variations not yet supported in reprocessing
1844  #del getattr(process,"slimmedMETs"+postfix).t1SmearedVarsAndUncs
1845  del getattr(process,"slimmedMETs"+postfix).tXYUncForRaw
1846  del getattr(process,"slimmedMETs"+postfix).tXYUncForT01
1847  del getattr(process,"slimmedMETs"+postfix).tXYUncForT1Smear
1848  del getattr(process,"slimmedMETs"+postfix).tXYUncForT01Smear
1849  #del getattr(process,"slimmedMETs"+postfix).caloMET
1850 
1851 
1852  def jetConfiguration(self):
1853 
1854  jetFlavor = self._parameters["jetFlavor"].value
1855  jetCorr = self._parameters["jetCorrectionType"].value
1856 
1857  jetCorLabelUpToL3Name="ak4PF"
1858  jetCorLabelL3ResName="ak4PF"
1859 
1860  # normal or CHS jets =============================
1861  if "chs" in jetFlavor:
1862  self.setParameter("CHS",True)
1863  jetCorLabelUpToL3Name += "CHS" #chs
1864  jetCorLabelL3ResName += "CHS"
1865  elif "Puppi" in jetFlavor:
1866  self.setParameter("CHS",False)
1867  jetCorLabelUpToL3Name += "Puppi"
1868  jetCorLabelL3ResName += "Puppi"
1869 
1870  else:
1871  self.setParameter("CHS",False)
1872 
1873  # change the correction type =====================
1874  if jetCorr == "L1L2L3-L1":
1875  jetCorLabelUpToL3Name += "L1FastL2L3Corrector"
1876  jetCorLabelL3ResName += "L1FastL2L3ResidualCorrector"
1877  elif jetCorr == "L1L2L3-RC": #to be fixed
1878  jetCorLabelUpToL3Name += "L1FastL2L3Corrector"
1879  jetCorLabelL3ResName += "L1FastL2L3ResidualCorrector"
1880 
1881  self.setParameter("jetCorLabelUpToL3",jetCorLabelUpToL3Name )
1882  self.setParameter("jetCorLabelL3Res",jetCorLabelL3ResName )
1883 
1884  # function enabling the auto jet cleaning for uncertainties ===============
1885  def jetCleaning(self, process, jetCollectionName, autoJetCleaning, jetProductionSequence, postfix ):
1886 
1887  if autoJetCleaning == "None" or autoJetCleaning == "Manual" :
1888  return cms.InputTag(jetCollectionName)
1889 
1890  #retrieve collections
1891  electronCollection = self._parameters["electronCollection"].value
1892  muonCollection = self._parameters["muonCollection"].value
1893  photonCollection = self._parameters["photonCollection"].value
1894  tauCollection = self._parameters["tauCollection"].value
1895 
1896  task = getPatAlgosToolsTask(process)
1897 
1898  if autoJetCleaning == "Full" : # auto clean taus, photons and jets
1899  if isValidInputTag(tauCollection):
1900  process.load("PhysicsTools.PatAlgos.cleaningLayer1.tauCleaner_cfi")
1901  task.add(process.cleanPatTaus)
1902  cleanPatTauProducer = getattr(process, "cleanPatTaus").clone(
1903  src = tauCollection
1904  )
1905  cleanPatTauProducer.checkOverlaps.electrons.src = electronCollection
1906  cleanPatTauProducer.checkOverlaps.muons.src = muonCollection
1907  addToProcessAndTask("cleanedPatTaus"+postfix, cleanPatTauProducer, process, task)
1908  jetProductionSequence += getattr(process, "cleanedPatTaus"+postfix)
1909  tauCollection = cms.InputTag("cleanedPatTaus"+postfix)
1910 
1911  if isValidInputTag(photonCollection):
1912  process.load("PhysicsTools.PatAlgos.cleaningLayer1.photonCleaner_cfi")
1913  task.add(process.cleanPatPhotons)
1914  cleanPatPhotonProducer = getattr(process, "cleanPatPhotons").clone(
1915  src = photonCollection
1916  )
1917  cleanPatPhotonProducer.checkOverlaps.electrons.src = electronCollection
1918  addToProcessAndTask("cleanedPatPhotons"+postfix, cleanPatPhotonProducer, process, task)
1919  jetProductionSequence += getattr(process, "cleanedPatPhotons"+postfix)
1920  photonCollection = cms.InputTag("cleanedPatPhotons"+postfix)
1921 
1922  #jet cleaning
1923  have_cleanPatJets = hasattr(process, "cleanPatJets")
1924  process.load("PhysicsTools.PatAlgos.cleaningLayer1.jetCleaner_cfi")
1925  cleanPatJetProducer = getattr(process, "cleanPatJets").clone(
1926  src = cms.InputTag(jetCollectionName)
1927  )
1928  #do not leave it hanging
1929  if not have_cleanPatJets:
1930  del process.cleanPatJets
1931  cleanPatJetProducer.checkOverlaps.muons.src = muonCollection
1932  cleanPatJetProducer.checkOverlaps.electrons.src = electronCollection
1933  if isValidInputTag(photonCollection) and autoJetCleaning != "LepClean":
1934  cleanPatJetProducer.checkOverlaps.photons.src = photonCollection
1935  else:
1936  del cleanPatJetProducer.checkOverlaps.photons
1937 
1938  if isValidInputTag(tauCollection) and autoJetCleaning != "LepClean":
1939  cleanPatJetProducer.checkOverlaps.taus.src = tauCollection
1940  else:
1941  del cleanPatJetProducer.checkOverlaps.taus
1942 
1943  # not used at all and electrons are already cleaned
1944  del cleanPatJetProducer.checkOverlaps.tkIsoElectrons
1945 
1946  addToProcessAndTask("cleanedPatJets"+postfix, cleanPatJetProducer, process, task)
1947  jetProductionSequence += getattr(process, "cleanedPatJets"+postfix)
1948  return cms.InputTag("cleanedPatJets"+postfix)
1949 
1950  # function to implement the 2017 EE fix
1951  def runFixEE2017(self,process,params,jets,cands,goodcolls,patMetModuleSequence,postfix):
1952 
1953  task = getPatAlgosToolsTask(process)
1954 
1955  pfCandidateJetsWithEEnoise = cms.EDProducer("BadPFCandidateJetsEEnoiseProducer",
1956  jetsrc = jets,
1957  userawPt = cms.bool(params["userawPt"]),
1958  ptThreshold = cms.double(params["ptThreshold"]),
1959  minEtaThreshold = cms.double(params["minEtaThreshold"]),
1960  maxEtaThreshold = cms.double(params["maxEtaThreshold"]),
1961  )
1962  addToProcessAndTask("pfCandidateJetsWithEEnoise"+postfix, pfCandidateJetsWithEEnoise, process, task)
1963  patMetModuleSequence += getattr(process,"pfCandidateJetsWithEEnoise"+postfix)
1964  pfcandidateClustered = cms.EDProducer("CandViewMerger",
1965  src = cms.VInputTag(goodcolls+[jets])
1966  )
1967  addToProcessAndTask("pfcandidateClustered"+postfix, pfcandidateClustered, process, task)
1968  patMetModuleSequence += getattr(process,"pfcandidateClustered"+postfix)
1969  pfcandidateForUnclusteredUnc = cms.EDProducer("CandPtrProjector",
1970  src = cands,
1971  veto = cms.InputTag("pfcandidateClustered"+postfix),
1972  )
1973  addToProcessAndTask("pfcandidateForUnclusteredUnc"+postfix, pfcandidateForUnclusteredUnc, process, task)
1974  patMetModuleSequence += getattr(process,"pfcandidateForUnclusteredUnc"+postfix)
1975  badUnclustered = cms.EDFilter("CandPtrSelector",
1976  src = cms.InputTag("pfcandidateForUnclusteredUnc"+postfix),
1977  cut = cms.string("abs(eta) > "+str(params["minEtaThreshold"])+" && abs(eta) < "+str(params["maxEtaThreshold"])),
1978  )
1979  addToProcessAndTask("badUnclustered"+postfix, badUnclustered, process, task)
1980  patMetModuleSequence += getattr(process,"badUnclustered"+postfix)
1981  blobUnclustered = cms.EDProducer("UnclusteredBlobProducer",
1982  candsrc = cms.InputTag("badUnclustered"+postfix),
1983  )
1984  addToProcessAndTask("blobUnclustered"+postfix, blobUnclustered, process, task)
1985  patMetModuleSequence += getattr(process,"blobUnclustered"+postfix)
1986  superbad = cms.EDProducer("CandViewMerger",
1987  src = cms.VInputTag(
1988  cms.InputTag("blobUnclustered"+postfix),
1989  cms.InputTag("pfCandidateJetsWithEEnoise"+postfix,"bad"),
1990  )
1991  )
1992  addToProcessAndTask("superbad"+postfix, superbad, process, task)
1993  patMetModuleSequence += getattr(process,"superbad"+postfix)
1994  pfCandidatesGoodEE2017 = cms.EDProducer("CandPtrProjector",
1995  src = cands,
1996  veto = cms.InputTag("superbad"+postfix),
1997  )
1998  addToProcessAndTask("pfCandidatesGoodEE2017"+postfix, pfCandidatesGoodEE2017, process, task)
1999  patMetModuleSequence += getattr(process,"pfCandidatesGoodEE2017"+postfix)
2000  # return good cands and jets
2001  return (cms.InputTag("pfCandidatesGoodEE2017"+postfix), cms.InputTag("pfCandidateJetsWithEEnoise"+postfix,"good"))
2002 
2003 #========================================================================================
2004 runMETCorrectionsAndUncertainties = RunMETCorrectionsAndUncertainties()
2005 
2006 
2007 
2008 #predefined functions for miniAOD production and reproduction
2009 # miniAOD production ===========================
2010 def runMetCorAndUncForMiniAODProduction(process, metType="PF",
2011  jetCollUnskimmed="patJets",
2012  photonColl="selectedPatPhotons",
2013  electronColl="selectedPatElectrons",
2014  muonColl="selectedPatMuons",
2015  tauColl="selectedPatTaus",
2016  pfCandColl = "particleFlow",
2017  jetCleaning="LepClean",
2018  jetSelection="pt>15 && abs(eta)<9.9",
2019  jecUnFile="",
2020  jetFlavor="AK4PFchs",
2021  recoMetFromPFCs=False,
2022  postfix=""):
2023 
2024  runMETCorrectionsAndUncertainties = RunMETCorrectionsAndUncertainties()
2025 
2026  #MET flavors
2027  runMETCorrectionsAndUncertainties(process, metType=metType,
2028  correctionLevel=["T0","T1","T2","Smear","Txy"],
2029  computeUncertainties=False,
2030  produceIntermediateCorrections=True,
2031  addToPatDefaultSequence=False,
2032  jetCollectionUnskimmed=jetCollUnskimmed,
2033  photonCollection=photonColl,
2034  electronCollection=electronColl,
2035  muonCollection=muonColl,
2036  tauCollection=tauColl,
2037  pfCandCollection =pfCandColl,
2038  autoJetCleaning=jetCleaning,
2039  jecUncertaintyFile=jecUnFile,
2040  jetSelection=jetSelection,
2041  jetFlavor=jetFlavor,
2042  recoMetFromPFCs=recoMetFromPFCs,
2043  postfix=postfix
2044  )
2045 
2046  #MET T1 uncertainties
2047  runMETCorrectionsAndUncertainties(process, metType=metType,
2048  correctionLevel=["T1"],
2049  computeUncertainties=True,
2050  produceIntermediateCorrections=False,
2051  addToPatDefaultSequence=False,
2052  jetCollectionUnskimmed=jetCollUnskimmed,
2053  photonCollection=photonColl,
2054  electronCollection=electronColl,
2055  muonCollection=muonColl,
2056  tauCollection=tauColl,
2057  pfCandCollection =pfCandColl,
2058  autoJetCleaning=jetCleaning,
2059  jecUncertaintyFile=jecUnFile,
2060  jetSelection=jetSelection,
2061  jetFlavor=jetFlavor,
2062  recoMetFromPFCs=recoMetFromPFCs,
2063  postfix=postfix
2064  )
2065 
2066  #MET T1 Smeared JER uncertainties
2067  runMETCorrectionsAndUncertainties(process, metType=metType,
2068  correctionLevel=["T1","Smear"],
2069  computeUncertainties=True,
2070  produceIntermediateCorrections=False,
2071  addToPatDefaultSequence=False,
2072  jetCollectionUnskimmed=jetCollUnskimmed,
2073  photonCollection=photonColl,
2074  electronCollection=electronColl,
2075  muonCollection=muonColl,
2076  tauCollection=tauColl,
2077  pfCandCollection =pfCandColl,
2078  autoJetCleaning=jetCleaning,
2079  jecUncertaintyFile=jecUnFile,
2080  jetSelection=jetSelection,
2081  jetFlavor=jetFlavor,
2082  recoMetFromPFCs=recoMetFromPFCs,
2083  postfix=postfix,
2084  )
2085 
2086 
2087 
2088 
2089 # miniAOD reproduction ===========================
2090 def runMetCorAndUncFromMiniAOD(process, metType="PF",
2091  jetCollUnskimmed="slimmedJets",
2092  photonColl="slimmedPhotons",
2093  electronColl="slimmedElectrons",
2094  muonColl="slimmedMuons",
2095  tauColl="slimmedTaus",
2096  pfCandColl = "packedPFCandidates",
2097  jetFlavor="AK4PFchs",
2098  jetCleaning="LepClean",
2099  isData=False,
2100  manualJetConfig=False,
2101  reclusterJets=None,
2102  jetSelection="pt>15 && abs(eta)<9.9",
2103  recoMetFromPFCs=None,
2104  jetCorLabelL3="ak4PFCHSL1FastL2L3Corrector",
2105  jetCorLabelRes="ak4PFCHSL1FastL2L3ResidualCorrector",
2106 ## jecUncFile="CondFormats/JetMETObjects/data/Summer15_50nsV5_DATA_UncertaintySources_AK4PFchs.txt",
2107  CHS=False,
2108  reapplyJEC=True,
2109  jecUncFile="",
2110  computeMETSignificance=True,
2111  fixEE2017=False,
2112  fixEE2017Params=None,
2113  extractDeepMETs=False,
2114  postfix=""):
2115 
2116  runMETCorrectionsAndUncertainties = RunMETCorrectionsAndUncertainties()
2117 
2118  #MET T1 uncertainties
2119  runMETCorrectionsAndUncertainties(process, metType=metType,
2120  correctionLevel=["T1"],
2121  computeUncertainties=True,
2122  produceIntermediateCorrections=False,
2123  addToPatDefaultSequence=False,
2124  jetCollectionUnskimmed=jetCollUnskimmed,
2125  electronCollection=electronColl,
2126  muonCollection=muonColl,
2127  tauCollection=tauColl,
2128  photonCollection=photonColl,
2129  pfCandCollection =pfCandColl,
2130  runOnData=isData,
2131  onMiniAOD=True,
2132  reapplyJEC=reapplyJEC,
2133  reclusterJets=reclusterJets,
2134  jetSelection=jetSelection,
2135  recoMetFromPFCs=recoMetFromPFCs,
2136  autoJetCleaning=jetCleaning,
2137  manualJetConfig=manualJetConfig,
2138  jetFlavor=jetFlavor,
2139  jetCorLabelUpToL3=jetCorLabelL3,
2140  jetCorLabelL3Res=jetCorLabelRes,
2141  jecUncertaintyFile=jecUncFile,
2142  computeMETSignificance=computeMETSignificance,
2143  CHS=CHS,
2144  postfix=postfix,
2145  fixEE2017=fixEE2017,
2146  fixEE2017Params=fixEE2017Params,
2147  extractDeepMETs=extractDeepMETs,
2148  )
2149 
2150  #MET T1+Txy / Smear
2151  runMETCorrectionsAndUncertainties(process, metType=metType,
2152  correctionLevel=["T1","Txy"],
2153  computeUncertainties=False,
2154  produceIntermediateCorrections=True,
2155  addToPatDefaultSequence=False,
2156  jetCollectionUnskimmed=jetCollUnskimmed,
2157  electronCollection=electronColl,
2158  muonCollection=muonColl,
2159  tauCollection=tauColl,
2160  photonCollection=photonColl,
2161  pfCandCollection =pfCandColl,
2162  runOnData=isData,
2163  onMiniAOD=True,
2164  reapplyJEC=reapplyJEC,
2165  reclusterJets=reclusterJets,
2166  jetSelection=jetSelection,
2167  recoMetFromPFCs=recoMetFromPFCs,
2168  autoJetCleaning=jetCleaning,
2169  manualJetConfig=manualJetConfig,
2170  jetFlavor=jetFlavor,
2171  jetCorLabelUpToL3=jetCorLabelL3,
2172  jetCorLabelL3Res=jetCorLabelRes,
2173  jecUncertaintyFile=jecUncFile,
2174  computeMETSignificance=computeMETSignificance,
2175  CHS=CHS,
2176  postfix=postfix,
2177  fixEE2017=fixEE2017,
2178  fixEE2017Params=fixEE2017Params,
2179  extractDeepMETs=extractDeepMETs,
2180  )
2181  #MET T1+Smear + uncertainties
2182  runMETCorrectionsAndUncertainties(process, metType=metType,
2183  correctionLevel=["T1","Smear"],
2184  computeUncertainties=True,
2185  produceIntermediateCorrections=False,
2186  addToPatDefaultSequence=False,
2187  jetCollectionUnskimmed=jetCollUnskimmed,
2188  electronCollection=electronColl,
2189  muonCollection=muonColl,
2190  tauCollection=tauColl,
2191  photonCollection=photonColl,
2192  pfCandCollection =pfCandColl,
2193  runOnData=isData,
2194  onMiniAOD=True,
2195  reapplyJEC=reapplyJEC,
2196  reclusterJets=reclusterJets,
2197  jetSelection=jetSelection,
2198  recoMetFromPFCs=recoMetFromPFCs,
2199  autoJetCleaning=jetCleaning,
2200  manualJetConfig=manualJetConfig,
2201  jetFlavor=jetFlavor,
2202  jetCorLabelUpToL3=jetCorLabelL3,
2203  jetCorLabelL3Res=jetCorLabelRes,
2204  jecUncertaintyFile=jecUncFile,
2205  computeMETSignificance=computeMETSignificance,
2206  CHS=CHS,
2207  postfix=postfix,
2208  fixEE2017=fixEE2017,
2209  fixEE2017Params=fixEE2017Params,
2210  extractDeepMETs=extractDeepMETs,
2211  )
def miniAODConfiguration(self, process, pfCandCollection, jetCollection, patMetModuleSequence, postfix)
def getVariations(self, process, metModName, identifier, preId, objectCollection, varType, metUncSequence, jetUncInfos=None, postfix="")
def extractMET(self, process, correctionLevel, patMetModuleSequence, postfix)
def getUnclusteredVariationsForMVAMET(self, process, var, val, metUncSequence, postfix)
def addToProcessAndTask(label, module, process, task)
Definition: helpers.py:29
def getMETUncertainties(self, process, metType, metModName, electronCollection, photonCollection, muonCollection, tauCollection, pfCandCollection, jetCollection, jetUncInfos, postfix)
def getCorrectedMET(self, process, metType, correctionLevel, produceIntermediateCorrections, jetCollection, metModuleSequence, postfix)
def runMetCorAndUncForMiniAODProduction(process, metType="PF", jetCollUnskimmed="patJets", photonColl="selectedPatPhotons", electronColl="selectedPatElectrons", muonColl="selectedPatMuons", tauColl="selectedPatTaus", pfCandColl="particleFlow", jetCleaning="LepClean", jetSelection="pt>15 && abs(eta)<9.9", jecUnFile="", jetFlavor="AK4PFchs", recoMetFromPFCs=False, postfix="")
S & print(S &os, JobReport::InputFile const &f)
Definition: JobReport.cc:66
def recomputeRawMetFromPfcs(self, process, pfCandCollection, onMiniAOD, patMetModuleSequence, postfix)
def createShiftedMETModule(self, process, originCollection, shiftedCollection)
def runFixEE2017(self, process, params, jets, cands, goodcolls, patMetModuleSequence, postfix)
def miniAODConfigurationPre(self, process, patMetModuleSequence, pfCandCollection, postfix)
def addIntermediateMETs(self, process, metType, correctionLevel, corScheme, corTags, corNames, postfix)
def getJetCollectionForCorsAndUncs(self, process, jetCollectionUnskimmed, jetSelection, autoJetCleaning, patMetModuleSequence, postfix)
def labelsInSequence(process, sequenceLabel, postfix="")
Utilities ====================================================================.
def ak4JetReclustering(self, process, pfCandCollection, patMetModuleSequence, postfix)
def createShiftedModules(self, process, shiftedCollModules, identifier, preId, objectCollection, metModName, varType, metUncSequence, postfix)
def listModules(sequence)
Definition: helpers.py:207
def createShiftedJetResModule(self, process, smear, objectCollection, varyByNsigmas, varDir, postfix)
def createEnergyScaleShiftedUpModule(self, process, identifier, objectCollection, varyByNsigmas, jetUncInfos=None, postfix="")
def updateJECs(self, process, jetCollection, patMetModuleSequence, postfix)
def listSequences(sequence)
Definition: helpers.py:212
def createMVAMETModule(self, process, identifier="", shiftedCollection="", isShifted=False, postfix="")
TEveGeoShape * clone(const TEveElement *element, TEveElement *parent)
Definition: eve_macros.cc:135
def createShiftedObjectModuleForMVAMET(self, origCollection, shiftedCollection, dr=0.5)
def getPatAlgosToolsTask(process)
Definition: helpers.py:14
def __call__(self, process, metType=None, correctionLevel=None, computeUncertainties=None, produceIntermediateCorrections=None, electronCollection=None, photonCollection=None, muonCollection=None, tauCollection=None, jetCollectionUnskimmed=None, pfCandCollection=None, autoJetCleaning=None, jetFlavor=None, jetCorr=None, jetCorLabelUpToL3=None, jetCorLabelL3Res=None, jecUncertaintyFile=None, jecUncertaintyTag=None, mvaMetLeptons=None, addToPatDefaultSequence=None, manualJetConfig=None, jetSelection=None, recoMetFromPFCs=None, reapplyJEC=None, reclusterJets=None, computeMETSignificance=None, CHS=None, runOnData=None, onMiniAOD=None, fixEE2017=None, fixEE2017Params=None, extractDeepMETs=None, postfix=None)
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="")
#define str(s)
def createSmearedJetModule(self, process, jetCollection, smear, varyByNsigmas, varDir, postfix)
def copyCentralMETProducer(self, process, shiftedCollModules, identifier, metModName, varType, postfix)
def jetCleaning(self, process, jetCollectionName, autoJetCleaning, jetProductionSequence, postfix)