4JetRecConfig: A helper module for configuring jet reconstruction
6The functions defined here turn JetDefinition object into ComponentAccumulator or list of algs fully configured
7and ready to be inserted in the framework sequence.
9Author: TJ Khoo, P-A Delsart
13from AthenaCommon
import Logging
14jetlog = Logging.logging.getLogger(
'JetRecConfig')
16from ROOT
import xAODType
19from AthenaConfiguration.ComponentAccumulator
import ComponentAccumulator
20from AthenaConfiguration.ComponentFactory
import CompFactory
23from JetRecConfig.JetDefinition
import JetDefinition, JetInputConstitSeq, JetInputConstit, JetInputExternal
24from JetRecConfig.JetGrooming
import GroomingDefinition
25from JetRecConfig.DependencyHelper
import solveDependencies, solveGroomingDependencies, aliasToModDef
28__all__ = [
"JetRecCfg",
"JetInputCfg"]
36def JetRecCfg( flags, jetdef, returnConfiguredDef=False):
37 """Top-level function for running jet finding or grooming.
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.
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.
52 sequenceName = jetdef.fullname()
53 jetlog.info(
"******************")
54 jetlog.info(
"Setting up to find {0}".format(sequenceName))
56 components = ComponentAccumulator()
57 from AthenaCommon.CFElements
import parOR
58 components.addSequence( parOR(sequenceName) )
61 if isinstance(jetdef, JetDefinition):
63 elif isinstance(jetdef, GroomingDefinition):
67 if flags.Concurrency.NumThreads <= 0:
68 jetlog.info(
"Reordering algorithms in sequence {0}".format(sequenceName))
74 if isinstance(a, ComponentAccumulator):
77 components.addEventAlgo( a , sequenceName = sequenceName )
79 if returnConfiguredDef:
return components, jetdef_i
84 """Returns a ComponentAccumulator containing algs needed to build inputs to jet finding as defined by jetOrConstitdef
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.
90 context is only used if jetOrConstitdef is not a JetDefinition and must refer to a context in StandardJetContext
92 components = ComponentAccumulator()
98 if isinstance(a, ComponentAccumulator):
101 components.addEventAlgo(a)
106 """Builds a ComponentAccumulator for creating PseudoJetContainer needed by jetdef.
107 THIS updates jetdef._internalAtt['finalPJContainer']
109 components = ComponentAccumulator()
111 for pjalg
in pjalglist:
112 components.addEventAlgo(pjalg)
123 """ Create the algorithms necessary to build the jet collection defined by jetdef.
125 This internally finds all the dependencies declared into jetdef (through input, ghosts & modifiers)
126 and returns a list of all necessary algs.
128 if returnConfiguredDef==True, also returns the fully configured clone of jetdef containing solved dependencies (debugging)
130 monTool is to allow the trigger config to pass a monitoring tool.
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)
139 jetdef_i = solveDependencies(jetdef, flags=flags)
147 if returnConfiguredDef:
164 jetlog.info(
"Scheduled JetAlgorithm instance \"jetalg_{0}\"".format(jetdef_i.fullname()))
166 if returnConfiguredDef:
167 return algs, jetdef_i
171 """Instantiate and schedule all the algorithms needed to run the grooming alg 'groomdef' and
172 add them in the ComponentAccumulator 'components'
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).
177 monTool is to allow the trigger config to pass a monitoring tool.
182 groomdef_i = solveGroomingDependencies(groomdef, flags)
186 for prereq
in groomdef_i._prereqOrder:
188 if len(prereq.split(
':')) > 2:
190 reqType, reqKey = prereq.split(
':')
192 groomdef_i.ungroomeddef.ghostdefs.append(reqKey)
193 elif reqType.endswith(
'input') :
194 groomdef_i.ungroomeddef.extrainputs.append(reqKey)
196 jetlog.info(
"Scheduling parent alg {} for {} ".format(groomdef.ungroomeddef.fullname(), groomdef.fullname()))
201 algs, ungroomeddef_i =
getJetDefAlgs(flags, groomdef_i.ungroomeddef ,
True)
202 groomdef_i._ungroomeddef = ungroomeddef_i
210 jetlog.info(
"Scheduled JetAlgorithm instance \"jetalg_{0}\"".format(groomdef_i.fullname()))
212 if returnConfiguredDef:
return algs, groomdef_i
216def getJetAlgs(flags, jetdef, returnConfiguredDef=False, monTool=None):
218 if isinstance(jetdef, JetDefinition):
220 elif isinstance(jetdef, GroomingDefinition):
221 func = getJetGroomAlgs
223 return func(flags, jetdef, returnConfiguredDef, monTool)
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)
239 constitpjalg =
getConstitPJGAlg(jetdef.inputdef , suffix=
None , flags=jetdef._cflags, parent_jetdef = jetdef)
241 finalPJContainer = str(constitpjalg.OutputContainer)
242 pjalglist = [constitpjalg]
245 ghostlist = [ key
for key
in jetdef._prereqOrder
if key.startswith(
'ghost:')]
248 pjContNames = [finalPJContainer]
249 for ghostkey
in sorted(ghostlist):
250 ghostdef = jetdef._prereqDic[ghostkey]
252 pjalglist.append(ghostpjalg)
253 pjContNames.append( str(ghostpjalg.OutputContainer) )
257 finalPJContainer = str(finalPJContainer)+
"_merged"+mergeId
258 mergerName =
"PJMerger_id"+mergeId
259 mergeAlg =CompFactory.PseudoJetMerger(
261 InputPJContainers = pjContNames,
262 OutputContainer = finalPJContainer,
264 pjalglist.append(mergeAlg)
267 jetdef._internalAtt[
'finalPJContainer'] = finalPJContainer
271_mergedPJContainers = dict()
273 """returns a simple unique ID for the list of PseudoJet container in pjList"""
274 t = tuple(str(n)
for n
in pjList)
275 currentSize = len(_mergedPJContainers)
276 return str(_mergedPJContainers.setdefault(t, currentSize))
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
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.
286 context is only used if jetOrConstitdef is not a JetDefinition and must refer to a context in StandardJetContext.
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)
294 from .JetDefinition
import JetInputConstit, JetDefinition
295 if isinstance(jetOrConstitdef, JetInputConstit):
297 jetlog.info(
"Setting up jet inputs from JetInputConstit : "+jetOrConstitdef.name)
298 jetdef = solveDependencies( JetDefinition(
'Kt', 0., jetOrConstitdef, context=context), flags )
303 jetdef = jetOrConstitdef
305 jetlog.info(
"Inspecting input file contents")
309 filecontents = jetdef._cflags.Input.Collections
314 cname = c.containername
if isinstance(c, JetInputConstit)
else c.containername(jetdef,c.specs)
315 return cname
in filecontents
318 inputdeps = [ inputkey
for inputkey
in jetdef._prereqOrder
if inputkey.startswith(
'input:')
or inputkey.startswith(
'extinput:') ]
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.")
327 if isinstance(inputInstance, JetInputConstit):
330 alg = inputInstance.algoBuilder( jetdef, inputInstance.specs )
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.
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}'
351 """returns a configured PseudoJetAlgorithm which converts the inputs defined by constitdef into fastjet::PseudoJet
353 IMPORTANT : constitdef must have its dependencies solved (i.e. it must result from a solveDependencies() call)
355 the flags argument is TEMPORARY and will be removed once further dev on PseudoJetAlgorithm is done (see comment below)
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),
366 SkipNegativeEnergy=
True,
367 DoByVertex=constitdef.byVertex
374 if flags
is not None:
375 from AthenaConfiguration.Enums
import BeamType
376 pjgalg.UseChargedPV = (flags.Beam.Type == BeamType.Collisions)
379 pjgalg.UseChargedPV=
False
380 pjgalg.UseChargedPUsideband=
True
381 elif suffix ==
'Neut':
382 pjgalg.UseCharged=
False
388 """returns a configured PseudoJetAlgorithm which converts the inputs defined by constitdef into fastjet::PseudoJet
390 The difference for the above is this is dedicated to ghosts which need variations for the Label and the muon segment cases.
392 IMPORTANT : ghostdef must have its dependencies solved (i.e. it must result from a solveDependencies() call)
394 label =
"Ghost"+ghostdef.label
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)
399 InputContainer = _container_name,
400 OutputContainer=
"PseudoJetGhost"+_container_name + _output_cont_name_suffix,
402 SkipNegativeEnergy=
True,
405 pjaclass = CompFactory.PseudoJetAlgorithm
406 if ghostdef.basetype==
"MuonSegment" or ghostdef.basetype==
"UnAssocMuonSegment":
408 pjaclass = CompFactory.MuonSegmentPseudoJetAlgorithm
409 kwargs.update( Pt =1e-20 )
410 kwargs.pop(
'SkipNegativeEnergy')
412 pjgalg = pjaclass(
"pjgalg_" + label +
"_" + parentjetdef.context, **kwargs )
416def getJetRecAlg( jetdef, monTool = None, ftf_suffix = '', extraOutputs = None):
417 """Returns the configured JetRecAlg instance corresponding to jetdef
419 IMPORTANT : jetdef must have its dependencies solved (i.e. it must result from solveDependencies() )
421 pjContNames = jetdef._internalAtt[
'finalPJContainer']
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),
431 "VariableRMinRadius": jetdef.VRMinRadius,
432 "VariableRMassScale": jetdef.VRMassScale
435 jetname = jetdef.fullname()
437 jclust = CompFactory.JetClustererByVertex(
442 jclust = CompFactory.JetClusterer(
449 jra = CompFactory.JetRecAlg(
450 "jetrecalg_"+jetname+ftf_suffix,
453 OutputContainer = jetname+ftf_suffix,
457 jra.MonTool = monTool
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
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)
471 jetlog.debug(
"Configuring grooming alg \"jetalg_{0}\"".format(groomdef.fullname()))
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)
485 jetname = groomdef.fullname()
486 jra = CompFactory.JetRecAlg(
487 "jetrecalg_"+jetname,
490 ParentDecor =
"Parent",
491 OutputContainer = jetname)
494 jra.MonTool = monTool
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
506def getJetCopyAlg(jetsin, jetsoutdef, decorations=[], shallowcopy=True, shallowIO=True, monTool=None):
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.
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!
517 jcopy = CompFactory.JetCopier(
520 DecorDeps=decorations,
521 ShallowCopy=shallowcopy,
526 for mod
in jetsoutdef.modifiers:
527 moddef = aliasToModDef(mod,jetsoutdef)
528 mods.append(
getModifier(jetsoutdef,moddef,moddef.modspec))
530 jetsoutname = jetsoutdef.fullname()
531 jra = CompFactory.JetRecAlg(
532 "jetrecalg_copy_"+jetsoutname,
535 OutputContainer = jetsoutname)
537 jra.MonTool = monTool
545 """returns a configured JetConstituentModSequence or None if constit.modifiers == []
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
551 IMPORTANT : parentjetdef & constitSeq must have their dependencies solved (i.e. they must result from solveDependencies() )
553 See also getConstitModAlg_nojetdef
558 if not isinstance(constitSeq, JetInputConstitSeq):
return
561 inputtype = constitSeq.basetype
563 sequence = constitSeq.modifiers
568 if constitSeq.inputname == constitSeq.containername:
return
570 for step
in sequence:
571 modInstance = parentjetdef._prereqDic[ f
'cmod:{step}' ]
572 if not modInstance.tooltype:
continue
574 toolclass = getattr( CompFactory, modInstance.tooltype)
577 for k,v
in modInstance.properties.items():
579 modInstance.properties[k ] = v(parentjetdef, constitSeq )
581 tool = toolclass(modInstance.name,**modInstance.properties)
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
589 sequenceshort =
"".join(sequence)
590 seqname =
"ConstitMod{0}_{1}".format(sequenceshort,constitSeq.name)
591 inputcontainer = str(constitSeq.inputname)
592 outputcontainer = str(constitSeq.containername)
594 if (inputtype == xAODType.FlowElement
or inputtype == xAODType.ParticleFlow):
597 def chopPFO(thestring):
598 pfostr =
"ParticleFlowObjects"
599 if thestring.endswith(pfostr):
600 return thestring[:-len(pfostr)]
602 inputcontainer = chopPFO(inputcontainer)
603 outputcontainer = chopPFO(outputcontainer)
605 doByVertex = constitSeq.byVertex
607 inChargedFEDecorKeys = []
608 inNeutralFEDecorKeys = []
622 inChargedFEDecorKeys += [
"cellCPData",
"FE_ElectronLinks",
"FE_PhotonLinks",
"FE_MuonLinks"]
623 inNeutralFEDecorKeys += [
"calpfo_NLeadingTruthParticleBarcodeEnergyPairs",
"FE_ElectronLinks",
"FE_PhotonLinks",
"FE_MuonLinks"]
625 modseq = CompFactory.JetConstituentModSequence(seqname,
627 OutputContainer = outputcontainer,
628 InputContainer= inputcontainer,
629 InChargedFEDecorKeys = inChargedFEDecorKeys,
630 InNeutralFEDecorKeys = inNeutralFEDecorKeys,
632 DoByVertex = doByVertex
635 modseq.MonTool = monTool
637 constitmodalg = CompFactory.JetAlgorithm(
"jetalg_{0}".format(modseq.getName()))
638 constitmodalg.Tools = [modseq]
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.
648 jetdef = solveDependencies( JetDefinition(
'Kt', 0., constitSeq, context=context) , flags)
649 constitSeq = jetdef._prereqDic[
'input:'+constitSeq.name]
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
657 modlist = [ key
for key
in jetdef._prereqOrder
if key.startswith(
'mod:')]
660 for modkey
in modlist:
661 moddef = jetdef._prereqDic[modkey]
663 modspec =
'' if ':' not in modkey
else modkey.split(
':',1)[1]
671 """Translate JetModifier into a concrete tool"""
672 jetlog.verbose(
"Retrieving modifier {0}".format(str(moddef)))
674 if flags
is not None:
676 jetdef = jetdef.clone()
677 jetdef._cflags = flags
678 jetdef._contextDic = flags.Jet.Context[jetdef.context]
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}\"")
692 for k,v
in moddef.properties.items():
695 v = v(jetdef, modspec)
696 setattr(modtool, k, v)
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)
710 jetlog.info(
"Standard Reco mode : filtering components in "+str(jetdef))
712 if jetdef._cflags
is None:
713 jetdef._cflags = flags
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} ")
728 if isinstance( jetdef.inputdef, JetInputConstitSeq):
730 jetdef.inputdef.modifiers =
filterJetDefList(jetdef, jetdef.inputdef.modifiers,
'cmod', raiseOnFailure, jetdef._cflags)
735 jetdef.ghostdefs =
filterJetDefList(jetdef, jetdef.ghostdefs,
"ghost", raiseOnFailure, jetdef._cflags)
736 jetdef.modifiers =
filterJetDefList(jetdef, jetdef.modifiers,
"mod", raiseOnFailure, jetdef._cflags)
738 filterJetDefList(jetdef, list(jetdef._prereqOrder),
"", raiseOnFailure, jetdef._cflags)
745 groomdef.modifiers =
filterJetDefList(groomdef, groomdef.modifiers,
"mod", raiseOnFailure, flags)
746 filterJetDefList(groomdef, list(groomdef._prereqOrder),
"", raiseOnFailure, flags)
755 basekey= compType+
':' if compType!=
"" else ""
757 fullname = jetdef.fullname()
761 fullkey = basekey+comp
762 cInstance = jetdef._prereqDic[fullkey]
766 raise Exception(
"JetDefinition {} can NOT be scheduled. Failure of {} {} reason={}".format(
767 jetdef, compType, comp, reason) )
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':
779 jetlog.info(
" *** Number of {} filtered components = {} final list={}".format(compType, nOut, outList) )
787 """Test if component is compatible with flags.
788 This is done by calling component.filterfn AND testing all its prereqs.
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]
797 return False,
"prereq "+str(reqInstance)+
" failed because : "+reason
799 ok, reason = component.filterfn(flags)
804 from AthenaConfiguration.Enums
import Project
805 return Project.determine() in( Project.AnalysisBase, Project.AthAnalysis)
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.
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')
817 if len(cfg._allSequences) != 1:
818 raise ConfigurationError(
'It is not allowed to flatten with multiple top sequences')
820 sequence = cfg.getSequence(sequence_name)
821 if sequence.Sequential:
822 raise ConfigurationError(
'It is not allowed to flatten sequential sequences')
825 for member
in sequence.Members:
826 if isinstance(member, CompFactory.AthSequencer):
827 members.extend(_flatten_CA(cfg, member.getName()))
829 members.append(member)
831 sequence.Members = members
835 ca = ComponentAccumulator()
837 if not isinstance(a, ComponentAccumulator) :
841 ca_algs = list(a._algorithms.keys())
843 algs_tmp.append(a.popEventAlgo(algo))
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' ]
850 for i, edalg
in evtDensityAlgs:
851 edInput = edalg.EventDensityTool.InputContainer
852 for j, pjalg
in pjAlgs:
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]
865 """Make the jet collection described by jetdef available as constituents to other jet finding
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
870 from .StandardJetConstits
import stdConstitDic, stdInputExtDic
871 jetname = jetdef.fullname()
874 def jetBuilder(largejetdef,spec):
875 return JetRecCfg(largejetdef._cflags, jetdef)
877 stdInputExtDic[jetname] = JetInputExternal( jetname, jetname, algoBuilder=jetBuilder)
878 stdConstitDic[jetname] = JetInputConstit(jetname, xAODType.Jet, jetname )
890 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
891 flags = initConfigFlags()
893 from AthenaConfiguration.TestDefaults
import defaultTestFiles, defaultConditionsTags
894 flags.Input.Files = defaultTestFiles.LATEST_AOD_MC
895 flags.IOVDb.GlobalTag = defaultConditionsTags.LATEST_MC
900 from AthenaConfiguration.MainServicesConfig
import MainServicesCfg
901 cfg=MainServicesCfg(flags)
904 from AthenaPoolCnvSvc.PoolReadConfig
import PoolReadCfg
905 cfg.merge(PoolReadCfg(flags))
908 from JetRecConfig.StandardSmallRJets
import AntiKt4EMTopo
909 cfg.merge(
JetRecCfg(flags, AntiKt4EMTopo))
911 cfg.printConfig(withDetails=
False,summariseProps=
True)
914if __name__==
"__main__":
std::vector< std::string > split(const std::string &s, const std::string &t=":")
filterJetDefList(jetdef, inList, compType, raiseOnFailure, flags)
getJetGroomAlgs(flags, groomdef, returnConfiguredDef=False, monTool=None)
getPJContName(jetOrConstitdef, suffix=None, parent_jetdef=None)
JetInputCfg(flags, jetOrConstitdef, context="default")
getConstitModAlg_nojetdef(constitSeq, flags, context="default", monTool=None)
getJetRecAlg(jetdef, monTool=None, ftf_suffix='', extraOutputs=None)
getJetAlgs(flags, jetdef, returnConfiguredDef=False, monTool=None)
removeGroomModifFailingConditions(groomdef, flags, raiseOnFailure=True)
registerAsInputConstit(jetdef)
removeComponentFailingConditions(jetdef, flags=None, raiseOnFailure=True)
getModifier(jetdef, moddef, modspec, flags=None)
JetRecConfigTest(flags=None)
getInputAlgs(jetOrConstitdef, flags, context="default", monTool=None)
JetRecCfg(flags, jetdef, returnConfiguredDef=False)
Top level functions returning ComponentAccumulator out of JetDefinition.
getJetCopyAlg(jetsin, jetsoutdef, decorations=[], shallowcopy=True, shallowIO=True, monTool=None)
getConstitPJGAlg(constitdef, suffix=None, flags=None, parent_jetdef=None)
getJetDefAlgs(flags, jetdef, returnConfiguredDef=False, monTool=None)
Mid level functions returning list of algs out of JetDefinition.
getPseudoJetAlgs(jetdef)
Mid level functions returning specific type of algs out of JetDefinition functions below assumines th...
getGhostPJGAlg(ghostdef, parentjetdef=None)
getJetRecGroomAlg(groomdef, monTool=None, extraOutputs=None)
getConstitModAlg(parentjetdef, constitSeq, monTool=None)
getJetModifierTools(jetdef)
isComponentPassingConditions(component, flags, jetdef)