ATLAS Offline Software
Loading...
Searching...
No Matches
JetRecoSequencesConfig.py
Go to the documentation of this file.
2# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3#
4
5""" ComponentAccumulator equivalents for the functions in JetRecoSequences """
6
7from .JetRecoCommon import (
8 interpretRecoAlg,
9 cloneAndUpdateJetRecoDict,
10 defineJets,
11 defineGroomedJets,
12 defineReclusteredJets,
13 getFilterCut,
14 getCalibMods,
15 getDecorList,
16 getHLTPrefix,
17 getClustersKey,
18 isPFlow,
19 doTracking,
20 doFSTracking,
21 getJetCalibDefaultString,
22 jetDefToString,
23 jetCalibFromJetDef,
24)
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
32
33from JetRecConfig import JetRecConfig
34from JetRecConfig import JetInputConfig
35from JetRecConfig.DependencyHelper import solveDependencies, solveGroomingDependencies
36
37from JetRecTools import OnlineMon
38from JetRec import JetOnlineMon
39
40from EventShapeTools.EventDensityConfig import getEventShapeName
41
42from AthenaConfiguration.AccumulatorCache import AccumulatorCache
43
44from typing import Final
45
46# Default threshold for filtering jets for input to hypo
47JET_DEFAULT_VIEW_PT_MIN_GEV : Final[int] = 10
48
49def formatFilteredJetsName(jetsIn, jetPtMinGeV):
50 return f"{jetsIn}_pt{int(jetPtMinGeV)}"
51
52
56def JetRecoDataDeps(flags, **jetRecoDict):
57
58 jetalg, jetradius, extra = interpretRecoAlg(jetRecoDict["recoAlg"])
59
60 if jetRecoDict['ionopt'] in ['ion', 'ionp']:
61 jetDefDict = HeavyIonJetRecoDataDeps(
62 flags, **jetRecoDict
63 )
64 elif extra == "r":
65 jetDefDict = ReclusteredJetRecoDataDeps(
66 flags, **jetRecoDict
67 )
68 jetDefDict['final'] = jetDefDict['reclustered']
69 elif extra in ["t", "sd"]:
70 jetDefDict = GroomedJetRecoDataDeps(
71 flags, **jetRecoDict
72 )
73 jetDefDict['final'] = jetDefDict['groomed']
74 else:
75 jetDefDict = StandardJetRecoDataDeps(
76 flags, **jetRecoDict
77 )
78 jetDefDict['final'] = jetDefDict['calib']
79
80 # Consistency check that we generated what we intended to generate
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}"
84 )
85
86 return jetDefDict
87
88
89def StandardJetBuildDataDeps(flags, **jetRecoDict):
90 """Jet clustering step -- generally only called through StandardJetRecoDataDeps"""
91 use_FS_tracking = doFSTracking(jetRecoDict)
92 trkopt = jetRecoDict['trkopt']
93 clustersKey = getClustersKey(jetRecoDict)
94
95 is_pflow = isPFlow(jetRecoDict)
96 if is_pflow:
97 jetDef = defineJets(
98 flags,
99 jetRecoDict,
100 pfoPrefix=f"HLT_{trkopt}",
101 prefix=getHLTPrefix(),
102 )
103 # Record which clusters should be used to form PFOs
104 # Purely for trigger usage
105 jetDef.inputdef.prereqs = [f'extinput:{clustersKey}']
106 else:
107 jetDef = defineJets(
108 flags,
109 jetRecoDict,
110 clustersKey=clustersKey,
111 prefix=getHLTPrefix(),
112 )
113 # Sort and filter
114 jetDef.modifiers = [
115 "Sort",
116 "Filter:{}".format(getFilterCut(jetRecoDict["recoAlg"])),
117 "ConstitFourMom_copy",
118 ]
119 if jetRecoDict["recoAlg"] == "a4":
120 jetDef.modifiers += ["CaloEnergies"] # needed for GSC
121 if is_pflow:
122 jetDef.modifiers += ["CaloEnergiesClus"] # Needed for FlowElement GSC
123 if use_FS_tracking:
124 jetDef.modifiers += ["TrackMoments", "JVF", "JVT", "NNJVT_TrkAugV1"] # (NN)JVT not strictly needed for no-calib jets
125
126 pj_name = JetRecConfig.getPJContName(jetDef.inputdef)
127 if use_FS_tracking:
128 pj_name = f"{pj_name}MergedWithGhostTracks"
129 jetDef._internalAtt["finalPJContainer"] = pj_name
130
131 jetsOut = jetDef.fullname()
132 jetDef = solveDependencies(jetDef,flags)
133 jetDef.lock()
134
135 return {'build': (jetsOut, jetDef)}
136
137
138def StandardJetRecoDataDeps(flags, **jetRecoDict):
139 """Jet clustering + calibration (via shallow copy)"""
140 if jetRecoDict["jetCalib"] == "nojcalib":
141 # If we don't calibrate, we need to return the clustered jets with filter
142 jetDefDict = StandardJetBuildDataDeps(
143 flags, **jetRecoDict
144 )
145 jetsNoCalib, jetDef = jetDefDict['build']
146 jetDef.lock()
147 jetsNoCalibFiltered = formatFilteredJetsName(jetsNoCalib, jetPtMinGeV=JET_DEFAULT_VIEW_PT_MIN_GEV)
148 # Inelegantly repeat the values because the requested calibration is null
149 jetDefDict.update({'nojcalib': (jetsNoCalibFiltered, jetDef), 'calib': (jetsNoCalibFiltered, jetDef)})
150 return jetDefDict
151 else:
152 # If we do calibrate, then the process is to copy+calibrate, and return those jets
153 jrdNoJCalib = cloneAndUpdateJetRecoDict(
154 jetRecoDict,
155 jetCalib="nojcalib"
156 )
157 jetDefDict = StandardJetBuildDataDeps(
158 flags, **jrdNoJCalib
159 )
160 jetsNoCalib, jetDefNoCalib = jetDefDict['build']
161 jetsViewNoCalib = formatFilteredJetsName(jetsNoCalib, jetPtMinGeV=JET_DEFAULT_VIEW_PT_MIN_GEV)
162
163 jetDef = jetDefNoCalib.clone()
164 jetDef.suffix = jetDefNoCalib.suffix.replace("nojcalib", jetRecoDict["jetCalib"])
165
166 if "sub" in jetRecoDict["jetCalib"]:
167 rhoKey = getEventShapeName(jetDef, nameprefix=getHLTPrefix())
168 else:
169 rhoKey = "auto"
170
171 # If we need JVT rerun the JVT modifier
172 use_FS_tracking = doFSTracking(jetRecoDict)
173 is_pflow = isPFlow(jetRecoDict)
174
175 jetDef.modifiers = getCalibMods(flags, jetRecoDict, rhoKey)
176 if use_FS_tracking:
177 jetDef.modifiers += ["JVT", "NNJVT_TrkAugV1"]
178
179 if jetRecoDict["recoAlg"] == "a4":
180 jetDef.modifiers += ["CaloQuality"]
181
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()]
185
186 jetDef = solveDependencies(jetDef,flags)
187 jetDef.lock()
188 jetsOut = formatFilteredJetsName(jetDef.fullname(),jetPtMinGeV=JET_DEFAULT_VIEW_PT_MIN_GEV)
189 jetDefDict.update({'nojcalib':(jetsViewNoCalib, jetDefNoCalib), 'calib':(jetsOut, jetDef)})
190 return jetDefDict
191
192def ReclusteredJetRecoDataDeps(flags, **jetRecoDict):
193 basicJetRecoDict = cloneAndUpdateJetRecoDict(
194 jetRecoDict,
195 # Standard size for reclustered inputs
196 recoAlg = "a4",
197 )
198
199 jetDefDict = StandardJetRecoDataDeps(
200 flags, **basicJetRecoDict
201 )
202 basicJetsName, basicJetDef = jetDefDict['calib']
203
204 rcJetPtMinGeV = 15 # 15 GeV minimum pt for jets to be reclustered
205 rcInputJetsName = formatFilteredJetsName(basicJetDef.fullname(), rcJetPtMinGeV)
206 rc_suffix = f"_{jetRecoDict['jetCalib']}" + (f"_{jetRecoDict['trkopt']}" if doTracking(jetRecoDict) else "")
207
208 rcJetDef = defineReclusteredJets(
209 jetRecoDict,
210 rcInputJetsName,
211 basicJetDef.inputdef.label,
212 getHLTPrefix(),
213 rc_suffix,
214 )
215
216 rcConstitPJKey = JetRecConfig.getPJContName(rcJetDef.inputdef, suffix=jetRecoDict['jetDefStr'])
217 rcJetDef._internalAtt["finalPJContainer"] = rcConstitPJKey
218 rcJetDef.lock()
219
220 rcJetsOut = rcJetDef.fullname()
221 jetDefDict['reclustered'] = (rcJetsOut, rcJetDef)
222 return jetDefDict
223
224
225def GroomedJetRecoDataDeps(flags, **jetRecoDict):
226 ungroomedJRD = cloneAndUpdateJetRecoDict(
227 jetRecoDict,
228 # Drop grooming spec
229 recoAlg=jetRecoDict["recoAlg"].rstrip("tsd"),
230 # No need to calibrate
231 jetCalib = "nojcalib",
232 )
233
234 jetDefDict = StandardJetBuildDataDeps(flags, **ungroomedJRD)
235 ungroomedJetsName, ungroomedDef = jetDefDict['build']
236
237 groomDef = defineGroomedJets(jetRecoDict, ungroomedDef)
238 groomedJetsName = groomDef.fullname()
239 groomDef.modifiers = getCalibMods(flags,jetRecoDict)
240 groomDef.modifiers += [
241 "Sort",
242 "Filter:{}".format(getFilterCut(jetRecoDict["recoAlg"])),
243 ]
244 groomDef = solveGroomingDependencies(groomDef, flags)
245 groomDef.lock()
246
247 return {'ungroomed':(ungroomedJetsName, ungroomedDef), 'groomed':(groomedJetsName, groomDef)}
248
249
250
253@AccumulatorCache
254def JetRecoCfg(flags, **jetDefDict):
255 """The top-level sequence
256
257 Forwards arguments to the standard jet reco, grooming or reclustering sequences.
258 """
259
260 if 'reclustered' in jetDefDict:
262 flags, **jetDefDict
263 )
264 elif 'groomed' in jetDefDict:
265 return GroomedJetRecoCfg(
266 flags, **jetDefDict
267 )
268 else:
269 return StandardJetRecoCfg(
270 flags, **jetDefDict
271 )
272
273
274# Get a configured JetViewAlg that creates a VIEW_ELEMENTS container of jets above a minimum jet pT
275# Filtered jets are given to hypo.
276# jetPtMinGeV is minimum jet pt in GeV for jets to be seen by hypo
277@AccumulatorCache
278def JetViewAlgCfg(flags,jetDef,jetPtMinGeV=JET_DEFAULT_VIEW_PT_MIN_GEV):
279
280 decorList = getDecorList(jetDef)
281 filteredJetsName = f"{jetDef.fullname()}_pt{int(jetPtMinGeV)}"
282 acc = ComponentAccumulator()
283 acc.addEventAlgo(
284 CompFactory.JetViewAlg(
285 "jetview_"+filteredJetsName,
286 InputContainer=jetDef.fullname(),
287 OutputContainer=filteredJetsName,
288 PtMin=jetPtMinGeV*1e3, #MeV
289 DecorDeps=decorList
290 )
291 )
292
293 return acc
294
295
296@AccumulatorCache
297def StandardJetBuildCfg(flags, jetDef):
298 """ Standard jet reconstruction, no reclustering or grooming
299
300 The clusters (and tracks, if necessary) should be built beforehand,
301 but this config will build the PFOs if they are needed.
302
303 The reconstruction is configured from the input JetDefinition
304 """
305
306 jetDefStr = jetDefToString(jetDef)
307 trackColls = jetDef._contextDic
308
309 seqname = "JetBuildSeq_"+jetDefStr
310 acc = ComponentAccumulator()
311 acc.addSequence(parOR(seqname),primary=True)
312
313 # Add PFlow reconstruction if necessary
314 if 'PFlow' in jetDef.inputdef.label:
315 from eflowRec.PFHLTConfig import PFCfg
316
317 clustersKey = jetDef.inputdef.prereqs[0].split(':')[1]
318 acc.merge(
319 PFCfg(
320 flags,
321 jetDef.context,
322 clustersin=clustersKey,
323 calclustersin="",
324 tracksin=trackColls["Tracks"],
325 verticesin=trackColls["Vertices"],
326 cellsin=fs_cells,
327 ),
328 seqname
329 )
330
331 alg = JetRecConfig.getConstitModAlg(
332 jetDef, jetDef.inputdef,
333 monTool=OnlineMon.getMonTool_Algorithm(flags, f"HLTJets/{jetDef.fullname()}/"),
334 )
335 # getConstitModAlg will return None if there's nothing for it to do
336 if alg is not None:
337 acc.addEventAlgo(alg,seqname)
338
339 pj_alg = JetRecConfig.getConstitPJGAlg(jetDef.inputdef)
340 acc.addEventAlgo(pj_alg,seqname)
341
342 jra_extra_outputs = []
343 if jetDef.context=='ftf':
344 pj_name = pj_alg.OutputContainer.Path
345 # Make sure that the jets are constructed with the ghost tracks included
346 merge_alg = CompFactory.PseudoJetMerger(
347 f"PJMerger_{pj_name}MergedWithGhostTracks",
348 InputPJContainers=[pj_name, trackColls["GhostTracks"]],
349 OutputContainer=f"{pj_name}MergedWithGhostTracks",
350 )
351 jra_extra_outputs.append(('xAOD::JetContainer',f"{jetDef.fullname()}.{trackColls['GhostTracksLabel']}"))
352 # update the pseudo jet name
353 acc.addEventAlgo(merge_alg,seqname)
354
355 acc.addEventAlgo(
356 JetRecConfig.getJetRecAlg(
357 jetDef,
358 JetOnlineMon.getMonTool_TrigJetAlgorithm(flags, f"HLTJets/{jetDef.fullname()}/"),
359 extraOutputs=jra_extra_outputs,
360 ),
361 seqname,
362 )
363
364 return acc
365
366
367def StandardJetRecoCfg(flags, **jetDefDict):
368 """ Full reconstruction for 'simple' (ungroomed, not reclustered) jets
369
370 First the uncalibrated jets are built, then (if necessary) the calibrated jets are provided
371 as a shallow copy.
372 """
373
374 jetsOut, jetDef = jetDefDict['calib']
375 jetDefStr = jetDefToString(jetDef)
376 seqname = "JetRecSeq_"+jetDefStr
377
378 # If we want the final jets to be uncalibrated, we can shortcut
379 if jetDef.suffix[1:] == "nojcalib":
380
381 reco_acc = ComponentAccumulator()
382 reco_acc.addSequence(parOR(seqname))
383
384 buildJets, buildJetDef = jetDefDict['build']
385 build_acc = StandardJetBuildCfg(
386 flags, buildJetDef
387 )
388 reco_acc.merge(build_acc, seqname)
389
390 # This view alg is added here rather than in StandardJetBuildCfg
391 # so that we are able to get the no-calib collection name later
392 jetViewAcc = JetViewAlgCfg(
393 flags,
394 jetDef,
395 jetPtMinGeV=JET_DEFAULT_VIEW_PT_MIN_GEV, # GeV converted internally
396 )
397 reco_acc.merge(jetViewAcc, seqname)
398 return reco_acc
399
400 # From here we run the full reconstruction including calibration
401 acc = ComponentAccumulator()
402 acc.addSequence(parOR(seqname))
403
404 buildJets, buildJetDef = jetDefDict['build']
405 build_acc = StandardJetBuildCfg(
406 flags, buildJetDef
407 )
408 acc.merge(build_acc,seqname)
409
410 jetsNoCalib, jetDefNoCalib = jetDefDict['nojcalib']
411 jetViewAcc = JetViewAlgCfg(
412 flags,
413 jetDefNoCalib,
414 jetPtMinGeV=JET_DEFAULT_VIEW_PT_MIN_GEV, # GeV converted internally
415 )
416 acc.merge(jetViewAcc, seqname)
417
418 # Figure out what jet calibration we are running
419 jetCalib = jetCalibFromJetDef(jetDef)
420
421 if "sub" in jetCalib:
422 # Add the event shape alg for area subtraction
423 # WARNING : offline jets use the parameter voronoiRf = 0.9 ! we might want to harmonize this.
424 eventShapeAlg = JetInputConfig.buildEventShapeAlg(jetDef, getHLTPrefix(),voronoiRf = 1.0 )
425 acc.addEventAlgo(eventShapeAlg,seqname)
426
427 decorList = getDecorList(jetDef)
428
429 # This algorithm creates the shallow copy and then also applies the calibration as part of the
430 # modifiers list
431 acc.addEventAlgo(
432 JetRecConfig.getJetCopyAlg(
433 jetsin=jetDefNoCalib.fullname(),
434 jetsoutdef=jetDef,
435 decorations=decorList,
437 f"HLTJets/{jetDef.fullname()}/"
438 ),
439 ),
440 seqname
441 )
442
443 # Check conditions before adding fast flavour tag info to jets
444 recoAlg, constitType, _ = jetDefStr.split('_',2)
445 jetCalibDef = getJetCalibDefaultString(recoAlg,f'{constitType}',jetDef.context)
446 if(
447 flags.Trigger.Jet.fastbtagPFlow
448 and jetDef.basename=="AntiKt4EMPFlow" # Tag only standard small-R PFlow jets
449 and jetCalib==jetCalibDef # exclude jets with not full default calibration
450 ):
451
452 ftagseqname = f"jetFtagSeq_{jetDef.context}"
453 acc.addSequence(parOR(ftagseqname),seqname)
454 # getjet context for our trkopt
455 trackingColls = jetDef._contextDic
456
457 # Adding Fast flavor tagging
458 acc.merge(
459 fastFlavourTaggingCfg(
460 flags,
461 jetDef.fullname(),
462 trackingColls["Vertices"],
463 trackingColls["Tracks"],
464 isPFlow=True,
465 ),
466 ftagseqname
467 )
468
469
470 # Filter the copied jet container so we only output jets with pt above jetPtMin
471 jetViewAcc = JetViewAlgCfg(
472 flags,
473 jetDef,
474 jetPtMinGeV=JET_DEFAULT_VIEW_PT_MIN_GEV, # GeV converted internally
475 )
476 acc.merge(jetViewAcc,seqname)
477
478 return acc
479
480
481def GroomedJetRecoCfg(flags, **jetDefDict):
482 """ Create the groomed jets
483
484 First the ungroomed jets are created (using the standard configuration), then the grooming
485 is applied
486 """
487 # Grooming needs the ungroomed jets to be built first,
488 # so call the basic jet reco seq, then add a grooming alg
489
490 ungroomedJetsName, ungroomedDef = jetDefDict['ungroomed']
491 groomedJets, groomDef = jetDefDict['groomed']
492 jetDefStr = jetDefToString(groomDef)
493
494 seqname = "JetGroomSeq_"+jetDefStr
495 acc = ComponentAccumulator()
496 acc.addSequence(parOR(seqname),primary=True)
497
498 build_acc = StandardJetBuildCfg(
499 flags,
500 ungroomedDef,
501 )
502 acc.merge(build_acc,seqname)
503
504 groom_extraoutputs = []
505 if '_ftf' in jetDefStr:
506 groom_extraoutputs.append(('xAOD::JetContainer',f'{groomedJets}.GhostTrack_ftf'))
507 acc.addEventAlgo( JetRecConfig.getJetRecGroomAlg(
508 groomDef,
509 monTool=JetOnlineMon.getMonTool_TrigJetAlgorithm(flags, f"HLTJets/{groomedJets}/"),
510 extraOutputs=groom_extraoutputs,
511 ),
512 seqname
513 )
514
515 recoAlg, constitType, _ = jetDefStr.split('_',2)
516 jetCalib = jetCalibFromJetDef(groomDef)
517 jetCalibDef = getJetCalibDefaultString(recoAlg,f'{constitType}',groomDef.context)
518 if(
519 groomDef.basename.startswith("AntiKt10EMPFlowCSSKSoftDrop") # Tag only groomed large-R PFlow jets
520 and jetCalib==jetCalibDef # exclude jets with not full default calibration
521 ):
522 trackingColls = groomDef._contextDic
523
524 ftagseqname = f"jetFtagSeq_{groomDef.context}_largeR"
525 acc.addSequence(parOR(ftagseqname), seqname)
526
527 acc.merge(
528 fastFlavourTaggingCfg(
529 flags,
530 groomDef.fullname(),
531 trackingColls['Vertices'],
532 trackingColls['Tracks'],
533 isPFlow=True,
534 doXbbtagLargeRJet = True,
535 ),
536 ftagseqname
537 )
538 return acc
539
540
541def ReclusteredJetRecoCfg(flags, **jetDefDict):
542 """ Create the reclustered jets
543
544 First the input jets are built, then the reclustering algorithm is run
545 """
546
547 basicJetsFiltered, basicJetDef = jetDefDict['calib']
548 rcJets, rcJetDef = jetDefDict['reclustered']
549 jetDefStr = jetDefToString(rcJetDef)
550
551 seqname = "JetReclusterSeq_"+jetDefStr
552 acc = ComponentAccumulator()
553 acc.addSequence(parOR(seqname),primary=True)
554
555 basic_acc = StandardJetRecoCfg(
556 flags, **jetDefDict
557 )
558 acc.merge(basic_acc,seqname)
559
560 rcJetPtMin = 15 # 15 GeV minimum pt for jets to be reclustered
561 jetViewAcc = JetViewAlgCfg(
562 flags,
563 basicJetDef,
564 jetPtMinGeV=rcJetPtMin, # GeV converted internally
565 )
566 acc.merge(jetViewAcc,seqname)
567
568 rcConstitPJAlg = JetRecConfig.getConstitPJGAlg(rcJetDef.inputdef, suffix=jetDefStr)
569 acc.addEventAlgo(rcConstitPJAlg,seqname)
570
571 acc.addEventAlgo(
572 JetRecConfig.getJetRecAlg(
573 rcJetDef,
575 f"HLTJets/{rcJetDef.fullname()}/"
576 )
577 ),
578 seqname
579 )
580
581 return acc
582
583
584@AccumulatorCache
585def FastFtaggedJetCopyAlgCfg(flags,jetDef):
586
587 acc = ComponentAccumulator()
588 jetsIn = jetDef.fullname()
589 # Don't need modifiers here, we won't rerun calibration
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
594
595# Returns reco sequence for RoI-based track reco + low-level flavour tagging
596@AccumulatorCache
597def JetRoITrackJetTagSequenceCfg(flags,jetsIn,trkopt,RoIs):
598
599 acc = ComponentAccumulator()
600
601 trkcfg, trkmap = JetRoITrackingCfg(flags, jetsIn, trkopt, RoIs)
602 acc.merge( trkcfg )
603
604 acc.merge(
605 fastFlavourTaggingCfg(
606 flags,
607 jetsIn,
608 trkmap['Vertices'],
609 trkmap['Tracks']
610 )
611 )
612
613 return acc
if(febId1==febId2)
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Definition hcg.cxx:177
getMonTool_TrigJetAlgorithm(flags, path)
getMonTool_Algorithm(flags, path)
Definition OnlineMon.py:3
Definition PFCfg.py:1
JetRoITrackJetTagSequenceCfg(flags, jetsIn, trkopt, RoIs)
JetRecoCfg(flags, **jetDefDict)
Configuration of the HLT jet reconstruction Takes as input the dictionaries of JetDefs from the data ...
JetRecoDataDeps(flags, **jetRecoDict)
Data dependency generation for the stages of jet reconstruction This is used to precompute the collec...
JetViewAlgCfg(flags, jetDef, jetPtMinGeV=JET_DEFAULT_VIEW_PT_MIN_GEV)