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
277 from EgammaAnalysisAlgorithms.ElectronAnalysisConfig
import ElectronCalibrationConfig
279 from EgammaAnalysisAlgorithms.ElectronAnalysisConfig
import ElectronWorkingPointConfig
281 superBlocks=
"Electrons")
282 from EgammaAnalysisAlgorithms.ElectronAnalysisConfig
import ElectronLRTMergedConfig
284 superBlocks=
"Electrons")
285 from EgammaAnalysisAlgorithms.ElectronAnalysisConfig
import ElectronTriggerAnalysisSFBlock
287 superBlocks=
"Electrons")
290 from EgammaAnalysisAlgorithms.PhotonAnalysisConfig
import PhotonCalibrationConfig
292 from EgammaAnalysisAlgorithms.PhotonAnalysisConfig
import PhotonWorkingPointConfig
294 superBlocks=
"Photons")
295 from EgammaAnalysisAlgorithms.PhotonExtraVariablesConfig
import PhotonExtraVariablesBlock
297 superBlocks=
"Photons")
300 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonCalibrationConfig
302 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonWorkingPointConfig
305 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonTriggerAnalysisSFBlock
308 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonLRTMergedConfig
311 from MuonAnalysisAlgorithms.MuonAnalysisConfig
import MuonContainerMergingConfig
312 self.
addAlgConfigBlock(algName=
"ContainerMerging", alg=MuonContainerMergingConfig,
316 from TauAnalysisAlgorithms.TauAnalysisConfig
import TauCalibrationConfig
318 from TauAnalysisAlgorithms.TauAnalysisConfig
import TauWorkingPointConfig
320 superBlocks=
"TauJets")
321 from TauAnalysisAlgorithms.TauAnalysisConfig
import TauTriggerAnalysisSFBlock
323 superBlocks=
"TauJets")
326 from TauAnalysisAlgorithms.DiTauAnalysisConfig
import DiTauCalibrationConfig
328 from TauAnalysisAlgorithms.DiTauAnalysisConfig
import DiTauWorkingPointConfig
330 superBlocks=
"DiTauJets")
333 from TrackingAnalysisAlgorithms.TrackingAnalysisConfig
import InDetTrackCalibrationConfig
335 from TrackingAnalysisAlgorithms.TrackingAnalysisConfig
import InDetTrackWorkingPointConfig
337 superBlocks=
"InDetTracks")
340 from AsgAnalysisAlgorithms.SystObjectLinkConfig
import SystObjectLinkBlock
342 superBlocks=[self.
ROOTNAME,
"Jets",
"Electrons",
"Photons",
"Muons",
"TauJets"])
345 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelElectronsConfig
import ParticleLevelElectronsBlock
347 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelMuonsConfig
import ParticleLevelMuonsBlock
349 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelNeutrinosConfig
import ParticleLevelNeutrinosBlock
351 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelJetsConfig
import ParticleLevelJetsBlock
353 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelTausConfig
import ParticleLevelTausBlock
355 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelPhotonsConfig
import ParticleLevelPhotonsBlock
357 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelMissingETConfig
import ParticleLevelMissingETBlock
359 from TruthParticleLevelAnalysisAlgorithms.ParticleLevelOverlapRemovalConfig
import ParticleLevelOverlapRemovalBlock
360 self.
addAlgConfigBlock(algName=
"PL_OverlapRemoval", alg=ParticleLevelOverlapRemovalBlock)
363 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import IFFLeptonDecorationBlock
364 self.
addAlgConfigBlock(algName=
"IFFClassification", alg=IFFLeptonDecorationBlock,
365 superBlocks=[
"Electrons",
"Muons",
366 "PL_Electrons",
"PL_Muons"])
368 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import MCTCLeptonDecorationBlock
369 self.
addAlgConfigBlock(algName=
"MCTCClassification", alg=MCTCLeptonDecorationBlock,
370 superBlocks=[
"Electrons",
"Muons",
"TauJets",
371 "PL_Electrons",
"PL_Muons",
"PL_Taus"])
374 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import GeneratorAnalysisBlock
375 self.
addAlgConfigBlock(algName=
"GeneratorLevelAnalysis", alg=GeneratorAnalysisBlock)
378 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import PtEtaSelectionBlock
380 defaults={
'selectionName':
''},
382 "Jets",
"Electrons",
"Photons",
"Muons",
"TauJets",
"DiTauJets",
383 "PL_Jets",
"PL_Electrons",
"PL_Photons",
"PL_Muons",
"PL_Taus",
"PL_Neutrinos"])
386 from MetAnalysisAlgorithms.MetAnalysisConfig
import MetAnalysisConfig
390 from AsgAnalysisAlgorithms.OverlapAnalysisConfig
import OverlapAnalysisConfig
392 defaults={
'configName':
'OverlapRemoval'})
395 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import ObjectCutFlowBlock
399 from JetAnalysisAlgorithms.JetReclusteringConfig
import JetReclusteringBlock
403 from JetAnalysisAlgorithms.ReclusteredJetCalibrationConfig
import ReclusteredJetCalibrationBlock
404 self.
addAlgConfigBlock(algName=
"ReclusteredJetCalibration", alg=ReclusteredJetCalibrationBlock)
407 from EventSelectionAlgorithms.EventSelectionConfig
import makeMultipleEventSelectionConfigs
408 self.
addAlgConfigBlock(algName=
'EventSelection', alg=makeMultipleEventSelectionConfigs)
411 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import EventCutFlowBlock
413 defaults={
'containerName':
'EventInfo',
'selectionName':
''})
416 from AsgAnalysisAlgorithms.BootstrapGeneratorConfig
import BootstrapGeneratorConfig
420 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import PerEventSFBlock
424 from AsgAnalysisAlgorithms.LeptonSFCalculatorConfig
import LeptonSFCalculatorBlock
428 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import OutputThinningBlock
430 defaults={
'configName':
'Thinning'})
433 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import SelectionDecorationBlock
435 alg=SelectionDecorationBlock)
438 from TauAnalysisAlgorithms.DiTauMassConfig
import DiTauMassBlock
442 from AsgAnalysisAlgorithms.FakeBkgConfig
import FakeBkgBlock
446 from AsgAnalysisAlgorithms.VGammaORConfig
import VGammaORBlock
450 from AsgAnalysisAlgorithms.OutputAnalysisConfig
import OutputAnalysisConfig
452 defaults={
'configName':
'Output'})
455 from AsgAnalysisAlgorithms.AsgAnalysisConfig
import IOStatsBlock
459 from AsgAnalysisAlgorithms.PrintToolConfigAlgConfig
import PrintToolConfigAlgBlock
460 self.
addAlgConfigBlock(algName=
"PrintConfiguration", alg=PrintToolConfigAlgBlock)