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, algName, options, defaults, subAlgs=None):
65 name associated with the algorithm. This name must have been added to the
66 list of available algorithms
68 dictionary containing options for the algorithm read from the YAML file
74 configSeq = ConfigSequence()
85 if arg
in funcOptions:
86 args[arg] = funcOptions[arg]
88 elif arg
in funcDefaults:
89 args[arg] = funcDefaults[arg]
91 elif defaults
is not None and arg
in defaults:
92 args[arg] = defaults[arg]
100 raise ValueError(f
"{arg} is required for {funcName}")
101 if inspect.isclass(func):
102 configSeq.append(func(**args))
105 return configSeq, args.keys()
109 """This class provides a configuration manager that is intended to allow the user to:
110 - define and configure functions that return an algSequence(?) object
121 """Add class to list of available algorithms"""
122 if not callable(alg):
123 raise ValueError(f
"{algName} is not a callable.")
126 if superBlocks
is None:
128 elif not isinstance(superBlocks, list):
129 superBlocks = [superBlocks]
132 for block
in superBlocks:
133 if block
not in self.
_order:
135 order = self.
_order[block]
140 if block
not in self.
_algs:
141 raise ValueError(f
"{block} not added")
142 algs = self.
_algs[block].subAlgs
145 raise ValueError(f
"{algName} has already been added.")
157 order.append(algName)
159 order.insert(order.index(pos), algName)
161 raise ValueError(f
"{pos} does not exit in already added config blocks")
166 """Prints algorithms exposed to configuration"""
169 for alg, algInfo
in algs.items():
170 algName = algInfo.alg.__name__
171 algOptions = algInfo.options
172 if algName
not in printed:
173 printed.append(algName)
174 logCPAlgCfgFactory.info(f
"\033[4m{alg}\033[0m -> \033[4m{algName}\033[0m")
177 if inspect.isclass(algInfo.alg):
179 algInfo.alg().printOptions(verbose=printOpts)
182 seq = ConfigSequence()
184 seq.printOptions(verbose=printOpts)
188 for opt
in algOptions:
189 logCPAlgCfgFactory.info(f
" {opt}")
190 printAlg(algInfo.subAlgs)
198 configSeq: configSequence object
202 algContext, algName = name.split(
'.')
203 block = self.
_algs[algContext].subAlgs[algName]
205 block = self.
_algs[name]
207 raise ValueError(f
"{name} config block not found. Make sure context is correct.")
208 configSeq, _ = block.makeConfig(kwargs)
213 """add algorithms and options"""
216 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import CommonServicesConfig
220 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import PileupReweightingBlock
224 from AsgAnalysisAlgorithms.EventCleaningConfig
import EventCleaningBlock
228 from TriggerAnalysisAlgorithms.TriggerAnalysisConfig
import Trigger
230 from TriggerAnalysisAlgorithms.TriggerAnalysisSFConfig
import TriggerAnalysisSFBlock
234 from JetAnalysisAlgorithms.JetAnalysisConfig
import makeJetAnalysisConfig
236 from JetAnalysisAlgorithms.JetJvtAnalysisConfig
import JetJvtAnalysisConfig
239 from JetAnalysisAlgorithms.BJetCalibAnalysisConfig
import BJetCalibAnalysisConfig
242 from FTagAnalysisAlgorithms.FTagAnalysisConfig
import FTagConfig
244 defaults={
'selectionName':
''},
246 from FTagAnalysisAlgorithms.FTagSFAnalysisConfig
import FlavourTaggingEventSF
248 alg=FlavourTaggingEventSF,
249 defaults={
'selectionName':
''},
251 from FTagAnalysisAlgorithms.XbbAnalysisConfig
import XbbConfig
256 from EgammaAnalysisAlgorithms.ElectronAnalysisConfig
import ElectronCalibrationConfig
258 from EgammaAnalysisAlgorithms.ElectronAnalysisConfig
import ElectronWorkingPointConfig
260 superBlocks=
"Electrons")
261 from EgammaAnalysisAlgorithms.ElectronAnalysisConfig
import ElectronLRTMergedConfig
263 superBlocks=
"Electrons")
264 from EgammaAnalysisAlgorithms.ElectronAnalysisConfig
import ElectronTriggerAnalysisSFBlock
266 superBlocks=
"Electrons")
269 from EgammaAnalysisAlgorithms.PhotonAnalysisConfig
import PhotonCalibrationConfig
271 from EgammaAnalysisAlgorithms.PhotonAnalysisConfig
import PhotonWorkingPointConfig
273 superBlocks=
"Photons")
274 from EgammaAnalysisAlgorithms.PhotonExtraVariablesConfig
import PhotonExtraVariablesBlock
276 superBlocks=
"Photons")
279 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonCalibrationConfig
281 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonWorkingPointConfig
284 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonTriggerAnalysisSFBlock
287 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonLRTMergedConfig
290 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonContainerMergingConfig
291 self.
addAlgConfigBlock(algName=
"ContainerMerging", alg=MuonContainerMergingConfig,
295 from TauAnalysisAlgorithms.TauAnalysisConfig
import TauCalibrationConfig
297 from TauAnalysisAlgorithms.TauAnalysisConfig
import TauWorkingPointConfig
299 superBlocks=
"TauJets")
300 from TauAnalysisAlgorithms.TauAnalysisConfig
import TauTriggerAnalysisSFBlock
302 superBlocks=
"TauJets")
305 from AsgAnalysisAlgorithms.SystObjectLinkConfig
import SystObjectLinkBlock
307 superBlocks=[self.
ROOTNAME,
"Jets",
"Electrons",
"Photons",
"Muons",
"TauJets"])
310 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelElectronsConfig
import ParticleLevelElectronsBlock
312 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelMuonsConfig
import ParticleLevelMuonsBlock
314 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelNeutrinosConfig
import ParticleLevelNeutrinosBlock
316 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelJetsConfig
import ParticleLevelJetsBlock
318 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelTausConfig
import ParticleLevelTausBlock
320 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelPhotonsConfig
import ParticleLevelPhotonsBlock
322 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelMissingETConfig
import ParticleLevelMissingETBlock
324 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelOverlapRemovalConfig
import ParticleLevelOverlapRemovalBlock
325 self.
addAlgConfigBlock(algName=
"PL_OverlapRemoval", alg=ParticleLevelOverlapRemovalBlock)
328 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import IFFLeptonDecorationBlock
329 self.
addAlgConfigBlock(algName=
"IFFClassification", alg=IFFLeptonDecorationBlock,
330 superBlocks=[
"Electrons",
"Muons",
331 "PL_Electrons",
"PL_Muons"])
333 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import MCTCLeptonDecorationBlock
334 self.
addAlgConfigBlock(algName=
"MCTCClassification", alg=MCTCLeptonDecorationBlock,
335 superBlocks=[
"Electrons",
"Muons",
"TauJets",
336 "PL_Electrons",
"PL_Muons",
"PL_Taus"])
339 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import GeneratorAnalysisBlock
340 self.
addAlgConfigBlock(algName=
"GeneratorLevelAnalysis", alg=GeneratorAnalysisBlock)
343 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import PtEtaSelectionBlock
345 defaults={
'selectionName':
''},
347 "Jets",
"Electrons",
"Photons",
"Muons",
"TauJets",
348 "PL_Jets",
"PL_Electrons",
"PL_Photons",
"PL_Muons",
"PL_Taus",
"PL_Neutrinos"])
351 from MetAnalysisAlgorithms.MetAnalysisConfig
import MetAnalysisConfig
355 from AsgAnalysisAlgorithms.OverlapAnalysisConfig
import OverlapAnalysisConfig
357 defaults={
'configName':
'OverlapRemoval'})
360 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import ObjectCutFlowBlock
364 from JetAnalysisAlgorithms.JetReclusteringConfig
import JetReclusteringBlock
368 from JetAnalysisAlgorithms.ReclusteredJetCalibrationConfig
import ReclusteredJetCalibrationBlock
369 self.
addAlgConfigBlock(algName=
"ReclusteredJetCalibration", alg=ReclusteredJetCalibrationBlock)
372 from EventSelectionAlgorithms.EventSelectionConfig
import makeMultipleEventSelectionConfigs
373 self.
addAlgConfigBlock(algName=
'EventSelection', alg=makeMultipleEventSelectionConfigs)
376 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import EventCutFlowBlock
378 defaults={
'containerName':
'EventInfo',
'selectionName':
''})
381 from AsgAnalysisAlgorithms.BootstrapGeneratorConfig
import BootstrapGeneratorConfig
385 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import PerEventSFBlock
389 from AsgAnalysisAlgorithms.LeptonSFCalculatorConfig
import LeptonSFCalculatorBlock
393 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import OutputThinningBlock
395 defaults={
'configName':
'Thinning'})
398 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import SelectionDecorationBlock
400 alg=SelectionDecorationBlock)
403 from TauAnalysisAlgorithms.DiTauMassConfig
import DiTauMassBlock
407 from AsgAnalysisAlgorithms.FakeBkgConfig
import FakeBkgBlock
411 from AsgAnalysisAlgorithms.VGammaORConfig
import VGammaORBlock
415 from AsgAnalysisAlgorithms.OutputAnalysisConfig
import OutputAnalysisConfig
417 defaults={
'configName':
'Output'})
420 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import IOStatsBlock
424 from AsgAnalysisAlgorithms.PrintToolConfigAlgConfig
import PrintToolConfigAlgBlock
425 self.
addAlgConfigBlock(algName=
"PrintConfiguration", alg=PrintToolConfigAlgBlock)