41 def addAlgorithm(self, algClassOrObj, name = None, addFilterTools = [], addToSubSequence=True, *args, **kwargs):
43 Instantiate/add a monitoring algorithm
46 algClassOrObj -- the Configurable class object of the algorithm to create, or an instance
47 of the algorithm Configurable. The former is recommended. In the former case,
48 the name argument is required.
49 name -- the name of the algorithm to create. Required when passing a Configurable class object
50 as algClassOrObj. No effect if a Configurable instance is passed.
51 addToSubSequence -- if the algorithm should be added to a subsequence in the component accumulator,
52 or just to the top level sequence.
53 *args, **kwargs -- additional arguments will be forwarded to the Configurable constructor if
54 a Configurable class object is passed. No effect if a Configurable instance
58 algObj -- an algorithm Configurable object
60 from inspect
import isclass
61 if isclass(algClassOrObj):
63 raise TypeError(
'addAlgorithm with a class argument requires a name for the algorithm')
64 algObj = algClassOrObj(name, *args, **kwargs)
66 algObj = algClassOrObj
69 algObj.Environment = self.
flags.DQ.Environment
70 algObj.DataType = self.
flags.DQ.DataType.value
71 if self.
flags.DQ.useTrigger:
72 algObj.TrigDecisionTool = self.
resobj.getPublicTool(
"TrigDecisionTool")
74 if self.
flags.DQ.enableLumiAccess:
75 algObj.EnableLumi =
True
76 from LumiBlockComps.LuminosityCondAlgConfig
import LuminosityCondAlgCfg
77 self.
resobj.merge (LuminosityCondAlgCfg (self.
flags))
78 if not self.
flags.Input.isMC:
79 from LumiBlockComps.LBDurationCondAlgConfig
import LBDurationCondAlgCfg
80 from LumiBlockComps.TrigLiveFractionCondAlgConfig
import TrigLiveFractionCondAlgCfg
81 self.
resobj.merge (LBDurationCondAlgCfg (self.
flags))
82 self.
resobj.merge (TrigLiveFractionCondAlgCfg (self.
flags))
84 algObj.EnableLumi =
False
87 for obj
in addFilterTools:
89 if isinstance(obj, ComponentAccumulator):
90 filter = self.
resobj.popToolsAndMerge(obj)
91 elif hasattr(obj,
'getGaudiType')
and obj.getGaudiType() ==
'AlgTool':
94 raise ValueError(f
'Object {obj} passed to addFilterTools is not a ComponentAccumulator or an AlgTool')
95 algObj.FilterTools += [filter]
100 self.
resobj.addEventAlgo(algObj, sequenceName=self.
monSeq.name)
102 self.
resobj.addEventAlgo(algObj)
105 def addGroup(self, alg, name, topPath='', defaultDuration='run'):
106 '''Add a group to an algorithm
108 Technically, adding a GenericMonitoringTool instance. The name given here can be
109 used to retrieve the group from within the algorithm when calling the fill()
110 function. Note this is *not* the same thing as the Monitored::Group class. To
111 avoid replication of code, this calls the more general case, getArray with an 1D
115 alg -- algorithm Configurable object (e.g. one returned from addAlgorithm)
116 name -- name of the group
117 topPath -- directory name in the output ROOT file under which histograms will be
119 defaultDuration -- default time between histogram reset for all histograms in
120 group; can be overridden for each specific histogram
123 tool -- a GenericMonitoringTool Configurable object. This can be used to define
124 histograms associated with that group (using defineHistogram).
126 if alg
is not None and name == alg.getName():
127 raise ValueError(f
"Cannot have a monitoring group with the same name as the parent algorithm ({name})")
128 array = self.
addArray([1],alg,name,topPath=topPath,defaultDuration=defaultDuration)
131 def addArray(self, dimensions, alg, baseName, topPath='', defaultDuration='run'):
132 '''Add many groups to an algorithm
135 dimensions -- list holding the size in each dimension [n1,n2,n3,n4,...]
136 alg -- algorithm Configurable object
137 baseName -- base name of the group. postfixes are added by GMT Array initialize
138 topPath -- directory name in the output ROOT file under which histograms will be
140 duration -- default time between histogram reset for all histograms in group
143 tool -- a GenericMonitoringToolArray object. This is used to define histograms
144 associated with each group in the array.
147 from AthenaMonitoringKernel.GenericMonitoringTool
import GenericMonitoringArray
148 array = GenericMonitoringArray(self.
flags, baseName, dimensions)
153 pathToSet = self.
flags.DQ.FileKey+(
'/%s' % topPath
if topPath
else '')
154 if self.
flags.Output.HISTFileName:
155 pathToSet =
'/' + pathToSet
156 array.broadcast(
'HistPath',pathToSet)
157 array.broadcast(
'UseCache',
True)
158 convention =
'ONLINE' if self.
flags.Common.isOnline
else 'OFFLINE'
159 array.broadcast(
'convention', convention)
160 array.broadcast(
'defaultDuration',defaultDuration)
162 alg.GMTools += array.toolList()