CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
runMETCorrectionsAndUncertainties.py
Go to the documentation of this file.
1 import FWCore.ParameterSet.Config as cms
2 
4 import PhysicsTools.PatAlgos.tools.helpers as configtools
5 from PhysicsTools.PatAlgos.tools.jetTools import switchJetCollection
6 
7 
8 def isValidInputTag(input):
9  input_str = input
10  if isinstance(input, cms.InputTag):
11  input_str = input.value()
12  if input is None or input_str == '""':
13  return False
14  else:
15  return True
16 
17 
19 
20  _label='RunMETCorrectionsAndUncertainties'
21  _defaultParameters=dicttypes.SortedKeysDict()
22 
23  def __init__(self):
24  ConfigToolBase.__init__(self)
25  self.addParameter(self._defaultParameters, 'metType', "PF",
26  "Type of considered MET (only PF supported so far)", Type=str)
27  self.addParameter(self._defaultParameters, 'correctionLevel', [""],
28  "level of correction : available corrections for pfMet are T0, T1, T2, Txy and Smear; irrelevant entry for MVAMet)",
29  allowedValues=["T0","T1","T2","Txy","Smear",""])
30  self.addParameter(self._defaultParameters, 'computeUncertainties', True,
31  "enable/disable the uncertainty computation", Type=bool)
32  self.addParameter(self._defaultParameters, 'produceIntermediateCorrections', False,
33  "enable/disable the production of all correction schemes (only for the most common)", Type=bool)
34  self.addParameter(self._defaultParameters, 'electronCollection', cms.InputTag('selectedPatElectrons'),
35  "Input electron collection", Type=cms.InputTag, acceptNoneValue=True)
36 # empty default InputTag for photons to avoid double-counting wrt. cleanPatElectrons collection
37  self.addParameter(self._defaultParameters, 'photonCollection', None,
38  "Input photon collection", Type=cms.InputTag, acceptNoneValue=True)
39  self.addParameter(self._defaultParameters, 'muonCollection', cms.InputTag('selectedPatMuons'),
40  "Input muon collection", Type=cms.InputTag, acceptNoneValue=True)
41  self.addParameter(self._defaultParameters, 'tauCollection', cms.InputTag('selectedPatTaus'),
42  "Input tau collection", Type=cms.InputTag, acceptNoneValue=True)
43  self.addParameter(self._defaultParameters, 'jetCollection', cms.InputTag('selectedPatJets'),
44  "Input jet 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', cms.InputTag('ak4PFCHSL1FastL2L3Corrector'), "Use ak4PFL1FastL2L3Corrector (ak4PFCHSL1FastL2L3Corrector) for PFJets with (without) charged hadron subtraction, ak4CaloL1FastL2L3Corrector for CaloJets", Type=cms.InputTag)
57  self.addParameter(self._defaultParameters, 'jetCorLabelL3Res', cms.InputTag('ak4PFCHSL1FastL2L3ResidualCorrector'), "Use ak4PFL1FastL2L3ResidualCorrector (ak4PFCHSL1FastL2L3ResidualCorrector) for PFJets with (without) charged hadron subtraction, ak4CaloL1FastL2L3ResidualCorrector for CaloJets", Type=cms.InputTag)
58 
59 # the file is used only for local running
60 ## self.addParameter(self._defaultParameters, 'jecUncertaintyFile', 'CondFormats/JetMETObjects/data/Summer15_50nsV5_DATA_UncertaintySources_AK4PFchs.txt',
61  self.addParameter(self._defaultParameters, 'jecUncertaintyFile', '',
62  "Extra JES uncertainty file", Type=str)
63 ## self.addParameter(self._defaultParameters, 'jecUncertaintyTag', 'SubTotalMC',
64  self.addParameter(self._defaultParameters, 'jecUncertaintyTag', 'Uncertainty',
65  "JES uncertainty Tag", Type=str)
66 
67  self.addParameter(self._defaultParameters, 'mvaMetLeptons',["Electrons","Muons"],
68  "Leptons to be used for recoil computation in the MVA MET, available values are: Electrons, Muons, Taus, Photons", allowedValues=["Electrons","Muons","Taus","Photons",""])
69 
70  self.addParameter(self._defaultParameters, 'addToPatDefaultSequence', True,
71  "Flag to enable/disable that metUncertaintySequence is inserted into patDefaultSequence", Type=bool)
72  self.addParameter(self._defaultParameters, 'manualJetConfig', False,
73  "Enable jet configuration options", Type=bool)
74  self.addParameter(self._defaultParameters, 'recoMetFromPFCs', False,
75  "Recompute the MET from scratch using the pfCandidate collection", Type=bool)
76  self.addParameter(self._defaultParameters, 'reclusterJets', False,
77  "Flag to enable/disable the jet reclustering", Type=bool)
78  self.addParameter(self._defaultParameters, 'CHS', False,
79  "Flag to enable/disable the CHS jets", Type=bool)
80  self.addParameter(self._defaultParameters, 'runOnData', False,
81  "Switch for data/MC processing", Type=bool)
82  self.addParameter(self._defaultParameters, 'onMiniAOD', False,
83  "Switch on miniAOD configuration", Type=bool)
84  self.addParameter(self._defaultParameters, 'postfix', '',
85  "Technical parameter to identify the resulting sequence and its modules (allows multiple calls in a job)", Type=str)
86  self._parameters = copy.deepcopy(self._defaultParameters)
87  self._comment = ""
88 
90  return self._defaultParameters
91 
92 #=========================================================================================
93  def __call__(self, process,
94  metType =None,
95  correctionLevel =None,
96  computeUncertainties =None,
97  produceIntermediateCorrections = None,
98  electronCollection =None,
99  photonCollection =None,
100  muonCollection =None,
101  tauCollection =None,
102  jetCollection =None,
103  jetCollectionUnskimmed =None,
104  pfCandCollection =None,
105  autoJetCleaning =None,
106  jetFlavor =None,
107  jetCorr =None,
108  jetCorLabelUpToL3 =None,
109  jetCorLabelL3Res =None,
110  jecUncertaintyFile =None,
111  jecUncertaintyTag =None,
112  mvaMetLeptons =None,
113  addToPatDefaultSequence =None,
114  manualJetConfig =None,
115  recoMetFromPFCs =None,
116  reclusterJets =None,
117  CHS =None,
118  runOnData =None,
119  onMiniAOD =None,
120  postfix =None):
121  electronCollection = self.initializeInputTag(electronCollection, 'electronCollection')
122  photonCollection = self.initializeInputTag(photonCollection, 'photonCollection')
123  muonCollection = self.initializeInputTag(muonCollection, 'muonCollection')
124  tauCollection = self.initializeInputTag(tauCollection, 'tauCollection')
125  jetCollection = self.initializeInputTag(jetCollection, 'jetCollection')
126  jetCollectionUnskimmed = self.initializeInputTag(jetCollectionUnskimmed, 'jetCollectionUnskimmed')
127  pfCandCollection = self.initializeInputTag(pfCandCollection, 'pfCandCollection')
128  if metType is None :
129  metType = self._defaultParameters['metType'].value
130  if correctionLevel is None :
131  correctionLevel = self._defaultParameters['correctionLevel'].value
132  if computeUncertainties is None :
133  computeUncertainties = self._defaultParameters['computeUncertainties'].value
134  if produceIntermediateCorrections is None :
135  produceIntermediateCorrections = self._defaultParameters['produceIntermediateCorrections'].value
136  if electronCollection is None :
137  electronCollection = self._defaultParameters['electronCollection'].value
138  if photonCollection is None :
139  photonCollection = self._defaultParameters['photonCollection'].value
140  if muonCollection is None :
141  muonCollection = self._defaultParameters['muonCollection'].value
142  if tauCollection is None :
143  tauCollection = self._defaultParameters['tauCollection'].value
144  if jetCollection is None :
145  jetCollection = self._defaultParameters['jetCollection'].value
146  if jetCollectionUnskimmed is None :
147  jetCollectionUnskimmed = self._defaultParameters['jetCollectionUnskimmed'].value
148  if pfCandCollection is None :
149  pfCandCollection = self._defaultParameters['pfCandCollection'].value
150  if autoJetCleaning is None :
151  autoJetCleaning = self._defaultParameters['autoJetCleaning'].value
152  if jetFlavor is None :
153  jetFlavor = self._defaultParameters['jetFlavor'].value
154  if jetCorr is None :
155  jetCorr = self._defaultParameters['jetCorrectionType'].value
156  if jetCorLabelUpToL3 is None:
157  jetCorLabelUpToL3 = self._defaultParameters['jetCorLabelUpToL3'].value
158  if jetCorLabelL3Res is None:
159  jetCorLabelL3Res = self._defaultParameters['jetCorLabelL3Res'].value
160  if jecUncertaintyFile is None:
161  jecUncertaintyFile = self._defaultParameters['jecUncertaintyFile'].value
162  if jecUncertaintyTag is None:
163  jecUncertaintyTag = self._defaultParameters['jecUncertaintyTag'].value
164 
165  if mvaMetLeptons is None:
166  mvaMetLeptons = self._defaultParameters['mvaMetLeptons'].value
167 
168  if addToPatDefaultSequence is None :
169  addToPatDefaultSequence = self._defaultParameters['addToPatDefaultSequence'].value
170  if manualJetConfig is None :
171  manualJetConfig = self._defaultParameters['manualJetConfig'].value
172  if recoMetFromPFCs is None :
173  recoMetFromPFCs = self._defaultParameters['recoMetFromPFCs'].value
174  if reclusterJets is None :
175  reclusterJets = self._defaultParameters['reclusterJets'].value
176  if CHS is None :
177  CHS = self._defaultParameters['CHS'].value
178  if runOnData is None :
179  runOnData = self._defaultParameters['runOnData'].value
180  if onMiniAOD is None :
181  onMiniAOD = self._defaultParameters['onMiniAOD'].value
182  if postfix is None :
183  postfix = self._defaultParameters['postfix'].value
184 
185  self.setParameter('metType',metType),
186  self.setParameter('correctionLevel',correctionLevel),
187  self.setParameter('computeUncertainties',computeUncertainties),
188  self.setParameter('produceIntermediateCorrections',produceIntermediateCorrections),
189  self.setParameter('electronCollection',electronCollection),
190  self.setParameter('photonCollection',photonCollection),
191  self.setParameter('muonCollection',muonCollection),
192  self.setParameter('tauCollection',tauCollection),
193  self.setParameter('jetCollection',jetCollection),
194  self.setParameter('jetCollectionUnskimmed',jetCollectionUnskimmed),
195  self.setParameter('pfCandCollection',pfCandCollection),
196 
197  self.setParameter('autoJetCleaning',autoJetCleaning),
198  self.setParameter('jetFlavor',jetFlavor),
199 
200  #optional
201  self.setParameter('jecUncertaintyFile',jecUncertaintyFile),
202  self.setParameter('jecUncertaintyTag',jecUncertaintyTag),
203 
204  self.setParameter('mvaMetLeptons',mvaMetLeptons),
205 
206  self.setParameter('addToPatDefaultSequence',addToPatDefaultSequence),
207  self.setParameter('recoMetFromPFCs',recoMetFromPFCs),
208  self.setParameter('runOnData',runOnData),
209  self.setParameter('onMiniAOD',onMiniAOD),
210  self.setParameter('postfix',postfix),
211 
212  #if mva MET, autoswitch to std jets
213  if metType == "MVA":
214  self.setParameter('CHS',False),
215 
216  #jet energy scale uncertainty needs
217  if manualJetConfig:
218  self.setParameter('CHS',CHS)
219  self.setParameter('jetCorLabelUpToL3',jetCorLabelUpToL3)
220  self.setParameter('jetCorLabelL3Res',jetCorLabelL3Res)
221  self.setParameter('reclusterJets',reclusterJets)
222  else:
223  #internal jet configuration
224  self.jetConfiguration()
225 
226  #met reprocessing and jet reclustering
227  if recoMetFromPFCs:
228  self.setParameter('reclusterJets',True)
229 
230  #jet collection overloading for automatic jet reclustering
231  if reclusterJets:
232  self.setParameter('jetCollection',cms.InputTag('selectedPatJets'))
233  self.setParameter('jetCollectionUnSkimmed',cms.InputTag('patJets'))
234 
235  self.apply(process)
236 
237 
238  def toolCode(self, process):
239  metType = self._parameters['metType'].value
240  correctionLevel = self._parameters['correctionLevel'].value
241  computeUncertainties = self._parameters['computeUncertainties'].value
242  produceIntermediateCorrections = self._parameters['produceIntermediateCorrections'].value
243  electronCollection = self._parameters['electronCollection'].value
244  photonCollection = self._parameters['photonCollection'].value
245  muonCollection = self._parameters['muonCollection'].value
246  tauCollection = self._parameters['tauCollection'].value
247  jetCollection = self._parameters['jetCollection'].value
248  jetCollectionUnskimmed = self._parameters['jetCollectionUnskimmed'].value
249  pfCandCollection = self._parameters['pfCandCollection'].value
250  autoJetCleaning = self._parameters['autoJetCleaning'].value
251  jetFlavor = self._parameters['jetFlavor'].value
252  jetCorLabelUpToL3 = self._parameters['jetCorLabelUpToL3'].value
253  jetCorLabelL3Res = self._parameters['jetCorLabelL3Res'].value
254  jecUncertaintyFile = self._parameters['jecUncertaintyFile'].value
255  jecUncertaintyTag = self._parameters['jecUncertaintyTag'].value
256 
257  mvaMetLeptons = self._parameters['mvaMetLeptons'].value
258  addToPatDefaultSequence = self._parameters['addToPatDefaultSequence'].value
259  recoMetFromPFCs = self._parameters['recoMetFromPFCs'].value
260  reclusterJets = self._parameters['reclusterJets'].value
261  onMiniAOD = self._parameters['onMiniAOD'].value
262  postfix = self._parameters['postfix'].value
263 
264  #prepare jet configuration
265  jetUncInfos = { "jCorrPayload":jetFlavor, "jCorLabelUpToL3":jetCorLabelUpToL3,
266  "jCorLabelL3Res":jetCorLabelL3Res, "jecUncFile":jecUncertaintyFile,
267  "jecUncTag":jecUncertaintyTag }
268 
269  patMetModuleSequence = cms.Sequence()
270 
271  # recompute the MET (and thus the jets as well for correction) from scratch
272  if recoMetFromPFCs:
273  self.recomputeRawMetFromPfcs(process,
274  pfCandCollection,
275  onMiniAOD,
276  patMetModuleSequence,
277  postfix)
278  reclusterJets = True
279  elif onMiniAOD: #raw MET extraction if running on miniAODs
280  self.extractMET(process, "raw", patMetModuleSequence, postfix)
281 
282 
283  #default MET production
284  self.produceMET(process, metType,patMetModuleSequence, postfix)
285 
286 
287  #jet AK4 reclustering if needed for JECs
288  if reclusterJets:
289  jetCollection = self.ak4JetReclustering(process, pfCandCollection,
290  patMetModuleSequence, postfix)
291 
292  #preparation to run over miniAOD (met reproduction)
293  if onMiniAOD:
294  # reclusterJets = True
295  self.miniAODConfiguration(process,
296  pfCandCollection,
297  jetCollectionUnskimmed,
298  patMetModuleSequence,
299  postfix
300  )
301 
302  #jet ES configuration and jet cleaning
303  self.jetCleaning(process, autoJetCleaning, postfix)
304 
305 
306  # correct the MET
307  patMetCorrectionSequence, metModName = self.getCorrectedMET(process, metType, correctionLevel,
308  produceIntermediateCorrections,
309  patMetModuleSequence, postfix )
310 
311  #fix the default jets for the type1 computation to those used to compute the uncertainties
312  #in order to be consistent with what is done in the correction and uncertainty step
313  #particularly true for miniAODs
314  if isValidInputTag(jetCollectionUnskimmed) and "T1" in metModName:
315  getattr(process,"patPFMetT1T2Corr").src = jetCollectionUnskimmed
316  getattr(process,"patPFMetT2Corr").src = jetCollectionUnskimmed
317 
318  if postfix!="" and reclusterJets:
319  getattr(process,"patPFMetT1T2Corr"+postfix).src = cms.InputTag(jetCollectionUnskimmed.value()+postfix)
320  getattr(process,"patPFMetT2Corr"+postfix).src = cms.InputTag(jetCollectionUnskimmed.value()+postfix)
321 
322  #compute the uncertainty on the MET
323  patMetUncertaintySequence = cms.Sequence()
324  if computeUncertainties:
325  patMetUncertaintySequence = self.getMETUncertainties(process, metType, metModName,
326  electronCollection,
327  photonCollection,
328  muonCollection,
329  tauCollection,
330  jetCollection,
331  jetUncInfos,
332  patMetModuleSequence,
333  postfix)
334 
335 
336  setattr(process, "patMetCorrectionSequence"+postfix, patMetCorrectionSequence)
337  setattr(process, "patMetUncertaintySequence"+postfix, patMetUncertaintySequence)
338  setattr(process, "patMetModuleSequence"+postfix, patMetModuleSequence)
339 
340  #prepare and fill the final sequence containing all the sub-sequence
341  fullPatMetSequence = cms.Sequence()
342  fullPatMetSequence += getattr(process, "patMetCorrectionSequence"+postfix)
343  fullPatMetSequence += getattr(process, "patMetUncertaintySequence"+postfix)
344  fullPatMetSequence += getattr(process, "patMetModuleSequence"+postfix)
345 
346  setattr(process,"fullPatMetSequence"+postfix,fullPatMetSequence)
347 
348  # insert the fullPatMetSequence into patDefaultSequence if needed
349  if addToPatDefaultSequence:
350  if not hasattr(process, "patDefaultSequence"):
351  raise ValueError("PAT default sequence is not defined !!")
352  process.patDefaultSequence += getattr(process, "fullPatMetSequence"+postfix)
353 
354 #====================================================================================================
355  def produceMET(self, process, metType, metModuleSequence, postfix):
356  if metType == "PF" and not hasattr(process, 'pat'+metType+'Met'):
357  process.load("PhysicsTools.PatUtils.patPFMETCorrections_cff")
358 
359  if postfix != "" and metType == "PF" and not hasattr(process, 'pat'+metType+'Met'+postfix):
360  configtools.cloneProcessingSnippet(process, getattr(process,"producePatPFMETCorrections"), postfix)
361  setattr(process, 'pat'+metType+'Met'+postfix, getattr(process,'patPFMet' ).clone() )
362  getattr(process, "patPFMet"+postfix).metSource = cms.InputTag("pfMet"+postfix)
363  getattr(process, "patPFMet"+postfix).srcJets = cms.InputTag("selectedPatJets"+postfix)
364  getattr(process, "patPFMet"+postfix).srcPFCands = self._parameters["pfCandCollection"].value
365 
366  if self._parameters["runOnData"].value:
367  getattr(process, "patPFMet"+postfix).addGenMET = False
368 
369 
370  #MM: FIXME MVA
371  if metType == "MVA": # and not hasattr(process, 'pat'+metType+'Met'):
372  # process.load("PhysicsTools.PatUtils.patPFMETCorrections_cff")
373  mvaMetProducer = self.createMVAMETModule(process)
374  setattr(process, 'pfMVAMet'+postfix, mvaMetProducer )
375  setattr(process, 'pat'+metType+'Met'+postfix, getattr(process,'patPFMet' ).clone(
376  metSource = cms.InputTag('pfMVAMet'),
377 
378  ) )
379 
380  metModuleSequence += getattr(process, 'pat'+metType+'Met'+postfix )
381 
382 #====================================================================================================
383  def getCorrectedMET(self, process, metType, correctionLevel,produceIntermediateCorrections, metModuleSequence, postfix ):
384 
385  # default outputs
386  patMetCorrectionSequence = cms.Sequence()
387  metModName = "pat"+metType+"Met"+postfix
388 
389  # loading correction file if not already here
390  #if not hasattr(process, 'patMetCorrectionSequence'):
391  # process.load("PhysicsTools.PatUtils.patPFMETCorrections_cff")
392  #MM loaded at the production level in principle
393 
394  if metType == "MVA": #corrections are irrelevant for the MVA MET (except jet smearing?)
395  return patMetCorrectionSequence, metModName
396 
397  ## MM: FIXME, smearing procedure needs a lot of work, still 2010 recipes everywhere
398  ## ==> smearing disabled for all cases
399  # if cor == "Smear":
400  # #print "WARNING: smearing procedure still uses 2010 recipe, disabled per default for the moment"
401 
402 
403  corNames = { #not really needed but in case we have changes in the future....
404  "T0":"T0pc",
405  "T1":"T1",
406  "T2":"T2",
407  "Txy":"Txy",
408  "Smear":"Smear",
409  }
410 
411 
412  #if empty correction level, no need to try something
413  for cor in correctionLevel: #MM to be changed!!!!!!
414  if cor not in corNames.keys():
415  if cor != "":
416  print "ERROR : ",cor," is not a proper MET correction name! aborting the MET correction production"
417  return patMetCorrectionSequence, metModName
418 
419  corModNames = {
420  "T0": "patPFMetT0CorrSequence"+postfix,
421  "T1": "patPFMetT1T2CorrSequence"+postfix,
422  "T2": "patPFMetT2CorrSequence"+postfix,
423  "Txy": "patPFMetTxyCorrSequence"+postfix,
424  "Smear": "patPFMetSmearCorrSequence"+postfix,
425  "T2Smear": "patPFMetT2SmearCorrSequence"+postfix
426  }
427 
428  if postfix != "":
429  configtools.cloneProcessingSnippet(process, getattr(process,"patPFMetT0CorrSequence"), postfix)
430  configtools.cloneProcessingSnippet(process, getattr(process,"patPFMetT1T2CorrSequence"), postfix)
431  configtools.cloneProcessingSnippet(process, getattr(process,"patPFMetT2CorrSequence"), postfix)
432  configtools.cloneProcessingSnippet(process, getattr(process,"patPFMetTxyCorrSequence"), postfix)
433  configtools.cloneProcessingSnippet(process, getattr(process,"patPFMetSmearCorrSequence"), postfix)
434  configtools.cloneProcessingSnippet(process, getattr(process,"patPFMetT2SmearCorrSequence"), postfix)
435 
436 
437  corModules = {}
438  for mod in corModNames.keys():
439  corModules[mod] = getattr(process, corModNames[mod] )
440 
441  corTags = {
442  "T0":cms.InputTag('patPFMetT0Corr'+postfix),
443  "T1":cms.InputTag('patPFMetT1T2Corr'+postfix, 'type1'),
444  "T2":cms.InputTag('patPFMetT2Corr'+postfix, 'type2'),
445  "Txy": cms.InputTag('patPFMetTxyCorr'+postfix),
446  "Smear":cms.InputTag('patPFMetSmearCorr'+postfix, 'type1'),
447  "Smear":cms.InputTag('patPFMetT1T2SmearCorr'+postfix, 'type1'),
448  "T2Smear":cms.InputTag('patPFMetT2SmearCorr'+postfix, 'type2')
449  }
450 
451  corScheme=""
452  corrections = []
453  correctionSequence = []
454  for cor in correctionLevel:
455  corScheme += corNames[cor]
456  corrections.append(corTags[cor])
457  correctionSequence.append(corModules[cor])
458 
459  #T2 and smearing corModuleTag switch, specific case
460  if "T2" in correctionLevel and "Smear" in correctionLevel:
461  corrections.append(corTags["T2Smear"])
462  correctionSequence.append(corModules["T2Smear"])
463  # if not produceIntermediateCorrections:
464  # #print "REMOVAL"
465  # correctionSequence.remove( corModules["Smear"] )
466  # corrections.remove(corTags["Smear"])
467 
468 
469  #Txy parameter tuning
470  if "Txy" in correctionLevel:
471  self.tuneTxyParameters(process, corScheme, postfix)
472  getattr(process, "patPFMetTxyCorr"+postfix).srcPFlow = self._parameters["pfCandCollection"].value
473 
474  #Enable MET significance in the type1 MET is computed
475  #if "T1" in correctionLevel:
476  # getattr(process, "pat"+metType+"Met"+postfix).computeMETSignificance = cms.bool(True)
477 
478  #T1 parameter tuning when CHS jets are not used
479  if "T1" in correctionLevel and not self._parameters["CHS"].value:
480  setattr(process, "corrPfMetType1"+postfix, getattr(process, "corrPfMetType1" ).clone() )
481  getattr(process, "corrPfMetType1"+postfix).src = cms.InputTag("ak4PFJets"+postfix)
482  getattr(process, "corrPfMetType1"+postfix).jetCorrLabel = "ak4PFL1FastL2L3Corrector"
483  getattr(process, "corrPfMetType1"+postfix).jetCorrLabelRes = "ak4PFL1FastL2L3ResidualCorrector"
484  getattr(process, "corrPfMetType1"+postfix).offsetCorrLabel = "ak4PFL1FastjetCorrector"
485 
486  if "T1" in correctionLevel and self._parameters["CHS"].value and self._parameters["reclusterJets"].value:
487  getattr(process, "corrPfMetType1"+postfix).src = cms.InputTag("ak4PFJetsCHS"+postfix)
488 
489  #create the main MET producer
490  metModName = "pat"+metType+"Met"+corScheme+postfix
491 
492  sequenceName=""
493  corMetProducer=None
494  if metType == "PF":
495  corMetProducer = cms.EDProducer("CorrectedPATMETProducer",
496  src = cms.InputTag('pat'+metType+'Met' + postfix),
497  srcCorrections = cms.VInputTag(corrections)
498  )
499  sequenceName="patMetCorrectionSequence"
500 
501  #MM: FIXME MVA
502  #if metType == "MVA":
503  # return patMetCorrectionSequence, metModName #FIXME
504  # corMetProducer = self.createMVAMETModule(process)
505  # sequenceName="pfMVAMEtSequence"
506 
507  setattr(process,metModName, corMetProducer)
508 
509  # adding the full sequence only if it does not exist
510  if not hasattr(process, sequenceName+postfix):
511  for corModule in correctionSequence:
512  patMetCorrectionSequence += corModule
513  setattr(process, sequenceName+postfix, patMetCorrectionSequence)
514 
515  else: #if it exists, only add the missing correction modules, no need to redo everything
516  patMetCorrectionSequence = cms.Sequence()
517  setattr(process, sequenceName+postfix,patMetCorrectionSequence)
518  for mod in corModNames.keys():
519  if not hasattr(process, corModNames[mod]):
520  patMetCorrectionSequence += corModule
521 
522 
523  #plug the main patMetproducer
524  metModuleSequence += getattr(process, metModName)
525 
526  #create the intermediate MET steps
527  #and finally add the met producers in the sequence for scheduled mode
528  if produceIntermediateCorrections:
529  interMets = self.addIntermediateMETs(process, metType, correctionLevel, corScheme, corTags,corNames, postfix)
530  for met in interMets.keys():
531  setattr(process,met, interMets[met] )
532  metModuleSequence += getattr(process, met)
533 
534  return patMetCorrectionSequence, metModName
535 
536 
537 #====================================================================================================
538  def addIntermediateMETs(self, process, metType, correctionLevel, corScheme, corTags, corNames, postfix):
539  interMets = {}
540 
541  # we don't want to duplicate an exisiting module if we ask for a simple 1-corr scheme
542  if len(correctionLevel) == 1:
543  return interMets
544 
545  #ugly, but it works
546  nCor=len(correctionLevel)+1
547  ids = [0]*nCor
548  for i in range(nCor**nCor):
549  tmp=i
550  exists=False
551  corName=""
552  corrections = []
553  for j in range(nCor):
554  ids[j] = tmp%nCor
555  tmp = tmp//nCor
556 
557  if j != 0 and ids[j-1] < ids[j]:
558  exists=True
559  for k in range(0,j):
560  if ids[k] == ids[j] and ids[k]!=0:
561  exists=True
562 
563  if exists or sum(ids[j] for j in range(nCor))==0:
564  continue
565 
566  for cor in range(nCor):
567  cid = ids[nCor-cor-1]
568  cKey = correctionLevel[cid-1]
569  if cid ==0:#empty correction
570  continue
571  else :
572  corName += corNames[cKey]
573  corrections.append( corTags[ cKey ] )
574 
575  if corName == corScheme:
576  continue
577 
578  corName='pat'+metType+'Met' + corName + postfix
579  interMets[corName] = cms.EDProducer("CorrectedPATMETProducer",
580  src = cms.InputTag('pat'+metType+'Met' + postfix),
581  srcCorrections = cms.VInputTag(corrections)
582  )
583 
584 
585  return interMets
586 
587 
588 #====================================================================================================
589  def getMETUncertainties(self, process, metType, metModName, electronCollection, photonCollection,
590  muonCollection, tauCollection, jetCollection, jetUncInfos, patMetModuleSequence, postfix):
591 
592 
593  # uncertainty sequence
594  metUncSequence = cms.Sequence()
595 
596  #===================================================================================
597  # jet energy resolution shifts
598  #===================================================================================
599  if not isValidInputTag(jetCollection): #or jetCollection=="":
600  print "INFO : jet collection %s does not exists, no energy resolution shifting will be performed in MET uncertainty tools" % jetCollection
601  else:
602  preId=""
603  if "Smear" in metModName:
604  preId="Smeared"
605 
606  metJERUncModules = self.getVariations(process, metModName, "Jet",preId, jetCollection, "Res", metUncSequence, postfix=postfix )
607 
608  for mod in metJERUncModules.keys():
609  setattr(process, mod, metJERUncModules[mod] )
610  patMetModuleSequence += getattr(process, mod)
611 
612  #===================================================================================
613  # Unclustered energy shifts
614  #===================================================================================
615  metUnclEUncModules = self.getUnclusteredVariations(process, metModName, metUncSequence, postfix )
616  for mod in metUnclEUncModules.keys():
617  setattr(process, mod, metUnclEUncModules[mod] )
618  patMetModuleSequence += getattr(process, mod)
619 
620  #===================================================================================
621  # Other energy shifts
622  #===================================================================================
623  objectCollections = { "Jet":jetCollection,
624  "Electron":electronCollection,
625  "Photon":photonCollection,
626  "Muon":muonCollection,
627  "Tau":tauCollection,
628  }
629 
630  for obj in objectCollections.keys():
631  if not isValidInputTag(objectCollections[obj]): # or objectCollections[obj]=="":
632  print "INFO : %s collection %s does not exists, no energy scale shifting will be performed in MET uncertainty tools" %(obj, objectCollections[obj])
633  else:
634  metObjUncModules = self.getVariations(process, metModName, obj,"", objectCollections[obj], "En", metUncSequence, jetUncInfos, postfix )
635 
636  #adding the shifted MET produced to the proper patMetModuleSequence
637  for mod in metObjUncModules.keys():
638  setattr(process, mod, metObjUncModules[mod] )
639  patMetModuleSequence += getattr(process, mod)
640 
641  #return the sequence containing the shifted collections producers
642  return metUncSequence
643 
644 #====================================================================================================
645  def createEnergyScaleShiftedUpModule(self, process,identifier, objectCollection,
646  varyByNsigmas, jetUncInfos=None, postfix=""):
647 
648  shiftedModuleUp = None
649 
650  if identifier == "Electron":
651  shiftedModuleUp = cms.EDProducer("ShiftedPATElectronProducer",
652  src = objectCollection,
653  binning = cms.VPSet(
654  cms.PSet(
655  binSelection = cms.string('isEB'),
656  binUncertainty = cms.double(0.006)
657  ),
658  cms.PSet(
659  binSelection = cms.string('!isEB'),
660  binUncertainty = cms.double(0.015)
661  ),
662  ),
663  shiftBy = cms.double(+1.*varyByNsigmas)
664  )
665 
666  if identifier == "Photon":
667  shiftedModuleUp = cms.EDProducer("ShiftedPATPhotonProducer",
668  src = objectCollection,
669  binning = cms.VPSet(
670  cms.PSet(
671  binSelection = cms.string('isEB'),
672  binUncertainty = cms.double(0.01)
673  ),
674  cms.PSet(
675  binSelection = cms.string('!isEB'),
676  binUncertainty = cms.double(0.025)
677  ),
678  ),
679  shiftBy = cms.double(+1.*varyByNsigmas)
680  )
681 
682  if identifier == "Muon":
683  shiftedModuleUp = cms.EDProducer("ShiftedPATMuonProducer",
684  src = objectCollection,
685  binning = cms.VPSet(
686  cms.PSet(
687  binSelection = cms.string('pt < 100'),
688  binUncertainty = cms.double(0.002)
689  ),
690  cms.PSet(
691  binSelection = cms.string('pt >= 100'),
692  binUncertainty = cms.double(0.05)
693  ),
694  ),
695  shiftBy = cms.double(+1.*varyByNsigmas)
696  )
697 
698  if identifier == "Tau":
699  shiftedModuleUp = cms.EDProducer("ShiftedPATTauProducer",
700  src = objectCollection,
701  uncertainty = cms.double(0.03),
702  shiftBy = cms.double(+1.*varyByNsigmas)
703  )
704 
705  if identifier == "Jet":
706  moduleType="ShiftedPATJetProducer"
707  #MM: FIXME MVA
708  #if self._parameters["metType"].value == "MVA":
709  # moduleType="ShiftedPFJetProducer"
710 
711  if jetUncInfos["jecUncFile"] == "":
712 
713  shiftedModuleUp = cms.EDProducer(moduleType,
714  src = objectCollection,
715  jetCorrUncertaintyTag = cms.string(jetUncInfos["jecUncTag"] ), #jecUncertaintyTag),
716  addResidualJES = cms.bool(True),
717  jetCorrLabelUpToL3 = cms.InputTag(jetUncInfos["jCorLabelUpToL3"].value() ), #jetCorrLabelUpToL3.value()),
718  jetCorrLabelUpToL3Res = cms.InputTag(jetUncInfos["jCorLabelL3Res"].value() ), #jetCorrLabelUpToL3Res.value()),
719  jetCorrPayloadName = cms.string(jetUncInfos["jCorrPayload"] ),
720  shiftBy = cms.double(+1.*varyByNsigmas),
721  )
722  else:
723 
724 
725  shiftedModuleUp = cms.EDProducer(moduleType,
726  src = objectCollection,
727  jetCorrInputFileName = cms.FileInPath(jetUncInfos["jecUncFile"] ), #jecUncertaintyFile),
728  jetCorrUncertaintyTag = cms.string(jetUncInfos["jecUncTag"] ), #jecUncertaintyTag),
729  addResidualJES = cms.bool(True),
730  jetCorrLabelUpToL3 = cms.InputTag(jetUncInfos["jCorLabelUpToL3"].value() ), #jetCorrLabelUpToL3.value()),
731  jetCorrLabelUpToL3Res = cms.InputTag(jetUncInfos["jCorLabelL3Res"].value() ), #jetCorrLabelUpToL3Res.value()),
732  jetCorrPayloadName = cms.string(jetUncInfos["jCorrPayload"] ),
733  shiftBy = cms.double(+1.*varyByNsigmas),
734  )
735 
736 
737  return shiftedModuleUp
738 
739 
740 #====================================================================================================
741 
742 
743 #====================================================================================================
744  def removePostfix(self, name, postfix):
745 
746  if postfix=="":
747  return name
748 
749  baseName = name
750  if baseName[-len(postfix):] == postfix:
751  baseName = baseName[0:-len(postfix)]
752  else:
753  raise StandardError("Tried to remove postfix %s from %s, but it wasn't there" % (postfix, baseName))
754 
755  return baseName
756 
757 #====================================================================================================
758  def tuneTxyParameters(self, process, corScheme, postfix):
760  xyTags = {
761  "Txy_50ns":metCors.patMultPhiCorrParams_Txy_50ns,
762  "T1Txy_50ns":metCors.patMultPhiCorrParams_T1Txy_50ns,
763  "T0pcTxy_50ns":metCors.patMultPhiCorrParams_T0pcTxy_50ns,
764  "T0pcT1Txy_50ns":metCors.patMultPhiCorrParams_T0pcT1Txy_50ns,
765  "T1T2Txy_50ns":metCors.patMultPhiCorrParams_T1T2Txy_50ns,
766  "T0pcT1T2Txy_50ns":metCors.patMultPhiCorrParams_T0pcT1T2Txy_50ns,
767  "T1SmearTxy_50ns":metCors.patMultPhiCorrParams_T1SmearTxy_50ns,
768  "T1T2SmearTxy_50ns":metCors.patMultPhiCorrParams_T1T2SmearTxy_50ns,
769  "T0pcT1SmearTxy_50ns":metCors.patMultPhiCorrParams_T0pcT1SmearTxy_50ns,
770  "T0pcT1T2SmearTxy_50ns":metCors.patMultPhiCorrParams_T0pcT1T2SmearTxy_50ns,
771 
772  "Txy_25ns":metCors.patMultPhiCorrParams_Txy_25ns,
773  "T1Txy_25ns":metCors.patMultPhiCorrParams_T1Txy_25ns,
774  "T0pcTxy_25ns":metCors.patMultPhiCorrParams_T0pcTxy_25ns,
775  "T0pcT1Txy_25ns":metCors.patMultPhiCorrParams_T0pcT1Txy_25ns,
776  "T1T2Txy_25ns":metCors.patMultPhiCorrParams_T1T2Txy_25ns,
777  "T0pcT1T2Txy_25ns":metCors.patMultPhiCorrParams_T0pcT1T2Txy_25ns,
778  "T1SmearTxy_25ns":metCors.patMultPhiCorrParams_T1SmearTxy_25ns,
779  "T1T2SmearTxy_25ns":metCors.patMultPhiCorrParams_T1T2SmearTxy_25ns,
780  "T0pcT1SmearTxy_25ns":metCors.patMultPhiCorrParams_T0pcT1SmearTxy_25ns,
781  "T0pcT1T2SmearTxy_25ns":metCors.patMultPhiCorrParams_T0pcT1T2SmearTxy_25ns
782  }
783 
784  getattr(process, "patPFMetTxyCorr"+postfix).parameters = xyTags[corScheme+"_25ns"]
785  ##for automatic switch to 50ns / 25ns corrections ==> does not work...
786  #from Configuration.StandardSequences.Eras import eras
787  #eras.run2_50ns_specific.toModify( getattr(process, "patPFMetTxyCorr"+postfix) , parameters=xyTags[corScheme+"_50ns"] )
788  #eras.run2_25ns_specific.toModify( getattr(process, "patPFMetTxyCorr"+postfix) , parameters=xyTags[corScheme+"_25ns"] )
789 
790 
791 #====================================================================================================
792  def getVariations(self, process, metModName, identifier,preId, objectCollection, varType,
793  metUncSequence, jetUncInfos=None, postfix="" ):
794 
795  # temporary hardcoded varyByNSigma value
796  varyByNsigmas=1
797 
798  # remove the postfix to put it at the end
799  baseName = self.removePostfix(metModName, postfix)
800 
801  #default shifted MET producers
802  shiftedMetProducers = {preId+identifier+varType+'Up':None, preId+identifier+varType+'Down':None}
803 
804  #create the shifted collection producers=========================================
805  shiftedCollModules = {'Up':None, 'Down':None}
806 
807  if identifier=="Jet" and varType=="Res":
808  smear=False
809  if "Smear" in metModName:
810  smear=True
811 
812  shiftedCollModules['Up'] = self.createShiftedJetResModule(process, smear, objectCollection, +1.*varyByNsigmas,
813  "Up", metUncSequence, postfix)
814  shiftedCollModules['Down'] = self.createShiftedJetResModule(process, smear, objectCollection, -1.*varyByNsigmas,
815  "Down", metUncSequence, postfix)
816 
817  else:
818  shiftedCollModules['Up'] = self.createEnergyScaleShiftedUpModule(process, identifier, objectCollection, varyByNsigmas, jetUncInfos, postfix)
819  shiftedCollModules['Down'] = shiftedCollModules['Up'].clone( shiftBy = cms.double(-1.*varyByNsigmas) )
820 
821  if identifier=="Jet" and varType=="Res":
822  smear=False
823  if "Smear" in metModName:
824  objectCollection=cms.InputTag("selectedPatJetsForMetT1T2SmearCorr"+postfix)
825 
826 
827 
828  #and the MET producers
829  shiftedMetProducers = self.createShiftedModules(process, shiftedCollModules, identifier, preId, objectCollection,
830  metModName, varType, metUncSequence, postfix)
831 
832  return shiftedMetProducers
833 
834 #========================================================================================
835  def createShiftedJetResModule(self, process, smear, objectCollection, varyByNsigmas, varDir, metUncSequence, postfix ):
836 
837  smearedJetModule = self.createSmearedJetModule(process, objectCollection, smear, varyByNsigmas, varDir, metUncSequence, postfix)
838 
839  return smearedJetModule
840 
841 
842 #========================================================================================
843  def createShiftedModules(self, process, shiftedCollModules, identifier, preId, objectCollection, metModName, varType, metUncSequence, postfix):
844 
845  shiftedMetProducers = {}
846 
847  # remove the postfix to put it at the end
848  baseName = self.removePostfix(metModName, postfix)
849 
850  #adding the shifted collection producers to the sequence, create the shifted MET correction Modules and add them as well
851  for mod in shiftedCollModules.keys():
852  modName = "shiftedPat"+preId+identifier+varType+mod+postfix
853  #MM: FIXME MVA
854  #if "MVA" in metModName and identifier == "Jet": #dummy fix
855  # modName = "uncorrectedshiftedPat"+preId+identifier+varType+mod+postfix
856  setattr(process, modName, shiftedCollModules[mod])
857  metUncSequence += getattr(process, modName)
858 
859  #removing the uncorrected
860  modName = "shiftedPat"+preId+identifier+varType+mod+postfix
861 
862  #PF MET =================================================================================
863  if "PF" in metModName:
864  #create the MET shifts and add them to the sequence
865  shiftedMETCorrModule = self.createShiftedMETModule(process, objectCollection, modName)
866  modMETShiftName = "shiftedPatMETCorr"+preId+identifier+varType+mod+postfix
867  setattr(process, modMETShiftName, shiftedMETCorrModule)
868  metUncSequence += getattr(process, modMETShiftName)
869 
870  #and finally prepare the shifted MET producers
871  modName = baseName+identifier+varType+mod+postfix
872  shiftedMETModule = getattr(process, metModName).clone(
873  src = cms.InputTag( metModName ),
874  srcCorrections = cms.VInputTag( cms.InputTag(modMETShiftName) )
875  )
876  shiftedMetProducers[ modName ] = shiftedMETModule
877 
878  #MM: FIXME MVA
879  #MVA MET, duplication of the MVA MET producer ============================================
880  #if "MVA" in metModName:
881  # print "name: ",metModName, modName
882  # shiftedMETModule = self.createMVAMETModule(process, identifier, modName, True)
883  # modName = baseName+identifier+varType+mod+postfix
884  # setattr(process, modName, shiftedMETModule)
885  # shiftedMetProducers[ modName ] = shiftedMETModule
886  #
887  # #pileupjetId and =====
888  # if identifier == "Jet":
889  # #special collection replacement for the MVAMET for the jet case ======
890  # origCollection = cms.InputTag("calibratedAK4PFJetsForPFMVAMEt"+postfix) #self._parameters["jetCollection"].value
891  # newCollection = cms.InputTag("uncorrectedshiftedPat"+preId+identifier+varType+mod+postfix)
892  # moduleName = "shiftedPat"+preId+identifier+varType+mod+postfix
893  # corrShiftedModule = getattr(process,"calibratedAK4PFJetsForPFMVAMEt").clone(
894  # src=newCollection
895  # )
896 
897  # setattr(process, moduleName, corrShiftedModule)
898  # metUncSequence += getattr(process, moduleName)
899 
900  # puJetIdProducer = getattr(process, "puJetIdForPFMVAMEt").clone(
901  # jets = moduleName
902  # )
903  # puJetIdName = "puJetIdForPFMVAMEt"+preId+identifier+varType+mod+postfix
904  # setattr(process, puJetIdName, puJetIdProducer)
905  # metUncSequence += getattr(process, puJetIdName)
906  # shiftedMETModule.srcMVAPileupJetId = cms.InputTag(puJetIdName,"fullDiscriminant")
907 
908  #==========================================================================================
909 
910  return shiftedMetProducers
911 
912 
913 #========================================================================================
914  def createShiftedMETModule(self, process, originCollection, shiftedCollection):
915 
916  shiftedModule = cms.EDProducer("ShiftedParticleMETcorrInputProducer",
917  srcOriginal = originCollection,
918  srcShifted = cms.InputTag(shiftedCollection),
919  )
920 
921  return shiftedModule
922 
923 #========================================================================================
924  def createMVAMETModule(self, process, identifier="", shiftedCollection="", isShifted=False, postfix="" ):
925 
926  if not hasattr(process, "pfMVAMEt"):
927  process.load("RecoMET.METPUSubtraction.mvaPFMET_cff")
928 
929  #retrieve collections
930  electronCollection = self._parameters["electronCollection"].value
931  muonCollection = self._parameters["electronCollection"].value
932  photonCollection = self._parameters["photonCollection"].value
933  tauCollection = self._parameters["tauCollection"].value
934  pfCandCollection = self._parameters["pfCandCollection"].value
935  corJetCollection = cms.InputTag("calibratedAK4PFJetsForPFMVAMEt"+postfix)
936  uncorJetCollection = cms.InputTag("ak4PFJets")
937 
938  #shift if needed===
939  if isShifted:
940  if identifier == "Electron":
941  electronCollection = cms.InputTag(shiftedCollection)
942  if identifier == "Muon":
943  muonCollection = cms.InputTag(shiftedCollection)
944  if identifier == "Tau":
945  tauCollection = cms.InputTag(shiftedCollection)
946  if identifier == "Photon":
947  photonCollection = cms.InputTag(shiftedCollection)
948  if identifier == "Unclustered":
949  pfCandCollection = cms.InputTag(shiftedCollection)
950  if identifier == "Jet":
951  corJetCollection = cms.InputTag(shiftedCollection)
952  uncorJetCollection = cms.InputTag("uncorrected"+shiftedCollection)
953 
954 
955  #leptons
956  mvaMetLeptons = self._parameters["mvaMetLeptons"].value
957  leptons = cms.VInputTag([])
958  if "Electrons" in mvaMetLeptons and isValidInputTag(electronCollection):
959  leptons.append = electronCollection
960  if "Muons" in mvaMetLeptons and isValidInputTag(muonCollection):
961  leptons.append = muonCollection
962  if "Photons" in mvaMetLeptons and isValidInputTag(photonCollection):
963  leptons.append = photonCollection
964  if "Taus" in mvaMetLeptons and isValidInputTag(tauCollection):
965  leptons.append = tauCollection
966 
967 
968  mvaMetProducer=getattr(process, "pfMVAMEt").clone(
969  srcCorrJets = corJetCollection, #cms.InputTag("calibratedAK4PFJetsForPFMVAMEt"+postfix),
970  srcUncorrJets = uncorJetCollection,
971  srcPFCandidates = pfCandCollection,
972  srcLeptons = leptons,
973  )
974 
975  return mvaMetProducer
976 
977 #========================================================================================
978  def getUnclusteredVariations(self, process, metModName, metUncSequence, postfix ):
979 
980  varyByNsigmas=1
981 
982  unclEnMETcorrectionsSrcs = [
983  [ 'pfCandMETcorr' + postfix, [ '' ] ],
984  [ 'patPFMetT1T2Corr' + postfix, [ 'type2', 'offset' ] ],
985  [ 'patPFMetT2Corr' + postfix, [ 'type2' ] ],
986  ]
987 
988  #MM missing protection against missing corrections needed to compute the uncertainties
989  #for srcUnclEnMETcorr in unclEnMETcorrectionsSrcs:
990  # if not hasattr(process, srcUnclEnMETcorr[0])
991  # metUncSequence
992 
993  shiftedMetProducers = {}
994 
995  variations={"Up":1.,"Down":-1.}
996  for var in variations.keys():
997 
998  modName = self.removePostfix(metModName, postfix)
999  modName = modName+"UnclusteredEn"+var+postfix
1000 
1001  #MM: FIXME MVA
1002  ##MVA MET special case
1003  #if "MVA" in metModName:
1004  # shiftedMetProducers[ modName ] = self.getUnclusteredVariationsForMVAMET(process, var, variations[var]*varyByNsigmas, metUncSequence, postfix )
1005  # continue
1006 
1007 
1008  for srcUnclEnMETcorr in unclEnMETcorrectionsSrcs:
1009  moduleUnclEnMETcorr = cms.EDProducer("ShiftedMETcorrInputProducer",
1010  src = cms.VInputTag(
1011  [ cms.InputTag(srcUnclEnMETcorr[0], instanceLabel) for instanceLabel in srcUnclEnMETcorr[1] ]
1012  ),
1013  uncertainty = cms.double(0.10),
1014  shiftBy = cms.double(variations[var]*varyByNsigmas)
1015  )
1016 
1017  baseName = self.removePostfix(srcUnclEnMETcorr[0], postfix)
1018 
1019  moduleUnclEnMETcorrName = baseName+"UnclusteredEn"+var+postfix
1020  setattr(process, moduleUnclEnMETcorrName, moduleUnclEnMETcorr)
1021  metUncSequence += moduleUnclEnMETcorr
1022  unclEnMETcorrections = ([ cms.InputTag(moduleUnclEnMETcorrName, instanceLabel)
1023  for instanceLabel in srcUnclEnMETcorr[1] ] )
1024 
1025 
1026  #and finally prepare the shifted MET producer
1027  if "PF" in metModName:
1028  shiftedMETModule = getattr(process, metModName).clone(
1029  src = cms.InputTag( metModName ),
1030  srcCorrections = cms.VInputTag( unclEnMETcorrections )
1031  )
1032  shiftedMetProducers[ modName ] = shiftedMETModule
1033 
1034  return shiftedMetProducers
1035 
1036 
1037 #========================================================================================
1038  def getUnclusteredVariationsForMVAMET(self, process, var, val, metUncSequence, postfix ):
1039 
1040  if not hasattr(process, "pfCandsNotInJetsForMetCorr"):
1041  process.load("JetMETCorrections.Type1MET.correctionTerms.PfMetType1Type2_cff")
1042 
1043  #MM: it's bloody stupid to make it that way....
1044  # compute the shifted particles ====
1045  unclCandModule = cms.EDProducer("ShiftedPFCandidateProducer",
1046  src = cms.InputTag('pfCandsNotInJetsForMetCorr'),
1047  shiftBy = cms.double(val),
1048  uncertainty = cms.double(0.10)
1049  )
1050  setattr(process, "pfCandsNotInJetsUnclusteredEn"+var+postfix, unclCandModule)
1051  metUncSequence += getattr(process, "pfCandsNotInJetsUnclusteredEn"+var+postfix)
1052 
1053 
1054 
1055  #replace the old unclustered particles by the shifted ones....
1056  pfCandCollection = self._parameters["pfCandCollection"].value
1057 
1058  #top projection on jets
1059  pfCandsNotInJets = cms.EDProducer("CandPtrProjector",
1060  src = pfCandCollection,
1061  veto = cms.InputTag("ak4PFJets")
1062  )
1063  setattr(process, "pfCandsNotInJetsUnclusteredEn"+var+postfix, pfCandsNotInJets)
1064  metUncSequence += getattr(process,"pfCandsNotInJetsUnclusteredEn"+var+postfix)
1065 
1066  fullShiftedModule = self.createShiftedObjectModuleForMVAMET(pfCandCollection, cms.InputTag("pfCandsNotInJetsUnclusteredEn"+var+postfix), 0.01 )
1067  setattr(process, "pfCandidatesEn"+var+postfix, fullShiftedModule)
1068  metUncSequence += getattr(process, "pfCandidatesEn"+var+postfix)
1069 
1070  # duplication of the MVA MET producer ============================================
1071  shiftedMETModule = self.createMVAMETModule(process, "Unclustered", "pfCandidatesEn"+var+postfix, True)
1072  return shiftedMETModule
1073 
1074 #========================================================================================
1075  def createShiftedObjectModuleForMVAMET(self, origCollection, shiftedCollection, dr=0.5):
1076  fullShiftedModule = cms.EDProducer("ShiftedPFCandidateProducerByMatchedObject",
1077  srcPFCandidates = origCollection,
1078  srcUnshiftedObjects = origCollection,
1079  dRmatch_PFCandidate = cms.double(dr),
1080  srcShiftedObjects = shiftedCollection
1081  )
1082  return fullShiftedModule
1083 
1084 #========================================================================================
1085  def createSmearedJetModule(self, process, jetCollection, smear, varyByNsigmas, varDir, metUncSequence, postfix):
1086 
1087  smearedJetModule = None
1088 
1089  modName = "pat"
1090  selJetModName= "selectedPatJetsForMetT1T2"
1091  if smear:
1092  modName += "SmearedJets"
1093  selJetModName += "SmearCorr"
1094  else:
1095  modName += "Jets"
1096 
1097 
1098  if varDir != "":
1099  modName += "Res"+varDir
1100  selJetModName += "Res"+varDir
1101 
1102  modName += postfix
1103  selJetModName += postfix
1104 
1105  if "PF" == self._parameters["metType"].value:
1106  setattr(process, modName, getattr(process, "patSmearedJets"+postfix).clone(
1107  src = jetCollection,
1108  areSrcJetsSmeared = cms.bool(smear),
1109  shiftBy = cms.double(varyByNsigmas),
1110  ) )
1111  metUncSequence += getattr(process, modName)
1112 
1113  smearedJetModule = getattr(process, "selectedPatJetsForMetT1T2SmearCorr").clone(
1114  src = cms.InputTag(modName)
1115  )
1116 
1117  #MM: FIXME MVA
1118  #if "MVA" == self._parameters["metType"].value:
1119  # from RecoMET.METProducers.METSigParams_cfi import *
1120 
1121  # genJetsCollection=cms.InputTag('ak4GenJetsNoNu')
1122  # if self._parameters["onMiniAOD"].value:
1123  # genJetsCollection=cms.InputTag("slimmedGenJets")
1124 
1125  # smearedJetModule = cms.EDProducer("SmearedPFJetProducer",
1126  # src = cms.InputTag('ak4PFJets'),
1127  # jetCorrLabel = cms.InputTag("ak4PFL1FastL2L3Corrector"),
1128  # dRmaxGenJetMatch = cms.string('min(0.5, 0.1 + 0.3*exp(-0.05*(genJetPt - 10.)))'),
1129  # sigmaMaxGenJetMatch = cms.double(3.),
1130  # inputFileName = cms.FileInPath('PhysicsTools/PatUtils/data/pfJetResolutionMCtoDataCorrLUT.root'),
1131  # lutName = cms.string('pfJetResolutionMCtoDataCorrLUT'),
1132  # jetResolutions = METSignificance_params,
1133  # skipRawJetPtThreshold = cms.double(10.), # GeV
1134  # skipCorrJetPtThreshold = cms.double(1.e-2),
1135  # srcGenJets = genJetsCollection,
1136  # shiftBy = cms.double(varyByNsigmas),
1137  # #verbosity = cms.int32(1)
1138  # )
1139 
1140  return smearedJetModule
1141 
1142 
1143 ### Utilities ====================================================================
1144  def initializeInputTag(self, input, default):
1145  retVal = None
1146  if input is None:
1147  retVal = self._defaultParameters[default].value
1148  elif type(input) == str:
1149  retVal = cms.InputTag(input)
1150  else:
1151  retVal = input
1152  return retVal
1153 
1154 
1155  def recomputeRawMetFromPfcs(self, process, pfCandCollection, onMiniAOD, patMetModuleSequence, postfix):
1156 
1157  #RECO MET
1158  if not hasattr(process, "pfMet"+postfix) and self._parameters["metType"].value == "PF":
1159  #common to AOD/mAOD processing
1160  #raw MET
1161  from RecoMET.METProducers.PFMET_cfi import pfMet
1162  setattr(process, "pfMet"+postfix, pfMet.clone() )
1163  getattr(process, "pfMet"+postfix).src = pfCandCollection
1164  getattr(process, "pfMet"+postfix).calculateSignificance = False
1165  patMetModuleSequence += getattr(process, "pfMet"+postfix)
1166 
1167  #PAT METs
1168  process.load("PhysicsTools.PatAlgos.producersLayer1.metProducer_cff")
1169  configtools.cloneProcessingSnippet(process, getattr(process,"patMETCorrections"), postfix)
1170 
1171  #T1 pfMet for AOD to mAOD only
1172  if not onMiniAOD:
1173  #correction duplication needed
1174  getattr(process, "pfMetT1"+postfix).src = cms.InputTag("pfMet"+postfix)
1175  patMetModuleSequence += getattr(process, "pfMetT1"+postfix)
1176 
1177  setattr(process, 'patMETs'+postfix, getattr(process,'patMETs' ).clone() )
1178  getattr(process, "patMETs"+postfix).metSource = cms.InputTag("pfMetT1"+postfix)
1179 
1180 
1181  def extractMET(self, process, correctionLevel, patMetModuleSequence, postfix):
1182  pfMet = cms.EDProducer("RecoMETExtractor",
1183  metSource= cms.InputTag("slimmedMETs",processName=cms.InputTag.skipCurrentProcess()),
1184  correctionLevel = cms.string(correctionLevel)
1185  )
1186  if(correctionLevel=="raw"):#dummy fix
1187  setattr(process,"pfMet"+postfix ,pfMet)
1188  patMetModuleSequence += getattr(process, "pfMet"+postfix)
1189  else:
1190  setattr(process,"met"+correctionLevel+postfix ,pfMet)
1191  patMetModuleSequence += getattr(process, "met"+correctionLevel+postfix)
1192 
1193 
1194  def updateJECs(self,process,jetCollection, patMetModuleSequence, postfix):
1195  from PhysicsTools.PatAlgos.producersLayer1.jetUpdater_cff import updatedPatJetCorrFactors
1196  patJetCorrFactorsReapplyJEC = updatedPatJetCorrFactors.clone(
1197  src = jetCollection,
1198  levels = ['L1FastJet',
1199  'L2Relative',
1200  'L3Absolute'],
1201  payload = 'AK4PFchs' ) # always CHS from miniAODs
1202 
1203  from PhysicsTools.PatAlgos.producersLayer1.jetUpdater_cff import updatedPatJets
1204  patJetsReapplyJEC = updatedPatJets.clone(
1205  jetSource = cms.InputTag("slimmedJets"),
1206  jetCorrFactorsSource = cms.VInputTag(cms.InputTag("patJetCorrFactorsReapplyJEC"))
1207  )
1208 
1209  setattr(process,"patJetCorrFactorsReapplyJEC",patJetCorrFactorsReapplyJEC)
1210  setattr(process,"patJets",patJetsReapplyJEC.clone())
1211  patMetModuleSequence += getattr(process,"patJetCorrFactorsReapplyJEC")
1212  patMetModuleSequence += getattr(process,"patJets")
1213 
1214 
1215  def ak4JetReclustering(self,process, pfCandCollection, patMetModuleSequence, postfix):
1216 
1217  chs = self._parameters["CHS"].value
1218  jetColName="ak4PFJets"
1219  CHSname=""
1220  pfCandColl=pfCandCollection
1221  if chs:
1222  CHSname="chs"
1223  jetColName="ak4PFJetsCHS"
1224 
1225  pfCHS=None
1226  if self._parameters["onMiniAOD"].value:
1227  pfCHS = cms.EDFilter("CandPtrSelector", src = pfCandCollection, cut = cms.string("fromPV"))
1228  else:
1229  setattr( process, "tmpPFCandCollPtr", cms.EDProducer("PFCandidateFwdPtrProducer",
1230  src = pfCandCollection ) )
1231  process.load("CommonTools.ParticleFlow.pfNoPileUpJME_cff")
1232  configtools.cloneProcessingSnippet(process, getattr(process,"pfNoPileUpJMESequence"), postfix )
1233  getattr(process, "pfPileUpJME"+postfix).PFCandidates = cms.InputTag("tmpPFCandCollPtr")
1234  pfCHS = getattr(process, "pfNoPileUpJME").clone( bottomCollection = cms.InputTag("tmpPFCandCollPtr") )
1235 
1236  if not hasattr(process, "pfCHS"+postfix):
1237  setattr(process,"pfCHS"+postfix,pfCHS)
1238  pfCandColl = cms.InputTag("pfCHS"+postfix)
1239 
1240 
1241  jetColName+=postfix
1242 
1243  if not hasattr(process, jetColName):
1244  process.load("RecoJets.JetProducers.ak4PFJets_cfi")
1245 
1246  #if chs:
1247  setattr(process, jetColName, getattr(process,"ak4PFJets").clone() )
1248 
1249  getattr(process, jetColName).src = pfCandColl
1250  getattr(process, jetColName).doAreaFastjet = True
1251 
1252  patMetModuleSequence += getattr(process, jetColName)
1253 
1254  corLevels=['L1FastJet', 'L2Relative', 'L3Absolute']
1255  if self._parameters["runOnData"].value:
1256  corLevels.append("L2L3Residual")
1257 
1258  switchJetCollection(process,
1259  jetSource = cms.InputTag(jetColName),
1260  jetCorrections = ('AK4PF'+CHSname, corLevels , ''),
1261  postfix=postfix
1262  )
1263 
1264  getattr(process,"patJets"+postfix).addGenJetMatch = False
1265  getattr(process,"patJets"+postfix).addGenPartonMatch = False
1266  getattr(process,"patJets"+postfix).addPartonJetMatch = False
1267  if self._parameters['onMiniAOD'].value:
1268  del getattr(process,"patJets"+postfix).JetFlavourInfoSource
1269  del getattr(process,"patJets"+postfix).JetPartonMapSource
1270  getattr(process,"patJets"+postfix).getJetMCFlavour = False
1271 
1272  getattr(process,"patJetCorrFactors"+postfix).src=cms.InputTag(jetColName)
1273  getattr(process,"patJetCorrFactors"+postfix).primaryVertices= cms.InputTag("offlineSlimmedPrimaryVertices")
1274 
1275 
1276  return cms.InputTag("selectedPatJets"+postfix)
1277 
1278 
1279  def miniAODConfiguration(self, process, pfCandCollection, jetCollection, patMetModuleSequence, postfix ):
1280 
1281  if self._parameters["metType"].value == "PF": # not hasattr(process, "pfMet"+postfix)
1282 
1283  getattr(process, "patPFMet"+postfix).addGenMET = False
1284  if not self._parameters["runOnData"].value:
1285  getattr(process, "patPFMet"+postfix).addGenMET = True
1286  process.genMetExtractor = cms.EDProducer("GenMETExtractor",
1287  metSource= cms.InputTag("slimmedMETs",processName=cms.InputTag.skipCurrentProcess())
1288  )
1289  patMetModuleSequence += getattr(process, "genMetExtractor")
1290  getattr(process, "patPFMet"+postfix).genMETSource = cms.InputTag("genMetExtractor")
1291 
1292  if hasattr(process, "patPFMetTxyCorr"+postfix):
1293  getattr(process, "patPFMetTxyCorr"+postfix).vertexCollection = cms.InputTag("offlineSlimmedPrimaryVertices")
1294 
1295  #handling jets when no reclustering is done
1296  if not self._parameters["reclusterJets"].value:
1297  self.updateJECs(process, jetCollection, patMetModuleSequence, postfix)
1298 
1299 
1300  #MM: FIXME MVA
1301  #if hasattr(process, "pfMVAMet"):
1302  # getattr(process, "pfMVAMet").srcVertices = cms.InputTag("offlineSlimmedPrimaryVertices")
1303  # getattr(process, "pfMVAMEt").srcVertices = cms.InputTag("offlineSlimmedPrimaryVertices")
1304  # getattr(process, "puJetIdForPFMVAMEt").vertexes = cms.InputTag("offlineSlimmedPrimaryVertices")
1305  # getattr(process, "patMVAMet").addGenMET = False
1306 
1307  if not hasattr(process, "slimmedMETs"+postfix) and self._parameters["metType"].value == "PF":
1308 
1309  from PhysicsTools.PatAlgos.selectionLayer1.jetSelector_cfi import selectedPatJets
1310  setattr(process, "selectedPatJets"+postfix, selectedPatJets.clone() )
1311 
1312  getattr(process,"selectedPatJets"+postfix).src = cms.InputTag("patJets"+postfix)
1313  getattr(process,"selectedPatJets"+postfix).cut = cms.string("pt > 10")
1314 
1315  from PhysicsTools.PatAlgos.slimming.slimmedMETs_cfi import slimmedMETs
1316  setattr(process, "slimmedMETs"+postfix, slimmedMETs.clone() )
1317  getattr(process,"slimmedMETs"+postfix).src = cms.InputTag("patPFMetT1"+postfix)
1318  getattr(process,"slimmedMETs"+postfix).rawVariation = cms.InputTag("patPFMet"+postfix)
1319  getattr(process,"slimmedMETs"+postfix).t1Uncertainties = cms.InputTag("patPFMetT1%s"+postfix)
1320  getattr(process,"slimmedMETs"+postfix).t01Variation = cms.InputTag("patPFMetT0pcT1"+postfix)
1321  getattr(process,"slimmedMETs"+postfix).t1SmearedVarsAndUncs = cms.InputTag("patPFMetT1Smear%s"+postfix)
1322 
1323  getattr(process,"slimmedMETs"+postfix).tXYUncForRaw = cms.InputTag("patPFMetTxy"+postfix)
1324  getattr(process,"slimmedMETs"+postfix).tXYUncForT1 = cms.InputTag("patPFMetT1Txy"+postfix)
1325  getattr(process,"slimmedMETs"+postfix).tXYUncForT01 = cms.InputTag("patPFMetT0pcT1Txy"+postfix)
1326  getattr(process,"slimmedMETs"+postfix).tXYUncForT1Smear = cms.InputTag("patPFMetT1SmearTxy"+postfix)
1327  getattr(process,"slimmedMETs"+postfix).tXYUncForT01Smear = cms.InputTag("patPFMetT0pcT1SmearTxy"+postfix)
1328 
1329  getattr(process,"slimmedMETs"+postfix).runningOnMiniAOD = True
1330  getattr(process,"slimmedMETs"+postfix).t01Variation = cms.InputTag("slimmedMETs",processName=cms.InputTag.skipCurrentProcess())
1331 
1332  #extractor for caloMET === temporary for the beginning of the data taking
1333  self.extractMET(process,"calo",patMetModuleSequence,postfix)
1334  from PhysicsTools.PatAlgos.tools.metTools import addMETCollection
1335  addMETCollection(process,
1336  labelName = "patCaloMet",
1337  metSource = "metcalo")
1338  getattr(process,"patCaloMet").addGenMET = False
1339 
1340  #smearing and type0 variations not yet supported in reprocessing
1341  del getattr(process,"slimmedMETs"+postfix).t1SmearedVarsAndUncs
1342  del getattr(process,"slimmedMETs"+postfix).tXYUncForT01
1343  del getattr(process,"slimmedMETs"+postfix).tXYUncForT1Smear
1344  del getattr(process,"slimmedMETs"+postfix).tXYUncForT01Smear
1345  #del getattr(process,"slimmedMETs"+postfix).caloMET
1346 
1347 
1348  def jetConfiguration(self):
1349 
1350  jetFlavor = self._parameters["jetFlavor"].value
1351  jetCorr = self._parameters["jetCorrectionType"].value
1352 
1353  jetCorLabelUpToL3Name="ak4PF"
1354  jetCorLabelL3ResName="ak4PF"
1355 
1356  # normal or CHS jets =============================
1357  if "chs" in jetFlavor:
1358  self.setParameter("CHS",True)
1359  jetCorLabelUpToL3Name += "CHS" #chs
1360  jetCorLabelL3ResName += "CHS"
1361  else:
1362  self.setParameter("CHS",False)
1363 
1364  # change the correction type =====================
1365  if jetCorr == "L1L2L3-L1":
1366  jetCorLabelUpToL3Name += "L1FastL2L3Corrector"
1367  jetCorLabelL3ResName += "L1FastL2L3ResidualCorrector"
1368  elif jetCorr == "L1L2L3-RC": #to be fixed
1369  jetCorLabelUpToL3Name += "L1FastL2L3Corrector"
1370  jetCorLabelL3ResName += "L1FastL2L3ResidualCorrector"
1371 
1372  self.setParameter("jetCorLabelUpToL3",cms.InputTag(jetCorLabelUpToL3Name) )
1373  self.setParameter("jetCorLabelL3Res",cms.InputTag(jetCorLabelL3ResName) )
1374 
1375 
1376  # function enabling the auto jet cleaning for uncertainties ===============
1377  def jetCleaning(self, process, autoJetCleaning, postfix ):
1378 
1379  if autoJetCleaning != "None" or autoJetCleaning == "Manual" :
1380  return self._parameters["jetCollection"].value
1381 
1382  #retrieve collections
1383  electronCollection = self._parameters["electronCollection"].value
1384  muonCollection = self._parameters["muonCollection"].value
1385  photonCollection = self._parameters["photonCollection"].value
1386  tauCollection = self._parameters["tauCollection"].value
1387  jetCollection = self._parameters["jetCollection"].value
1388 
1389 
1390  if autoJetCleaning == "Full" : # auto clean taus, photons and jets
1391  if isValidInputTag(tauCollection):
1392  process.load("PhysicsTools.PatAlgos.cleaningLayer1.tauCleaner_cfi")
1393  cleanPatTauProducer = getattr(process, "cleanPatTaus").clone(
1394  src = tauCollection
1395 
1396  )
1397  cleanPatTauProducer.checkOverlaps.electrons.src = electronCollection
1398  cleanPatTauProducer.checkOverlaps.muons.src = muonCollection
1399  setattr(process, "cleanedPatTaus"+postfix, cleanPatTauProducer)
1400  tauCollection = cms.InputTag("cleanedPatTaus"+postfix)
1401 
1402  if isValidInputTag(photonCollection):
1403  process.load("PhysicsTools.PatAlgos.cleaningLayer1.photonCleaner_cfi")
1404  cleanPatPhotonProducer = getattr(process, "cleanPatPhotons").clone(
1405  src = photonCollection
1406  )
1407  cleanPatPhotonProducer.checkOverlaps.electrons.src = electronCollection
1408  setattr(process, "cleanedPatPhotons"+postfix, cleanPatPhotonProducer)
1409  photonCollection = cms.InputTag("cleanedPatPhotons"+postfix)
1410 
1411  #jet cleaning
1412  process.load("PhysicsTools.PatAlgos.cleaningLayer1.jetCleaner_cfi")
1413  cleanPatJetProducer = getattr(process, "cleanPatJets").clone(
1414  src = jetCollection
1415  )
1416  cleanPatJetProducer.checkOverlaps.muons.src = muonCollection
1417  cleanPatJetProducer.checkOverlaps.electrons.src = electronCollection
1418  if isValidInputTag(photonCollection) and autoJetCleaning != "LepClean":
1419  cleanPatJetProducer.checkOverlaps.photons.src = photonCollection
1420  else:
1421  del cleanPatJetProducer.checkOverlaps.photons
1422 
1423  if isValidInputTag(tauCollection) and autoJetCleaning != "LepClean":
1424  cleanPatJetProducer.checkOverlaps.taus.src = tauCollection
1425  else:
1426  del cleanPatJetProducer.checkOverlaps.taus
1427 
1428  setattr(process, "cleanedPatJets"+postfix, cleanPatJetProducer)
1429 
1430  return cms.InputTag("cleanedPatJets"+postfix)
1431 
1432 
1433 #========================================================================================
1434 runMETCorrectionsAndUncertainties = RunMETCorrectionsAndUncertainties()
1435 
1436 
1437 
1438 #predefined functions for miniAOD production and reproduction
1439 # miniAOD production ===========================
1440 def runMetCorAndUncForMiniAODProduction(process, metType="PF",
1441  jetCollUnskimmed="patJets",
1442  jetColl="selectedPatJetsForMETUnc",
1443  photonColl="selectedPatPhotons",
1444  electronColl="selectedPatElectrons",
1445  muonColl="selectedPatMuons",
1446  tauColl="selectedPatTaus",
1447  pfCandColl = "particleFlow",
1448  jetCleaning="LepClean",
1449 ## jecUnFile="CondFormats/JetMETObjects/data/Summer15_50nsV5_DATA_UncertaintySources_AK4PFchs.txt",
1450  jecUnFile="",
1451  recoMetFromPFCs=False,
1452  postfix=""):
1453 
1454  runMETCorrectionsAndUncertainties = RunMETCorrectionsAndUncertainties()
1455 
1456  #MET flavors
1457  runMETCorrectionsAndUncertainties(process, metType="PF",
1458  correctionLevel=["T0","T1","T2","Smear","Txy"],
1459  computeUncertainties=False,
1460  produceIntermediateCorrections=True,
1461  addToPatDefaultSequence=False,
1462  jetCollectionUnskimmed=jetCollUnskimmed,
1463  jetCollection=jetColl,
1464  photonCollection=photonColl,
1465  electronCollection=electronColl,
1466  muonCollection=muonColl,
1467  tauCollection=tauColl,
1468  pfCandCollection =pfCandColl,
1469  autoJetCleaning=jetCleaning,
1470  jecUncertaintyFile=jecUnFile,
1471  recoMetFromPFCs=recoMetFromPFCs,
1472  postfix=postfix
1473  )
1474 
1475  #MET T1 uncertainties
1476  runMETCorrectionsAndUncertainties(process, metType="PF",
1477  correctionLevel=["T1"],
1478  computeUncertainties=True,
1479  produceIntermediateCorrections=False,
1480  addToPatDefaultSequence=False,
1481  jetCollectionUnskimmed=jetCollUnskimmed,
1482  jetCollection=jetColl,
1483  photonCollection=photonColl,
1484  electronCollection=electronColl,
1485  muonCollection=muonColl,
1486  tauCollection=tauColl,
1487  pfCandCollection =pfCandColl,
1488  autoJetCleaning=jetCleaning,
1489  jecUncertaintyFile=jecUnFile,
1490  recoMetFromPFCs=recoMetFromPFCs,
1491  postfix=postfix
1492  )
1493 
1494  #MET T1 Smeared JER uncertainties
1495  runMETCorrectionsAndUncertainties(process, metType="PF",
1496  correctionLevel=["T1","Smear"],
1497  computeUncertainties=True,
1498  produceIntermediateCorrections=False,
1499  addToPatDefaultSequence=False,
1500  jetCollectionUnskimmed=jetCollUnskimmed,
1501  jetCollection=jetColl,
1502  photonCollection=photonColl,
1503  electronCollection=electronColl,
1504  muonCollection=muonColl,
1505  tauCollection=tauColl,
1506  pfCandCollection =pfCandColl,
1507  autoJetCleaning=jetCleaning,
1508  jecUncertaintyFile=jecUnFile,
1509  recoMetFromPFCs=recoMetFromPFCs,
1510  postfix=postfix,
1511  )
1512 
1513 
1514 
1515 
1516 # miniAOD reproduction ===========================
1517 def runMetCorAndUncFromMiniAOD(process, metType="PF",
1518  jetCollUnskimmed="slimmedJets",
1519  jetColl="selectedPatJets",
1520  photonColl="slimmedPhotons",
1521  electronColl="slimmedElectrons",
1522  muonColl="slimmedMuons",
1523  tauColl="slimmedTaus",
1524  pfCandColl = "packedPFCandidates",
1525  jetFlav="AK4PFchs",
1526  jetCleaning="LepClean",
1527  isData=False,
1528  jetConfig=False,
1529  reclusterJets=False,
1530  recoMetFromPFCs=False,
1531  jetCorLabelL3=cms.InputTag('ak4PFCHSL1FastL2L3Corrector'),
1532  jetCorLabelRes=cms.InputTag('ak4PFCHSL1FastL2L3ResidualCorrector'),
1533 ## jecUncFile="CondFormats/JetMETObjects/data/Summer15_50nsV5_DATA_UncertaintySources_AK4PFchs.txt",
1534  jecUncFile="",
1535  postfix=""):
1536 
1537  runMETCorrectionsAndUncertainties = RunMETCorrectionsAndUncertainties()
1538 
1539  #MET T1 uncertainties
1540  runMETCorrectionsAndUncertainties(process, metType="PF",
1541  correctionLevel=["T1"],
1542  computeUncertainties=True,
1543  produceIntermediateCorrections=False,
1544  addToPatDefaultSequence=False,
1545  jetCollection=jetColl,
1546  jetCollectionUnskimmed=jetCollUnskimmed,
1547  electronCollection=electronColl,
1548  muonCollection=muonColl,
1549  tauCollection=tauColl,
1550  photonCollection=photonColl,
1551  pfCandCollection =pfCandColl,
1552  runOnData=isData,
1553  onMiniAOD=True,
1554  reclusterJets=reclusterJets,
1555  recoMetFromPFCs=recoMetFromPFCs,
1556  autoJetCleaning=jetCleaning,
1557  manualJetConfig=jetConfig,
1558  jetFlavor=jetFlav,
1559  jetCorLabelUpToL3=jetCorLabelL3,
1560  jetCorLabelL3Res=jetCorLabelRes,
1561  jecUncertaintyFile=jecUncFile,
1562  postfix=postfix,
1563  )
1564 
1565  #MET T1+Txy
1566  runMETCorrectionsAndUncertainties(process, metType="PF",
1567  correctionLevel=["T1","Txy"],
1568  computeUncertainties=False,
1569  produceIntermediateCorrections=True,
1570  addToPatDefaultSequence=False,
1571  jetCollection=jetColl,
1572  jetCollectionUnskimmed=jetCollUnskimmed,
1573  electronCollection=electronColl,
1574  muonCollection=muonColl,
1575  tauCollection=tauColl,
1576  photonCollection=photonColl,
1577  pfCandCollection =pfCandColl,
1578  runOnData=isData,
1579  onMiniAOD=True,
1580  reclusterJets=reclusterJets,
1581  recoMetFromPFCs=recoMetFromPFCs,
1582  autoJetCleaning=jetCleaning,
1583  manualJetConfig=jetConfig,
1584  jetFlavor=jetFlav,
1585  jetCorLabelUpToL3=jetCorLabelL3,
1586  jetCorLabelL3Res=jetCorLabelRes,
1587  jecUncertaintyFile=jecUncFile,
1588  postfix=postfix,
1589  )
def initializeInputTag
Utilities ====================================================================.
if(c.getParameter< edm::InputTag >("puppiValueMap").label().size()!=0)
Definition: value.py:1
TEveGeoShape * clone(const TEveElement *element, TEveElement *parent)
Definition: eve_macros.cc:135
def getDefaultParameters
self.addParameter(self._defaultParameters, &#39;jecUncertaintyFile&#39;, &#39;CondFormats/JetMETObjects/data/Summ...