19 from AnalysisAlgorithmsConfig.ConfigSequence
import ConfigSequence
21 from AnaAlgorithm.Logging
import logging
22 logCPAlgCfgFactory = logging.getLogger(
'CPAlgCfgFactory')
26 """return dict(par, val) with all func parameters with defualt values"""
27 signature = inspect.signature(func)
30 for k, v
in signature.parameters.items()
31 if v.default
is not inspect.Parameter.empty
36 """return list of input parameters"""
37 if inspect.isclass(func):
38 args =
list(inspect.signature(func.__init__).parameters.keys())
41 args =
list(inspect.signature(func).parameters.keys())
49 def __init__(self, alg, factoryName, algName, options, defaults, subAlgs=None):
66 name associated with the algorithm. This name must have been added to the
67 list of available algorithms
69 dictionary containing options for the algorithm read from the YAML file
75 configSeq = ConfigSequence()
86 if arg
in funcOptions:
87 args[arg] = funcOptions[arg]
89 elif arg
in funcDefaults:
90 args[arg] = funcDefaults[arg]
92 elif defaults
is not None and arg
in defaults:
93 args[arg] = defaults[arg]
101 raise ValueError(f
"{arg} is required for {funcName}")
102 if inspect.isclass(func):
103 configSeq.append(func(**args))
107 return configSeq, args.keys()
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
123 """Add class to list of available algorithms"""
124 if not callable(alg):
125 raise ValueError(f
"{algName} is not a callable.")
128 if superBlocks
is None:
130 elif not isinstance(superBlocks, list):
131 superBlocks = [superBlocks]
134 for block
in superBlocks:
135 if block
not in self.
_order:
137 order = self.
_order[block]
142 if block
not in self.
_algs:
143 raise ValueError(f
"{block} not added")
144 algs = self.
_algs[block].subAlgs
147 raise ValueError(f
"{algName} has already been added.")
150 factoryName = f
"{block}.{algName}"
152 factoryName = algName
157 factoryName=factoryName,
165 order.append(algName)
167 order.insert(order.index(pos), algName)
169 raise ValueError(f
"{pos} does not exit in already added config blocks")
174 """Prints algorithms exposed to configuration"""
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")
185 if inspect.isclass(algInfo.alg):
187 algInfo.alg().printOptions(verbose=printOpts)
190 seq = ConfigSequence()
192 seq.printOptions(verbose=printOpts)
196 for opt
in algOptions:
197 logCPAlgCfgFactory.info(f
" {opt}")
198 printAlg(algInfo.subAlgs)
206 configSeq: configSequence object
210 algContext, algName = name.split(
'.')
211 block = self.
_algs[algContext].subAlgs[algName]
213 block = self.
_algs[name]
215 raise ValueError(f
"{name} config block not found. Make sure context is correct.")
220 already_fixed_blocks = {
221 'Electrons',
'Photons',
'Muons',
'TauJets',
'DiTauJets',
'MissingET',
'FlavourTagging',
'FlavourTaggingEventSF',
'XbbTagging',
222 'InDetTracks',
'KLFitter',
'EventSelection',
'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)
231 """add algorithms and options"""
234 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import CommonServicesConfig
238 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import PileupReweightingBlock
242 from AsgAnalysisAlgorithms.EventCleaningConfig
import EventCleaningBlock
246 from TriggerAnalysisAlgorithms.TriggerAnalysisConfig
import Trigger
248 from TriggerAnalysisAlgorithms.TriggerAnalysisSFConfig
import TriggerAnalysisSFBlock
252 from JetAnalysisAlgorithms.JetAnalysisConfig
import makeJetAnalysisConfig
254 from JetAnalysisAlgorithms.JetJvtAnalysisConfig
import JetJvtAnalysisConfig
257 from JetAnalysisAlgorithms.BJetCalibAnalysisConfig
import BJetCalibAnalysisConfig
260 from FTagAnalysisAlgorithms.FTagAnalysisConfig
import FTagConfig
262 defaults={
'selectionName':
''},
264 from FTagAnalysisAlgorithms.FTagSFAnalysisConfig
import FlavourTaggingEventSF
266 alg=FlavourTaggingEventSF,
267 defaults={
'selectionName':
''},
269 from FTagAnalysisAlgorithms.XbbAnalysisConfig
import XbbConfig
274 from EgammaAnalysisAlgorithms.ElectronAnalysisConfig
import ElectronCalibrationConfig
276 from EgammaAnalysisAlgorithms.ElectronAnalysisConfig
import ElectronWorkingPointConfig
278 superBlocks=
"Electrons")
279 from EgammaAnalysisAlgorithms.ElectronAnalysisConfig
import ElectronLRTMergedConfig
281 superBlocks=
"Electrons")
282 from EgammaAnalysisAlgorithms.ElectronAnalysisConfig
import ElectronTriggerAnalysisSFBlock
284 superBlocks=
"Electrons")
287 from EgammaAnalysisAlgorithms.PhotonAnalysisConfig
import PhotonCalibrationConfig
289 from EgammaAnalysisAlgorithms.PhotonAnalysisConfig
import PhotonWorkingPointConfig
291 superBlocks=
"Photons")
292 from EgammaAnalysisAlgorithms.PhotonExtraVariablesConfig
import PhotonExtraVariablesBlock
294 superBlocks=
"Photons")
297 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonCalibrationConfig
299 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonWorkingPointConfig
302 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonTriggerAnalysisSFBlock
305 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonLRTMergedConfig
308 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonContainerMergingConfig
309 self.
addAlgConfigBlock(algName=
"ContainerMerging", alg=MuonContainerMergingConfig,
313 from TauAnalysisAlgorithms.TauAnalysisConfig
import TauCalibrationConfig
315 from TauAnalysisAlgorithms.TauAnalysisConfig
import TauWorkingPointConfig
317 superBlocks=
"TauJets")
318 from TauAnalysisAlgorithms.TauAnalysisConfig
import TauTriggerAnalysisSFBlock
320 superBlocks=
"TauJets")
323 from TauAnalysisAlgorithms.DiTauAnalysisConfig
import DiTauCalibrationConfig
325 from TauAnalysisAlgorithms.DiTauAnalysisConfig
import DiTauWorkingPointConfig
327 superBlocks=
"DiTauJets")
330 from TrackingAnalysisAlgorithms.TrackingAnalysisConfig
import InDetTrackCalibrationConfig
332 from TrackingAnalysisAlgorithms.TrackingAnalysisConfig
import InDetTrackWorkingPointConfig
334 superBlocks=
"InDetTracks")
337 from AsgAnalysisAlgorithms.SystObjectLinkConfig
import SystObjectLinkBlock
339 superBlocks=[self.
ROOTNAME,
"Jets",
"Electrons",
"Photons",
"Muons",
"TauJets"])
342 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelElectronsConfig
import ParticleLevelElectronsBlock
344 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelMuonsConfig
import ParticleLevelMuonsBlock
346 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelNeutrinosConfig
import ParticleLevelNeutrinosBlock
348 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelJetsConfig
import ParticleLevelJetsBlock
350 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelTausConfig
import ParticleLevelTausBlock
352 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelPhotonsConfig
import ParticleLevelPhotonsBlock
354 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelMissingETConfig
import ParticleLevelMissingETBlock
356 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelOverlapRemovalConfig
import ParticleLevelOverlapRemovalBlock
357 self.
addAlgConfigBlock(algName=
"PL_OverlapRemoval", alg=ParticleLevelOverlapRemovalBlock)
360 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import IFFLeptonDecorationBlock
361 self.
addAlgConfigBlock(algName=
"IFFClassification", alg=IFFLeptonDecorationBlock,
362 superBlocks=[
"Electrons",
"Muons",
363 "PL_Electrons",
"PL_Muons"])
365 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import MCTCLeptonDecorationBlock
366 self.
addAlgConfigBlock(algName=
"MCTCClassification", alg=MCTCLeptonDecorationBlock,
367 superBlocks=[
"Electrons",
"Muons",
"TauJets",
368 "PL_Electrons",
"PL_Muons",
"PL_Taus"])
371 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import GeneratorAnalysisBlock
372 self.
addAlgConfigBlock(algName=
"GeneratorLevelAnalysis", alg=GeneratorAnalysisBlock)
375 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import PtEtaSelectionBlock
377 defaults={
'selectionName':
''},
379 "Jets",
"Electrons",
"Photons",
"Muons",
"TauJets",
"DiTauJets",
380 "PL_Jets",
"PL_Electrons",
"PL_Photons",
"PL_Muons",
"PL_Taus",
"PL_Neutrinos"])
383 from MetAnalysisAlgorithms.MetAnalysisConfig
import MetAnalysisConfig
387 from AsgAnalysisAlgorithms.OverlapAnalysisConfig
import OverlapAnalysisConfig
389 defaults={
'configName':
'OverlapRemoval'})
392 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import ObjectCutFlowBlock
396 from JetAnalysisAlgorithms.JetReclusteringConfig
import JetReclusteringBlock
400 from JetAnalysisAlgorithms.ReclusteredJetCalibrationConfig
import ReclusteredJetCalibrationBlock
401 self.
addAlgConfigBlock(algName=
"ReclusteredJetCalibration", alg=ReclusteredJetCalibrationBlock)
404 from EventSelectionAlgorithms.EventSelectionConfig
import makeMultipleEventSelectionConfigs
405 self.
addAlgConfigBlock(algName=
'EventSelection', alg=makeMultipleEventSelectionConfigs)
408 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import EventCutFlowBlock
410 defaults={
'containerName':
'EventInfo',
'selectionName':
''})
413 from AsgAnalysisAlgorithms.BootstrapGeneratorConfig
import BootstrapGeneratorConfig
417 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import PerEventSFBlock
421 from AsgAnalysisAlgorithms.LeptonSFCalculatorConfig
import LeptonSFCalculatorBlock
425 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import OutputThinningBlock
427 defaults={
'configName':
'Thinning'})
430 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import SelectionDecorationBlock
432 alg=SelectionDecorationBlock)
435 from TauAnalysisAlgorithms.DiTauMassConfig
import DiTauMassBlock
439 from AsgAnalysisAlgorithms.FakeBkgConfig
import FakeBkgBlock
443 from AsgAnalysisAlgorithms.VGammaORConfig
import VGammaORBlock
447 from AsgAnalysisAlgorithms.OutputAnalysisConfig
import OutputAnalysisConfig
449 defaults={
'configName':
'Output'})
452 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import IOStatsBlock
456 from AsgAnalysisAlgorithms.PrintToolConfigAlgConfig
import PrintToolConfigAlgBlock
457 self.
addAlgConfigBlock(algName=
"PrintConfiguration", alg=PrintToolConfigAlgBlock)