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__))
75 def execute(self, log_out=sys.stdout, log_err=sys.stderr):
76 """! Generic component execution method.
78 Individual components may override this if specific behavior is required.
80 @param log_out name of log file for output
81 @param log_err name of log file for error
84 proc = subprocess.Popen(self.
cmd_line_str(), shell=
True, stdout=log_out, stderr=log_err)
88 return proc.returncode
91 """! Check if the component's assigned command exists."""
92 return subprocess.call(
"type " + self.
command, shell=
True,
93 stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0
96 """! Return the command arguments of this component."""
100 """! Return list of arguments, making sure they are all converted to strings."""
101 return [str(c)
for c
in self.
cmd_args()]
104 """! Perform any necessary setup for this component to run such as making symlinks
105 to required directories.
110 """! Perform post-job cleanup such as deleting temporary files."""
115 Configure the logging for a component.
117 @param parser the ConfigParser object passed from the job manager
119 classname = self.__class__.__name__
120 if classname
in parser:
121 if 'loglevel' in parser[classname]:
122 loglevel = logging.getLevelName(parser[classname][
'loglevel'])
123 self.logger.setLevel(loglevel)
126 """! Automatic configuration
128 Automatically load attributes from config by reading in values from
129 the section with the same name as the class in the config file and
130 assigning them to class attributes with the same name.
132 @param parser config parser
134 section_name = self.__class__.__name__
135 if parser.has_section(section_name):
136 for name, value
in parser.items(section_name):
137 setattr(self, name, convert_config_value(value))
140 getattr(self, name).__class__.__name__,
141 getattr(self, name)))
144 """! Set class attributes for the component based on JSON parameters.
146 Components should not need to override this method.
148 @param params parameters to setup component
154 raise Exception(
"Required parameter '%s' is missing for component '%s'"
158 setattr(self, p, params[p])
159 self.
logger.debug(
"%s:%s=%s [required]" % (self.
name, p, params[p]))
161 self.
logger.debug(
"Ignored job param '%s'" % p)
167 setattr(self, p, params[p])
168 self.
logger.debug(
"%s:%s=%s [optional]" % (self.
name, p, params[p]))
170 self.
logger.debug(
"Ignored job param '%s'" % p)
174 Return a list of required parameters.
176 The job will fail if these are not present in the JSON file.
182 Return a list of optional parameters.
184 Optional parameters are: **nevents**, **seed**
186 return [
'nevents',
'seed']
190 Return a list of required configuration settings.
192 There are none by default.
197 """! Raise an exception on the first missing config setting for this component."""
199 if not hasattr(self, c):
200 raise Exception(
'Missing required config attribute: %s:%s' % (self.__class__.__name__, c))
201 if getattr(self, c)
is None:
202 raise Exception(
'Config was not set: %s:%s' % (self.__class__.__name__, c))
205 """! Get a list of input files for this component."""
209 """! Return a list of output files created by this component.
211 By default, a series of transformations will be performed on inputs to
212 transform them into outputs.
220 """! This is the default method for automatically transforming input file names
221 to outputs when output file names are not explicitly provided.
225 f, ext = os.path.splitext(infile)
230 outputs.append(
'%s%s' % (f, ext))
234 """! Configure component from environment variables which are just upper case
235 versions of the required config names set in the shell environment."""
237 self.
logger.debug(
"Setting config '%s' from environ" % c)
238 if c.upper()
in os.environ:
239 setattr(self, c, os.environ[c.upper()])
240 self.
logger.debug(
"Set config '%s=%s' from env var '%s'" % (c, getattr(self, c), c.upper()))
242 raise Exception(
"Missing config in environ for '%s'" % c)
246 """! A dummy component that just prints some information instead of executing a program."""
249 Component.__init__(self,
'dummy',
'dummy', **kwargs)
251 def execute(self, log_out=sys.stdout, log_err=sys.stderr):
252 self.
logger.debug(
"dummy debug")
253 self.
logger.info(
"dummy info")
254 self.
logger.warning(
"dummy warn")
255 self.
logger.critical(
"dummy critical")
256 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.