Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
CPBaseRunner.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2 
3 import argparse
4 from AnaAlgorithm.Logging import logging
5 from abc import ABC, abstractmethod
6 
7 class CPBaseRunner(ABC):
8  def __init__(self):
9  self.logger = logging.getLogger("CPBaseRunner")
10  self._args = None
11  self._inputList = None
13  # parse the arguments here is a bad idea
14 
15  @property
16  def args(self):
17  if self._args is None:
18  self._args = self.parser.parse_args()
19  return self._args
20 
21  @property
22  def inputList(self):
23  if self._inputList is None:
24  if self.args.input_list.endswith('.txt'):
25  self._inputList = CPBaseRunner._parseInputFileList(self.args.input_list)
26  elif ".root" in self.args.input_list:
27  self._inputList = [self.args.input_list]
28  else:
29  raise FileNotFoundError(f'Input file list \"{self.args.input_list}\" is not supported!'
30  'Please provide a text file with a list of input files or a single root file.')
31  return self._inputList
32 
33  def printFlags(self):
34  self.logger.info("="*73)
35  self.logger.info("="*20 + "FLAG CONFIGURATION" + "="*20)
36  self.logger.info("="*73)
37  self.logger.info(" Input files: %s", self.flags.Input.isMC)
38  self.logger.info(" RunNumber: %s", self.flags.Input.RunNumbers)
39  self.logger.info(" MCCampaign: %s", self.flags.Input.MCCampaign)
40  self.logger.info(" GeneratorInfo: %s", self.flags.Input.GeneratorsInfo)
41  self.logger.info("="*73)
42 
43  @abstractmethod
44  def addCustomArguments(self):
45  pass
46 
47  @abstractmethod
48  def makeAlgSequence(self):
49  pass
50 
51  @abstractmethod
52  def run(self):
53  pass
54 
55  # The responsiblity of flag.lock will pass to the caller
57  from AthenaConfiguration.AllConfigFlags import initConfigFlags
58  flags = initConfigFlags()
59  flags.Input.Files = self.inputList
60  flags.Exec.MaxEvents = self.args.max_events
61  return flags
62 
64  parser = argparse.ArgumentParser(
65  description='Runscript for CP Algorithm unit tests')
66  baseGroup = parser.add_argument_group('Base Script Options')
67  baseGroup.add_argument('--input-list', dest='input_list',
68  help='path to text file containing list of input files, or a single root file')
69  baseGroup.add_argument('--output-name', dest='output_name', default='output',
70  help='output name of the analysis root file')
71  baseGroup.add_argument('-e', '--max-events', dest='max_events', type=int, default=-1,
72  help='Number of events to run')
73  baseGroup.add_argument('-t', '--text-config', dest='text_config',
74  help='path to the YAML configuration file')
75  baseGroup.add_argument('--no-systematics', dest='no_systematics',
76  action='store_true', help='Disable systematics')
77  return parser
78 
79  def _readYamlConfig(self):
80  from ROOT import PathResolver
81  yamlconfig = PathResolver.find_file(
82  self.args.text_config, "CALIBPATH", PathResolver.RecursiveSearch)
83  if not yamlconfig:
84  raise FileNotFoundError(f'PathResolver failed to locate \"{self.args.text_config}\" config file!'
85  'Check if you have a typo in -t/--text-config argument or missing file in the analysis configuration sub-directory.')
86  self.logger.info("Setting up configuration based on YAML config:")
87  from AnalysisAlgorithmsConfig.ConfigText import TextConfig
88  config = TextConfig(yamlconfig)
89  return config
90 
92  files = []
93  with open(path, 'r') as inputText:
94  for line in inputText.readlines():
95  # skip comments and empty lines
96  if line.startswith('#') or not line.strip():
97  continue
98  files += line.split(',')
99  # remove leading/trailing whitespaces, and \n
100  files = [file.strip() for file in files]
101  return files
102 
103  def setup(self):
104  self.parser.parse_args()
105  self.config = self._readYamlConfig()
107 
109  self.parser.description = 'CPRunScript available arguments'
110  self.parser.usage = argparse.SUPPRESS
111  self.parser.print_help()
grepfile.info
info
Definition: grepfile.py:38
python.CPBaseRunner.CPBaseRunner._parseInputFileList
def _parseInputFileList(path)
Definition: CPBaseRunner.py:91
python.CPBaseRunner.CPBaseRunner.parser
parser
Definition: CPBaseRunner.py:12
python.CPBaseRunner.CPBaseRunner._readYamlConfig
def _readYamlConfig(self)
Definition: CPBaseRunner.py:79
PathResolver::find_file
static std::string find_file(const std::string &logical_file_name, const std::string &search_path, SearchType search_type=LocalSearch)
Definition: PathResolver.cxx:251
python.CPBaseRunner.CPBaseRunner._defaultFlagsInitialization
def _defaultFlagsInitialization(self)
Definition: CPBaseRunner.py:56
python.CPBaseRunner.CPBaseRunner.addCustomArguments
def addCustomArguments(self)
Definition: CPBaseRunner.py:44
python.CPBaseRunner.CPBaseRunner.printFlags
def printFlags(self)
Definition: CPBaseRunner.py:33
python.CPBaseRunner.CPBaseRunner._defaultParseArguments
def _defaultParseArguments(self)
Definition: CPBaseRunner.py:63
python.CPBaseRunner.CPBaseRunner.printAvailableArguments
def printAvailableArguments(self)
Definition: CPBaseRunner.py:108
python.CPBaseRunner.CPBaseRunner.run
def run(self)
Definition: CPBaseRunner.py:52
python.CPBaseRunner.CPBaseRunner.makeAlgSequence
def makeAlgSequence(self)
Definition: CPBaseRunner.py:48
python.CPBaseRunner.CPBaseRunner.setup
def setup(self)
Definition: CPBaseRunner.py:103
python.CPBaseRunner.CPBaseRunner
Definition: CPBaseRunner.py:7
python.CPBaseRunner.CPBaseRunner.flags
flags
Definition: CPBaseRunner.py:106
Trk::open
@ open
Definition: BinningType.h:40
python.CPBaseRunner.CPBaseRunner.config
config
Definition: CPBaseRunner.py:105
python.CPBaseRunner.CPBaseRunner.args
def args(self)
Definition: CPBaseRunner.py:16
python.AllConfigFlags.initConfigFlags
def initConfigFlags()
Definition: AllConfigFlags.py:19
confTool.parse_args
def parse_args()
Definition: confTool.py:36
python.CPBaseRunner.CPBaseRunner.logger
logger
Definition: CPBaseRunner.py:9
python.CPBaseRunner.CPBaseRunner._inputList
_inputList
Definition: CPBaseRunner.py:11
python.CPBaseRunner.CPBaseRunner.inputList
def inputList(self)
Definition: CPBaseRunner.py:22
python.CPBaseRunner.CPBaseRunner._args
_args
Definition: CPBaseRunner.py:10
python.CPBaseRunner.CPBaseRunner.__init__
def __init__(self)
Definition: CPBaseRunner.py:8