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',
'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 CommonServices
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.FTagTrigMatchAnalysisConfig
import FTagJetTrigMatchingBlock
261 self.
addAlgConfigBlock(algName=
"FTagTriggerMatching", alg=FTagJetTrigMatchingBlock,
263 from FTagAnalysisAlgorithms.FTagAnalysisConfig
import FTagConfig
265 defaults={
'selectionName':
''},
267 from FTagAnalysisAlgorithms.FTagSFAnalysisConfig
import FlavourTaggingEventSF
269 alg=FlavourTaggingEventSF,
270 defaults={
'selectionName':
''},
272 from FTagAnalysisAlgorithms.XbbAnalysisConfig
import XbbConfig
275 from JetAnalysisAlgorithms.JetUncertaintiesConfig
import JetUncertaintiesConfig
280 from EgammaAnalysisAlgorithms.ElectronAnalysisConfig
import ElectronCalibrationConfig
282 from EgammaAnalysisAlgorithms.ElectronAnalysisConfig
import ElectronWorkingPointConfig
284 superBlocks=
"Electrons")
285 from EgammaAnalysisAlgorithms.ElectronAnalysisConfig
import ElectronLRTMergedConfig
287 superBlocks=
"Electrons")
288 from EgammaAnalysisAlgorithms.ElectronAnalysisConfig
import ElectronTriggerAnalysisSFBlock
290 superBlocks=
"Electrons")
293 from EgammaAnalysisAlgorithms.PhotonAnalysisConfig
import PhotonCalibrationConfig
295 from EgammaAnalysisAlgorithms.PhotonAnalysisConfig
import PhotonWorkingPointConfig
297 superBlocks=
"Photons")
298 from EgammaAnalysisAlgorithms.PhotonExtraVariablesConfig
import PhotonExtraVariablesBlock
300 superBlocks=
"Photons")
303 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonCalibrationConfig
305 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonWorkingPointConfig
308 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonTriggerAnalysisSFBlock
311 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonLRTMergedConfig
314 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonContainerMergingConfig
315 self.
addAlgConfigBlock(algName=
"ContainerMerging", alg=MuonContainerMergingConfig,
319 from TauAnalysisAlgorithms.TauAnalysisConfig
import TauCalibrationConfig
321 from TauAnalysisAlgorithms.TauAnalysisConfig
import TauWorkingPointConfig
323 superBlocks=
"TauJets")
324 from TauAnalysisAlgorithms.TauAnalysisConfig
import TauTriggerAnalysisSFBlock
326 superBlocks=
"TauJets")
329 from TauAnalysisAlgorithms.DiTauAnalysisConfig
import DiTauCalibrationConfig
331 from TauAnalysisAlgorithms.DiTauAnalysisConfig
import DiTauWorkingPointConfig
333 superBlocks=
"DiTauJets")
336 from TrackingAnalysisAlgorithms.TrackingAnalysisConfig
import InDetTrackCalibrationConfig
338 from TrackingAnalysisAlgorithms.TrackingAnalysisConfig
import InDetTrackWorkingPointConfig
340 superBlocks=
"InDetTracks")
343 from AsgAnalysisAlgorithms.SystObjectLinkConfig
import SystObjectLinkBlock
345 superBlocks=[self.
ROOTNAME,
"Jets",
"Electrons",
"Photons",
"Muons",
"TauJets"])
348 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelElectronsConfig
import ParticleLevelElectronsBlock
350 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelMuonsConfig
import ParticleLevelMuonsBlock
352 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelNeutrinosConfig
import ParticleLevelNeutrinosBlock
354 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelJetsConfig
import ParticleLevelJetsBlock
356 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelTausConfig
import ParticleLevelTausBlock
358 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelPhotonsConfig
import ParticleLevelPhotonsBlock
360 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelMissingETConfig
import ParticleLevelMissingETBlock
362 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelOverlapRemovalConfig
import ParticleLevelOverlapRemovalBlock
363 self.
addAlgConfigBlock(algName=
"PL_OverlapRemoval", alg=ParticleLevelOverlapRemovalBlock)
366 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import IFFLeptonDecorationBlock
367 self.
addAlgConfigBlock(algName=
"IFFClassification", alg=IFFLeptonDecorationBlock,
368 superBlocks=[
"Electrons",
"Muons",
369 "PL_Electrons",
"PL_Muons"])
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"])
377 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import GeneratorAnalysisBlock
378 self.
addAlgConfigBlock(algName=
"GeneratorLevelAnalysis", alg=GeneratorAnalysisBlock)
381 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import PtEtaSelectionBlock
383 defaults={
'selectionName':
''},
385 "Jets",
"Electrons",
"Photons",
"Muons",
"TauJets",
"DiTauJets",
386 "PL_Jets",
"PL_Electrons",
"PL_Photons",
"PL_Muons",
"PL_Taus",
"PL_Neutrinos"])
389 from MetAnalysisAlgorithms.MetAnalysisConfig
import MetAnalysisConfig
393 from AsgAnalysisAlgorithms.OverlapAnalysisConfig
import OverlapAnalysisConfig
395 defaults={
'configName':
'OverlapRemoval'})
398 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import ObjectCutFlowBlock
402 from JetAnalysisAlgorithms.JetReclusteringConfig
import JetReclusteringBlock
406 from JetAnalysisAlgorithms.ReclusteredJetCalibrationConfig
import ReclusteredJetCalibrationBlock
407 self.
addAlgConfigBlock(algName=
"ReclusteredJetCalibration", alg=ReclusteredJetCalibrationBlock)
410 from EventSelectionAlgorithms.EventSelectionConfig
import makeMultipleEventSelectionConfigs
411 self.
addAlgConfigBlock(algName=
'EventSelection', alg=makeMultipleEventSelectionConfigs)
414 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import EventCutFlowBlock
416 defaults={
'containerName':
'EventInfo',
'selectionName':
''})
419 from AsgAnalysisAlgorithms.BootstrapGeneratorConfig
import BootstrapGeneratorConfig
423 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import PerEventSFBlock
427 from AsgAnalysisAlgorithms.LeptonSFCalculatorConfig
import LeptonSFCalculatorBlock
431 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import OutputThinningBlock
433 defaults={
'configName':
'Thinning'})
436 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import SelectionDecorationBlock
438 alg=SelectionDecorationBlock)
441 from TauAnalysisAlgorithms.DiTauMassConfig
import DiTauMassBlock
445 from AsgAnalysisAlgorithms.FakeBkgConfig
import FakeBkgBlock
449 from AsgAnalysisAlgorithms.VGammaORConfig
import VGammaORBlock
453 from AsgAnalysisAlgorithms.OutputAnalysisConfig
import OutputAnalysisConfig
455 defaults={
'configName':
'Output'})
458 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import IOStatsBlock
462 from AsgAnalysisAlgorithms.PrintToolConfigAlgConfig
import PrintToolConfigAlgBlock
463 self.
addAlgConfigBlock(algName=
"PrintConfiguration", alg=PrintToolConfigAlgBlock)