ATLAS Offline Software
Loading...
Searching...
No Matches
python.JetRecConfig Namespace Reference

Functions

 JetRecCfg (flags, jetdef, returnConfiguredDef=False)
 Top level functions returning ComponentAccumulator out of JetDefinition.
 JetInputCfg (flags, jetOrConstitdef, context="default")
 PseudoJetCfg (jetdef)
 getJetDefAlgs (flags, jetdef, returnConfiguredDef=False, monTool=None)
 Mid level functions returning list of algs out of JetDefinition.
 getJetGroomAlgs (flags, groomdef, returnConfiguredDef=False, monTool=None)
 getJetAlgs (flags, jetdef, returnConfiguredDef=False, monTool=None)
 getPseudoJetAlgs (jetdef)
 Mid level functions returning specific type of algs out of JetDefinition functions below assumines the JetDefinition has its dependencies solved by a call to solveDependencies().
 mergedPJId (pjList)
 getInputAlgs (jetOrConstitdef, flags, context="default", monTool=None)
 getPJContName (jetOrConstitdef, suffix=None, parent_jetdef=None)
 getConstitPJGAlg (constitdef, suffix=None, flags=None, parent_jetdef=None)
 getGhostPJGAlg (ghostdef, parentjetdef=None)
 getJetRecAlg (jetdef, monTool=None, ftf_suffix='', extraOutputs=None)
 getJetRecGroomAlg (groomdef, monTool=None, extraOutputs=None)
 getJetCopyAlg (jetsin, jetsoutdef, decorations=[], shallowcopy=True, shallowIO=True, monTool=None)
 getConstitModAlg (parentjetdef, constitSeq, monTool=None)
 getConstitModAlg_nojetdef (constitSeq, flags, context="default", monTool=None)
 getJetModifierTools (jetdef)
 getModifier (jetdef, moddef, modspec, flags=None)
 removeComponentFailingConditions (jetdef, flags=None, raiseOnFailure=True)
 removeGroomModifFailingConditions (groomdef, flags, raiseOnFailure=True)
 filterJetDefList (jetdef, inList, compType, raiseOnFailure, flags)
 isComponentPassingConditions (component, flags, jetdef)
 isAnalysisRelease ()
 reOrderAlgs (algs)
 registerAsInputConstit (jetdef)
 removeFromList (l, o)
 JetRecConfigTest (flags=None)

Variables

 jetlog = Logging.logging.getLogger('JetRecConfig')
list __all__ = ["JetRecCfg", "JetInputCfg"]
 _mergedPJContainers = dict()

Detailed Description

JetRecConfig: A helper module for configuring jet reconstruction     

The functions defined here turn JetDefinition object into ComponentAccumulator or list of algs fully configured
and ready to be inserted in the framework sequence.

Author: TJ Khoo, P-A Delsart                                                      

Function Documentation

◆ filterJetDefList()

filterJetDefList ( jetdef,
inList,
compType,
raiseOnFailure,
flags )

Definition at line 751 of file JetRecConfig.py.

751def filterJetDefList(jetdef, inList, compType, raiseOnFailure, flags):
752
753 nOut=0
754 outList=[]
755 basekey= compType+':' if compType!="" else ""
756
757 fullname = jetdef.fullname()
758
759 # loop over components in the list to be filtered
760 for comp in inList:
761 fullkey = basekey+comp
762 cInstance = jetdef._prereqDic[fullkey]
763 ok, reason = isComponentPassingConditions(cInstance, flags, jetdef)
764 if not ok :
765 if raiseOnFailure:
766 raise Exception("JetDefinition {} can NOT be scheduled. Failure of {} {} reason={}".format(
767 jetdef, compType, comp, reason) )
768
769 nOut+=1
770 jetlog.info(f"{fullname} : removing {compType} {comp} reason={reason}")
771 if fullkey in jetdef._prereqOrder:
772 jetdef._prereqOrder.remove(fullkey)
773 if compType=='ghost':
774 removeFromList(jetdef._prereqOrder, 'input:'+comp)
775 removeFromList(jetdef._prereqOrder, 'extinput:'+comp)
776 else:
777 outList.append(comp)
778
779 jetlog.info(" *** Number of {} filtered components = {} final list={}".format(compType, nOut, outList) )
780
781 return outList
782
783
784
785

◆ getConstitModAlg()

getConstitModAlg ( parentjetdef,
constitSeq,
monTool = None )
returns a configured JetConstituentModSequence or None if constit.modifiers == [] 

The JetConstituentModSequence is determined by the JetInputConstitSeq constitSeq . 
However, details of the configuration of the JetConstituentModSequence may depends on which JetDefinition
this JetConstituentModSequence is intended for. Thus the function also requires a parentjetdef JetDefinition input

IMPORTANT : parentjetdef & constitSeq must have their dependencies solved (i.e. they must result from solveDependencies() )

See also getConstitModAlg_nojetdef

Definition at line 544 of file JetRecConfig.py.

544def getConstitModAlg(parentjetdef, constitSeq, monTool=None):
545 """returns a configured JetConstituentModSequence or None if constit.modifiers == []
546
547 The JetConstituentModSequence is determined by the JetInputConstitSeq constitSeq .
548 However, details of the configuration of the JetConstituentModSequence may depends on which JetDefinition
549 this JetConstituentModSequence is intended for. Thus the function also requires a parentjetdef JetDefinition input
550
551 IMPORTANT : parentjetdef & constitSeq must have their dependencies solved (i.e. they must result from solveDependencies() )
552
553 See also getConstitModAlg_nojetdef
554 """
555
556 # JetInputConstit do not need any JetConstituentModSequence
557 # (they are only needed to trigger the building of the source container and a PJ algo)
558 if not isinstance(constitSeq, JetInputConstitSeq): return
559
560
561 inputtype = constitSeq.basetype
562
563 sequence = constitSeq.modifiers
564
565 modlist = []
566
567 #if modlist == []: return
568 if constitSeq.inputname == constitSeq.containername: return
569
570 for step in sequence:
571 modInstance = parentjetdef._prereqDic[ f'cmod:{step}' ]
572 if not modInstance.tooltype: continue
573
574 toolclass = getattr( CompFactory, modInstance.tooltype)
575
576 # update the properties : if some of them are function, just replace by calling this func :
577 for k,v in modInstance.properties.items():
578 if callable(v) :
579 modInstance.properties[k ] = v(parentjetdef, constitSeq )
580
581 tool = toolclass(modInstance.name,**modInstance.properties)
582
583 if (inputtype == xAODType.FlowElement or inputtype == xAODType.ParticleFlow) and modInstance.tooltype not in ["CorrectPFOTool","ChargedHadronSubtractionTool"]:
584 tool.IgnoreChargedPFO=True
585 tool.ApplyToChargedPFO=False
586 tool.InputType = inputtype
587 modlist.append(tool)
588
589 sequenceshort = "".join(sequence)
590 seqname = "ConstitMod{0}_{1}".format(sequenceshort,constitSeq.name)
591 inputcontainer = str(constitSeq.inputname)
592 outputcontainer = str(constitSeq.containername)
593
594 if (inputtype == xAODType.FlowElement or inputtype == xAODType.ParticleFlow):
595 # Tweak PF names because ConstModSequence needs to work with
596 # up to 4 containers
597 def chopPFO(thestring):
598 pfostr = "ParticleFlowObjects"
599 if thestring.endswith(pfostr):
600 return thestring[:-len(pfostr)]
601 return thestring
602 inputcontainer = chopPFO(inputcontainer)
603 outputcontainer = chopPFO(outputcontainer)
604
605 doByVertex = constitSeq.byVertex
606
607 inChargedFEDecorKeys = []
608 inNeutralFEDecorKeys = []
609
610 if doByVertex:
611 # For by-vertex jet reconstruction, we are performing deep copies of neutral PFOs
612 # Need to schedule this algorithm after all decorations have been apllied by using ReadDecorHandleKeys
613
614 # https://gitlab.cern.ch/atlas/athena/-/blob/main/Reconstruction/PFlow/PFlowUtils/src/PFlowCellCPDataDecoratorAlgorithm.h
615
616 # https://gitlab.cern.ch/atlas/athena/-/blob/main/Reconstruction/PFlow/PFlowUtils/src/PFlowCalibPFODecoratorAlgorithm.h
617
618 # https://gitlab.cern.ch/atlas/athena/-/blob/main/Reconstruction/eflowRec/eflowRec/PFEGamFlowElementAssoc.h
619
620 # https://gitlab.cern.ch/atlas/athena/-/blob/main/Reconstruction/eflowRec/eflowRec/PFMuonFlowElementAssoc.h
621
622 inChargedFEDecorKeys += ["cellCPData", "FE_ElectronLinks", "FE_PhotonLinks", "FE_MuonLinks"]
623 inNeutralFEDecorKeys += ["calpfo_NLeadingTruthParticleBarcodeEnergyPairs", "FE_ElectronLinks", "FE_PhotonLinks", "FE_MuonLinks"]
624
625 modseq = CompFactory.JetConstituentModSequence(seqname,
626 InputType=inputtype,
627 OutputContainer = outputcontainer,
628 InputContainer= inputcontainer,
629 InChargedFEDecorKeys = inChargedFEDecorKeys,
630 InNeutralFEDecorKeys = inNeutralFEDecorKeys,
631 Modifiers = modlist,
632 DoByVertex = doByVertex
633 )
634 if monTool:
635 modseq.MonTool = monTool
636
637 constitmodalg = CompFactory.JetAlgorithm("jetalg_{0}".format(modseq.getName()))
638 constitmodalg.Tools = [modseq]
639
640 return constitmodalg
641

◆ getConstitModAlg_nojetdef()

getConstitModAlg_nojetdef ( constitSeq,
flags,
context = "default",
monTool = None )
Same as getConstitModAlg. 
This is a convenient function to obtain a JetConstituentModSequence when it is certain, no JetDef is needed.
This function just builds a dummy JetDefinition then calls getConstitModAlg
Needed in the trigger config.

Definition at line 642 of file JetRecConfig.py.

642def getConstitModAlg_nojetdef( constitSeq, flags,context="default", monTool=None):
643 """Same as getConstitModAlg.
644 This is a convenient function to obtain a JetConstituentModSequence when it is certain, no JetDef is needed.
645 This function just builds a dummy JetDefinition then calls getConstitModAlg
646 Needed in the trigger config.
647 """
648 jetdef = solveDependencies( JetDefinition('Kt', 0., constitSeq, context=context) , flags)
649 constitSeq = jetdef._prereqDic['input:'+constitSeq.name] # retrieve the fully configured version of constitSeq
650 return getConstitModAlg(jetdef, constitSeq, monTool=monTool)
651
652

◆ getConstitPJGAlg()

getConstitPJGAlg ( constitdef,
suffix = None,
flags = None,
parent_jetdef = None )
returns a configured PseudoJetAlgorithm which converts the inputs defined by constitdef into fastjet::PseudoJet

IMPORTANT : constitdef must have its dependencies solved (i.e. it must result from a solveDependencies() call)

the flags argument is TEMPORARY and will be removed once further dev on PseudoJetAlgorithm is done (see comment below)

Definition at line 350 of file JetRecConfig.py.

350def getConstitPJGAlg(constitdef, suffix=None, flags=None, parent_jetdef = None):
351 """returns a configured PseudoJetAlgorithm which converts the inputs defined by constitdef into fastjet::PseudoJet
352
353 IMPORTANT : constitdef must have its dependencies solved (i.e. it must result from a solveDependencies() call)
354
355 the flags argument is TEMPORARY and will be removed once further dev on PseudoJetAlgorithm is done (see comment below)
356 """
357 _str_containername = constitdef.containername(parent_jetdef).split(':')[-1] if callable(constitdef.containername) else constitdef.containername
358 jetlog.debug("Getting PseudoJetAlg for label {0} from {1}".format(constitdef.name,constitdef.inputname))
359 end = '' if suffix is None else f'_{suffix}'
360 full_label = constitdef.label + end
361 pjgalg = CompFactory.PseudoJetAlgorithm(
362 "pjgalg_"+_str_containername+end,
363 InputContainer = _str_containername,
364 OutputContainer =getPJContName(constitdef, suffix = suffix, parent_jetdef = parent_jetdef),
365 Label = full_label,
366 SkipNegativeEnergy=True,
367 DoByVertex=constitdef.byVertex
368 )
369
370 # This is a terrible temporary hack to enable running in cosmic runs.
371 # There should not be any Properties setting here in a helper function.
372 # This will have to be fixed when all the filtering occuring in PseudoJetAlgorithm
373 # is removed and done as part of a JetConstituentModSequence.
374 if flags is not None:
375 from AthenaConfiguration.Enums import BeamType
376 pjgalg.UseChargedPV = (flags.Beam.Type == BeamType.Collisions)
377
378 if suffix == 'PUSB':
379 pjgalg.UseChargedPV=False
380 pjgalg.UseChargedPUsideband=True
381 elif suffix == 'Neut':
382 pjgalg.UseCharged=False
383 # end of HAck
384
385 return pjgalg
386
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Definition hcg.cxx:179

◆ getGhostPJGAlg()

getGhostPJGAlg ( ghostdef,
parentjetdef = None )
returns a configured PseudoJetAlgorithm which converts the inputs defined by constitdef into fastjet::PseudoJet

The difference for the above is this is dedicated to ghosts which need variations for the Label and the muon segment cases.  

IMPORTANT : ghostdef must have its dependencies solved (i.e. it must result from a solveDependencies() call)

Definition at line 387 of file JetRecConfig.py.

387def getGhostPJGAlg(ghostdef, parentjetdef = None):
388 """returns a configured PseudoJetAlgorithm which converts the inputs defined by constitdef into fastjet::PseudoJet
389
390 The difference for the above is this is dedicated to ghosts which need variations for the Label and the muon segment cases.
391
392 IMPORTANT : ghostdef must have its dependencies solved (i.e. it must result from a solveDependencies() call)
393 """
394 label = "Ghost"+ghostdef.label # IMPORTANT !! "Ghost" in the label will be interpreted by the C++ side !
395 _container_name = ghostdef.containername(parentjetdef).split(":")[1] if callable(ghostdef.containername) else ghostdef.containername
396 _output_cont_name_suffix = "" if parentjetdef.context == "default" or _container_name.endswith(parentjetdef.context) else ("_" + parentjetdef.context)
397
398 kwargs = dict(
399 InputContainer = _container_name,
400 OutputContainer= "PseudoJetGhost"+_container_name + _output_cont_name_suffix,
401 Label= label,
402 SkipNegativeEnergy= True,
403 )
404
405 pjaclass = CompFactory.PseudoJetAlgorithm
406 if ghostdef.basetype=="MuonSegment" or ghostdef.basetype=="UnAssocMuonSegment":
407 # Muon segments have a specialised type
408 pjaclass = CompFactory.MuonSegmentPseudoJetAlgorithm
409 kwargs.update( Pt =1e-20 ) # ??,)
410 kwargs.pop('SkipNegativeEnergy')
411
412 pjgalg = pjaclass( "pjgalg_" + label + "_" + parentjetdef.context, **kwargs )
413 return pjgalg
414
415

◆ getInputAlgs()

getInputAlgs ( jetOrConstitdef,
flags,
context = "default",
monTool = None )
Returns the list of configured algs needed to build inputs to jet finding as defined by jetOrConstitdef

jetOrConstitdef can either be 
 * a JetDefinition : this happens when called from JetRecCfg or getJetDefAlgs then the jetdef._prereqDic/Order are used.
 * a JetInputConstit : to allow scheduling the corresponding constituents algs independently of any jet alg. 

context is only used if jetOrConstitdef is not a JetDefinition and must refer to a context in StandardJetContext.

The returned list may contain several algs, including constituent modifications algs, track selection, copying of
input truth particles and event density calculations
It may also contain ComponentAccumulator, only (?) in reco from RDO/RAW when we need to build externals such as clusters or tracks : in this case we call the main config functions from external packages)

Definition at line 279 of file JetRecConfig.py.

279def getInputAlgs(jetOrConstitdef, flags, context="default", monTool=None):
280 """Returns the list of configured algs needed to build inputs to jet finding as defined by jetOrConstitdef
281
282 jetOrConstitdef can either be
283 * a JetDefinition : this happens when called from JetRecCfg or getJetDefAlgs then the jetdef._prereqDic/Order are used.
284 * a JetInputConstit : to allow scheduling the corresponding constituents algs independently of any jet alg.
285
286 context is only used if jetOrConstitdef is not a JetDefinition and must refer to a context in StandardJetContext.
287
288 The returned list may contain several algs, including constituent modifications algs, track selection, copying of
289 input truth particles and event density calculations
290 It may also contain ComponentAccumulator, only (?) in reco from RDO/RAW when we need to build externals such as clusters or tracks : in this case we call the main config functions from external packages)
291
292 """
293
294 from .JetDefinition import JetInputConstit, JetDefinition
295 if isinstance(jetOrConstitdef, JetInputConstit):
296 # technically we need a JetDefinition, so just build an empty one only containing our JetInputConstit
297 jetlog.info("Setting up jet inputs from JetInputConstit : "+jetOrConstitdef.name)
298 jetdef = solveDependencies( JetDefinition('Kt', 0., jetOrConstitdef, context=context), flags )
299 canrun = removeComponentFailingConditions(jetdef, raiseOnFailure = flags.Jet.strictMode)
300 if not canrun:
301 return []
302 else:
303 jetdef = jetOrConstitdef
304
305 jetlog.info("Inspecting input file contents")
306
307 # We won't prepare an alg if the input already exists in the in input file
308 try:
309 filecontents = jetdef._cflags.Input.Collections
310 except Exception:
311 filecontents = []
312 # local function to check if the container of the JetInputXXXX 'c' is already in filecontents :
313 def isInInput( c ):
314 cname = c.containername if isinstance(c, JetInputConstit) else c.containername(jetdef,c.specs)
315 return cname in filecontents
316
317 # Loop over all inputs required by jetdefs and get the corresponding algs
318 inputdeps = [ inputkey for inputkey in jetdef._prereqOrder if inputkey.startswith('input:') or inputkey.startswith('extinput:') ]
319 algs = []
320 for inputfull in inputdeps:
321 inputInstance = jetdef._prereqDic[inputfull]
322 if isInInput( inputInstance ):
323 jetlog.info(f"Input container for {inputInstance} already in input file.")
324 continue
325
326 # Get the input or external alg
327 if isinstance(inputInstance, JetInputConstit):
328 alg = getConstitModAlg(jetdef, inputInstance, monTool=monTool)
329 else: # it must be a JetInputExternal
330 alg = inputInstance.algoBuilder( jetdef, inputInstance.specs )
331
332 if alg is not None:
333 algs.append(alg)
334
335 return algs
336
337

◆ getJetAlgs()

getJetAlgs ( flags,
jetdef,
returnConfiguredDef = False,
monTool = None )

Definition at line 216 of file JetRecConfig.py.

216def getJetAlgs(flags, jetdef, returnConfiguredDef=False, monTool=None):
217 # Useful helper function For Run-II config style
218 if isinstance(jetdef, JetDefinition):
219 func = getJetDefAlgs
220 elif isinstance(jetdef, GroomingDefinition):
221 func = getJetGroomAlgs
222
223 return func(flags, jetdef, returnConfiguredDef, monTool)
224
225

◆ getJetCopyAlg()

getJetCopyAlg ( jetsin,
jetsoutdef,
decorations = [],
shallowcopy = True,
shallowIO = True,
monTool = None )
Get a JetRecAlg set up to copy a jet collection and apply mods
In this setup we do not resolve dependencies because typically
these may be set up already in the original jet collection
In future we may wish to add a toggle.

The decoration list can be set in order for the decorations
(jet moments) on the original jets to be propagated to the
copy collection. Beware of circular dependencies!

Definition at line 506 of file JetRecConfig.py.

506def getJetCopyAlg(jetsin, jetsoutdef, decorations=[], shallowcopy=True, shallowIO=True, monTool=None):
507 """
508 Get a JetRecAlg set up to copy a jet collection and apply mods
509 In this setup we do not resolve dependencies because typically
510 these may be set up already in the original jet collection
511 In future we may wish to add a toggle.
512
513 The decoration list can be set in order for the decorations
514 (jet moments) on the original jets to be propagated to the
515 copy collection. Beware of circular dependencies!
516 """
517 jcopy = CompFactory.JetCopier(
518 "copier",
519 InputJets = jetsin,
520 DecorDeps=decorations,
521 ShallowCopy=shallowcopy,
522 ShallowIO=shallowIO)
523
524 # Convert mod aliases into concrete tools
525 mods = []
526 for mod in jetsoutdef.modifiers:
527 moddef = aliasToModDef(mod,jetsoutdef)
528 mods.append(getModifier(jetsoutdef,moddef,moddef.modspec))
529
530 jetsoutname = jetsoutdef.fullname()
531 jra = CompFactory.JetRecAlg(
532 "jetrecalg_copy_"+jetsoutname,
533 Provider = jcopy,
534 Modifiers = mods,
535 OutputContainer = jetsoutname)
536 if not isAnalysisRelease():
537 jra.MonTool = monTool
538
539
540 return jra
541
542
543

◆ getJetDefAlgs()

getJetDefAlgs ( flags,
jetdef,
returnConfiguredDef = False,
monTool = None )

Mid level functions returning list of algs out of JetDefinition.

 Create the algorithms necessary to build the jet collection defined by jetdef.

This internally finds all the dependencies declared into jetdef (through input, ghosts & modifiers) 
and returns a list of all necessary algs.

if returnConfiguredDef==True, also returns the fully configured clone of jetdef containing solved dependencies (debugging)

monTool is to allow the trigger config to pass a monitoring tool.

returns a list containing either algs or ComponentAccumulator 
  (ComponentAccumulator occurs only (?) in reco from RDO/RAW when we need to build externals such as clusters or tracks : in this case we call the main config functions from external packages)

Definition at line 122 of file JetRecConfig.py.

122def getJetDefAlgs(flags, jetdef , returnConfiguredDef=False, monTool=None):
123 """ Create the algorithms necessary to build the jet collection defined by jetdef.
124
125 This internally finds all the dependencies declared into jetdef (through input, ghosts & modifiers)
126 and returns a list of all necessary algs.
127
128 if returnConfiguredDef==True, also returns the fully configured clone of jetdef containing solved dependencies (debugging)
129
130 monTool is to allow the trigger config to pass a monitoring tool.
131
132 returns a list containing either algs or ComponentAccumulator
133 (ComponentAccumulator occurs only (?) in reco from RDO/RAW when we need to build externals such as clusters or tracks : in this case we call the main config functions from external packages)
134 """
135
136 # Scan the dependencies of this jetdef, also converting all aliases it contains
137 # into config objects and returning a fully configured copy.
138
139 jetdef_i = solveDependencies(jetdef, flags=flags)
140
141
142 # check if the conditions are compatible with the inputs & modifiers of this jetdef_i.
143 # if in reco job we will remove whatever is incompatible and still try to run
144 # if not, we raise an exception
145 canrun = removeComponentFailingConditions(jetdef_i, raiseOnFailure= flags.Jet.strictMode)
146 if not canrun :
147 if returnConfiguredDef:
148 return [], jetdef_i
149 return []
150
151 algs = []
152
153 # With jetdef_i, we can now instantiate the proper c++ tools and algs.
154
155 # algs needed to build the various inputs (constituents, track selection, event density, ...)
156 algs += getInputAlgs(jetdef_i, flags , monTool=monTool)
157
158 # algs to create fastjet::PseudoJet objects out of the inputs
159 algs += getPseudoJetAlgs(jetdef_i)
160
161 # Generate a JetRecAlg to run the jet finding and modifiers
162 algs += [getJetRecAlg(jetdef_i, monTool=monTool)]
163
164 jetlog.info("Scheduled JetAlgorithm instance \"jetalg_{0}\"".format(jetdef_i.fullname()))
165
166 if returnConfiguredDef:
167 return algs, jetdef_i
168 return algs
169

◆ getJetGroomAlgs()

getJetGroomAlgs ( flags,
groomdef,
returnConfiguredDef = False,
monTool = None )
Instantiate and schedule all the algorithms needed to run the grooming alg 'groomdef' and
add them in the ComponentAccumulator 'components'

This function is meant to be called from the top-level JetRecConfig.JetRecCfg
(groomdef is expected to be non locked and will be modified).

monTool is to allow the trigger config to pass a monitoring tool.

Definition at line 170 of file JetRecConfig.py.

170def getJetGroomAlgs(flags, groomdef, returnConfiguredDef=False, monTool=None):
171 """Instantiate and schedule all the algorithms needed to run the grooming alg 'groomdef' and
172 add them in the ComponentAccumulator 'components'
173
174 This function is meant to be called from the top-level JetRecConfig.JetRecCfg
175 (groomdef is expected to be non locked and will be modified).
176
177 monTool is to allow the trigger config to pass a monitoring tool.
178 """
179
180 # Find dependencies from modifier aliases and get a fully configured groomdef
181 # ( This also detects input dependencies, see below)
182 groomdef_i = solveGroomingDependencies(groomdef, flags)
183
184 # Transfer the input & ghost dependencies onto the parent jet alg,
185 # so they are handled when instatiating the parent jet algs
186 for prereq in groomdef_i._prereqOrder:
187 #Protection for some modifiers that have three 'arguments'
188 if len(prereq.split(':')) > 2:
189 continue
190 reqType, reqKey = prereq.split(':')
191 if reqType=='ghost':
192 groomdef_i.ungroomeddef.ghostdefs.append(reqKey)
193 elif reqType.endswith('input') : # can be extinput or input
194 groomdef_i.ungroomeddef.extrainputs.append(reqKey)
195
196 jetlog.info("Scheduling parent alg {} for {} ".format(groomdef.ungroomeddef.fullname(), groomdef.fullname()))
197
198 # Retrieve algs needed to build the parent (ungroomed) jets
199 # (we always want it even if the parent jets are already in the input file because
200 # we need to rebuild the pseudoJet)
201 algs, ungroomeddef_i = getJetDefAlgs(flags, groomdef_i.ungroomeddef , True)
202 groomdef_i._ungroomeddef = ungroomeddef_i # set directly the internal members to avoid complication. This is fine, since we've been cloning definitions.
203
204 #Filter the modifiers based on the flags
205 removeGroomModifFailingConditions(groomdef_i, flags, raiseOnFailure = flags.Jet.strictMode)
206
207 algs += [ getJetRecGroomAlg(groomdef_i, monTool=monTool) ]
208
209
210 jetlog.info("Scheduled JetAlgorithm instance \"jetalg_{0}\"".format(groomdef_i.fullname()))
211
212 if returnConfiguredDef: return algs, groomdef_i
213 return algs
214
215

◆ getJetModifierTools()

getJetModifierTools ( jetdef)
returns the list of configured JetModifier tools needed by this jetdef.
This is done by instantiating the actual C++ tool as ordered in jetdef._prereqOrder

Definition at line 653 of file JetRecConfig.py.

653def getJetModifierTools( jetdef ):
654 """returns the list of configured JetModifier tools needed by this jetdef.
655 This is done by instantiating the actual C++ tool as ordered in jetdef._prereqOrder
656 """
657 modlist = [ key for key in jetdef._prereqOrder if key.startswith('mod:')]
658
659 mods = []
660 for modkey in modlist:
661 moddef = jetdef._prereqDic[modkey]
662 modkey = modkey[4:] # remove 'mod:'
663 modspec = '' if ':' not in modkey else modkey.split(':',1)[1]
664 mod = getModifier(jetdef,moddef,modspec)
665 mods.append(mod)
666
667 return mods
668
669

◆ getJetRecAlg()

getJetRecAlg ( jetdef,
monTool = None,
ftf_suffix = '',
extraOutputs = None )
Returns the configured JetRecAlg instance corresponding to jetdef

IMPORTANT : jetdef must have its dependencies solved (i.e. it must result from solveDependencies() )

Definition at line 416 of file JetRecConfig.py.

416def getJetRecAlg( jetdef, monTool = None, ftf_suffix = '', extraOutputs = None):
417 """Returns the configured JetRecAlg instance corresponding to jetdef
418
419 IMPORTANT : jetdef must have its dependencies solved (i.e. it must result from solveDependencies() )
420 """
421 pjContNames = jetdef._internalAtt['finalPJContainer']
422
423 kwargs = {
424 "JetAlgorithm": jetdef.algorithm,
425 "JetRadius": jetdef.radius,
426 "PtMin": jetdef.ptmin,
427 "InputPseudoJets": pjContNames,
428 "GhostArea": jetdef.ghostarea,
429 "JetInputType": int(jetdef.inputdef.jetinputtype),
430 "RandomOption": 1,
431 "VariableRMinRadius": jetdef.VRMinRadius,
432 "VariableRMassScale": jetdef.VRMassScale
433 }
434
435 jetname = jetdef.fullname()
436 if jetdef.byVertex:
437 jclust = CompFactory.JetClustererByVertex(
438 "builder",
439 **kwargs
440 )
441 else:
442 jclust = CompFactory.JetClusterer(
443 "builder",
444 **kwargs
445 )
446
447 mods = getJetModifierTools(jetdef)
448
449 jra = CompFactory.JetRecAlg(
450 "jetrecalg_"+jetname+ftf_suffix,
451 Provider = jclust,
452 Modifiers = mods,
453 OutputContainer = jetname+ftf_suffix,
454 )
455 if monTool:
456 # this option can't be set in AnalysisBase -> set only if explicitly asked :
457 jra.MonTool = monTool
458
459 # Explicitly register (ghost)associated branches for downstream dependency resolution
460 _extraOutputs = extraOutputs if extraOutputs is not None else []
461 jra.ExtraOutputs = _extraOutputs + [
462 ('xAOD::JetContainer',f'{jetname}.Ghost{ghost}') for ghost in jetdef.ghostdefs
463 ]
464 return jra
465
466

◆ getJetRecGroomAlg()

getJetRecGroomAlg ( groomdef,
monTool = None,
extraOutputs = None )
Returns a configured JetRecAlg set-up to perform the grooming defined by 'groomdef' 
('monTool' is a temporary placeholder, it is expected to be used in the trigger in the future) 

Definition at line 467 of file JetRecConfig.py.

467def getJetRecGroomAlg(groomdef,monTool=None,extraOutputs=None):
468 """Returns a configured JetRecAlg set-up to perform the grooming defined by 'groomdef'
469 ('monTool' is a temporary placeholder, it is expected to be used in the trigger in the future)
470 """
471 jetlog.debug("Configuring grooming alg \"jetalg_{0}\"".format(groomdef.fullname()))
472
473
474 # the grooming tool (a IJetProvider instance)
475 groomClass = CompFactory.getComp(groomdef.tooltype)
476 groomer = groomClass(groomdef.groomalg,
477 UngroomedJets = groomdef.ungroomeddef.fullname(),
478 ParentPseudoJets = groomdef.ungroomeddef._internalAtt['finalPJContainer'],
479 **groomdef.properties)
480
481 # get JetModifier list
482 mods = getJetModifierTools(groomdef)
483
484 # put everything together in a JetRecAlg
485 jetname = groomdef.fullname()
486 jra = CompFactory.JetRecAlg(
487 "jetrecalg_"+jetname,
488 Provider = groomer,
489 Modifiers = mods,
490 ParentDecor = "Parent",
491 OutputContainer = jetname)
492
493 if not isAnalysisRelease():
494 jra.MonTool = monTool
495
496 # Explicitly register (ghost)associated branches for downstream dependency resolution
497 _extraOutputs = extraOutputs if extraOutputs is not None else []
498 jra.ExtraOutputs = _extraOutputs + [
499 ('xAOD::JetContainer',f'{jetname}.Ghost{ghost}') for ghost in groomdef.ungroomeddef.ghostdefs
500 ]
501
502 return jra
503
504

◆ getModifier()

getModifier ( jetdef,
moddef,
modspec,
flags = None )
Translate JetModifier into a concrete tool

Definition at line 670 of file JetRecConfig.py.

670def getModifier(jetdef, moddef, modspec, flags=None):
671 """Translate JetModifier into a concrete tool"""
672 jetlog.verbose("Retrieving modifier {0}".format(str(moddef)))
673
674 if flags is not None:
675 # then we are called from non JetRecConfig functions: we must update the context according to flags
676 jetdef = jetdef.clone()
677 jetdef._cflags = flags
678 jetdef._contextDic = flags.Jet.Context[jetdef.context]
679
680 # Get the modifier tool
681 try:
682 modtool = moddef.createfn(jetdef, modspec)
683 except Exception as e:
684 jetlog.error( f"Unhandled modifier specification {modspec} for mod {moddef} acting on jet def {jetdef.basename}!")
685 jetlog.error( f"Received exception \"{e}\"" )
686 jetlog.error( f"Helper function is \"{moddef.createfn}\"" )
687 raise ValueError( f"JetModConfig unable to handle mod {moddef} with spec \"{modspec}\"")
688
689
690 # now we overwrite the default properties of the tool, by those
691 # set in the moddef :
692 for k,v in moddef.properties.items():
693 if callable(v) :
694 # The value we got is a function : we call it to get the actual value we want to set on the tool
695 v = v(jetdef, modspec)
696 setattr(modtool, k, v)
697
698 return modtool
699
700
701
702

◆ getPJContName()

getPJContName ( jetOrConstitdef,
suffix = None,
parent_jetdef = None )
Construct the name of the PseudoJetContainer defined by the given JetDef or JetInputConstit.
This name has to be constructed from various places, so we factorize the definition here.

Definition at line 341 of file JetRecConfig.py.

341def getPJContName( jetOrConstitdef, suffix=None, parent_jetdef = None):
342 """Construct the name of the PseudoJetContainer defined by the given JetDef or JetInputConstit.
343 This name has to be constructed from various places, so we factorize the definition here.
344 """
345 cdef = jetOrConstitdef if isinstance(jetOrConstitdef, JetInputConstit) else jetOrConstitdef.inputdef
346 _str_containername = cdef.containername(parent_jetdef).split(':')[-1] if callable(cdef.containername) else cdef.containername
347 end = '' if suffix is None else f'_{suffix}'
348 return f'PseudoJet{_str_containername}{end}'
349

◆ getPseudoJetAlgs()

getPseudoJetAlgs ( jetdef)

Mid level functions returning specific type of algs out of JetDefinition functions below assumines the JetDefinition has its dependencies solved by a call to solveDependencies().

 Builds the list of configured PseudoJetAlgorithm needed for this jetdef.
THIS updates jetdef._internalAtt['finalPJContainer'] 
(this function is factorized out of PseudoJetCfg so it can be used standalone in the trigger config)

Definition at line 233 of file JetRecConfig.py.

233def getPseudoJetAlgs(jetdef):
234 """ Builds the list of configured PseudoJetAlgorithm needed for this jetdef.
235 THIS updates jetdef._internalAtt['finalPJContainer']
236 (this function is factorized out of PseudoJetCfg so it can be used standalone in the trigger config)
237 """
238
239 constitpjalg = getConstitPJGAlg(jetdef.inputdef , suffix=None , flags=jetdef._cflags, parent_jetdef = jetdef)
240
241 finalPJContainer = str(constitpjalg.OutputContainer)
242 pjalglist = [constitpjalg]
243
244 # Schedule the ghost PseudoJetAlgs
245 ghostlist = [ key for key in jetdef._prereqOrder if key.startswith('ghost:')]
246 if ghostlist != []:
247 # then we need to schedule a PseudoJetAlg for each ghost collections...
248 pjContNames = [finalPJContainer]
249 for ghostkey in sorted(ghostlist):
250 ghostdef = jetdef._prereqDic[ghostkey]
251 ghostpjalg = getGhostPJGAlg( ghostdef, jetdef )
252 pjalglist.append(ghostpjalg)
253 pjContNames.append( str(ghostpjalg.OutputContainer) ) #
254
255 # .. and merge them together with the input constituents
256 mergeId = mergedPJId( pjContNames )
257 finalPJContainer = str(finalPJContainer)+"_merged"+mergeId
258 mergerName = "PJMerger_id"+mergeId
259 mergeAlg =CompFactory.PseudoJetMerger(
260 mergerName,
261 InputPJContainers = pjContNames,
262 OutputContainer = finalPJContainer,
263 )
264 pjalglist.append(mergeAlg)
265
266 # set the name of the complete,merged input PseudoJets, so it can be re-used downstream
267 jetdef._internalAtt['finalPJContainer'] = finalPJContainer
268 return pjalglist
269
270

◆ isAnalysisRelease()

isAnalysisRelease ( )

Definition at line 803 of file JetRecConfig.py.

803def isAnalysisRelease():
804 from AthenaConfiguration.Enums import Project
805 return Project.determine() in( Project.AnalysisBase, Project.AthAnalysis)
806
807

◆ isComponentPassingConditions()

isComponentPassingConditions ( component,
flags,
jetdef )
Test if component is compatible with flags.
This is done by calling component.filterfn AND testing all its prereqs.

Definition at line 786 of file JetRecConfig.py.

786def isComponentPassingConditions(component, flags, jetdef):
787 """Test if component is compatible with flags.
788 This is done by calling component.filterfn AND testing all its prereqs.
789 """
790 for req in component.prereqs:
791 _str_req = req(jetdef) if callable(req) else req
792 if _str_req not in jetdef._prereqDic:
793 return False, "prereq "+_str_req+" not available"
794 reqInstance = jetdef._prereqDic[_str_req]
795 ok, reason = isComponentPassingConditions(reqInstance, flags, jetdef)
796 if not ok :
797 return False, "prereq "+str(reqInstance)+" failed because : "+reason
798
799 ok, reason = component.filterfn(flags)
800 return ok, reason
801
802

◆ JetInputCfg()

JetInputCfg ( flags,
jetOrConstitdef,
context = "default" )
Returns a ComponentAccumulator containing algs needed to build inputs to jet finding as defined by jetOrConstitdef

jetOrConstitdef can either be 
 * a JetDefinition : this happens when called from JetRecCfg, then the jetdef._prereqDic/Order are used.
 * a JetInputConstit : to allow scheduling the corresponding constituents algs independently of any jet alg. 

context is only used if jetOrConstitdef is not a JetDefinition and must refer to a context in StandardJetContext

Definition at line 83 of file JetRecConfig.py.

83def JetInputCfg(flags,jetOrConstitdef , context="default"):
84 """Returns a ComponentAccumulator containing algs needed to build inputs to jet finding as defined by jetOrConstitdef
85
86 jetOrConstitdef can either be
87 * a JetDefinition : this happens when called from JetRecCfg, then the jetdef._prereqDic/Order are used.
88 * a JetInputConstit : to allow scheduling the corresponding constituents algs independently of any jet alg.
89
90 context is only used if jetOrConstitdef is not a JetDefinition and must refer to a context in StandardJetContext
91 """
92 components = ComponentAccumulator()
93
94 algs = getInputAlgs(jetOrConstitdef, flags, context)
95
96 for a in algs:
97
98 if isinstance(a, ComponentAccumulator):
99 components.merge(a)
100 else:
101 components.addEventAlgo(a)
102
103 return components
104

◆ JetRecCfg()

JetRecCfg ( flags,
jetdef,
returnConfiguredDef = False )

Top level functions returning ComponentAccumulator out of JetDefinition.

Top-level function for running jet finding or grooming.

This returns a ComponentAccumulator that can be merged with others
from elsewhere in the job and which provides everything needed to
reconstruct one jet collection.

arguments : 
  - jetdef : jet or grooming definition
  - flags : the configuration flags instance, mainly for input file
peeking such that we don't attempt to reproduce stuff that's already
in the input file. And also to be able to invoke building of inputs outside of Jet domain during reco from RAW/RDO.
  - returnConfiguredDef : is for debugging. It will also returns the cloned JetDefinition which contains the calculated dependencies.

Definition at line 36 of file JetRecConfig.py.

36def JetRecCfg( flags, jetdef, returnConfiguredDef=False):
37 """Top-level function for running jet finding or grooming.
38
39 This returns a ComponentAccumulator that can be merged with others
40 from elsewhere in the job and which provides everything needed to
41 reconstruct one jet collection.
42
43 arguments :
44 - jetdef : jet or grooming definition
45 - flags : the configuration flags instance, mainly for input file
46 peeking such that we don't attempt to reproduce stuff that's already
47 in the input file. And also to be able to invoke building of inputs outside of Jet domain during reco from RAW/RDO.
48 - returnConfiguredDef : is for debugging. It will also returns the cloned JetDefinition which contains the calculated dependencies.
49
50 """
51
52 sequenceName = jetdef.fullname()
53 jetlog.info("******************")
54 jetlog.info("Setting up to find {0}".format(sequenceName))
55
56 components = ComponentAccumulator()
57 from AthenaCommon.CFElements import parOR
58 components.addSequence( parOR(sequenceName) )
59
60 # call the relevant function according to jetdef_i type
61 if isinstance(jetdef, JetDefinition):
62 algs, jetdef_i = getJetDefAlgs(flags, jetdef , True)
63 elif isinstance(jetdef, GroomingDefinition):
64 algs, jetdef_i = getJetGroomAlgs(flags, jetdef, True)
65
66 # FIXME temporarily reorder for serial running
67 if flags.Concurrency.NumThreads <= 0:
68 jetlog.info("Reordering algorithms in sequence {0}".format(sequenceName))
69 algs, ca = reOrderAlgs(algs)
70 components.merge(ca)
71
72 for a in algs:
73
74 if isinstance(a, ComponentAccumulator):
75 components.merge(a )
76 else:
77 components.addEventAlgo( a , sequenceName = sequenceName )
78
79 if returnConfiguredDef: return components, jetdef_i
80 return components
81
82

◆ JetRecConfigTest()

JetRecConfigTest ( flags = None)

Definition at line 886 of file JetRecConfig.py.

886def JetRecConfigTest(flags=None):
887
888 # Config flags steer the job at various levels
889 if flags is None:
890 from AthenaConfiguration.AllConfigFlags import initConfigFlags
891 flags = initConfigFlags()
892
893 from AthenaConfiguration.TestDefaults import defaultTestFiles, defaultConditionsTags
894 flags.Input.Files = defaultTestFiles.LATEST_AOD_MC
895 flags.IOVDb.GlobalTag = defaultConditionsTags.LATEST_MC
896
897 flags.lock()
898
899 # Get a ComponentAccumulator setting up the fundamental Athena job
900 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
901 cfg=MainServicesCfg(flags)
902
903 # Add the components for reading in pool files
904 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
905 cfg.merge(PoolReadCfg(flags))
906
907 # Add the components from our jet reconstruction job
908 from JetRecConfig.StandardSmallRJets import AntiKt4EMTopo
909 cfg.merge(JetRecCfg(flags, AntiKt4EMTopo))
910
911 cfg.printConfig(withDetails=False,summariseProps=True)
912 cfg.run(10)
913

◆ mergedPJId()

mergedPJId ( pjList)
returns a simple unique ID for the list of PseudoJet container in pjList

Definition at line 272 of file JetRecConfig.py.

272def mergedPJId(pjList):
273 """returns a simple unique ID for the list of PseudoJet container in pjList"""
274 t = tuple(str(n) for n in pjList) # make sure it is string (it could have been a handle in old style config)
275 currentSize = len(_mergedPJContainers)
276 return str(_mergedPJContainers.setdefault(t, currentSize))
277
278

◆ PseudoJetCfg()

PseudoJetCfg ( jetdef)
Builds a ComponentAccumulator for creating PseudoJetContainer needed by jetdef.
THIS updates jetdef._internalAtt['finalPJContainer'] 

Definition at line 105 of file JetRecConfig.py.

105def PseudoJetCfg(jetdef):
106 """Builds a ComponentAccumulator for creating PseudoJetContainer needed by jetdef.
107 THIS updates jetdef._internalAtt['finalPJContainer']
108 """
109 components = ComponentAccumulator()
110 pjalglist = getPseudoJetAlgs(jetdef)
111 for pjalg in pjalglist:
112 components.addEventAlgo(pjalg)
113 return components
114
115

◆ registerAsInputConstit()

registerAsInputConstit ( jetdef)
Make the jet collection described by jetdef available as constituents to other jet finding 

Technically : create  JetInputExternal and JetInputConstit and register them in the relevant look-up dictionnaries.
the JetInputConstit will have a algoBuilder to generate the JetContainer described by jetdef

Definition at line 864 of file JetRecConfig.py.

864def registerAsInputConstit( jetdef ):
865 """Make the jet collection described by jetdef available as constituents to other jet finding
866
867 Technically : create JetInputExternal and JetInputConstit and register them in the relevant look-up dictionnaries.
868 the JetInputConstit will have a algoBuilder to generate the JetContainer described by jetdef
869 """
870 from .StandardJetConstits import stdConstitDic, stdInputExtDic
871 jetname = jetdef.fullname()
872
873 # define a function to generate the CA for this jetdef
874 def jetBuilder(largejetdef,spec):
875 return JetRecCfg(largejetdef._cflags, jetdef)
876
877 stdInputExtDic[jetname] = JetInputExternal( jetname, jetname, algoBuilder=jetBuilder)
878 stdConstitDic[jetname] = JetInputConstit(jetname, xAODType.Jet, jetname )
879
880

◆ removeComponentFailingConditions()

removeComponentFailingConditions ( jetdef,
flags = None,
raiseOnFailure = True )
Filters the lists jetdef.modifiers and jetdef.ghosts (and jetdef._prereqOrder), so only the components
comptatible with flags are selected. 
If flags==None : assume jetdef._cflags is properly set (this is done by higher-level functions)
The compatibility is ultimately tested using the component 'filterfn' attributes.
Internally calls the function isComponentPassingConditions() (see below) 

Definition at line 703 of file JetRecConfig.py.

703def removeComponentFailingConditions(jetdef, flags=None, raiseOnFailure=True):
704 """Filters the lists jetdef.modifiers and jetdef.ghosts (and jetdef._prereqOrder), so only the components
705 comptatible with flags are selected.
706 If flags==None : assume jetdef._cflags is properly set (this is done by higher-level functions)
707 The compatibility is ultimately tested using the component 'filterfn' attributes.
708 Internally calls the function isComponentPassingConditions() (see below)
709 """
710 jetlog.info("Standard Reco mode : filtering components in "+str(jetdef))
711
712 if jetdef._cflags is None:
713 jetdef._cflags = flags
714
715
718
719 # ---------
720 # first check if the input can be obtained. If not return.
721 ok,reason = isComponentPassingConditions( jetdef.inputdef, jetdef._cflags, jetdef)
722 if not ok:
723 if raiseOnFailure:
724 raise Exception(f"JetDefinition {jetdef} can NOT be scheduled. Failure of input {jetdef.inputdef.name} reason={reason}" )
725 jetlog.info(f"IMPORTANT : removing {jetdef} because input incompatible with job conditions. Reason={reason} ")
726 return False
727
728 if isinstance( jetdef.inputdef, JetInputConstitSeq):
729 # remove ConstitModifiers failing conditions.
730 jetdef.inputdef.modifiers = filterJetDefList(jetdef, jetdef.inputdef.modifiers, 'cmod', raiseOnFailure, jetdef._cflags)
731
732
733
734 # call the helper function to perform filtering :
735 jetdef.ghostdefs = filterJetDefList(jetdef, jetdef.ghostdefs, "ghost", raiseOnFailure, jetdef._cflags)
736 jetdef.modifiers = filterJetDefList(jetdef, jetdef.modifiers, "mod", raiseOnFailure, jetdef._cflags)
737 # finally filter all possible intermediate dependency :
738 filterJetDefList(jetdef, list(jetdef._prereqOrder), "", raiseOnFailure, jetdef._cflags)
739 return True
740
741
742

◆ removeFromList()

removeFromList ( l,
o )

Definition at line 881 of file JetRecConfig.py.

881def removeFromList(l, o):
882 if o in l:
883 l.remove(o)
884
885# Run test with command like "python -m JetRecConfig.JetRecConfig"

◆ removeGroomModifFailingConditions()

removeGroomModifFailingConditions ( groomdef,
flags,
raiseOnFailure = True )

Definition at line 743 of file JetRecConfig.py.

743def removeGroomModifFailingConditions(groomdef, flags, raiseOnFailure=True):
744
745 groomdef.modifiers = filterJetDefList(groomdef, groomdef.modifiers, "mod", raiseOnFailure, flags)
746 filterJetDefList(groomdef, list(groomdef._prereqOrder), "", raiseOnFailure, flags)
747
748
749
750# define a helper function to filter components from jet definition

◆ reOrderAlgs()

reOrderAlgs ( algs)
In runIII the scheduler automatically orders algs, so the JetRecConfig helpers do not try to enforce the correct ordering.
This is not the case in runII config for which this jobO is intended --> This function makes sure some jet-related algs are well ordered.

Definition at line 808 of file JetRecConfig.py.

808def reOrderAlgs(algs):
809 """In runIII the scheduler automatically orders algs, so the JetRecConfig helpers do not try to enforce the correct ordering.
810 This is not the case in runII config for which this jobO is intended --> This function makes sure some jet-related algs are well ordered.
811 """
812 def _flatten_CA(cfg, sequence_name="AthAlgSeq"):
813 from AthenaConfiguration.ComponentAccumulator import ConfigurationError
814 if not isinstance(cfg, ComponentAccumulator):
815 raise ConfigurationError('It is not allowed to flatten with multiple top sequences')
816
817 if len(cfg._allSequences) != 1:
818 raise ConfigurationError('It is not allowed to flatten with multiple top sequences')
819
820 sequence = cfg.getSequence(sequence_name)
821 if sequence.Sequential:
822 raise ConfigurationError('It is not allowed to flatten sequential sequences')
823
824 members = []
825 for member in sequence.Members:
826 if isinstance(member, CompFactory.AthSequencer):
827 members.extend(_flatten_CA(cfg, member.getName()))
828 else:
829 members.append(member)
830
831 sequence.Members = members
832 return members
833
834 algs_tmp = []
835 ca = ComponentAccumulator()
836 for a in algs:
837 if not isinstance(a, ComponentAccumulator) :
838 algs_tmp.append(a)
839 else:
840 _flatten_CA(a)
841 ca_algs = list(a._algorithms.keys())
842 for algo in ca_algs:
843 algs_tmp.append(a.popEventAlgo(algo))
844 ca.merge(a)
845
846 algs = algs_tmp
847 evtDensityAlgs = [(i, alg) for (i, alg) in enumerate(algs) if alg and alg.getType() == 'EventDensityAthAlg' ]
848 pjAlgs = [(i, alg) for (i, alg) in enumerate(algs) if alg and alg.getType() == 'PseudoJetAlgorithm' ]
849 pairsToswap = []
850 for i, edalg in evtDensityAlgs:
851 edInput = edalg.EventDensityTool.InputContainer
852 for j, pjalg in pjAlgs:
853 if j < i:
854 continue
855 if edInput == str(pjalg.OutputContainer):
856 pairsToswap.append((i, j))
857 for i, j in pairsToswap:
858 algs[i], algs[j] = algs[j], algs[i]
859
860 return algs, ca
861
862
863

Variable Documentation

◆ __all__

list python.JetRecConfig.__all__ = ["JetRecCfg", "JetInputCfg"]
private

Definition at line 28 of file JetRecConfig.py.

◆ _mergedPJContainers

python.JetRecConfig._mergedPJContainers = dict()
protected

Definition at line 271 of file JetRecConfig.py.

◆ jetlog

python.JetRecConfig.jetlog = Logging.logging.getLogger('JetRecConfig')

Definition at line 14 of file JetRecConfig.py.