ATLAS Offline Software
ChainConfigurationBase.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2 
3 
4 from AthenaCommon.Logging import logging
5 log = logging.getLogger(__name__)
6 
7 import abc
8 import inspect
9 import functools
10 from TriggerMenuMT.HLT.Config.MenuComponents import Chain, ChainStep
11 from DecisionHandling.DecisionHandlingConfig import ComboHypoCfg
12 from HLTSeeding.HLTSeedingConfig import mapThresholdToL1DecisionCollection
13 
14 
15 #----------------------------------------------------------------
16 # Base class to configure chain
17 #----------------------------------------------------------------
18 class ChainConfigurationBase(metaclass=abc.ABCMeta):
19 
20  def __init__(self, chainDict):
21 
22  # Consider using translation from dict["chainName"] to dict.chainName (less typing),
23  # though need to be able to access list of dictionaries as value of chainPart as well
24  # dict = type("dict", (object,), dict)
25 
26  self.dict = {}
27  self.dict.update(chainDict)
28 
29  self.chainName = self.dict['chainName']
30  self.chainL1Item = self.dict['L1item']
31 
32  # check dictionary contains only one chain part
33  if len( self.dict['chainParts'] ) != 1:
34  raise RuntimeError( "Passed chain dictionary with %i chainParts to ChainConfigurationBase, but this constructor only supports chains with a single part" % len( self.dict['chainParts'] ) )
35 
36  self.chainPart = self.dict['chainParts'][0]
37  self.L1Threshold = self.chainPart['L1threshold'] # now threshold is always there
38  self.mult = int(self.chainPart['multiplicity'])
39  self.chainPartName = self.chainPart['chainPartName']
42 
43  self.chainPartNameNoMult = self.chainPartName[1:] if self.mult > 1 else self.chainPartName
44  self.chainPartNameNoMultwL1 += "_"+self.chainL1Item
45 
46  def getStep(self, flags, stepName, sequenceCfgArray, comboHypoCfg=ComboHypoCfg, comboTools=[], **stepArgs):
47  log.debug("Configuring step %s", stepName)
48 
49  # do not generate Menu Sequences, just store the functions that can do that
50  seqArray = [functools.partial(gen, flags, **stepArgs) for gen in sequenceCfgArray]
51 
52  if (len(seqArray)>0):
53  if inspect.signature(comboHypoCfg).parameters and all(inspect.signature(comboTool).parameters for comboTool in comboTools):
54  # Bind flags to comboHypo generator if needed
55  if 'flags' in inspect.signature(comboHypoCfg).parameters:
56  comboHypoCfg = functools.partial(comboHypoCfg, flags)
57  return ChainStep(stepName, seqArray, [self.mult], [self.dict], comboHypoCfg = comboHypoCfg, comboToolConfs = comboTools)
58 
59  # if not returned any step
60  raise RuntimeError("[getStep] No sequences generated for step %s!", stepName)
61 
62  def getEmptyStep(self, stepID, stepPartName):
63  stepName = 'Step%s'%str(stepID) + '_' + stepPartName
64  log.debug("Configuring empty step %s", stepName)
65  return ChainStep(stepName, Sequences=[], multiplicity=[] ,chainDicts=[self.dict])
66 
67  def buildChain(self, chainSteps):
68 
69  alignmentGroups = []
70  if isinstance(self.chainPart, dict):
71  alignmentGroups = [self.chainPart['alignmentGroup']]
72  elif isinstance(self.chainPart, list):
73 
74  alignmentGroups = [cp['alignmentGroup'] for cp in self.chainPart]
75  testAlignGrps = list(set(alignmentGroups))
76  if not(len(testAlignGrps) == 1 and testAlignGrps[0] == 'JetMET'):
77  log.error("ChainConfigurationBase.buildChain(): number of chainParts does not correspond chainSteps")
78  log.error('ChainConfigurationBase.buildChain() chainPart: %s',self.chainPart)
79  log.error("ChainConfigurationBase.buildChain() alignmentGroups: %s", alignmentGroups)
80  log.error("ChainConfigurationBase.buildChain() chainName: %s", self.chainName)
81  log.error("ChainConfigurationBase.buildChain() chainSteps: %s", chainSteps)
82  else:
83  alignmentGroups = testAlignGrps
84 
85  else:
86  log.error("ChainConfigurationBase.buildChain(): chainPart is not a list or dict, not sure what to do here! %s ", self.chainPart)
87 
89  myChain = Chain(name = self.chainName,
90  ChainSteps = chainSteps,
91  L1decisions = [L1decision],
92  nSteps = [len(chainSteps)], # not true for combined chains
93  alignmentGroups = alignmentGroups
94  )
95 
96  return myChain
97 
98  @abc.abstractmethod
99  def assembleChainImpl(self, flags):
100  return
101 
102  def assembleChain(self, flags):
103  return self.assembleChainImpl(flags)
ChainConfigurationBase.ChainConfigurationBase.L1Threshold
L1Threshold
Definition: ChainConfigurationBase.py:37
ChainConfigurationBase.ChainConfigurationBase.dict
dict
Definition: ChainConfigurationBase.py:26
ChainConfigurationBase.ChainConfigurationBase.buildChain
def buildChain(self, chainSteps)
Definition: ChainConfigurationBase.py:67
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
ChainConfigurationBase.ChainConfigurationBase.mult
mult
Definition: ChainConfigurationBase.py:38
ChainConfigurationBase.ChainConfigurationBase.getEmptyStep
def getEmptyStep(self, stepID, stepPartName)
Definition: ChainConfigurationBase.py:62
ChainConfigurationBase.ChainConfigurationBase.chainName
chainName
Definition: ChainConfigurationBase.py:29
ChainConfigurationBase.ChainConfigurationBase.chainPartNameNoMult
chainPartNameNoMult
Definition: ChainConfigurationBase.py:40
ChainConfigurationBase.ChainConfigurationBase.chainPart
chainPart
Definition: ChainConfigurationBase.py:36
ChainConfigurationBase.ChainConfigurationBase.assembleChainImpl
def assembleChainImpl(self, flags)
Definition: ChainConfigurationBase.py:99
ChainConfigurationBase.ChainConfigurationBase.chainL1Item
chainL1Item
Definition: ChainConfigurationBase.py:30
histSizes.list
def list(name, path='/')
Definition: histSizes.py:38
CxxUtils::set
constexpr std::enable_if_t< is_bitmask_v< E >, E & > set(E &lhs, E rhs)
Convenience function to set bits in a class enum bitmask.
Definition: bitmask.h:224
ChainConfigurationBase.ChainConfigurationBase.chainPartNameNoMultwL1
chainPartNameNoMultwL1
Definition: ChainConfigurationBase.py:41
Cut::all
@ all
Definition: SUSYToolsAlg.cxx:64
dqt_zlumi_pandas.update
update
Definition: dqt_zlumi_pandas.py:42
ChainConfigurationBase.ChainConfigurationBase.assembleChain
def assembleChain(self, flags)
Definition: ChainConfigurationBase.py:102
ChainConfigurationBase.ChainConfigurationBase
Definition: ChainConfigurationBase.py:18
str
Definition: BTagTrackIpAccessor.cxx:11
ChainConfigurationBase.ChainConfigurationBase.__init__
def __init__(self, chainDict)
Definition: ChainConfigurationBase.py:20
HLTSeedingConfig.mapThresholdToL1DecisionCollection
def mapThresholdToL1DecisionCollection(threshold)
Definition: HLTSeedingConfig.py:79
ChainConfigurationBase.ChainConfigurationBase.chainPartName
chainPartName
Definition: ChainConfigurationBase.py:39
ChainConfigurationBase.ChainConfigurationBase.getStep
def getStep(self, flags, stepName, sequenceCfgArray, comboHypoCfg=ComboHypoCfg, comboTools=[], **stepArgs)
Definition: ChainConfigurationBase.py:46