3Defines the base interface that component classes should extend.
11from ._config
import convert_config_value
12from hpsmc
import global_config
17 Base class for components in a job.
19 Do not perform any logging in the init method of Component subclasses,
20 as this is not configured by the job manager until after the components
23 Optional parameters are: **nevents**, **seed**
25 @param name name of the component
26 @param command command to execute
27 @param nevents number of events to process
28 @param seed random seed
29 @param inputs list of input files
30 @param outputs list of output files
31 @param append_tok token to append to output file names
32 @param output_ext extension to append to output file names; format is .ext
33 @param ignore_job_params list of parameters to ignore when setting parameters
34 @param kwargs additional keyword arguments
63 raise Exception(
"The HPSMC_DIR is not set!")
66 self.
logger = logging.getLogger(
"{}.{}".format(__name__, self.__class__.__name__))
73 def execute(self, log_out=sys.stdout, log_err=sys.stderr):
74 """! Generic component execution method.
76 Individual components may override this if specific behavior is required.
78 @param log_out name of log file for output
79 @param log_err name of log file for error
82 proc = subprocess.Popen(self.
cmd_line_str(), shell=
True, stdout=log_out, stderr=log_err)
86 return proc.returncode
89 """! Check if the component's assigned command exists."""
90 return subprocess.call(
"type " + self.
command, shell=
True,
91 stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0
94 """! Return the command arguments of this component."""
98 """! Return list of arguments, making sure they are all converted to strings."""
99 return [str(c)
for c
in self.
cmd_args()]
102 """! Perform any necessary setup for this component to run such as making symlinks
103 to required directories.
108 """! Perform post-job cleanup such as deleting temporary files."""
113 Configure the logging for a component.
115 @param parser the ConfigParser object passed from the job manager
117 classname = self.__class__.__name__
118 if classname
in parser:
119 if 'loglevel' in parser[classname]:
120 loglevel = logging.getLevelName(parser[classname][
'loglevel'])
121 self.logger.setLevel(loglevel)
124 """! Automatic configuration
126 Automatically load attributes from config by reading in values from
127 the section with the same name as the class in the config file and
128 assigning them to class attributes with the same name.
130 @param parser config parser
132 section_name = self.__class__.__name__
133 if parser.has_section(section_name):
134 for name, value
in parser.items(section_name):
135 setattr(self, name, convert_config_value(value))
138 getattr(self, name).__class__.__name__,
139 getattr(self, name)))
142 """! Set class attributes for the component based on JSON parameters.
144 Components should not need to override this method.
146 @param params parameters to setup component
152 raise Exception(
"Required parameter '%s' is missing for component '%s'"
156 setattr(self, p, params[p])
157 self.
logger.debug(
"%s:%s=%s [required]" % (self.
name, p, params[p]))
159 self.
logger.debug(
"Ignored job param '%s'" % p)
165 setattr(self, p, params[p])
166 self.
logger.debug(
"%s:%s=%s [optional]" % (self.
name, p, params[p]))
168 self.
logger.debug(
"Ignored job param '%s'" % p)
172 Return a list of required parameters.
174 The job will fail if these are not present in the JSON file.
180 Return a list of optional parameters.
182 Optional parameters are: **nevents**, **seed**
184 return [
'nevents',
'seed']
188 Return a list of required configuration settings.
190 There are none by default.
195 """! Raise an exception on the first missing config setting for this component."""
197 if not hasattr(self, c):
198 raise Exception(
'Missing required config attribute: %s:%s' % (self.__class__.__name__, c))
199 if getattr(self, c)
is None:
200 raise Exception(
'Config was not set: %s:%s' % (self.__class__.__name__, c))
203 """! Get a list of input files for this component."""
207 """! Return a list of output files created by this component.
209 By default, a series of transformations will be performed on inputs to
210 transform them into outputs.
218 """! This is the default method for automatically transforming input file names
219 to outputs when output file names are not explicitly provided.
223 f, ext = os.path.splitext(infile)
228 outputs.append(
'%s%s' % (f, ext))
232 """! Configure component from environment variables which are just upper case
233 versions of the required config names set in the shell environment."""
235 self.
logger.debug(
"Setting config '%s' from environ" % c)
236 if c.upper()
in os.environ:
237 setattr(self, c, os.environ[c.upper()])
238 self.
logger.debug(
"Set config '%s=%s' from env var '%s'" % (c, getattr(self, c), c.upper()))
240 raise Exception(
"Missing config in environ for '%s'" % c)
244 """! A dummy component that just prints some information instead of executing a program."""
247 Component.__init__(self,
'dummy',
'dummy', **kwargs)
249 def execute(self, log_out=sys.stdout, log_err=sys.stderr):
250 self.
logger.debug(
"dummy debug")
251 self.
logger.info(
"dummy info")
252 self.
logger.warning(
"dummy warn")
253 self.
logger.critical(
"dummy critical")
254 self.
logger.error(
"dummy error")
Base class for components in a job.
output_files(self)
Return a list of output files created by this component.
execute(self, log_out=sys.stdout, log_err=sys.stderr)
Generic component execution method.
optional_parameters(self)
Return a list of optional parameters.
cleanup(self)
Perform post-job cleanup such as deleting temporary files.
config_logging(self, parser)
Configure the logging for a component.
config_from_environ(self)
Configure component from environment variables which are just upper case versions of the required con...
cmd_args_str(self)
Return list of arguments, making sure they are all converted to strings.
required_parameters(self)
Return a list of required parameters.
setup(self)
Perform any necessary setup for this component to run such as making symlinks to required directories...
cmd_exists(self)
Check if the component's assigned command exists.
set_parameters(self, params)
Set class attributes for the component based on JSON parameters.
config(self, parser)
Automatic configuration.
required_config(self)
Return a list of required configuration settings.
_inputs_to_outputs(self)
This is the default method for automatically transforming input file names to outputs when output fil...
cmd_args(self)
Return the command arguments of this component.
check_config(self)
Raise an exception on the first missing config setting for this component.
input_files(self)
Get a list of input files for this component.
__init__(self, name, command=None, nevents=None, seed=1, inputs=[], outputs=None, append_tok=None, output_ext=None, ignore_job_params=[], **kwargs)
A dummy component that just prints some information instead of executing a program.
execute(self, log_out=sys.stdout, log_err=sys.stderr)
Generic component execution method.