5""" ComponentAccumulator equivalents for the functions in JetRecoSequences """
7from .JetRecoCommon
import (
9 cloneAndUpdateJetRecoDict,
12 defineReclusteredJets,
21 getJetCalibDefaultString,
25from AthenaConfiguration.ComponentAccumulator
import ComponentAccumulator
26from AthenaConfiguration.ComponentFactory
import CompFactory
27from AthenaCommon.CFElements
import parOR
28from ..CommonSequences.FullScanDefs
import fs_cells
29from ..Bjet.BjetFlavourTaggingConfig
import fastFlavourTaggingCfg
30from .JetTrackingConfig
import JetRoITrackingCfg
31from .JetHIConfig
import HeavyIonJetRecoDataDeps
33from JetRecConfig
import JetRecConfig
34from JetRecConfig
import JetInputConfig
35from JetRecConfig.DependencyHelper
import solveDependencies, solveGroomingDependencies
37from JetRecTools
import OnlineMon
38from JetRec
import JetOnlineMon
40from EventShapeTools.EventDensityConfig
import getEventShapeName
42from AthenaConfiguration.AccumulatorCache
import AccumulatorCache
44from typing
import Final
47JET_DEFAULT_VIEW_PT_MIN_GEV : Final[int] = 10
50 return f
"{jetsIn}_pt{int(jetPtMinGeV)}"
58 jetalg, jetradius, extra = interpretRecoAlg(jetRecoDict[
"recoAlg"])
60 if jetRecoDict[
'ionopt']
in [
'ion',
'ionp']:
61 jetDefDict = HeavyIonJetRecoDataDeps(
68 jetDefDict[
'final'] = jetDefDict[
'reclustered']
69 elif extra
in [
"t",
"sd"]:
73 jetDefDict[
'final'] = jetDefDict[
'groomed']
78 jetDefDict[
'final'] = jetDefDict[
'calib']
81 gen_jetDefStr = jetDefToString(jetDefDict[
'final'][1])
82 assert jetRecoDict[
'jetDefStr'] == gen_jetDefStr, (
83 f
"Expected jetDefStr {jetRecoDict['jetDefStr']} from reco dict, generated {gen_jetDefStr}"
90 """Jet clustering step -- generally only called through StandardJetRecoDataDeps"""
91 use_FS_tracking = doFSTracking(jetRecoDict)
92 trkopt = jetRecoDict[
'trkopt']
93 clustersKey = getClustersKey(jetRecoDict)
95 is_pflow = isPFlow(jetRecoDict)
100 pfoPrefix=f
"HLT_{trkopt}",
101 prefix=getHLTPrefix(),
105 jetDef.inputdef.prereqs = [f
'extinput:{clustersKey}']
110 clustersKey=clustersKey,
111 prefix=getHLTPrefix(),
116 "Filter:{}".format(getFilterCut(jetRecoDict[
"recoAlg"])),
117 "ConstitFourMom_copy",
119 if jetRecoDict[
"recoAlg"] ==
"a4":
120 jetDef.modifiers += [
"CaloEnergies"]
122 jetDef.modifiers += [
"CaloEnergiesClus"]
124 jetDef.modifiers += [
"TrackMoments",
"JVF",
"JVT",
"NNJVT_TrkAugV1"]
126 pj_name = JetRecConfig.getPJContName(jetDef.inputdef)
128 pj_name = f
"{pj_name}MergedWithGhostTracks"
129 jetDef._internalAtt[
"finalPJContainer"] = pj_name
131 jetsOut = jetDef.fullname()
132 jetDef = solveDependencies(jetDef,flags)
135 return {
'build': (jetsOut, jetDef)}
139 """Jet clustering + calibration (via shallow copy)"""
140 if jetRecoDict[
"jetCalib"] ==
"nojcalib":
145 jetsNoCalib, jetDef = jetDefDict[
'build']
149 jetDefDict.update({
'nojcalib': (jetsNoCalibFiltered, jetDef),
'calib': (jetsNoCalibFiltered, jetDef)})
153 jrdNoJCalib = cloneAndUpdateJetRecoDict(
160 jetsNoCalib, jetDefNoCalib = jetDefDict[
'build']
163 jetDef = jetDefNoCalib.clone()
164 jetDef.suffix = jetDefNoCalib.suffix.replace(
"nojcalib", jetRecoDict[
"jetCalib"])
166 if "sub" in jetRecoDict[
"jetCalib"]:
167 rhoKey = getEventShapeName(jetDef, nameprefix=getHLTPrefix())
172 use_FS_tracking = doFSTracking(jetRecoDict)
173 is_pflow = isPFlow(jetRecoDict)
175 jetDef.modifiers = getCalibMods(flags, jetRecoDict, rhoKey)
177 jetDef.modifiers += [
"JVT",
"NNJVT_TrkAugV1"]
179 if jetRecoDict[
"recoAlg"] ==
"a4":
180 jetDef.modifiers += [
"CaloQuality"]
182 if not is_pflow
and jetRecoDict[
"recoAlg"] ==
"a4":
183 from TriggerMenuMT.HLT.Jet.JetRecoCommon
import cleaningDict
184 jetDef.modifiers += [f
'Cleaning:{clean_wp}' for _,clean_wp
in cleaningDict.items()]
186 jetDef = solveDependencies(jetDef,flags)
189 jetDefDict.update({
'nojcalib':(jetsViewNoCalib, jetDefNoCalib),
'calib':(jetsOut, jetDef)})
193 basicJetRecoDict = cloneAndUpdateJetRecoDict(
200 flags, **basicJetRecoDict
202 basicJetsName, basicJetDef = jetDefDict[
'calib']
206 rc_suffix = f
"_{jetRecoDict['jetCalib']}" + (f
"_{jetRecoDict['trkopt']}" if doTracking(jetRecoDict)
else "")
208 rcJetDef = defineReclusteredJets(
211 basicJetDef.inputdef.label,
216 rcConstitPJKey = JetRecConfig.getPJContName(rcJetDef.inputdef, suffix=jetRecoDict[
'jetDefStr'])
217 rcJetDef._internalAtt[
"finalPJContainer"] = rcConstitPJKey
220 rcJetsOut = rcJetDef.fullname()
221 jetDefDict[
'reclustered'] = (rcJetsOut, rcJetDef)
226 ungroomedJRD = cloneAndUpdateJetRecoDict(
229 recoAlg=jetRecoDict[
"recoAlg"].rstrip(
"tsd"),
231 jetCalib =
"nojcalib",
235 ungroomedJetsName, ungroomedDef = jetDefDict[
'build']
237 groomDef = defineGroomedJets(jetRecoDict, ungroomedDef)
238 groomedJetsName = groomDef.fullname()
239 groomDef.modifiers = getCalibMods(flags,jetRecoDict)
240 groomDef.modifiers += [
242 "Filter:{}".format(getFilterCut(jetRecoDict[
"recoAlg"])),
244 groomDef = solveGroomingDependencies(groomDef, flags)
247 return {
'ungroomed':(ungroomedJetsName, ungroomedDef),
'groomed':(groomedJetsName, groomDef)}
255 """The top-level sequence
257 Forwards arguments to the standard jet reco, grooming or reclustering sequences.
260 if 'reclustered' in jetDefDict:
264 elif 'groomed' in jetDefDict:
280 decorList = getDecorList(jetDef)
281 filteredJetsName = f
"{jetDef.fullname()}_pt{int(jetPtMinGeV)}"
282 acc = ComponentAccumulator()
284 CompFactory.JetViewAlg(
285 "jetview_"+filteredJetsName,
286 InputContainer=jetDef.fullname(),
287 OutputContainer=filteredJetsName,
288 PtMin=jetPtMinGeV*1e3,
298 """ Standard jet reconstruction, no reclustering or grooming
300 The clusters (and tracks, if necessary) should be built beforehand,
301 but this config will build the PFOs if they are needed.
303 The reconstruction is configured from the input JetDefinition
306 jetDefStr = jetDefToString(jetDef)
307 trackColls = jetDef._contextDic
309 seqname =
"JetBuildSeq_"+jetDefStr
310 acc = ComponentAccumulator()
311 acc.addSequence(parOR(seqname),primary=
True)
314 if 'PFlow' in jetDef.inputdef.label:
315 from eflowRec.PFHLTConfig
import PFCfg
317 clustersKey = jetDef.inputdef.prereqs[0].
split(
':')[1]
322 clustersin=clustersKey,
324 tracksin=trackColls[
"Tracks"],
325 verticesin=trackColls[
"Vertices"],
331 alg = JetRecConfig.getConstitModAlg(
332 jetDef, jetDef.inputdef,
337 acc.addEventAlgo(alg,seqname)
339 pj_alg = JetRecConfig.getConstitPJGAlg(jetDef.inputdef)
340 acc.addEventAlgo(pj_alg,seqname)
342 jra_extra_outputs = []
343 if jetDef.context==
'ftf':
344 pj_name = pj_alg.OutputContainer.Path
346 merge_alg = CompFactory.PseudoJetMerger(
347 f
"PJMerger_{pj_name}MergedWithGhostTracks",
348 InputPJContainers=[pj_name, trackColls[
"GhostTracks"]],
349 OutputContainer=f
"{pj_name}MergedWithGhostTracks",
351 jra_extra_outputs.append((
'xAOD::JetContainer',f
"{jetDef.fullname()}.{trackColls['GhostTracksLabel']}"))
353 acc.addEventAlgo(merge_alg,seqname)
356 JetRecConfig.getJetRecAlg(
359 extraOutputs=jra_extra_outputs,
368 """ Full reconstruction for 'simple' (ungroomed, not reclustered) jets
370 First the uncalibrated jets are built, then (if necessary) the calibrated jets are provided
374 jetsOut, jetDef = jetDefDict[
'calib']
375 jetDefStr = jetDefToString(jetDef)
376 seqname =
"JetRecSeq_"+jetDefStr
379 if jetDef.suffix[1:] ==
"nojcalib":
381 reco_acc = ComponentAccumulator()
382 reco_acc.addSequence(parOR(seqname))
384 buildJets, buildJetDef = jetDefDict[
'build']
388 reco_acc.merge(build_acc, seqname)
395 jetPtMinGeV=JET_DEFAULT_VIEW_PT_MIN_GEV,
397 reco_acc.merge(jetViewAcc, seqname)
401 acc = ComponentAccumulator()
402 acc.addSequence(parOR(seqname))
404 buildJets, buildJetDef = jetDefDict[
'build']
408 acc.merge(build_acc,seqname)
410 jetsNoCalib, jetDefNoCalib = jetDefDict[
'nojcalib']
414 jetPtMinGeV=JET_DEFAULT_VIEW_PT_MIN_GEV,
416 acc.merge(jetViewAcc, seqname)
419 jetCalib = jetCalibFromJetDef(jetDef)
421 if "sub" in jetCalib:
424 eventShapeAlg = JetInputConfig.buildEventShapeAlg(jetDef, getHLTPrefix(),voronoiRf = 1.0 )
425 acc.addEventAlgo(eventShapeAlg,seqname)
427 decorList = getDecorList(jetDef)
432 JetRecConfig.getJetCopyAlg(
433 jetsin=jetDefNoCalib.fullname(),
435 decorations=decorList,
437 f
"HLTJets/{jetDef.fullname()}/"
444 recoAlg, constitType, _ = jetDefStr.split(
'_',2)
445 jetCalibDef = getJetCalibDefaultString(recoAlg,f
'{constitType}',jetDef.context)
447 flags.Trigger.Jet.fastbtagPFlow
448 and jetDef.basename==
"AntiKt4EMPFlow"
449 and jetCalib==jetCalibDef
452 ftagseqname = f
"jetFtagSeq_{jetDef.context}"
453 acc.addSequence(parOR(ftagseqname),seqname)
455 trackingColls = jetDef._contextDic
459 fastFlavourTaggingCfg(
462 trackingColls[
"Vertices"],
463 trackingColls[
"Tracks"],
474 jetPtMinGeV=JET_DEFAULT_VIEW_PT_MIN_GEV,
476 acc.merge(jetViewAcc,seqname)
482 """ Create the groomed jets
484 First the ungroomed jets are created (using the standard configuration), then the grooming
490 ungroomedJetsName, ungroomedDef = jetDefDict[
'ungroomed']
491 groomedJets, groomDef = jetDefDict[
'groomed']
492 jetDefStr = jetDefToString(groomDef)
494 seqname =
"JetGroomSeq_"+jetDefStr
495 acc = ComponentAccumulator()
496 acc.addSequence(parOR(seqname),primary=
True)
502 acc.merge(build_acc,seqname)
504 groom_extraoutputs = []
505 if '_ftf' in jetDefStr:
506 groom_extraoutputs.append((
'xAOD::JetContainer',f
'{groomedJets}.GhostTrack_ftf'))
507 acc.addEventAlgo( JetRecConfig.getJetRecGroomAlg(
510 extraOutputs=groom_extraoutputs,
515 recoAlg, constitType, _ = jetDefStr.split(
'_',2)
516 jetCalib = jetCalibFromJetDef(groomDef)
517 jetCalibDef = getJetCalibDefaultString(recoAlg,f
'{constitType}',groomDef.context)
519 groomDef.basename.startswith(
"AntiKt10EMPFlowCSSKSoftDrop")
520 and jetCalib==jetCalibDef
522 trackingColls = groomDef._contextDic
524 ftagseqname = f
"jetFtagSeq_{groomDef.context}_largeR"
525 acc.addSequence(parOR(ftagseqname), seqname)
528 fastFlavourTaggingCfg(
531 trackingColls[
'Vertices'],
532 trackingColls[
'Tracks'],
534 doXbbtagLargeRJet =
True,
542 """ Create the reclustered jets
544 First the input jets are built, then the reclustering algorithm is run
547 basicJetsFiltered, basicJetDef = jetDefDict[
'calib']
548 rcJets, rcJetDef = jetDefDict[
'reclustered']
549 jetDefStr = jetDefToString(rcJetDef)
551 seqname =
"JetReclusterSeq_"+jetDefStr
552 acc = ComponentAccumulator()
553 acc.addSequence(parOR(seqname),primary=
True)
558 acc.merge(basic_acc,seqname)
564 jetPtMinGeV=rcJetPtMin,
566 acc.merge(jetViewAcc,seqname)
568 rcConstitPJAlg = JetRecConfig.getConstitPJGAlg(rcJetDef.inputdef, suffix=jetDefStr)
569 acc.addEventAlgo(rcConstitPJAlg,seqname)
572 JetRecConfig.getJetRecAlg(
575 f
"HLTJets/{rcJetDef.fullname()}/"
587 acc = ComponentAccumulator()
588 jetsIn = jetDef.fullname()
590 ftagJetDef = jetDef.clone(suffix=jetDef.suffix+
'_fastftag',modifiers=[],lock=
True)
591 decorList = getDecorList(jetDef)
592 acc.addEventAlgo(JetRecConfig.getJetCopyAlg(jetsin=jetsIn,jetsoutdef=ftagJetDef,decorations=decorList))
593 return acc, ftagJetDef
599 acc = ComponentAccumulator()
601 trkcfg, trkmap = JetRoITrackingCfg(flags, jetsIn, trkopt, RoIs)
605 fastFlavourTaggingCfg(
std::vector< std::string > split(const std::string &s, const std::string &t=":")
getMonTool_TrigJetAlgorithm(flags, path)
getMonTool_Algorithm(flags, path)
StandardJetRecoCfg(flags, **jetDefDict)
JetRoITrackJetTagSequenceCfg(flags, jetsIn, trkopt, RoIs)
ReclusteredJetRecoDataDeps(flags, **jetRecoDict)
JetRecoCfg(flags, **jetDefDict)
Configuration of the HLT jet reconstruction Takes as input the dictionaries of JetDefs from the data ...
formatFilteredJetsName(jetsIn, jetPtMinGeV)
StandardJetBuildCfg(flags, jetDef)
StandardJetRecoDataDeps(flags, **jetRecoDict)
JetRecoDataDeps(flags, **jetRecoDict)
Data dependency generation for the stages of jet reconstruction This is used to precompute the collec...
StandardJetBuildDataDeps(flags, **jetRecoDict)
FastFtaggedJetCopyAlgCfg(flags, jetDef)
GroomedJetRecoDataDeps(flags, **jetRecoDict)
GroomedJetRecoCfg(flags, **jetDefDict)
JetViewAlgCfg(flags, jetDef, jetPtMinGeV=JET_DEFAULT_VIEW_PT_MIN_GEV)
ReclusteredJetRecoCfg(flags, **jetDefDict)