ATLAS Offline Software
MenuComponents.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2 
3 from TriggerMenuMT.HLT.Config.Utility.HLTMenuConfig import HLTMenuConfig
4 from TriggerMenuMT.HLT.Config.ControlFlow.MenuComponentsNaming import CFNaming
5 from TriggerMenuMT.HLT.Config.ControlFlow.HLTCFTools import (NoHypoToolCreated,
6  algColor,
7  isHypoBase,
8  isInputMakerBase)
9 from AthenaCommon.CFElements import parOR, seqAND, findAlgorithmByPredicate
10 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
11 from AthenaConfiguration.ComponentFactory import CompFactory
12 from DecisionHandling.DecisionHandlingConfig import ComboHypoCfg
13 import GaudiConfig2
14 from TrigCompositeUtils.TrigCompositeUtils import legName
15 from TriggerJobOpts.TriggerConfigFlags import ROBPrefetching
16 
17 from collections.abc import MutableSequence
18 import functools
19 import inspect
20 import re
21 
22 from AthenaCommon.Logging import logging
23 log = logging.getLogger( __name__ )
24 # Pool of mutable ComboHypo instances (FIXME: ATR-29181)
25 _ComboHypoPool = dict()
26 
27 
28 class Node(object):
29  """base class representing one Alg + inputs + outputs, to be used to Draw dot diagrams and connect objects"""
30  def __init__(self, Alg):
31  self.name = ("%sNode")%( Alg.getName() )
32  self.Alg=Alg
33  self.inputs=[]
34  self.outputs=[]
35 
36  def addOutput(self, name):
37  self.outputs.append(str(name))
38 
39  def addInput(self, name):
40  self.inputs.append(str(name))
41 
42  def getOutputList(self):
43  return self.outputs
44 
45  def getInputList(self):
46  return self.inputs
47 
48  def __repr__(self):
49  return "Node::%s [%s] -> [%s]"%(self.Alg.getName(), ' '.join(map(str, self.getInputList())), ' '.join(map(str, self.getOutputList())))
50 
51 
52 class AlgNode(Node):
53  """Node class that connects inputs and outputs to basic alg. properties """
54  def __init__(self, Alg, inputProp, outputProp):
55  Node.__init__(self, Alg)
56  self.outputProp = outputProp
57  self.inputProp = inputProp
58 
59  def addDefaultOutput(self):
60  if self.outputProp != '':
61  self.addOutput(("%s_%s"%(self.Alg.getName(),self.outputProp)))
62 
63  def setPar(self, propname, value):
64  cval = getattr( self.Alg, propname)
65  if isinstance(cval, MutableSequence):
66  cval.append(value)
67  return setattr(self.Alg, propname, cval)
68  else:
69  return setattr(self.Alg, propname, value)
70 
71  def resetPar(self, prop):
72  cval = getattr(self.Alg, prop)
73  if isinstance(cval, MutableSequence):
74  return setattr(self.Alg, prop, [])
75  else:
76  return setattr(self.Alg, prop, "")
77 
78  def getPar(self, prop):
79  return getattr(self.Alg, prop)
80 
81  def resetOutput(self):
82  self.resetPar(self.outputProp)
83 
84  def resetInput(self):
85  self.resetPar(self.inputProp)
86 
87  def addOutput(self, name):
88  outputs = self.readOutputList()
89  if name in outputs:
90  log.debug("Output DH not added in %s: %s already set!", self.Alg.getName(), name)
91  else:
92  if self.outputProp != '':
93  self.setPar(self.outputProp, name)
94  else:
95  log.debug("no outputProp set for output of %s", self.Alg.getName())
96  Node.addOutput(self, name)
97 
98  def readOutputList(self):
99  cval = self.getPar(self.outputProp)
100  return (cval if isinstance(cval, MutableSequence) else
101  ([str(cval)] if cval else []))
102 
103  def addInput(self, name):
104  inputs = self.readInputList()
105  if name in inputs:
106  log.debug("Input DH not added in %s: %s already set!", self.Alg.getName(), name)
107  else:
108  if self.inputProp != '':
109  self.setPar(self.inputProp, name)
110  else:
111  log.debug("no InputProp set for input of %s", self.Alg.getName())
112  Node.addInput(self, name)
113  return len(self.readInputList())
114 
115  def readInputList(self):
116  cval = self.getPar(self.inputProp)
117  return (cval if isinstance(cval, MutableSequence) else
118  ([str(cval)] if cval else []))
119 
120  def __repr__(self):
121  return "Alg::%s [%s] -> [%s]"%(self.Alg.getName(), ' '.join(map(str, self.getInputList())), ' '.join(map(str, self.getOutputList())))
122 
123 
125  """ Class to group info on hypotools for ChainDict"""
126  def __init__(self, hypoToolGen):
127  # Check if the generator function takes flags:
128  self.hasFlags = 'flags' in inspect.signature(hypoToolGen).parameters
129  self.hypoToolGen = hypoToolGen
130  self.name=hypoToolGen.__name__
131 
132  def setConf( self, chainDict):
133  if type(chainDict) is not dict:
134  raise RuntimeError("Configuring hypo with %s, not good anymore, use chainDict" % str(chainDict) )
135  self.chainDict = chainDict
136 
137  def create(self, flags):
138  """creates instance of the hypo tool"""
139  if self.hasFlags:
140  return self.hypoToolGen( flags, self.chainDict )
141  else:
142  return self.hypoToolGen( self.chainDict )
143 
144  def confAndCreate(self, flags, chainDict):
145  """sets the configuration and creates instance of the hypo tool"""
146  self.setConf(chainDict)
147  return self.create(flags)
148 
149 
151  """Node for HypoAlgs"""
152  initialOutput= 'StoreGateSvc+UNSPECIFIED_OUTPUT'
153  def __init__(self, Alg):
154  assert isHypoBase(Alg), "Error in creating HypoAlgNode from Alg " + Alg.name
155  AlgNode.__init__(self, Alg, 'HypoInputDecisions', 'HypoOutputDecisions')
156  self.previous=[]
157 
158  def addOutput(self, name):
159  outputs = self.readOutputList()
160  if name in outputs:
161  log.debug("Output DH not added in %s: %s already set!", self.name, name)
162  elif self.initialOutput in outputs:
163  AlgNode.addOutput(self, name)
164  else:
165  log.error("Hypo %s has already %s as configured output: you may want to duplicate the Hypo!",
166  self.name, outputs[0])
167 
168 
169  def addHypoTool (self, flags, hypoToolConf):
170  log.debug("Adding HypoTool %s for chain %s to %s", hypoToolConf.name, hypoToolConf.chainDict['chainName'], self.Alg.getName())
171  try:
172  result = hypoToolConf.create(flags)
173  if isinstance(result, ComponentAccumulator):
174  tool = result.popPrivateTools()
175  assert not isinstance(tool, list), "Can not handle list of tools"
176  self.Alg.HypoTools.append(tool)
177  return result
178  else:
179  self.Alg.HypoTools = self.Alg.HypoTools + [result] # see ATEAM-773
180 
181  except NoHypoToolCreated as e:
182  log.debug("%s returned empty tool: %s", hypoToolConf.name, e)
183  return None
184 
185  def setPreviousDecision(self,prev):
186  self.previous.append(prev)
187  return self.addInput(prev)
188 
189  def resetDecisions(self):
190  self.previous = []
191  self.resetOutput()
192  self.resetInput()
193 
194  def __repr__(self):
195  return "HypoAlg::%s [%s] -> [%s], previous = [%s], HypoTools=[%s]" % \
196  (self.Alg.name,' '.join(map(str, self.getInputList())),
197  ' '.join(map(str, self.getOutputList())),
198  ' '.join(map(str, self.previous)),
199  ' '.join([t.getName() for t in self.Alg.HypoTools]))
200 
201 
203  def __init__(self, Alg):
204  assert isInputMakerBase(Alg), "Error in creating InputMakerNode from Alg " + Alg.name
205  AlgNode.__init__(self, Alg, 'InputMakerInputDecisions', 'InputMakerOutputDecisions')
206  self.resetInput()
207  self.resetOutput()
208  input_maker_output = CFNaming.inputMakerOutName(self.Alg.name)
209  self.addOutput(input_maker_output)
210 
211 
213  def __init__(self, name, comboHypoCfg):
214  self.prop1 = "MultiplicitiesMap"
215  self.prop2 = "LegToInputCollectionMap"
216  self.comboHypoCfg = comboHypoCfg
217  self.acc = self.create( name )
218  thealgs= self.acc.getEventAlgos()
219  if thealgs is None:
220  log.error("ComboMaker: Combo alg %s not found", name)
221  if len(thealgs) != 1:
222  log.error("ComboMaker: Combo alg %s len is %d",name, len(thealgs))
223  Alg=thealgs[0]
224 
225  log.debug("ComboMaker init: Alg %s", name)
226  AlgNode.__init__(self, Alg, 'HypoInputDecisions', 'HypoOutputDecisions')
227  self.resetInput()
228  self.resetOutput()
230  setattr(self.Alg, self.prop1, {})
231  setattr(self.Alg, self.prop2, {})
232 
233  def __del__(self):
234  self.acc.wasMerged()
235 
236  def create (self, name):
237  log.debug("ComboMaker.create %s",name)
238  return self.comboHypoCfg(name=name)
239 
240  """
241  AlgNode automatically de-duplicates input ReadHandles upon repeated calls to addInput.
242  Node instead stores all the inputs, even if repeated (self.inputs)
243  This function maps from the raw number of times that addInput was called to the de-duplicated index of the handle.
244  E.g. a step processing chains such as HLT_e5_mu6 would return [0,1]
245  E.g. a step processing chains such as HLT_e5_e6 would return [0,0]
246  E.g. a step processing chains such as HLT_e5_mu6_mu7 would return [0,1,1]
247  These data are needed to configure the step's ComboHypo
248  """
250  mapping = []
251  theInputs = self.readInputList() #only unique inputs
252  for rawInput in self.inputs: # all inputs
253  mapping.append( theInputs.index(rawInput) )
254  return mapping
255 
256  """ overwrite AlgNode::addInput with Node::addInput"""
257  def addInput(self, name):
258  return AlgNode.addInput(self, name)
259 
260  def addChain(self, chainDict):
261  chainName = chainDict['chainName']
262  chainMult = chainDict['chainMultiplicities']
263  legsToInputCollections = self.mapRawInputsToInputsIndex()
264  if len(chainMult) != len(legsToInputCollections):
265  log.error("ComboMaker for Alg:{} with addChain for:{} Chain multiplicity:{} Per leg input collection index:{}."
266  .format(self.Alg.name, chainName, tuple(chainMult), tuple(legsToInputCollections)))
267  log.error("The size of the multiplicies vector must be the same size as the per leg input collection vector.")
268  log.error("The ComboHypo needs to know which input DecisionContainers contain the DecisionObjects to be used for each leg.")
269  log.error("Check why ComboMaker.addInput(...) was not called exactly once per leg.")
270  raise Exception("[createDataFlow] Error in ComboMaker.addChain. Cannot proceed.")
271 
272  cval1 = getattr(self.Alg, self.prop1) # check necessary to see if chain was added already?
273  cval2 = getattr(self.Alg, self.prop2)
274  if type(cval1) is dict or isinstance(cval1, GaudiConfig2.semantics._DictHelper):
275  if chainName in cval1.keys():
276  log.error("ERROR in configuration: ComboAlg %s has already been configured for chain %s", self.Alg.name, chainName)
277  raise Exception("[createDataFlow] Error in ComboMaker.addChain. Cannot proceed.")
278  else:
279  cval1[chainName] = chainMult
280  cval2[chainName] = legsToInputCollections
281  else:
282  cval1 = {chainName : chainMult}
283  cval2 = {chainName : legsToInputCollections}
284 
285  setattr(self.Alg, self.prop1, cval1)
286  setattr(self.Alg, self.prop2, cval2)
287 
288 
289  def getChains(self):
290  cval = getattr(self.Alg, self.prop1)
291  return cval.keys()
292 
293 
294  def createComboHypoTools(self, flags, chainDict, comboToolConfs):
295  """Created the ComboHypoTools"""
296  if not len(comboToolConfs):
297  return
298  confs = [ HypoToolConf( tool ) for tool in comboToolConfs ]
299  log.debug("ComboMaker.createComboHypoTools for chain %s, Alg %s with %d tools", chainDict["chainName"],self.Alg.getName(), len(comboToolConfs))
300  for conf in confs:
301  log.debug("ComboMaker.createComboHypoTools adding %s", conf)
302  tools = self.Alg.ComboHypoTools
303  self.Alg.ComboHypoTools = tools + [ conf.confAndCreate( flags, chainDict ) ]
304 
305 
306 
309 
311  """Class to emulate reco sequences with no Hypo"""
312 
313  def __init__(self, the_name):
314  log.debug("Made EmptySequence %s", the_name)
315  self._name = the_name
316 
317  # isEmptyStep causes the IM to try at runtime to merge by feature by default
318  # (i.e for empty steps appended after a leg has finised). But if this failes then it will
319  # merge by initial ROI instead (i.e. for empy steps prepended before a leg has started)
320  makerAlg = CompFactory.InputMakerForRoI(f"IM{the_name}",
321  isEmptyStep = True,
322  RoIsLink = 'initialRoI')
323 
324  self._maker = InputMakerNode( Alg = makerAlg )
325  self._sequence = Node( Alg = seqAND(the_name, [makerAlg]))
326 
328  self.ca.addSequence(seqAND(the_name))
329  self.ca.addEventAlgo(makerAlg, sequenceName=the_name)
330 
331  def __del__(self):
332  self.ca.wasMerged()
333 
334  @property
335  def sequence(self):
336  return self._sequence
337 
338  @property
339  def maker(self):
340  # Input makers are added during DataFlow building (connectToFilter) when a chain
341  # uses this sequence in another step. So we need to make sure to update the
342  # algorithm when accessed.
343  self._maker.Alg = self.ca.getEventAlgo(self._maker.Alg.name)
344  return self._maker
345 
346  @property
347  def globalRecoCA(self):
348  return None
349 
350  @property
351  def name(self):
352  return self._name
353 
354  def getOutputList(self):
355  return self.maker.readOutputList() # Only one since it's merged
356 
357  def connectToFilter(self, outfilter):
358  """Connect filter to the InputMaker"""
359  self.maker.addInput(outfilter)
360 
361  def getHypoToolConf(self):
362  return None
363 
364  def addToSequencer(self, recoSeq_list, hypo_list):
365  recoSeq_list.add(self.sequence.Alg)
366 
367  def buildDFDot(self, cfseq_algs, all_hypos, last_step_hypo_nodes, file):
368  cfseq_algs.append(self.maker)
369  cfseq_algs.append(self.sequence )
370  file.write(" %s[fillcolor=%s]\n"%(self.maker.Alg.getName(), algColor(self.maker.Alg)))
371  file.write(" %s[fillcolor=%s]\n"%(self.sequence.Alg.getName(), algColor(self.sequence.Alg)))
372  return cfseq_algs, all_hypos, last_step_hypo_nodes
373 
374  def __repr__(self):
375  return "MenuSequence::%s \n Hypo::%s \n Maker::%s \n Sequence::%s \n HypoTool::%s\n"\
376  %(self.name, "Empty", self.maker.Alg.getName(), self.sequence.Alg.getName(), "None")
377 
378 def EmptyMenuSequenceCfg(flags, name):
379  return EmptyMenuSequence(name)
380 
382  return o == EmptyMenuSequenceCfg
383 
385  """Class to group reco sequences with the Hypo.
386  By construction it has one Hypo only; behaviour changed to support muFastOvlpRmSequence(),
387  which has two, but this will change."""
388 
389  def __init__(self, flags, selectionCA, HypoToolGen, isProbe=None, globalRecoCA=None):
390  # FIXME: isProbe argument is now unused in MenuSequenceCA and will be removed later
391 
392  self.ca = selectionCA
393  self._globalCA = globalRecoCA
394  # separate the HypoCA to be merged later
395  self.hypoAcc = selectionCA.hypoAcc
396 
397  sequence = self.ca.topSequence()
398  self._sequence = Node(Alg=sequence)
399 
400  # InputMaker
401  inputMaker = [ a for a in self.ca.getEventAlgos() if isInputMakerBase(a)]
402  assert len(inputMaker) == 1, f"{len(inputMaker)} input makers in the ComponentAccumulator"
403  inputMaker = inputMaker[0]
404  self._maker = InputMakerNode( Alg = inputMaker )
405  input_maker_output = self.maker.readOutputList()[0] # only one since it's merged
406  assert inputMaker.name.startswith("IM"), f"Input maker {inputMaker.name} name needs to start with 'IM'"
407 
408  # HypoAlg
409  hypoAlg = selectionCA.hypoAcc.getEventAlgos()
410  assert len(hypoAlg) == 1, f"{len(hypoAlg)} hypo algs in the ComponentAccumulator"
411  hypoAlg = hypoAlg[0]
412  hypoAlg.RuntimeValidation = flags.Trigger.doRuntimeNaviVal
413 
414  self._name = CFNaming.menuSequenceName(hypoAlg.name)
415  self._hypo = HypoAlgNode( Alg = hypoAlg )
416  self._hypo.addOutput( CFNaming.hypoAlgOutName(hypoAlg.name) )
417  self._hypo.setPreviousDecision( input_maker_output )
418  self._hypoToolConf = HypoToolConf( HypoToolGen )
419 
420  # Connect InputMaker output to ROBPrefetchingAlg(s) if there are any
421  if ROBPrefetching.StepRoI in flags.Trigger.ROBPrefetchingOptions:
422  for child in sequence.Members:
423  if ( isinstance(child, CompFactory.ROBPrefetchingAlg) and
424  input_maker_output not in child.ROBPrefetchingInputDecisions ):
425  child.ROBPrefetchingInputDecisions.append(input_maker_output)
426 
427  log.debug("connecting InputMaker and HypoAlg, adding: InputMaker::%s.output=%s",
428  self.maker.Alg.name, input_maker_output)
429  log.debug("HypoAlg::%s.HypoInputDecisions=%s, HypoAlg::%s.HypoOutputDecisions=%s",
430  self.hypo.Alg.name, self.hypo.readInputList()[0],
431  self.hypo.Alg.name, self.hypo.readOutputList()[0])
432 
433  def __del__(self):
434  self.ca.wasMerged()
435  self.hypoAcc.wasMerged()
436  if self._globalCA:
437  self._globalCA.wasMerged()
438 
439  @property
440  def globalRecoCA(self):
441  return self._globalCA
442 
443  @property
444  def name(self):
445  return self._name
446 
447  @property
448  def sequence(self):
449  return self._sequence
450 
451  @property
452  def maker(self):
453  # Input makers are added during DataFlow building (connectToFilter) when a chain
454  # uses this sequence in another step. So we need to make sure to update the
455  # algorithm when accessed.
456  self._maker.Alg = self.ca.getEventAlgo(self._maker.Alg.name)
457  return self._maker
458 
459  @property
460  def hypo(self):
461  return self._hypo
462 
463  def getOutputList(self):
464  return [self._hypo.readOutputList()[0]]
465 
466  def connectToFilter(self, outfilter):
467  """Connect filter to the InputMaker"""
468  log.debug("connecting %s to inputs of %s", outfilter, self.maker.Alg.name)
469  self.maker.addInput(outfilter)
470 
471  def getHypoToolConf(self) :
472  return self._hypoToolConf
473 
474  def addToSequencer(self, recoSeq_list, hypo_list):
475  recoSeq_list.add(self.sequence.Alg)
476  hypo_list.add(self._hypo.Alg)
477 
478  def buildDFDot(self, cfseq_algs, all_hypos, last_step_hypo_nodes, file):
479  cfseq_algs.append(self.maker)
480  cfseq_algs.append(self.sequence)
481  file.write(" %s[fillcolor=%s]\n"%(self.maker.Alg.getName(), algColor(self.maker.Alg)))
482  file.write(" %s[fillcolor=%s]\n"%(self.sequence.Alg.getName(), algColor(self.sequence.Alg)))
483  cfseq_algs.append(self._hypo)
484  file.write(" %s[color=%s]\n"%(self._hypo.Alg.getName(), algColor(self._hypo.Alg)))
485  all_hypos.append(self._hypo)
486  return cfseq_algs, all_hypos, last_step_hypo_nodes
487 
488  def __repr__(self):
489  hyponame = self._hypo.Alg.name
490  hypotool = self._hypoToolConf.name
491  return "MenuSequence::%s \n Hypo::%s \n Maker::%s \n Sequence::%s \n HypoTool::%s\n"\
492  %(self.name, hyponame, self.maker.Alg.name, self.sequence.Alg.name, hypotool)
493 
494 
495 class Chain(object):
496  """Basic class to define the trigger menu """
497  __slots__ ='name','steps','nSteps','alignmentGroups','L1decisions', 'topoMap'
498  def __init__(self, name, ChainSteps, L1decisions, nSteps = [], alignmentGroups = [], topoMap=None):
499 
500  """
501  Construct the Chain from the steps
502  Out of all arguments the ChainSteps & L1Thresholds are most relevant, the chain name is used in debug messages
503  """
504  self.name = name
505  self.steps = ChainSteps
506  self.nSteps = nSteps
507  self.alignmentGroups = alignmentGroups
508 
509  # The chain holds a map of topo ComboHypoTool configurators
510  # This is needed to allow placement of the ComboHypoTool in the right position
511  # for multi-leg chains (defaults to last step)
512  # Format is {"[step name]" : ([topo config function], [topo descriptor string]), ...}
513  # Here, the topo descriptor string would usually be the chain name expression that
514  # configures the topo
515  self.topoMap = {}
516  if topoMap:
517  self.topoMap.update(topoMap)
518 
519  # L1decisions are used to set the seed type (EM, MU,JET), removing the actual threshold
520  # in practice it is the HLTSeeding Decision output
521  self.L1decisions = L1decisions
522  log.debug("[Chain.__init__] Made Chain %s with seeds: %s ", name, self.L1decisions)
523 
524  def append_bjet_steps(self,new_steps):
525  assert len(self.nSteps) == 1, "[Chain.append_bjet_steps] appending already-merged step lists - chain object will be broken. This should only be used to append Bjets to jets!"
526  self.steps = self.steps + new_steps
527  self.nSteps = [len(self.steps)]
528 
529  def append_step_to_jet(self,new_steps):
530  assert len(self.nSteps) == 1, "[Chain.append_step_to_jet] appending already-merged step lists - chain object will be broken. This is used either for appending Beamspot algorithms to jets!"
531  self.steps = self.steps + new_steps
532  self.nSteps = [len(self.steps)]
533 
534 
535  def numberAllSteps(self):
536  if len(self.steps)==0:
537  return
538  else:
539  for stepID,step in enumerate(self.steps):
540  step_name = step.name
541  if re.search('^Step[0-9]_',step_name):
542  step_name = step_name[6:]
543  elif re.search('^Step[0-9]{2}_', step_name):
544  step_name = step_name[7:]
545  step.name = 'Step%d_'%(stepID+1)+step_name
546  return
547 
548 
549  def insertEmptySteps(self, empty_step_name, n_new_steps, start_position):
550  #start position indexed from 0. if start position is 3 and length is 2, it works like:
551  # [old1,old2,old3,old4,old5,old6] ==> [old1,old2,old3,empty1,empty2,old4,old5,old6]
552 
553  if len(self.steps) == 0 :
554  log.error("I can't insert empty steps because the chain doesn't have any steps yet!")
555 
556  if len(self.steps) < start_position :
557  log.error("I can't insert empty steps at step %d because the chain doesn't have that many steps!", start_position)
558 
559 
560  chain_steps_pre_split = self.steps[:start_position]
561  chain_steps_post_split = self.steps[start_position:]
562 
563  next_step_name = ''
564  prev_step_name = ''
565  # copy the same dictionary as the last step, which else?
566  prev_chain_dict = []
567  if start_position == 0:
568  next_step_name = chain_steps_post_split[0].name
569  if re.search('^Step[0-9]_',next_step_name):
570  next_step_name = next_step_name[6:]
571  elif re.search('^Step[0-9]{2}_', next_step_name):
572  next_step_name = next_step_name[7:]
573 
574  prev_step_name = 'empty_'+str(len(self.L1decisions))+'L1in'
575  prev_chain_dict = chain_steps_post_split[0].stepDicts
576  else:
577  if len(chain_steps_post_split) == 0:
578  log.error("Adding empty steps to the end of a chain (%s)- why would you do this?",self.name)
579  else:
580  prev_step_name = chain_steps_pre_split[-1].name
581  next_step_name = chain_steps_post_split[0].name
582  prev_chain_dict = chain_steps_pre_split[-1].stepDicts
583 
584 
585  steps_to_add = []
586  for stepID in range(1,n_new_steps+1):
587  new_step_name = prev_step_name+'_'+empty_step_name+'%d_'%stepID+next_step_name
588 
589  log.debug("Configuring empty step %s", new_step_name)
590  steps_to_add += [ChainStep(new_step_name, [], [], chainDicts=prev_chain_dict, comboHypoCfg=ComboHypoCfg)]
591 
592  self.steps = chain_steps_pre_split + steps_to_add + chain_steps_post_split
593 
594  return
595 
596  def checkMultiplicity(self):
597  if len(self.steps) == 0:
598  return 0
599  mult=[sum(step.multiplicity) for step in self.steps] # on mult per step
600  not_empty_mult = [m for m in mult if m!=0]
601  if len(not_empty_mult) == 0: #empty chain?
602  log.error("checkMultiplicity: Chain %s has all steps with multiplicity =0: what to do?", self.name)
603  return 0
604  if not_empty_mult.count(not_empty_mult[0]) != len(not_empty_mult):
605  log.error("checkMultiplicity: Chain %s has steps with differnt multiplicities: %s", self.name, ' '.join(mult))
606  return 0
607 
608  if not_empty_mult[0] != len(self.L1decisions):
609  log.error("checkMultiplicity: Chain %s has %d multiplicity per step, and %d L1Decisions", self.name, mult, len(self.L1decisions))
610  return 0
611  return not_empty_mult[0]
612 
613 
614  # Receives a pair with the topo config function and an identifier string,
615  # optionally also a target step name
616  # The string is needed to rename the step after addition of the ComboHypoTool
617  def addTopo(self,topoPair,step="last"):
618  stepname = "last step" if step=="last" else step.name
619  log.debug("Adding topo configurator %s for %s to %s", topoPair[0].__qualname__, topoPair[1], "step " + stepname)
620  self.topoMap[step] = topoPair
621 
622  def __repr__(self):
623  return "-*- Chain %s -*- \n + Seeds: %s, Steps: %s, AlignmentGroups: %s \n + Steps: \n %s \n"%(\
624  self.name, ' '.join(map(str, self.L1decisions)), self.nSteps, self.alignmentGroups, '\n '.join(map(str, self.steps)))
625 
626 
627 # next: can we remove multiplicity array, if it can be retrieved from the ChainDict?
629  """Class to describe one step of a chain; if multiplicity is greater than 1, the step is combo/combined. Set one multiplicity value per sequence"""
630  def __init__(self, name, Sequences = [], multiplicity = [1], chainDicts = [], comboHypoCfg = ComboHypoCfg, comboToolConfs = [], isEmpty = False, createsGhostLegs = False):
631  # TODO: remove parameter multiplicity, since this must be extracted from the ChainDict ATR-23928
632  # include cases of empty steps with multiplicity = [] or multiplicity=[0,0,0///]
633  if sum(multiplicity) == 0:
634  multiplicity = []
635  else:
636  log.debug("chain %s, step %s: len=%d multiplicty=%d", chainDicts[0]['chainName'], name, len(chainDicts), len(multiplicity))
637  # sanity check on inputs, excluding empty steps
638  if len(chainDicts) != len(multiplicity):
639  log.error("[ChainStep] Sequences: %s",Sequences)
640  log.error("[ChainStep] chainDicts: %s",chainDicts)
641  log.error("[ChainStep] multiplicity: %s",multiplicity)
642  raise RuntimeError("[ChainStep] Tried to configure a ChainStep %s with %i multiplicity and %i dictionaries. These lists must have the same size" % (name, len(multiplicity), len(chainDicts)) )
643 
644  if len(Sequences) != len(multiplicity) and 'Jet' not in chainDicts[0]['signatures']:
645  log.error("[ChainStep] Sequences: %s",Sequences)
646  log.error("[ChainStep] multiplicities: %s",multiplicity)
647  raise RuntimeError("Tried to configure a ChainStep %s with %i Sequences and %i multiplicities. These lists must have the same size" % (name, len(Sequences), len(multiplicity)) )
648 
649  self.name = name
650  self.sequences = []
651  self.sequenceFunctions = Sequences
652  for iseq, seq in enumerate(self.sequenceFunctions):
653  if not isinstance(seq, functools.partial):
654  log.error("[ChainStep] %s Sequences verification failed, sequence %d is not partial function, likely ChainBase.getStep function was not used", self.name, iseq)
655  log.error("[ChainStep] It rather seems to be of type %s trying to print it", type(seq))
656  raise RuntimeError("Sequence is not packaged in a tuple, see error message above" )
657 
658  self.onlyJets = False
659  sig_set = None
660  if len(chainDicts) > 0 and 'signature' in chainDicts[0]:
661  leg_signatures = [step['signature'] for step in chainDicts if step['signature'] != 'Bjet']
662  if (len(multiplicity) > 0 and leg_signatures.count('Jet') == 1) and (len(set(leg_signatures)) > 1 and chainDicts[0]['signatures'].count('Jet') > 1) and (len(leg_signatures) != 2 or leg_signatures.count('MET') == 0):
663  index_jetLeg = leg_signatures.index('Jet')
664  multiplicity[index_jetLeg:index_jetLeg] = [1] * (len(chainDicts[0]['chainMultiplicities']) - len(multiplicity))
665  sig_set = set([step['signature'] for step in chainDicts])
666  if len(sig_set) == 1 and ('Jet' in sig_set or 'Bjet' in sig_set):
667  self.onlyJets = True
668  if len(sig_set) == 2 and ('Jet' in sig_set and 'Bjet' in sig_set):
669  self.onlyJets = True
670 
671  self.multiplicity = multiplicity
672  self.comboHypoCfg = comboHypoCfg
673  self.comboToolConfs = list(comboToolConfs)
674  self.stepDicts = chainDicts # one dict per leg
675  self.isEmpty = (sum(multiplicity) == 0 or isEmpty)
676  if not self.isEmpty:
677  #self.relabelLegIdsForJets()
678  self.setChainPartIndices()
679  self.legIds = self.getLegIds() if len(multiplicity) > 1 else [0]
680  self.makeCombo()
681 
682  def createSequences(self):
683  """ creation of this step sequences with instantiation of the CAs"""
684  log.debug("creating sequences for step %s", self.name)
685  for seq in self.sequenceFunctions:
686  self.sequences.append(seq()) # create the sequences
687 
689  has_jets = False
690  leg_counter = []
691 
692  for step_dict in self.stepDicts:
693  if 'Jet' in step_dict['signatures'] or 'Bjet' in step_dict['signatures']:
694  has_jets = True
695  leg_counter += [len(step_dict['chainParts'])]
696  elif len(step_dict['chainParts']) > 1:
697  log.error("[relabelLegIdsForJets] this should only happen for jet chains, but the signatures are %s",step_dict['signatures'])
698  raise Exception("[relabelLegIdsForJets] leg labelling is probably wrong...")
699  else:
700  leg_counter +=[1]
701 
702  self.onlyJets = False
703  if len(leg_counter) == len(self.multiplicity):
704  self.onlyJets = True
705 
706  log.debug("[relabelLegIdsForJets] leg_counter: %s , onlyjets: %s, multiplicity: %s...",leg_counter, self.onlyJets, self.multiplicity)
707 
708  if not has_jets or len(leg_counter) == len(self.multiplicity): #also don't relabel only jets since no offset needed
709  return
710 
711  if len(leg_counter) == 1 or (len(set(leg_counter)) == 1 and leg_counter[0] == 1):
712  #all legs are already length 1, or there's only one jet blocks nothing to do
713  return
714  elif len(set(leg_counter[:-1])) == 1 and leg_counter[0] == 1:
715  #it's the last leg that's not length one, so we don't need to relabel any end legs
716  return
717  else:
718  nLegs = 0
719  for i,nLegParts in enumerate(leg_counter):
720  oldLegName = self.stepDicts[i]['chainName']
721  if re.search('^leg[0-9]{3}_',oldLegName):
722  oldLegName = oldLegName[7:]
723  else:
724  log.error("[relabelLegIdsForJets] you told me to relabel the legs for %s",self.stepDicts)
725  raise Exception("[relabelLegIdsForJets] you told me to relabel the legs but this leg doesn't have a legXXX_ name!")
726  self.stepDicts[i]['chainName'] = legName(oldLegName,nLegs)
727  nLegs += nLegParts
728  return
729 
730  #Heather updated for full jet chain dicts
732  leg_counter = 0
733  lists_of_chainPartNames = []
734  for step_dict in self.stepDicts:
735  if len(lists_of_chainPartNames) == 0:
736  lists_of_chainPartNames += [[cp['chainPartName'] for cp in step_dict['chainParts']]]
737  else:
738  new_list_of_chainPartNames = [cp['chainPartName'] for cp in step_dict['chainParts']]
739  if new_list_of_chainPartNames == lists_of_chainPartNames[-1]:
740  leg_counter -= len(new_list_of_chainPartNames)
741  for chainPart in step_dict['chainParts']:
742  chainPart['chainPartIndex'] = leg_counter
743  leg_counter += 1
744  return
745 
746  def getLegIds(self):
747  leg_ids = []
748  for istep,step_dict in enumerate(self.stepDicts):
749  if step_dict['chainName'][0:3] != 'leg':
750  if self.onlyJets:
751  leg_ids += [istep]
752  else:
753  log.error("[getLegIds] chain %s has multiplicities %s but no legs? ",step_dict['chainName'], self.multiplicity)
754  raise Exception("[getLegIds] cannot extract leg IDs, exiting.")
755  else:
756  leg_ids += [int(step_dict['chainName'][3:6])]
757  return leg_ids
758 
759  def addComboHypoTools(self, tool):
760  #this function does not add tools, it just adds tool. do not pass it a list!
761  self.comboToolConfs.append(tool)
762 
763  def makeCombo(self):
764  self.combo = None
765  if self.isEmpty or self.comboHypoCfg is None:
766  return
767  comboName = CFNaming.comboHypoName(self.name)
768  key = hash((comboName, self.comboHypoCfg))
769  if key not in _ComboHypoPool:
770  _ComboHypoPool[key] = ComboMaker(comboName, self.comboHypoCfg)
771  self.combo = _ComboHypoPool[key]
772 
773 
774  def createComboHypoTools(self, flags, chainName):
775  chainDict = HLTMenuConfig.getChainDictFromChainName(chainName)
776  self.combo.createComboHypoTools(flags, chainDict, self.comboToolConfs)
777 
778  def getChainLegs(self):
779  """ This is extrapolating the chain legs from the step dictionaries"""
780  legs = [part['chainName'] for part in self.stepDicts]
781  return legs
782 
783  def getChainNames(self):
784  if self.combo is not None:
785  return list(self.combo.getChains())
786  return self.getChainLegs()
787 
788  def __repr__(self):
789  if len(self.sequenceFunctions) == 0:
790  return "--- ChainStep %s ---\n is Empty, ChainDict = %s "%(self.name, ' '.join(map(str, [dic['chainName'] for dic in self.stepDicts])) )
791 
792  repr_string= "--- ChainStep %s ---\n , multiplicity = %s ChainDict = %s \n + MenuSequences = %s "%\
793  (self.name, ' '.join(map(str,[mult for mult in self.multiplicity])),
794  ' '.join(map(str, [dic['chainName'] for dic in self.stepDicts])),
795  ' '.join(map(str, [seq.func.__name__ for seq in self.sequenceFunctions]) ))
796 
797  if self.combo is not None:
798  repr_string += "\n + ComboHypo = %s" % self.combo.Alg.name
799  if len(self.comboToolConfs)>0:
800  repr_string +=", ComboHypoTools = %s" %(' '.join(map(str, [tool.__name__ for tool in self.comboToolConfs])))
801  repr_string += "\n"
802  return repr_string
803 
804 
806  """ Class to handle in-event reco """
807  def __init__(self, name, inputMaker=None, **inputMakerArgs):
808  super( InEventRecoCA, self ).__init__()
809  self.name = name
810  self.recoSeq = None
811 
812  if inputMaker:
813  assert len(inputMakerArgs) == 0, "No support for explicitly passed input maker and and input maker arguments at the same time"
814  self.inputMakerAlg = inputMaker
815  else:
816  assert 'name' not in inputMakerArgs, "The name of input maker is predefined by the name of sequence"
817  args = {'name': "IM"+name,
818  'RoIsLink' : 'initialRoI',
819  'RoIs' : f'{name}RoIs',
820  'RoITool': CompFactory.ViewCreatorInitialROITool(),
821  'mergeUsingFeature': False}
822  args.update(**inputMakerArgs)
823  self.inputMakerAlg = CompFactory.InputMakerForRoI(**args)
824 
825  def addRecoSequence(self):
826  if self.recoSeq is None:
827  self.recoSeq = parOR( self.name )
828  self.addSequence( self.recoSeq )
829 
830  def mergeReco( self, ca ):
831  """ Merged CA moving reconstruction algorithms into the right sequence """
832  self.addRecoSequence()
833  return self.merge( ca, sequenceName=self.recoSeq.name )
834 
835  def addRecoAlgo( self, algo ):
836  """ Place algorithm in the correct reconstruction sequence """
837  self.addRecoSequence()
838  return self.addEventAlgo( algo, sequenceName=self.recoSeq.name )
839 
840  def inputMaker( self ):
841  return self.inputMakerAlg
842 
843 
844 
846  """ Class to handle in-view reco, sets up the View maker if not provided and exposes InputMaker so that more inputs to it can be added in the process of assembling the menu """
847  def __init__(self, name, viewMaker=None, isProbe=False, **viewMakerArgs):
848  super( InViewRecoCA, self ).__init__()
849  self.name = name +"_probe" if isProbe else name
850  def updateHandle(baseTool, probeTool, handleName):
851  if hasattr(baseTool, handleName) and getattr(baseTool, handleName).Path!="StoreGateSvc+":
852  setattr(probeTool, handleName, getattr(probeTool, handleName).Path + "_probe")
853 
854  if len(viewMakerArgs) != 0:
855  assert viewMaker is None, "No support for explicitly passed view maker and args for EventViewCreatorAlgorithm"
856 
857  if viewMaker:
858  assert len(viewMakerArgs) == 0, "No support for explicitly passed view maker and args for EventViewCreatorAlgorithm"
859  if isProbe:
860  self.viewMakerAlg = viewMaker.__class__(viewMaker.getName()+'_probe', **viewMaker._properties)
861  self.viewMakerAlg.Views = viewMaker.Views+'_probe'
862  roiTool = self.viewMakerAlg.RoITool.__class.__(self.viewMakerAlg.RoITool.getName()+'_probe', **self.viewMakerAlg.RoITool._properties)
863  log.debug(f"InViewRecoCA: Setting InputCachedViews on {self.viewMaker.getName()} to read decisions from tag leg {viewMaker.getName()}: {viewMaker.InputMakerOutputDecisions}")
864  self.viewMakerAlg.InputCachedViews = viewMaker.InputMakerOutputDecisions
865  updateHandle(viewMakerArgs['RoITool'], roiTool, "RoisWriteHandleKey")
866  if hasattr(viewMakerArgs['RoITool'], "RoiCreator"):
867  updateHandle(viewMakerArgs['RoITool'], roiTool, "ExtraPrefetchRoIsKey")
868  updateHandle(viewMakerArgs['RoITool'].RoiCreator, roiTool.RoiCreator, "RoisWriteHandleKey")
869 
870  self.viewMakerAlg.RoITool = roiTool
871  else:
872  self.viewMakerAlg = viewMaker
873  else:
874  assert 'name' not in viewMakerArgs, "The name of view maker is predefined by the name of sequence"
875  assert 'Views' not in viewMakerArgs, "The Views is predefined by the name of sequence"
876  assert 'ViewsNodeName' not in viewMakerArgs, "The ViewsNodeName is predefined by the name of sequence"
877  if 'RoITool' in viewMakerArgs:
878  roiTool = viewMakerArgs['RoITool']
879  else:
880  roiTool = CompFactory.ViewCreatorInitialROITool()
881 
882 
883  args = {'name': f'IM_{self.name}',
884  'ViewFallThrough' : True,
885  'RoIsLink' : 'initialRoI',
886  'RoITool' : roiTool,
887  'InViewRoIs' : f'{name}RoIs',
888  'Views' : f'{name}Views'+'_probe' if isProbe else f'{name}Views',
889  'ViewNodeName' : f'{name}InViews'+'_probe' if isProbe else f'{name}InViews',
890  'RequireParentView' : False,
891  'mergeUsingFeature' : False }
892  args.update(**viewMakerArgs)
893  self.viewMakerAlg = CompFactory.EventViewCreatorAlgorithm(**args)
894  if isProbe:
895  updateHandle(args['RoITool'], roiTool, "RoisWriteHandleKey")
896  if hasattr(args['RoITool'], "RoiCreator"):
897  updateHandle(args['RoITool'], roiTool, "ExtraPrefetchRoIsKey")
898  updateHandle(args['RoITool'].RoiCreator, roiTool.RoiCreator, "RoisWriteHandleKey")
899  self.viewsSeq = parOR( self.viewMakerAlg.ViewNodeName )
900  self.addSequence( self.viewsSeq )
901 
902  def mergeReco( self, ca ):
903  """ Merge CA moving reconstruction algorithms into the right sequence """
904  return self.merge( ca, sequenceName=self.viewsSeq.name )
905 
906 
907  def addRecoAlgo( self, algo ):
908  """ Place algorithm in the correct reconstruction sequence """
909  return self.addEventAlgo( algo, sequenceName=self.viewsSeq.name )
910 
911 
912  def inputMaker( self ):
913  return self.viewMakerAlg
914 
915 
917  """ CA component for MenuSequenceCA sequence """
918  def __init__(self, name, isProbe=False):
919  self.name = name+"_probe" if isProbe else name
920  self.isProbe=isProbe
921  super( SelectionCA, self ).__init__()
922 
925 
926  def wasMerged(self):
927  super( SelectionCA, self ).wasMerged()
928  self.hypoAcc.wasMerged()
929 
930  def mergeReco(self, recoCA, robPrefetchCA=None, upSequenceCA=None):
931  ''' upSequenceCA is the user CA to run before the recoCA'''
933  ca.addSequence(self.stepViewSequence)
934  if upSequenceCA:
935  ca.merge(upSequenceCA, sequenceName=self.stepViewSequence.name)
936  ca.addEventAlgo(recoCA.inputMaker(), sequenceName=self.stepViewSequence.name)
937  if robPrefetchCA:
938  ca.merge(robPrefetchCA, self.stepViewSequence.name)
939  ca.merge(recoCA, sequenceName=self.stepViewSequence.name)
940  self.merge(ca)
941 
942  def mergeHypo(self, other):
943  """To be used when the hypo alg configuration comes with auxiliary tools/services"""
944  self.hypoAcc.merge(other)
945 
946  def addHypoAlgo(self, algo):
947  """To be used when the hypo alg configuration does not require auxiliary tools/services"""
948  if self.isProbe:
949  newname = algo.getName()+'_probe'
950  algo.name=newname
951  self.hypoAcc.addEventAlgo(algo)
952 
953  def hypo(self):
954  """Access hypo algo (or throws)"""
955  h = findAlgorithmByPredicate(self.stepViewSequence, lambda alg: "HypoInputDecisions" in alg._descriptors ) # can't use isHypo
956  assert h is not None, "No hypo in SeelectionCA {}".format(self.name)
957  return h
958 
959  def inputMaker(self):
960  """Access Input Maker (or throws)"""
961  im = findAlgorithmByPredicate(self.stepViewSequence, lambda alg: "InputMakerInputDecisions" in alg._descriptors )
962  assert im is not None, "No input maker in SeelectionCA {}".format(self.name)
963  return im
964 
965  def topSequence(self):
966  return self.stepViewSequence
test_athena_ntuple_filter.seq
seq
filter configuration ## -> we use the special sequence 'AthMasterSeq' which is run before any other a...
Definition: test_athena_ntuple_filter.py:18
MenuComponents.AlgNode.readOutputList
def readOutputList(self)
Definition: MenuComponents.py:98
MenuComponents.Node.getOutputList
def getOutputList(self)
Definition: MenuComponents.py:42
MenuComponents.ChainStep.setChainPartIndices
def setChainPartIndices(self)
Definition: MenuComponents.py:731
MenuComponents.HypoAlgNode.initialOutput
initialOutput
Definition: MenuComponents.py:152
MenuComponents.ChainStep.getLegIds
def getLegIds(self)
Definition: MenuComponents.py:746
MenuComponents.ChainStep.comboHypoCfg
comboHypoCfg
Definition: MenuComponents.py:672
MenuComponents.EmptyMenuSequence.ca
ca
Definition: MenuComponents.py:327
MenuComponents.MenuSequenceCA.globalRecoCA
def globalRecoCA(self)
Definition: MenuComponents.py:440
MenuComponents.HypoToolConf.confAndCreate
def confAndCreate(self, flags, chainDict)
Definition: MenuComponents.py:144
MenuComponents.EmptyMenuSequenceCfg
def EmptyMenuSequenceCfg(flags, name)
Definition: MenuComponents.py:378
MenuComponents.AlgNode.addDefaultOutput
def addDefaultOutput(self)
Definition: MenuComponents.py:59
MenuComponents.InEventRecoCA.__init__
def __init__(self, name, inputMaker=None, **inputMakerArgs)
Definition: MenuComponents.py:807
MenuComponents.Node.inputs
inputs
Definition: MenuComponents.py:33
MenuComponents.InputMakerNode
Definition: MenuComponents.py:202
MenuComponents.ChainStep.name
name
Definition: MenuComponents.py:649
MenuComponents.EmptyMenuSequence.__del__
def __del__(self)
Definition: MenuComponents.py:331
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
MenuComponents.InEventRecoCA.inputMakerAlg
inputMakerAlg
Definition: MenuComponents.py:814
MenuComponents.Node.addOutput
def addOutput(self, name)
Definition: MenuComponents.py:36
vtune_athena.format
format
Definition: vtune_athena.py:14
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
MenuComponents.Chain.addTopo
def addTopo(self, topoPair, step="last")
Definition: MenuComponents.py:617
MenuComponents.ChainStep.makeCombo
def makeCombo(self)
Definition: MenuComponents.py:763
AthenaPoolTestReadDoubleSelector.topSequence
topSequence
Definition: AthenaPoolTestReadDoubleSelector.py:18
MenuComponents.MenuSequenceCA._hypo
_hypo
Definition: MenuComponents.py:415
MenuComponents.ChainStep.addComboHypoTools
def addComboHypoTools(self, tool)
Definition: MenuComponents.py:759
MenuComponents.MenuSequenceCA.buildDFDot
def buildDFDot(self, cfseq_algs, all_hypos, last_step_hypo_nodes, file)
Definition: MenuComponents.py:478
MenuComponents.ChainStep.multiplicity
multiplicity
Definition: MenuComponents.py:671
python.CFElements.findAlgorithmByPredicate
def findAlgorithmByPredicate(startSequence, predicate, depth=1000000)
Definition: CFElements.py:126
MenuComponents.SelectionCA.inputMaker
def inputMaker(self)
Definition: MenuComponents.py:959
MenuComponents.ChainStep
Definition: MenuComponents.py:628
MenuComponents.InEventRecoCA.addRecoAlgo
def addRecoAlgo(self, algo)
Definition: MenuComponents.py:835
MenuComponents.MenuSequenceCA._hypoToolConf
_hypoToolConf
Definition: MenuComponents.py:418
MenuComponents.Node.outputs
outputs
Definition: MenuComponents.py:34
MenuComponents.SelectionCA.hypoAcc
hypoAcc
Definition: MenuComponents.py:924
MenuComponents.Chain.numberAllSteps
def numberAllSteps(self)
Definition: MenuComponents.py:535
MenuComponents.AlgNode.resetOutput
def resetOutput(self)
Definition: MenuComponents.py:81
MenuComponents.HypoToolConf.create
def create(self, flags)
Definition: MenuComponents.py:137
MenuComponents.SelectionCA.wasMerged
def wasMerged(self)
Definition: MenuComponents.py:926
python.TrigConfigSvcUtils.getChains
def getChains(connection, smk)
Definition: TrigConfigSvcUtils.py:592
MenuComponents.HypoAlgNode.previous
previous
Definition: MenuComponents.py:156
MenuComponents.AlgNode
Definition: MenuComponents.py:52
dumpHVPathFromNtuple.append
bool append
Definition: dumpHVPathFromNtuple.py:91
MenuComponents.MenuSequenceCA.sequence
def sequence(self)
Definition: MenuComponents.py:448
MenuComponents.EmptyMenuSequence.getOutputList
def getOutputList(self)
Definition: MenuComponents.py:354
MenuComponents.SelectionCA.mergeReco
def mergeReco(self, recoCA, robPrefetchCA=None, upSequenceCA=None)
Definition: MenuComponents.py:930
MenuComponents.EmptyMenuSequence.__repr__
def __repr__(self)
Definition: MenuComponents.py:374
XMLtoHeader.count
count
Definition: XMLtoHeader.py:85
MenuComponents.ChainStep.__repr__
def __repr__(self)
Definition: MenuComponents.py:788
MenuComponents.ComboMaker.getChains
def getChains(self)
Definition: MenuComponents.py:289
MenuComponents.ChainStep.relabelLegIdsForJets
def relabelLegIdsForJets(self)
Definition: MenuComponents.py:688
MenuComponents.InViewRecoCA.viewsSeq
viewsSeq
Definition: MenuComponents.py:899
MenuComponents.Node.Alg
Alg
Definition: MenuComponents.py:32
HLTCFTools.isHypoBase
def isHypoBase(alg)
Definition: HLTCFTools.py:31
MenuComponents.ChainStep.sequenceFunctions
sequenceFunctions
Definition: MenuComponents.py:651
MenuComponents.EmptyMenuSequence.globalRecoCA
def globalRecoCA(self)
Definition: MenuComponents.py:347
MenuComponents.InViewRecoCA.name
name
Definition: MenuComponents.py:849
MenuComponents.EmptyMenuSequence
Definition: MenuComponents.py:310
MenuComponents.HypoToolConf.__init__
def __init__(self, hypoToolGen)
Definition: MenuComponents.py:126
MenuComponents.EmptyMenuSequence._maker
_maker
Definition: MenuComponents.py:324
MenuComponents.InEventRecoCA.inputMaker
def inputMaker(self)
Definition: MenuComponents.py:840
MenuComponents.Chain.nSteps
nSteps
Definition: MenuComponents.py:506
MenuComponents.ChainStep.getChainLegs
def getChainLegs(self)
Definition: MenuComponents.py:778
MenuComponents.SelectionCA.__init__
def __init__(self, name, isProbe=False)
Definition: MenuComponents.py:918
MenuComponents.isEmptySequenceCfg
def isEmptySequenceCfg(o)
Definition: MenuComponents.py:381
MenuComponents.InEventRecoCA.recoSeq
recoSeq
Definition: MenuComponents.py:810
MenuComponents.HypoToolConf.chainDict
chainDict
Definition: MenuComponents.py:135
MenuComponents.Chain.topoMap
topoMap
Definition: MenuComponents.py:515
MenuComponents.MenuSequenceCA.maker
def maker(self)
Definition: MenuComponents.py:452
MenuComponents.ComboMaker.createComboHypoTools
def createComboHypoTools(self, flags, chainDict, comboToolConfs)
Definition: MenuComponents.py:294
convertTimingResiduals.sum
sum
Definition: convertTimingResiduals.py:55
MenuComponents.EmptyMenuSequence.connectToFilter
def connectToFilter(self, outfilter)
Definition: MenuComponents.py:357
python.CFElements.seqAND
def seqAND(name, subs=[])
Definition: CFElements.py:25
MenuComponents.Node.__repr__
def __repr__(self)
Definition: MenuComponents.py:48
MenuComponents.Node.getInputList
def getInputList(self)
Definition: MenuComponents.py:45
HLTCFTools.isInputMakerBase
def isInputMakerBase(alg)
Definition: HLTCFTools.py:40
MenuComponents.EmptyMenuSequence._name
_name
Definition: MenuComponents.py:315
MenuComponents.Chain.steps
steps
Definition: MenuComponents.py:505
python.JetAnalysisCommon.parOR
parOR
Definition: JetAnalysisCommon.py:271
MenuComponents.InEventRecoCA.mergeReco
def mergeReco(self, ca)
Definition: MenuComponents.py:830
MenuComponents.ChainStep.legIds
legIds
Definition: MenuComponents.py:679
MenuComponents.InputMakerNode.__init__
def __init__(self, Alg)
Definition: MenuComponents.py:203
MenuComponents.ComboMaker.comboHypoCfg
comboHypoCfg
Definition: MenuComponents.py:216
MenuComponents.InEventRecoCA.name
name
Definition: MenuComponents.py:809
MenuComponents.ChainStep.createSequences
def createSequences(self)
Definition: MenuComponents.py:682
python.TrigCompositeUtils.legName
def legName(chainName, legCounter)
Definition: DecisionHandling/python/TrigCompositeUtils.py:12
MenuComponents.InViewRecoCA.addRecoAlgo
def addRecoAlgo(self, algo)
Definition: MenuComponents.py:907
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
MenuComponents.ComboMaker.prop1
prop1
Definition: MenuComponents.py:214
MenuComponents.Chain
Definition: MenuComponents.py:495
MenuComponents.ChainStep.sequences
sequences
Definition: MenuComponents.py:650
histSizes.list
def list(name, path='/')
Definition: histSizes.py:38
MenuComponents.AlgNode.outputProp
outputProp
Definition: MenuComponents.py:56
MenuComponents.ComboMaker
Definition: MenuComponents.py:212
MenuComponents.ChainStep.getChainNames
def getChainNames(self)
Definition: MenuComponents.py:783
MenuComponents.HypoAlgNode.__repr__
def __repr__(self)
Definition: MenuComponents.py:194
MenuComponents.AlgNode.readInputList
def readInputList(self)
Definition: MenuComponents.py:115
MenuComponents.MenuSequenceCA.connectToFilter
def connectToFilter(self, outfilter)
Definition: MenuComponents.py:466
MenuComponents.Node.__init__
def __init__(self, Alg)
Definition: MenuComponents.py:30
MenuComponents.Chain.checkMultiplicity
def checkMultiplicity(self)
Definition: MenuComponents.py:596
MenuComponents.HypoToolConf.hasFlags
hasFlags
Definition: MenuComponents.py:128
MenuComponents.MenuSequenceCA.hypoAcc
hypoAcc
Definition: MenuComponents.py:395
MenuComponents.Chain.__init__
def __init__(self, name, ChainSteps, L1decisions, nSteps=[], alignmentGroups=[], topoMap=None)
Definition: MenuComponents.py:498
MenuComponents.MenuSequenceCA.__repr__
def __repr__(self)
Definition: MenuComponents.py:488
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
MenuComponents.AlgNode.addOutput
def addOutput(self, name)
Definition: MenuComponents.py:87
MenuComponents.SelectionCA.addHypoAlgo
def addHypoAlgo(self, algo)
Definition: MenuComponents.py:946
MenuComponents.ComboMaker.__del__
def __del__(self)
Definition: MenuComponents.py:233
MenuComponents.EmptyMenuSequence.sequence
def sequence(self)
Definition: MenuComponents.py:335
MenuComponents.Node
Definition: MenuComponents.py:28
MenuComponents.ChainStep.__init__
def __init__(self, name, Sequences=[], multiplicity=[1], chainDicts=[], comboHypoCfg=ComboHypoCfg, comboToolConfs=[], isEmpty=False, createsGhostLegs=False)
Definition: MenuComponents.py:630
MenuComponents.Chain.__repr__
def __repr__(self)
Definition: MenuComponents.py:622
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
MenuComponents.MenuSequenceCA.ca
ca
Definition: MenuComponents.py:392
MenuComponents.InEventRecoCA.addRecoSequence
def addRecoSequence(self)
Definition: MenuComponents.py:825
MenuComponents.ChainStep.combo
combo
Definition: MenuComponents.py:764
MenuComponents.HypoAlgNode.__init__
def __init__(self, Alg)
Definition: MenuComponents.py:153
MenuComponents.InViewRecoCA.mergeReco
def mergeReco(self, ca)
Definition: MenuComponents.py:902
MenuComponents.HypoAlgNode.addHypoTool
def addHypoTool(self, flags, hypoToolConf)
Definition: MenuComponents.py:169
MenuComponents.HypoToolConf
Definition: MenuComponents.py:124
MenuComponents.ComboMaker.__init__
def __init__(self, name, comboHypoCfg)
Definition: MenuComponents.py:213
MenuComponents.HypoAlgNode.setPreviousDecision
def setPreviousDecision(self, prev)
Definition: MenuComponents.py:185
MenuComponents.ComboMaker.prop2
prop2
Definition: MenuComponents.py:215
MenuComponents.AlgNode.addInput
def addInput(self, name)
Definition: MenuComponents.py:103
MenuComponents.ComboMaker.acc
acc
Definition: MenuComponents.py:217
MenuComponents.HypoToolConf.hypoToolGen
hypoToolGen
Definition: MenuComponents.py:129
MenuComponents.MenuSequenceCA._sequence
_sequence
Definition: MenuComponents.py:398
MenuComponents.MenuSequenceCA.addToSequencer
def addToSequencer(self, recoSeq_list, hypo_list)
Definition: MenuComponents.py:474
MenuComponents.ComboMaker.addInput
def addInput(self, name)
Definition: MenuComponents.py:257
MenuComponents.MenuSequenceCA.__del__
def __del__(self)
Definition: MenuComponents.py:433
MenuComponents.InViewRecoCA.inputMaker
def inputMaker(self)
Definition: MenuComponents.py:912
MenuComponents.ComboMaker.addChain
def addChain(self, chainDict)
Definition: MenuComponents.py:260
MenuComponents.MenuSequenceCA.hypo
def hypo(self)
Definition: MenuComponents.py:460
MenuComponents.EmptyMenuSequence.name
def name(self)
Definition: MenuComponents.py:351
MenuComponents.EmptyMenuSequence.maker
def maker(self)
Definition: MenuComponents.py:339
MenuComponents.MenuSequenceCA.__init__
def __init__(self, flags, selectionCA, HypoToolGen, isProbe=None, globalRecoCA=None)
Definition: MenuComponents.py:389
MenuComponents.MenuSequenceCA.getOutputList
def getOutputList(self)
Definition: MenuComponents.py:463
MenuComponents.EmptyMenuSequence.buildDFDot
def buildDFDot(self, cfseq_algs, all_hypos, last_step_hypo_nodes, file)
Definition: MenuComponents.py:367
dqt_zlumi_pandas.update
update
Definition: dqt_zlumi_pandas.py:42
MenuComponents.InEventRecoCA
Definition: MenuComponents.py:805
MenuComponents.EmptyMenuSequence.getHypoToolConf
def getHypoToolConf(self)
Definition: MenuComponents.py:361
MenuComponents.ComboMaker.mapRawInputsToInputsIndex
def mapRawInputsToInputsIndex(self)
Definition: MenuComponents.py:249
MenuComponents.Chain.alignmentGroups
alignmentGroups
Definition: MenuComponents.py:507
MenuComponents.AlgNode.getPar
def getPar(self, prop)
Definition: MenuComponents.py:78
MenuComponents.ChainStep.onlyJets
onlyJets
Definition: MenuComponents.py:658
CaloCondBlobAlgs_fillNoiseFromASCII.hash
dictionary hash
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:109
MenuComponents.ComboMaker.create
def create(self, name)
Definition: MenuComponents.py:236
MenuComponents.AlgNode.inputProp
inputProp
Definition: MenuComponents.py:57
MenuComponents.MenuSequenceCA._name
_name
Definition: MenuComponents.py:414
MenuComponents.InViewRecoCA
Definition: MenuComponents.py:845
MenuComponents.Chain.L1decisions
L1decisions
Definition: MenuComponents.py:521
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
MenuComponents.ChainStep.createComboHypoTools
def createComboHypoTools(self, flags, chainName)
Definition: MenuComponents.py:774
MenuComponents.SelectionCA.mergeHypo
def mergeHypo(self, other)
Definition: MenuComponents.py:942
MenuComponents.AlgNode.__repr__
def __repr__(self)
Definition: MenuComponents.py:120
MenuComponents.SelectionCA.isProbe
isProbe
Definition: MenuComponents.py:920
MenuComponents.SelectionCA.stepViewSequence
stepViewSequence
Definition: MenuComponents.py:923
MenuComponents.HypoToolConf.name
name
Definition: MenuComponents.py:130
MenuComponents.Node.addInput
def addInput(self, name)
Definition: MenuComponents.py:39
MenuComponents.AlgNode.resetPar
def resetPar(self, prop)
Definition: MenuComponents.py:71
MenuComponents.HypoToolConf.setConf
def setConf(self, chainDict)
Definition: MenuComponents.py:132
MenuComponents.HypoAlgNode.addOutput
def addOutput(self, name)
Definition: MenuComponents.py:158
pickleTool.object
object
Definition: pickleTool.py:30
MenuComponents.ChainStep.stepDicts
stepDicts
Definition: MenuComponents.py:674
str
Definition: BTagTrackIpAccessor.cxx:11
MenuComponents.EmptyMenuSequence._sequence
_sequence
Definition: MenuComponents.py:325
MenuComponents.SelectionCA.hypo
def hypo(self)
Definition: MenuComponents.py:953
MenuComponents.AlgNode.setPar
def setPar(self, propname, value)
Definition: MenuComponents.py:63
MenuComponents.SelectionCA
Definition: MenuComponents.py:916
MenuComponents.EmptyMenuSequence.__init__
def __init__(self, the_name)
Definition: MenuComponents.py:313
MenuComponents.HypoAlgNode
Definition: MenuComponents.py:150
MenuComponents.MenuSequenceCA.getHypoToolConf
def getHypoToolConf(self)
Definition: MenuComponents.py:471
MenuComponents.Chain.append_step_to_jet
def append_step_to_jet(self, new_steps)
Definition: MenuComponents.py:529
MenuComponents.MenuSequenceCA
Definition: MenuComponents.py:384
MenuComponents.Node.name
name
Definition: MenuComponents.py:31
MenuComponents.MenuSequenceCA._maker
_maker
Definition: MenuComponents.py:404
MenuComponents.Chain.insertEmptySteps
def insertEmptySteps(self, empty_step_name, n_new_steps, start_position)
Definition: MenuComponents.py:549
MenuComponents.AlgNode.__init__
def __init__(self, Alg, inputProp, outputProp)
Definition: MenuComponents.py:54
MenuComponents.InViewRecoCA.viewMakerAlg
viewMakerAlg
Definition: MenuComponents.py:860
HLTCFTools.algColor
def algColor(alg)
Definition: HLTCFTools.py:15
MenuComponents.ChainStep.isEmpty
isEmpty
Definition: MenuComponents.py:675
MenuComponents.HypoAlgNode.resetDecisions
def resetDecisions(self)
Definition: MenuComponents.py:189
MenuComponents.ChainStep.comboToolConfs
comboToolConfs
Definition: MenuComponents.py:673
merge
Definition: merge.py:1
MenuComponents.InViewRecoCA.__init__
def __init__(self, name, viewMaker=None, isProbe=False, **viewMakerArgs)
Definition: MenuComponents.py:847
MenuComponents.EmptyMenuSequence.addToSequencer
def addToSequencer(self, recoSeq_list, hypo_list)
Definition: MenuComponents.py:364
MenuComponents.Chain.append_bjet_steps
def append_bjet_steps(self, new_steps)
Definition: MenuComponents.py:524
MenuComponents.AlgNode.resetInput
def resetInput(self)
Definition: MenuComponents.py:84
MenuComponents.SelectionCA.name
name
Definition: MenuComponents.py:919
MenuComponents.MenuSequenceCA._globalCA
_globalCA
Definition: MenuComponents.py:393
MenuComponents.SelectionCA.topSequence
def topSequence(self)
Definition: MenuComponents.py:965
MenuComponents.MenuSequenceCA.name
def name(self)
Definition: MenuComponents.py:444
MenuComponents.Chain.name
name
Definition: MenuComponents.py:504