Skip to content

Commit f50bf0e

Browse files
authored
Merge pull request #49318 from mbluj/CMSSW_16_0_X_m2m_tau
Tau fixes to mini-to-mini
2 parents d373bf5 + af587ab commit f50bf0e

File tree

1 file changed

+205
-1
lines changed

1 file changed

+205
-1
lines changed

PhysicsTools/PatAlgos/python/slimming/miniAODFromMiniAOD_tools.py

Lines changed: 205 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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+
312514
def 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):
322524
def 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

327531
def miniAODFromMiniAOD_customizeAllMC(process):

0 commit comments

Comments
 (0)