File indexing completed on 2023-03-17 11:16:24
0001 from __future__ import print_function
0002 from builtins import range
0003 from PhysicsTools.PatAlgos.tools.ConfigToolBase import *
0004
0005 from PhysicsTools.PatAlgos.tools.helpers import *
0006
0007 class RunOnData(ConfigToolBase):
0008
0009 """ Remove monte carlo matching from a given collection or all PAT
0010 candidate collections and adapt the JEC's:
0011 """
0012 _label='runOnData'
0013 _defaultParameters=dicttypes.SortedKeysDict()
0014 def __init__(self):
0015 ConfigToolBase.__init__(self)
0016 self.addParameter(self._defaultParameters,'names',['All'], "collection name; supported are 'Photons', 'Electrons', 'LowPtElectrons', 'Muons', 'Taus', 'TausBoosted', 'Jets', 'METs', 'All', 'PFAll', 'PFElectrons','PFTaus','PFMuons'", allowedValues=['Photons', 'Electrons', 'LowPtElectrons', 'Muons', 'Taus', 'TausBoosted', 'Jets', 'METs', 'All', 'PFAll', 'PFElectrons','PFTaus','PFMuons'])
0017 self.addParameter(self._defaultParameters,'postfix',"", "postfix of default sequence")
0018 self.addParameter(self._defaultParameters,'outputModules',['out'], "names of all output modules specified to be adapted (default is ['out'])")
0019 self._parameters=copy.deepcopy(self._defaultParameters)
0020 self._comment = ""
0021
0022 def getDefaultParameters(self):
0023 return self._defaultParameters
0024
0025 def __call__(self,process,
0026 names = None,
0027 postfix = None,
0028 outputModules = None) :
0029 if names is None:
0030 names=self._defaultParameters['names'].value
0031 if postfix is None:
0032 postfix=self._defaultParameters['postfix'].value
0033 if outputModules is None:
0034 outputModules=self._defaultParameters['outputModules'].value
0035 self.setParameter('names',names)
0036 self.setParameter('postfix',postfix)
0037 self.setParameter('outputModules',outputModules)
0038 self.apply(process)
0039
0040 def toolCode(self, process):
0041 names=self._parameters['names'].value
0042 postfix=self._parameters['postfix'].value
0043 outputModules=self._parameters['outputModules'].value
0044
0045 print('******************* RunOnData *******************')
0046 removeMCMatching(process, names=names, postfix=postfix, outputModules=outputModules)
0047 for mod in process.producerNames().split():
0048 if mod.startswith('patJetCorrFactors'):
0049 prefix = getattr(process, mod).payload.pythonValue().replace("'","")
0050 if 'L3Absolute' in getattr(process,mod).levels:
0051 if not 'L2L3Residual' in getattr(process,mod).levels:
0052 getattr(process,mod).levels.insert(getattr(process,mod).levels.index('L3Absolute')+1, 'L2L3Residual')
0053 print('adding L2L3Residual JEC for:', getattr(process,mod).label_())
0054 if hasattr(process, prefix+'CombinedCorrector'+postfix):
0055 if prefix+'L3Absolute' in getattr(process,prefix+'CombinedCorrector'+postfix).correctors:
0056 if not prefix+'L2L3Residual' in getattr(process,prefix+'CombinedCorrector'+postfix).correctors:
0057 idx = getattr(process,prefix+'CombinedCorrector'+postfix).correctors.index(prefix+'L3Absolute')+1
0058 getattr(process,prefix+'CombinedCorrector'+postfix).correctors.insert(idx, prefix+'L2L3Residual')
0059 print('adding L2L3Residual for TypeI MET correction:', getattr(process,prefix+'CombinedCorrector'+postfix).label_())
0060
0061 runOnData=RunOnData()
0062
0063
0064 class RemoveMCMatching(ConfigToolBase):
0065
0066 """ Remove monte carlo matching from a given collection or all PAT
0067 candidate collections:
0068 """
0069 _label='removeMCMatching'
0070 _defaultParameters=dicttypes.SortedKeysDict()
0071 def __init__(self):
0072 ConfigToolBase.__init__(self)
0073 self.addParameter(self._defaultParameters,'names',['All'],
0074 "collection name; supported are 'Photons', 'OOTPhotons', 'Electrons', 'LowPtElectrons', 'Muons', 'Taus', 'TausBoosted', 'Jets', 'JetsAK8', 'METs', 'All', 'PFAll', 'PFElectrons','PFTaus','PFMuons'",
0075 allowedValues=['Photons', 'OOTPhotons' ,'Electrons', 'LowPtElectrons', 'Muons', 'Taus', 'TausBoosted', 'Jets', 'JetsAK8', 'METs', 'All', 'PFAll', 'PFElectrons','PFTaus','PFMuons'])
0076 self.addParameter(self._defaultParameters,'postfix',"", "postfix of default sequence")
0077 self.addParameter(self._defaultParameters,'outputModules',['out'], "names of all output modules specified to be adapted (default is ['out'])")
0078 self._parameters=copy.deepcopy(self._defaultParameters)
0079 self._comment = ""
0080
0081 def getDefaultParameters(self):
0082 return self._defaultParameters
0083
0084 def __call__(self,process,
0085 names = None,
0086 postfix = None,
0087 outputModules = None) :
0088 if names is None:
0089 names=self._defaultParameters['names'].value
0090 if postfix is None:
0091 postfix=self._defaultParameters['postfix'].value
0092 if outputModules is None:
0093 outputModules=self._defaultParameters['outputModules'].value
0094 self.setParameter('names',names)
0095 self.setParameter('postfix',postfix)
0096 self.setParameter('outputModules',outputModules)
0097 self.apply(process)
0098
0099 def toolCode(self, process):
0100 names=self._parameters['names'].value
0101 postfix=self._parameters['postfix'].value
0102 outputModules=self._parameters['outputModules'].value
0103
0104 print("************** MC dependence removal ************")
0105 attrsToDelete = []
0106 for obj in range(len(names)):
0107 if( names[obj] == 'Photons' or names[obj] == 'All' ):
0108 print("removing MC dependencies for photons")
0109 _removeMCMatchingForPATObject(process, 'photonMatch', 'patPhotons', postfix)
0110 if( names[obj] == 'OOTPhotons' or names[obj] == 'All' ):
0111 print("removing MC dependencies for out of time photons")
0112 _removeMCMatchingForPATObject(process, 'ootPhotonMatch', 'patOOTPhotons', postfix)
0113 if( names[obj] == 'Electrons' or names[obj] == 'All' ):
0114 print("removing MC dependencies for electrons")
0115 _removeMCMatchingForPATObject(process, 'electronMatch', 'patElectrons', postfix)
0116 if( names[obj] == 'LowPtElectrons' or names[obj] == 'All' ):
0117 print("removing MC dependencies for LowPtElectrons")
0118 _removeMCMatchingForPATObject(process, 'lowPtElectronMatch', 'patLowPtElectrons', postfix)
0119 if( names[obj] == 'Muons' or names[obj] == 'All' ):
0120 print("removing MC dependencies for muons")
0121 _removeMCMatchingForPATObject(process, 'muonMatch', 'patMuons', postfix)
0122 if( names[obj] == 'Taus' or names[obj] == 'All' ):
0123 print("removing MC dependencies for taus")
0124 _removeMCMatchingForPATObject(process, 'tauMatch', 'patTaus', postfix)
0125
0126 tauProducer = getattr(process,'patTaus'+postfix)
0127 tauProducer.addGenJetMatch = False
0128 tauProducer.embedGenJetMatch = False
0129 attrsToDelete += [tauProducer.genJetMatch.getModuleLabel()]
0130 tauProducer.genJetMatch = ''
0131 attrsToDelete += ['tauGenJets'+postfix]
0132 attrsToDelete += ['tauGenJetsSelectorAllHadrons'+postfix]
0133
0134 if( names[obj] == 'TausBoosted' or names[obj] == 'All' ):
0135 print("removing MC dependencies for taus boosted %s" %postfix)
0136 if hasattr(process, 'tauMatchBoosted'+postfix) and hasattr(process, 'patTausBoosted'+postfix) :
0137 _removeMCMatchingForPATObject(process, 'tauMatchBoosted', 'patTausBoosted', postfix)
0138
0139 tauProducer = getattr(process,'patTausBoosted'+postfix)
0140 tauProducer.addGenJetMatch = False
0141 tauProducer.embedGenJetMatch = False
0142 attrsToDelete += [tauProducer.genJetMatch.getModuleLabel()]
0143 tauProducer.genJetMatch = ''
0144 attrsToDelete += ['tauGenJetsBoosted'+postfix]
0145 attrsToDelete += ['tauGenJetsSelectorAllHadronsBoosted'+postfix]
0146 else :
0147 print("...skipped since taus boosted %s" %postfix, "are not part of process.")
0148 if( names[obj] == 'Jets' or names[obj] == 'All' ):
0149 print("removing MC dependencies for jets")
0150 jetPostfixes = []
0151 for mod in process.producerNames().split():
0152 if mod.startswith('patJets') and getattr(process,mod).type_() == "PATJetProducer":
0153 jetPostfixes.append(getattr(process, mod).label_().replace("patJets",""))
0154 for pfix in jetPostfixes:
0155
0156 jetProducer = getattr(process, jetCollectionString()+pfix)
0157 jetProducer.addGenPartonMatch = False
0158 jetProducer.embedGenPartonMatch = False
0159
0160 jetProducer.genPartonMatch = ''
0161 jetProducer.addGenJetMatch = False
0162
0163 jetProducer.genJetMatch = ''
0164 jetProducer.getJetMCFlavour = False
0165 jetProducer.useLegacyJetMCFlavour = False
0166 jetProducer.addJetFlavourInfo = False
0167
0168 jetProducer.JetPartonMapSource = ''
0169
0170 jetProducer.JetFlavourInfoSource = ''
0171 attrsToDelete += ['slimmedGenJets'+pfix]
0172
0173 for outMod in outputModules:
0174 if hasattr(process,outMod):
0175 getattr(process,outMod).outputCommands.append("drop *_selectedPatJets*_genJets_*")
0176 getattr(process,outMod).outputCommands.append("drop recoGenJets_*_*_*")
0177 else:
0178 raise KeyError("process has no OutModule named " + outMod)
0179
0180 if ( names[obj] == 'JetsAK8' or names[obj] == 'All' ):
0181 print("removing MC dependencies for AK8 jets")
0182 attrsToDelete += ['slimmedGenJetsAK8' + postfix]
0183
0184 if( names[obj] == 'METs' or names[obj] == 'All' ):
0185 for mod in process.producerNames().split():
0186 if mod.startswith('pat') and getattr(process,mod).type_() == "PATMETProducer":
0187
0188 metProducer = getattr(process, mod)
0189 metProducer.addGenMET = False
0190 attrsToDelete += [metProducer.genMETSource.getModuleLabel()]
0191 metProducer.genMETSource = ''
0192 attrsToDelete += [
0193 'prunedGenParticles',
0194 'prunedGenParticlesWithStatusOne',
0195 'packedGenParticles',
0196 'packedPFCandidateToGenAssociation',
0197 'lostTracksToGenAssociation',
0198 ]
0199 for attr in attrsToDelete:
0200 if hasattr(process,attr): delattr(process,attr)
0201
0202 removeMCMatching=RemoveMCMatching()
0203
0204 def _removeMCMatchingForPATObject(process, matcherName, producerName, postfix=""):
0205 if hasattr(process, matcherName+postfix):
0206 objectMatcher = getattr(process, matcherName+postfix)
0207 if hasattr(process, producerName+postfix):
0208 objectProducer = getattr(process, producerName+postfix)
0209 objectProducer.addGenMatch = False
0210 objectProducer.embedGenMatch = False
0211 attr = objectProducer.genParticleMatch.getModuleLabel()
0212 objectProducer.genParticleMatch = ''
0213 if hasattr(process,attr): delattr(process,attr)
0214