ATLAS Offline Software
ConfigFactory.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2 
3 # This file defines a factory method that can create a configuration
4 # block sequence based on a passed in name. This avoids having to
5 # import all the various config block sequence makers in the
6 # configuration code, and also would make it easier to create them
7 # from a text configuration file.
8 
9 # This relies heavily on the blocks exposing all configurable
10 # parameters as options, since there is no other mechanism to
11 # configure them through this interface.
12 
13 # The implementation itself is probably not the best possible, it
14 # lacks all extensibility, gathers all information in a single place,
15 # etc. Still for now (08 Dec 22) this ought to be good enough.
16 
17 
18 import inspect
19 from AnalysisAlgorithmsConfig.ConfigSequence import ConfigSequence
20 
21 from AnaAlgorithm.Logging import logging
22 logCPAlgCfgFactory = logging.getLogger('CPAlgCfgFactory')
23 
24 
25 def getDefaultArgs(func):
26  """return dict(par, val) with all func parameters with defualt values"""
27  signature = inspect.signature(func)
28  return {
29  k: v.default
30  for k, v in signature.parameters.items()
31  if v.default is not inspect.Parameter.empty
32  }
33 
34 
35 def getFuncArgs(func):
36  """return list of input parameters"""
37  if inspect.isclass(func):
38  args = list(inspect.signature(func.__init__).parameters.keys())
39  args.remove('self')
40  else:
41  args = list(inspect.signature(func).parameters.keys())
42  return args
43 
44 
45 # class for config block information
46 class FactoryBlock():
47  """
48  """
49  def __init__(self, alg, factoryName, algName, options, defaults, subAlgs=None):
50  self.alg = alg
51  self.factoryName = factoryName
52  self.algName = algName
53  self.options = options
54  self.defaults = defaults
55  if subAlgs is None:
56  self.subAlgs = {}
57  else:
58  self.subAlgs = subAlgs
59 
60 
61  def makeConfig(self, funcOptions):
62  """
63  Parameters
64  ----------
65  funcName: str
66  name associated with the algorithm. This name must have been added to the
67  list of available algorithms
68  funcOptions: dict
69  dictionary containing options for the algorithm read from the YAML file
70 
71  Returns
72  -------
73  configSequence
74  """
75  configSeq = ConfigSequence()
76 
77  func = self.alg
78  funcName = self.algName
79  funcDefaults = getDefaultArgs(func)
80  defaults = self.defaults
81 
82  args = {}
83  # loop over all options for the function
84  for arg in getFuncArgs(func):
85  # supplied from config file
86  if arg in funcOptions:
87  args[arg] = funcOptions[arg]
88  # defaults set in function def
89  elif arg in funcDefaults:
90  args[arg] = funcDefaults[arg]
91  # defaults provided when func was added
92  elif defaults is not None and arg in defaults:
93  args[arg] = defaults[arg]
94  elif arg == 'seq':
95  # 'seq' should be first arg of func (not needed for class)
96  args[arg] = configSeq
97  elif arg == 'kwargs':
98  # cannot handle arbitrary parameters
99  continue
100  else:
101  raise ValueError(f"{arg} is required for {funcName}")
102  if inspect.isclass(func):
103  configSeq.append(func(**args))
104  else:
105  func(**args)
106  configSeq.setFactoryName(self.factoryName)
107  return configSeq, args.keys()
108 
109 
111  """This class provides a configuration manager that is intended to allow the user to:
112  - define and configure functions that return an algSequence(?) object
113  """
114  def __init__(self, addDefaultBlocks=True):
115  self.ROOTNAME = 'root' # constant
116  self._algs = {}
117  self._order = {self.ROOTNAME: []}
118  if addDefaultBlocks:
119  self.addDefaultAlgs()
120 
121 
122  def addAlgConfigBlock(self, algName, alg, defaults=None, pos=None, superBlocks=None):
123  """Add class to list of available algorithms"""
124  if not callable(alg):
125  raise ValueError(f"{algName} is not a callable.")
126  opts = getFuncArgs(alg)
127 
128  if superBlocks is None:
129  superBlocks = [self.ROOTNAME]
130  elif not isinstance(superBlocks, list):
131  superBlocks = [superBlocks]
132 
133  # add new alg block to subAlgs dict of super block
134  for block in superBlocks:
135  if block not in self._order:
136  self._order[block] = []
137  order = self._order[block]
138 
139  if block == self.ROOTNAME:
140  algs = self._algs
141  else:
142  if block not in self._algs:
143  raise ValueError(f"{block} not added")
144  algs = self._algs[block].subAlgs
145 
146  if alg in algs:
147  raise ValueError(f"{algName} has already been added.")
148 
149  if block != self.ROOTNAME:
150  factoryName = f"{block}.{algName}"
151  else :
152  factoryName = algName
153 
154  # create FactoryBlock with alg information
155  algs[algName] = FactoryBlock(
156  alg=alg,
157  factoryName=factoryName,
158  algName=algName,
159  options=opts,
160  defaults=defaults,
161  subAlgs={}
162  )
163  # insert into order (list)
164  if pos is None:
165  order.append(algName)
166  elif pos in order:
167  order.insert(order.index(pos), algName)
168  else:
169  raise ValueError(f"{pos} does not exit in already added config blocks")
170  return
171 
172 
173  def printAlgs(self, printOpts=True):
174  """Prints algorithms exposed to configuration"""
175  printed = [] # some subblocks exist for multiple superblocks
176  def printAlg(algs):
177  for alg, algInfo in algs.items():
178  algName = algInfo.alg.__name__
179  algOptions = algInfo.options
180  if algName not in printed:
181  printed.append(algName)
182  logCPAlgCfgFactory.info(f"\033[4m{alg}\033[0m -> \033[4m{algName}\033[0m")
183  if printOpts:
184  try:
185  if inspect.isclass(algInfo.alg):
186  # block
187  algInfo.alg().printOptions(verbose=printOpts)
188  else:
189  # make function
190  seq = ConfigSequence()
191  algInfo.alg(seq=seq)
192  seq.printOptions(verbose=printOpts)
193  except Exception:
194  # either a TypeError or something else due to missing args
195  # try to print something for casses with required args
196  for opt in algOptions:
197  logCPAlgCfgFactory.info(f" {opt}")
198  printAlg(algInfo.subAlgs)
199  printAlg(self._algs)
200  return
201 
202 
203  def makeConfig(self, name, **kwargs):
204  """
205  Returns:
206  configSeq: configSequence object
207  """
208  try:
209  if '.' in name:
210  algContext, algName = name.split('.')
211  block = self._algs[algContext].subAlgs[algName]
212  else:
213  block = self._algs[name]
214  except KeyError:
215  raise ValueError(f"{name} config block not found. Make sure context is correct.")
216  # Optional **kwargs are in the process of being retired. While the process is not fully complete
217  # we still need to allow them to be passed. However, for blocks where they have already been retired
218  # we want to raise an error so users don't experience undesirable behaviour where their extra options
219  # are being ignored, or run into related cryptic crashes.
220  already_fixed_blocks = {
221  'Electrons','Photons','Muons','TauJets','DiTauJets','MissingET','FlavourTagging','FlavourTaggingEventSF','XbbTagging',
222  'InDetTracks','KLFitter','PtEtaSelection','ObjectCutFlow','EventCutFlow','Thinning',
223  'IFFClassification','MCTCClassification','PerEventSF','SelectionDecoration','SystObjectLink'}
224  if kwargs and name.split('.')[-1] in already_fixed_blocks:
225  raise ValueError(f"Config block '{name}' no longer accepts **kwargs. Use config.setOptionValue('option', value) instead!")
226  configSeq, _ = block.makeConfig(kwargs)
227  return configSeq
228 
229 
230  def addDefaultAlgs(self):
231  """add algorithms and options"""
232 
233  # CommonServices
234  from AsgAnalysisAlgorithms.AsgAnalysisConfig import CommonServices
235  self.addAlgConfigBlock(algName="CommonServices", alg=CommonServices)
236 
237  # pileup reweighting
238  from AsgAnalysisAlgorithms.AsgAnalysisConfig import PileupReweightingBlock
239  self.addAlgConfigBlock(algName="PileupReweighting", alg=PileupReweightingBlock)
240 
241  # event cleaning
242  from AsgAnalysisAlgorithms.EventCleaningConfig import EventCleaningBlock
243  self.addAlgConfigBlock(algName="EventCleaning", alg=EventCleaningBlock)
244 
245  # trigger
246  from TriggerAnalysisAlgorithms.TriggerAnalysisConfig import Trigger
247  self.addAlgConfigBlock(algName="Trigger", alg=Trigger)
248  from TriggerAnalysisAlgorithms.TriggerAnalysisSFConfig import TriggerAnalysisSFBlock
249  self.addAlgConfigBlock(algName="TriggerMatching", alg=TriggerAnalysisSFBlock)
250 
251  # jets
252  from JetAnalysisAlgorithms.JetAnalysisConfig import makeJetAnalysisConfig
253  self.addAlgConfigBlock(algName="Jets", alg=makeJetAnalysisConfig)
254  from JetAnalysisAlgorithms.JetJvtAnalysisConfig import JetJvtAnalysisConfig
255  self.addAlgConfigBlock(algName="JVT", alg=JetJvtAnalysisConfig,
256  superBlocks="Jets")
257  from JetAnalysisAlgorithms.BJetCalibAnalysisConfig import BJetCalibAnalysisConfig
258  self.addAlgConfigBlock(algName="BJetCalib", alg=BJetCalibAnalysisConfig,
259  superBlocks="Jets")
260  from FTagAnalysisAlgorithms.FTagTrigMatchAnalysisConfig import FTagJetTrigMatchingBlock
261  self.addAlgConfigBlock(algName="FTagTriggerMatching", alg=FTagJetTrigMatchingBlock,
262  superBlocks="Jets")
263  from FTagAnalysisAlgorithms.FTagAnalysisConfig import FTagConfig
264  self.addAlgConfigBlock(algName="FlavourTagging", alg=FTagConfig,
265  defaults={'selectionName': ''},
266  superBlocks="Jets")
267  from FTagAnalysisAlgorithms.FTagSFAnalysisConfig import FlavourTaggingEventSF
268  self.addAlgConfigBlock(algName="FlavourTaggingEventSF",
269  alg=FlavourTaggingEventSF,
270  defaults={'selectionName': ''},
271  superBlocks="Jets")
272  from FTagAnalysisAlgorithms.XbbAnalysisConfig import XbbConfig
273  self.addAlgConfigBlock(algName="XbbTagging", alg=XbbConfig,
274  superBlocks="Jets")
275  from JetAnalysisAlgorithms.JetUncertaintiesConfig import JetUncertaintiesConfig
276  self.addAlgConfigBlock(algName="Uncertainties", alg=JetUncertaintiesConfig,
277  superBlocks="Jets")
278 
279  # electrons
280  from EgammaAnalysisAlgorithms.ElectronAnalysisConfig import ElectronCalibrationConfig
281  self.addAlgConfigBlock(algName="Electrons", alg=ElectronCalibrationConfig)
282  from EgammaAnalysisAlgorithms.ElectronAnalysisConfig import ElectronWorkingPointConfig
283  self.addAlgConfigBlock(algName="WorkingPoint", alg=ElectronWorkingPointConfig,
284  superBlocks="Electrons")
285  from EgammaAnalysisAlgorithms.ElectronAnalysisConfig import ElectronLRTMergedConfig
286  self.addAlgConfigBlock(algName="LRTMerging", alg=ElectronLRTMergedConfig,
287  superBlocks="Electrons")
288  from EgammaAnalysisAlgorithms.ElectronAnalysisConfig import ElectronTriggerAnalysisSFBlock
289  self.addAlgConfigBlock(algName="TriggerSF", alg=ElectronTriggerAnalysisSFBlock,
290  superBlocks="Electrons")
291 
292  # photons
293  from EgammaAnalysisAlgorithms.PhotonAnalysisConfig import PhotonCalibrationConfig
294  self.addAlgConfigBlock(algName="Photons", alg=PhotonCalibrationConfig)
295  from EgammaAnalysisAlgorithms.PhotonAnalysisConfig import PhotonWorkingPointConfig
296  self.addAlgConfigBlock(algName="WorkingPoint", alg=PhotonWorkingPointConfig,
297  superBlocks="Photons")
298  from EgammaAnalysisAlgorithms.PhotonExtraVariablesConfig import PhotonExtraVariablesBlock
299  self.addAlgConfigBlock(algName="ExtraVariables", alg=PhotonExtraVariablesBlock,
300  superBlocks="Photons")
301 
302  # muons
303  from MuonAnalysisAlgorithms.MuonAnalysisConfig import MuonCalibrationConfig
304  self.addAlgConfigBlock(algName="Muons", alg=MuonCalibrationConfig)
305  from MuonAnalysisAlgorithms.MuonAnalysisConfig import MuonWorkingPointConfig
306  self.addAlgConfigBlock(algName="WorkingPoint", alg=MuonWorkingPointConfig,
307  superBlocks="Muons")
308  from MuonAnalysisAlgorithms.MuonAnalysisConfig import MuonTriggerAnalysisSFBlock
309  self.addAlgConfigBlock(algName="TriggerSF", alg=MuonTriggerAnalysisSFBlock,
310  superBlocks="Muons")
311  from MuonAnalysisAlgorithms.MuonAnalysisConfig import MuonLRTMergedConfig
312  self.addAlgConfigBlock(algName="LRTMerging", alg=MuonLRTMergedConfig,
313  superBlocks="Muons")
314  from MuonAnalysisAlgorithms.MuonAnalysisConfig import MuonContainerMergingConfig
315  self.addAlgConfigBlock(algName="ContainerMerging", alg=MuonContainerMergingConfig,
316  superBlocks="Muons")
317 
318  # tauJets
319  from TauAnalysisAlgorithms.TauAnalysisConfig import TauCalibrationConfig
320  self.addAlgConfigBlock(algName="TauJets", alg=TauCalibrationConfig)
321  from TauAnalysisAlgorithms.TauAnalysisConfig import TauWorkingPointConfig
322  self.addAlgConfigBlock(algName="WorkingPoint", alg=TauWorkingPointConfig,
323  superBlocks="TauJets")
324  from TauAnalysisAlgorithms.TauAnalysisConfig import TauTriggerAnalysisSFBlock
325  self.addAlgConfigBlock(algName="TriggerSF", alg=TauTriggerAnalysisSFBlock,
326  superBlocks="TauJets")
327 
328  # diTauJets
329  from TauAnalysisAlgorithms.DiTauAnalysisConfig import DiTauCalibrationConfig
330  self.addAlgConfigBlock(algName="DiTauJets", alg=DiTauCalibrationConfig)
331  from TauAnalysisAlgorithms.DiTauAnalysisConfig import DiTauWorkingPointConfig
332  self.addAlgConfigBlock(algName="WorkingPoint", alg=DiTauWorkingPointConfig,
333  superBlocks="DiTauJets")
334 
335  # tracks
336  from TrackingAnalysisAlgorithms.TrackingAnalysisConfig import InDetTrackCalibrationConfig
337  self.addAlgConfigBlock(algName="InDetTracks", alg=InDetTrackCalibrationConfig)
338  from TrackingAnalysisAlgorithms.TrackingAnalysisConfig import InDetTrackWorkingPointConfig
339  self.addAlgConfigBlock(algName="WorkingPoint", alg=InDetTrackWorkingPointConfig,
340  superBlocks="InDetTracks")
341 
342  # SystObjectLink
343  from AsgAnalysisAlgorithms.SystObjectLinkConfig import SystObjectLinkBlock
344  self.addAlgConfigBlock(algName="SystObjectLink", alg=SystObjectLinkBlock,
345  superBlocks=[self.ROOTNAME, "Jets", "Electrons", "Photons", "Muons", "TauJets"])
346 
347  # Particle-level truth algorithms
348  from TruthParticleLevelAnalysisAlgorithms.ParticleLevelElectronsConfig import ParticleLevelElectronsBlock
349  self.addAlgConfigBlock(algName="PL_Electrons", alg=ParticleLevelElectronsBlock)
350  from TruthParticleLevelAnalysisAlgorithms.ParticleLevelMuonsConfig import ParticleLevelMuonsBlock
351  self.addAlgConfigBlock(algName="PL_Muons", alg=ParticleLevelMuonsBlock)
352  from TruthParticleLevelAnalysisAlgorithms.ParticleLevelNeutrinosConfig import ParticleLevelNeutrinosBlock
353  self.addAlgConfigBlock(algName="PL_Neutrinos", alg=ParticleLevelNeutrinosBlock)
354  from TruthParticleLevelAnalysisAlgorithms.ParticleLevelJetsConfig import ParticleLevelJetsBlock
355  self.addAlgConfigBlock(algName="PL_Jets", alg=ParticleLevelJetsBlock)
356  from TruthParticleLevelAnalysisAlgorithms.ParticleLevelTausConfig import ParticleLevelTausBlock
357  self.addAlgConfigBlock(algName="PL_Taus", alg=ParticleLevelTausBlock)
358  from TruthParticleLevelAnalysisAlgorithms.ParticleLevelPhotonsConfig import ParticleLevelPhotonsBlock
359  self.addAlgConfigBlock(algName="PL_Photons", alg=ParticleLevelPhotonsBlock)
360  from TruthParticleLevelAnalysisAlgorithms.ParticleLevelMissingETConfig import ParticleLevelMissingETBlock
361  self.addAlgConfigBlock(algName="PL_MissingET", alg=ParticleLevelMissingETBlock)
362  from TruthParticleLevelAnalysisAlgorithms.ParticleLevelOverlapRemovalConfig import ParticleLevelOverlapRemovalBlock
363  self.addAlgConfigBlock(algName="PL_OverlapRemoval", alg=ParticleLevelOverlapRemovalBlock)
364 
365  # IFF truth classification
366  from AsgAnalysisAlgorithms.AsgAnalysisConfig import IFFLeptonDecorationBlock
367  self.addAlgConfigBlock(algName="IFFClassification", alg=IFFLeptonDecorationBlock,
368  superBlocks=["Electrons", "Muons",
369  "PL_Electrons", "PL_Muons"])
370  # MCTC truth classification
371  from AsgAnalysisAlgorithms.AsgAnalysisConfig import MCTCLeptonDecorationBlock
372  self.addAlgConfigBlock(algName="MCTCClassification", alg=MCTCLeptonDecorationBlock,
373  superBlocks=["Electrons", "Muons", "TauJets",
374  "PL_Electrons", "PL_Muons", "PL_Taus"])
375 
376  # generator level analysis
377  from AsgAnalysisAlgorithms.AsgAnalysisConfig import GeneratorAnalysisBlock
378  self.addAlgConfigBlock(algName="GeneratorLevelAnalysis", alg=GeneratorAnalysisBlock)
379 
380  # pT/Eta Selection
381  from AsgAnalysisAlgorithms.AsgAnalysisConfig import PtEtaSelectionBlock
382  self.addAlgConfigBlock(algName="PtEtaSelection", alg=PtEtaSelectionBlock,
383  defaults={'selectionName': ''},
384  superBlocks=[self.ROOTNAME,
385  "Jets", "Electrons", "Photons", "Muons", "TauJets", "DiTauJets",
386  "PL_Jets", "PL_Electrons", "PL_Photons", "PL_Muons", "PL_Taus", "PL_Neutrinos"])
387 
388  # met
389  from MetAnalysisAlgorithms.MetAnalysisConfig import MetAnalysisConfig
390  self.addAlgConfigBlock(algName="MissingET", alg=MetAnalysisConfig)
391 
392  # overlap removal
393  from AsgAnalysisAlgorithms.OverlapAnalysisConfig import OverlapAnalysisConfig
394  self.addAlgConfigBlock(algName="OverlapRemoval", alg=OverlapAnalysisConfig,
395  defaults={'configName': 'OverlapRemoval'})
396 
397  # object-based cutflow
398  from AsgAnalysisAlgorithms.AsgAnalysisConfig import ObjectCutFlowBlock
399  self.addAlgConfigBlock(algName='ObjectCutFlow', alg=ObjectCutFlowBlock)
400 
401  # jet reclustering
402  from JetAnalysisAlgorithms.JetReclusteringConfig import JetReclusteringBlock
403  self.addAlgConfigBlock(algName="JetReclustering", alg=JetReclusteringBlock)
404 
405  # jet reclustering calibration
406  from JetAnalysisAlgorithms.ReclusteredJetCalibrationConfig import ReclusteredJetCalibrationBlock
407  self.addAlgConfigBlock(algName="ReclusteredJetCalibration", alg=ReclusteredJetCalibrationBlock)
408 
409  # event selection
410  from EventSelectionAlgorithms.EventSelectionConfig import makeMultipleEventSelectionConfigs
411  self.addAlgConfigBlock(algName='EventSelection', alg=makeMultipleEventSelectionConfigs)
412 
413  # event-based cutflow
414  from AsgAnalysisAlgorithms.AsgAnalysisConfig import EventCutFlowBlock
415  self.addAlgConfigBlock(algName='EventCutFlow', alg=EventCutFlowBlock,
416  defaults={'containerName': 'EventInfo', 'selectionName': ''})
417 
418  # bootstraps
419  from AsgAnalysisAlgorithms.BootstrapGeneratorConfig import BootstrapGeneratorConfig
420  self.addAlgConfigBlock(algName='Bootstraps', alg=BootstrapGeneratorConfig)
421 
422  # per-event scale factor calculation
423  from AsgAnalysisAlgorithms.AsgAnalysisConfig import PerEventSFBlock
424  self.addAlgConfigBlock(algName='PerEventSF', alg=PerEventSFBlock)
425 
426  # per-event unified lepton scale factor calculation
427  from AsgAnalysisAlgorithms.LeptonSFCalculatorConfig import LeptonSFCalculatorBlock
428  self.addAlgConfigBlock(algName='LeptonSF', alg=LeptonSFCalculatorBlock)
429 
430  # thinning
431  from AsgAnalysisAlgorithms.AsgAnalysisConfig import OutputThinningBlock
432  self.addAlgConfigBlock(algName="Thinning", alg=OutputThinningBlock,
433  defaults={'configName': 'Thinning'})
434 
435  # selection decorations
436  from AsgAnalysisAlgorithms.AsgAnalysisConfig import SelectionDecorationBlock
437  self.addAlgConfigBlock(algName='SelectionDecoration',
438  alg=SelectionDecorationBlock)
439 
440  # di-tau mass calculator
441  from TauAnalysisAlgorithms.DiTauMassConfig import DiTauMassBlock
442  self.addAlgConfigBlock(algName="DiTauMMC", alg=DiTauMassBlock)
443 
444  # IFF fake background estimator
445  from AsgAnalysisAlgorithms.FakeBkgConfig import FakeBkgBlock
446  self.addAlgConfigBlock(algName='FakeBkgCalculator', alg=FakeBkgBlock)
447 
448  # VGamma overlap removal
449  from AsgAnalysisAlgorithms.VGammaORConfig import VGammaORBlock
450  self.addAlgConfigBlock(algName='VGammaOR', alg=VGammaORBlock)
451 
452  # output
453  from AsgAnalysisAlgorithms.OutputAnalysisConfig import OutputAnalysisConfig
454  self.addAlgConfigBlock(algName="Output", alg=OutputAnalysisConfig,
455  defaults={'configName': 'Output'})
456 
457  # IOStats printouts
458  from AsgAnalysisAlgorithms.AsgAnalysisConfig import IOStatsBlock
459  self.addAlgConfigBlock(algName="IOStats", alg=IOStatsBlock)
460 
461  # configuration printer
462  from AsgAnalysisAlgorithms.PrintToolConfigAlgConfig import PrintToolConfigAlgBlock
463  self.addAlgConfigBlock(algName="PrintConfiguration", alg=PrintToolConfigAlgBlock)
464 
465  return
python.ConfigFactory.FactoryBlock.__init__
def __init__(self, alg, factoryName, algName, options, defaults, subAlgs=None)
Definition: ConfigFactory.py:49
python.ConfigFactory.ConfigFactory.printAlgs
def printAlgs(self, printOpts=True)
Definition: ConfigFactory.py:173
python.ConfigFactory.ConfigFactory
Definition: ConfigFactory.py:110
python.ConfigFactory.getDefaultArgs
def getDefaultArgs(func)
Definition: ConfigFactory.py:25
python.ConfigFactory.getFuncArgs
def getFuncArgs(func)
Definition: ConfigFactory.py:35
python.ConfigFactory.FactoryBlock
Definition: ConfigFactory.py:46
python.ConfigFactory.FactoryBlock.defaults
defaults
Definition: ConfigFactory.py:54
python.ConfigFactory.ConfigFactory.addDefaultAlgs
def addDefaultAlgs(self)
Definition: ConfigFactory.py:230
python.ConfigFactory.FactoryBlock.factoryName
factoryName
Definition: ConfigFactory.py:51
python.ConfigFactory.FactoryBlock.makeConfig
def makeConfig(self, funcOptions)
Definition: ConfigFactory.py:61
python.ConfigFactory.ConfigFactory.makeConfig
def makeConfig(self, name, **kwargs)
Definition: ConfigFactory.py:203
python.ConfigFactory.FactoryBlock.alg
alg
Definition: ConfigFactory.py:50
python.ConfigFactory.ConfigFactory._order
_order
Definition: ConfigFactory.py:117
histSizes.list
def list(name, path='/')
Definition: histSizes.py:38
python.ConfigFactory.FactoryBlock.options
options
Definition: ConfigFactory.py:53
python.ConfigFactory.ConfigFactory._algs
_algs
Definition: ConfigFactory.py:116
python.ConfigFactory.ConfigFactory.addAlgConfigBlock
def addAlgConfigBlock(self, algName, alg, defaults=None, pos=None, superBlocks=None)
Definition: ConfigFactory.py:122
python.ConfigFactory.ConfigFactory.__init__
def __init__(self, addDefaultBlocks=True)
Definition: ConfigFactory.py:114
python.ConfigFactory.ConfigFactory.ROOTNAME
ROOTNAME
Definition: ConfigFactory.py:115
python.ConfigFactory.FactoryBlock.subAlgs
subAlgs
Definition: ConfigFactory.py:56
python.ConfigFactory.FactoryBlock.algName
algName
Definition: ConfigFactory.py:52