@@ -109,8 +109,79 @@ def miniAODFromMiniAOD_customizeCommon(process):
109109 ###########################################################################
110110 # Rekey jet constituents
111111 ###########################################################################
112+
113+ # Add deep flavour info to AK4CHS jets
114+ # (based on function from jetsAK4_CHS_cff in Nano)
115+ from PhysicsTools .PatAlgos .tools .jetTools import updateJetCollection
116+ def _m2m_addDeepInfoAK4CHS (process ,
117+ addDeepBTag ,
118+ addDeepFlavour ,
119+ addParticleNet ,
120+ addRobustParTAK4 = False ,
121+ addUnifiedParTAK4 = False ):
122+ _btagDiscriminators = []
123+ if addDeepBTag :
124+ print ("Updating process to run DeepCSV btag" )
125+ _btagDiscriminators += ['pfDeepCSVJetTags:probb' ,'pfDeepCSVJetTags:probbb' ,'pfDeepCSVJetTags:probc' ]
126+ if addDeepFlavour :
127+ print ("Updating process to run DeepFlavour btag" )
128+ _btagDiscriminators += ['pfDeepFlavourJetTags:probb' ,'pfDeepFlavourJetTags:probbb' ,'pfDeepFlavourJetTags:problepb' ,'pfDeepFlavourJetTags:probc' ]
129+ if addParticleNet :
130+ print ("Updating process to run ParticleNetAK4" )
131+ from RecoBTag .ONNXRuntime .pfParticleNetFromMiniAODAK4_cff import _pfParticleNetFromMiniAODAK4CHSCentralJetTagsAll as pfParticleNetFromMiniAODAK4CHSCentralJetTagsAll
132+ from RecoBTag .ONNXRuntime .pfParticleNetFromMiniAODAK4_cff import _pfParticleNetFromMiniAODAK4CHSForwardJetTagsAll as pfParticleNetFromMiniAODAK4CHSForwardJetTagsAll
133+ _btagDiscriminators += pfParticleNetFromMiniAODAK4CHSCentralJetTagsAll
134+ _btagDiscriminators += pfParticleNetFromMiniAODAK4CHSForwardJetTagsAll
135+ if addRobustParTAK4 :
136+ print ("Updating process to run RobustParTAK4" )
137+ from RecoBTag .ONNXRuntime .pfParticleTransformerAK4_cff import _pfParticleTransformerAK4JetTagsAll as pfParticleTransformerAK4JetTagsAll
138+ _btagDiscriminators += pfParticleTransformerAK4JetTagsAll
139+ if addUnifiedParTAK4 :
140+ print ("Updating process to run UnifiedParTAK4" )
141+ from RecoBTag .ONNXRuntime .pfUnifiedParticleTransformerAK4_cff import _pfUnifiedParticleTransformerAK4JetTagsAll as pfUnifiedParticleTransformerAK4JetTagsAll
142+ _btagDiscriminators += pfUnifiedParticleTransformerAK4JetTagsAll
143+
144+ if len (_btagDiscriminators )== 0 : return process
145+ print ("Will recalculate the following discriminators: " + ", " .join (_btagDiscriminators ))
146+ updateJetCollection (
147+ process ,
148+ jetSource = cms .InputTag ('slimmedJets' , processName = cms .InputTag .skipCurrentProcess ()),
149+ jetCorrections = ('AK4PFchs' , cms .vstring (['L1FastJet' , 'L2Relative' , 'L3Absolute' ,'L2L3Residual' ]), 'None' ),
150+ btagDiscriminators = _btagDiscriminators ,
151+ postfix = 'AK4CHSWithDeepInfo' ,
152+ )
153+ process .load ("Configuration.StandardSequences.MagneticField_cff" )
154+
155+ from PhysicsTools .PatAlgos .tools .helpers import getPatAlgosToolsTask , addToProcessAndTask
156+ task = getPatAlgosToolsTask (process )
157+ addToProcessAndTask ("slimmedJetsWithDeepInfo" , process .selectedUpdatedPatJetsAK4CHSWithDeepInfo .clone (), process , task )
158+ del process .selectedUpdatedPatJetsAK4CHSWithDeepInfo
159+
160+ return process
161+
162+ # FIXME: this probably needs to be era dependent, but all enabled for now
163+ m2m_addDeepInfoAK4CHS_switch = cms .PSet (
164+ m2m_addDeepBTag_switch = cms .untracked .bool (True ),
165+ m2m_addDeepFlavourTag_switch = cms .untracked .bool (True ),
166+ m2m_addParticleNet_switch = cms .untracked .bool (True ),
167+ m2m_addRobustParTAK4Tag_switch = cms .untracked .bool (True ),
168+ m2m_addUnifiedParTAK4Tag_switch = cms .untracked .bool (True )
169+ )
170+ _m2m_addDeepInfoAK4CHS (process ,
171+ addDeepBTag = m2m_addDeepInfoAK4CHS_switch .m2m_addDeepBTag_switch ,
172+ addDeepFlavour = m2m_addDeepInfoAK4CHS_switch .m2m_addDeepFlavourTag_switch ,
173+ addParticleNet = m2m_addDeepInfoAK4CHS_switch .m2m_addParticleNet_switch ,
174+ addRobustParTAK4 = m2m_addDeepInfoAK4CHS_switch .m2m_addRobustParTAK4Tag_switch ,
175+ addUnifiedParTAK4 = m2m_addDeepInfoAK4CHS_switch .m2m_addUnifiedParTAK4Tag_switch )
176+
177+ jets_ak4chs_to_use = 'slimmedJets::@skipCurrentProcess'
178+ for flag in m2m_addDeepInfoAK4CHS_switch ._Parameterizable__parameterNames :
179+ if m2m_addDeepInfoAK4CHS_switch .getParameter (flag ).value ():
180+ jets_ak4chs_to_use = 'slimmedJetsWithDeepInfo'
181+ break
182+
112183 addToProcessAndTask ("slimmedJets" , cms .EDProducer ("PATJetCandidatesRekeyer" ,
113- src = cms .InputTag ("slimmedJets" , processName = cms . InputTag . skipCurrentProcess () ),
184+ src = cms .InputTag (jets_ak4chs_to_use ),
114185 packedPFCandidatesNew = cms .InputTag ("packedPFCandidates" ,processName = cms .InputTag .currentProcess ()),
115186 ),
116187 process , task
@@ -172,12 +243,120 @@ def miniAODFromMiniAOD_customizeCommon(process):
172243 tauIdEmbedder .runTauID ()
173244 task .add (process .rerunMvaIsolationTaskM2M , getattr (process , taus_to_use ))
174245
246+ # Produce a "hybrid" tau collection combining HPS-reconstructed taus with tau-tagged jets
247+ def _m2m_addUTagToTaus (process , task ,
248+ tausToUpdate = 'slimmedTaus' ,
249+ storePNetCHSjets = False ,
250+ storeUParTPUPPIjets = False ,
251+ addGenJet = False ):
252+ if not (storePNetCHSjets or storeUParTPUPPIjets ): return process
253+ if addGenJet :
254+ from PhysicsTools .JetMCAlgos .TauGenJets_cfi import tauGenJets
255+ addToProcessAndTask ('tauGenJets' ,
256+ tauGenJets .clone (GenParticles = 'prunedGenParticles' ),
257+ process , task )
258+ from PhysicsTools .JetMCAlgos .TauGenJetsDecayModeSelectorAllHadrons_cfi import tauGenJetsSelectorAllHadrons
259+ addToProcessAndTask ('tauGenJetsSelectorAllHadrons' ,
260+ tauGenJetsSelectorAllHadrons ,
261+ process , task )
262+ from PhysicsTools .PatAlgos .mcMatchLayer0 .tauMatch_cfi import tauGenJetMatch
263+ from PhysicsTools .PatAlgos .patTauHybridProducer_cfi import patTauHybridProducer
264+ if storePNetCHSjets :
265+ jetCollection = jets_ak4chs_to_use
266+ TagName = 'pfParticleNetFromMiniAODAK4CHSCentralJetTags'
267+ tag_prefix = 'byUTagCHS'
268+ updatedTauName = 'slimmedTausWithUTagCHS'
269+ # PNet tagger used for CHS jets
270+ from RecoBTag .ONNXRuntime .pfParticleNetFromMiniAODAK4_cff import pfParticleNetFromMiniAODAK4CHSCentralJetTags
271+ Discriminators = [TagName + ":" + tag for tag in pfParticleNetFromMiniAODAK4CHSCentralJetTags .flav_names .value ()]
272+ # Define "hybridTau" producer
273+ setattr (process , updatedTauName ,
274+ patTauHybridProducer .clone (
275+ src = tausToUpdate ,
276+ jetSource = jetCollection ,
277+ dRMax = 0.4 ,
278+ jetPtMin = 15 ,
279+ jetEtaMax = 2.5 ,
280+ UTagLabel = TagName ,
281+ UTagScoreNames = Discriminators ,
282+ tagPrefix = tag_prefix ,
283+ tauScoreMin = - 1 ,
284+ vsJetMin = 0.05 ,
285+ checkTauScoreIsBest = False ,
286+ chargeAssignmentProbMin = 0.2 ,
287+ addGenJetMatch = addGenJet ,
288+ genJetMatch = ''
289+ ))
290+ if addGenJet :
291+ addToProcessAndTask ('tauGenJetMatchCHSJet' ,
292+ tauGenJetMatch .clone (src = jetCollection ),
293+ process , task )
294+ getattr (process ,updatedTauName ).genJetMatch = 'tauGenJetMatchCHSJet'
295+ if storeUParTPUPPIjets : task .add (getattr (process ,updatedTauName ))
296+ if storeUParTPUPPIjets :
297+ jetCollection = 'slimmedJetsPuppiPreRekey'
298+ TagName = 'pfUnifiedParticleTransformerAK4JetTags'
299+ tag_prefix = 'byUTagPUPPI'
300+ updatedTauName = 'slimmedTausWithUTagPUPPI' if not storePNetCHSjets else 'slimmedTausWithUTagCHSAndUTagPUPPI'
301+ # Unified ParT Tagger used for PUPPI jets
302+ from RecoBTag .ONNXRuntime .pfUnifiedParticleTransformerAK4JetTags_cfi import pfUnifiedParticleTransformerAK4JetTags
303+ Discriminators = [TagName + ":" + tag for tag in pfUnifiedParticleTransformerAK4JetTags .flav_names .value ()]
304+ # Define "hybridTau" producer
305+ setattr (process , updatedTauName ,
306+ patTauHybridProducer .clone (
307+ src = tausToUpdate if not storePNetCHSjets else 'slimmedTausWithUTagCHS' ,
308+ jetSource = jetCollection ,
309+ dRMax = 0.4 ,
310+ jetPtMin = 15 ,
311+ jetEtaMax = 2.5 ,
312+ UTagLabel = TagName ,
313+ UTagScoreNames = Discriminators ,
314+ tagPrefix = tag_prefix ,
315+ tauScoreMin = - 1 ,
316+ vsJetMin = 0.05 ,
317+ checkTauScoreIsBest = False ,
318+ chargeAssignmentProbMin = 0.2 ,
319+ addGenJetMatch = addGenJet ,
320+ genJetMatch = ''
321+ ))
322+ if addGenJet :
323+ addToProcessAndTask ('tauGenJetMatchPUPPIJet' ,
324+ tauGenJetMatch .clone (src = jetCollection ),
325+ process , task )
326+ getattr (process ,updatedTauName ).genJetMatch = 'tauGenJetMatchPUPPIJet'
327+ # Add "hybridTau" producer to pat-task
328+ addToProcessAndTask ('slimmedTausUpdatedWithUTags' ,
329+ getattr (process , updatedTauName ).clone (),
330+ process , task )
331+ return process
332+
333+ m2m_uTagToTaus_switches = cms .PSet (
334+ storePNetCHSjets = cms .bool (True ),
335+ storeUParTPUPPIjets = cms .bool (True ),
336+ addGenJet = cms .bool (True )
337+ )
338+ _m2m_addUTagToTaus (process , task ,
339+ taus_to_use ,
340+ storePNetCHSjets = m2m_uTagToTaus_switches .storePNetCHSjets .value (),
341+ storeUParTPUPPIjets = m2m_uTagToTaus_switches .storeUParTPUPPIjets .value (),
342+ addGenJet = m2m_uTagToTaus_switches .addGenJet .value ()
343+ )
344+ if m2m_uTagToTaus_switches .storePNetCHSjets .value () or m2m_uTagToTaus_switches .storeUParTPUPPIjets .value ():
345+ taus_to_use = 'slimmedTausUpdatedWithUTags'
346+
175347 addToProcessAndTask ("slimmedTaus" , cms .EDProducer ("PATTauCandidatesRekeyer" ,
176348 src = cms .InputTag (taus_to_use ),
177349 packedPFCandidatesNew = cms .InputTag ("packedPFCandidates" ,processName = cms .InputTag .currentProcess ()),
178350 ),
179351 process , task
180352 )
353+ # fix circular module dependency in ParticleNetFromMiniAOD TagInfos when slimmedTaus is updated
354+ def _fixPNetInputCollection (process ):
355+ if hasattr (process , 'slimmedTaus' ):
356+ for mod in process .producers .keys ():
357+ if 'ParticleNetFromMiniAOD' in mod and 'TagInfos' in mod :
358+ getattr (process , mod ).taus = 'slimmedTaus::@skipCurrentProcess'
359+ _fixPNetInputCollection (process )
181360
182361 boosted_taus_to_use = 'slimmedTausBoosted::@skipCurrentProcess'
183362 idsToRun_for_boosted_taus = cms .PSet (idsToAdd = cms .vstring ())
@@ -204,6 +383,11 @@ def miniAODFromMiniAOD_customizeCommon(process):
204383 process , task
205384 )
206385
386+ # Use original pf-particles w/o recalculated puppi to be coherent with on-the-fly deepTau calculations
387+ for mod in process .producers .keys ():
388+ if 'deeptau' in mod .lower ():
389+ getattr (process , mod ).pfcands = 'packedPFCandidates::@skipCurrentProcess'
390+
207391 ###########################################################################
208392 # Rekey candidates in electrons, photons and muons
209393 ###########################################################################
@@ -309,6 +493,24 @@ def miniAODFromMiniAOD_customizeCommon(process):
309493
310494 return process
311495
496+ def hybridTausOnData (process ):
497+ print ('removing MC dependencies for hybrid taus' )
498+ modulesToDel = []
499+ for moduleName in process .producers .keys ():
500+ if not 'slimmedTaus' in moduleName : continue
501+ module = getattr (process , moduleName )
502+ if module .__dict__ ['_TypedParameterizable__type' ] != 'PATTauHybridProducer' : continue
503+ module .addGenJetMatch = False
504+ genJetModule = module .genJetMatch .getModuleLabel ()
505+ if not genJetModule in modulesToDel :
506+ modulesToDel .append (genJetModule )
507+ module .genJetMatch = ''
508+ if modulesToDel :
509+ modulesToDel .extend (['tauGenJets' ,'tauGenJetsSelectorAllHadrons' ])
510+ for moduleName in modulesToDel :
511+ if hasattr (process ,moduleName ): delattr (process ,moduleName )
512+ return process
513+
312514def miniAODFromMiniAOD_customizeData (process ):
313515 from PhysicsTools .PatAlgos .tools .puppiJetMETReclusteringFromMiniAOD_cff import puppiJetMETReclusterFromMiniAOD_Data
314516 process = puppiJetMETReclusterFromMiniAOD_Data (process )
@@ -322,6 +524,8 @@ def miniAODFromMiniAOD_customizeMC(process):
322524def miniAODFromMiniAOD_customizeAllData (process ):
323525 process = miniAODFromMiniAOD_customizeData (process )
324526 process = miniAODFromMiniAOD_customizeCommon (process )
527+ # remove MC dependencies for hybrid taus
528+ process = hybridTausOnData (process )
325529 return process
326530
327531def miniAODFromMiniAOD_customizeAllMC (process ):
0 commit comments