Source code for ecpi.process.generic.composant

"""
Implementation of generic module components ran by ECPI.

@author: COLLEY, Jean-Marc, BACON Philippe, APC/IN2P3/CNRS
"""

import os.path
import logging
import json
import configparser
import ecpi.common.params.tools_check as tpars
import ecpi.common.instru.model_effect as me

s_logger = logging.getLogger(__name__)


[docs]class GenericComposantProcessing(object): """. Mother class for all ECPI modules. """ def __init__(self, file_schema): """**constructor** :param file_schema: path to the .json scheme :type file_schema: str """ self.composant_name = "" self.error_range = 0 self.d_pars = {} self.d_data_in = {} self.d_data_out = {} self.status = 0 self.mod_effect = None self.d_status = { 0: "OK", 1: "parameter validation error", 2: "input working isn't present in the parameter dict", 3: "input working directory does not exist", 4: "convert error : configparser to dictionary", 5: "ECLAIRs model effect is not valid" } with open(file_schema, "r") as fichier: self.json_schem = json.load(fichier) def __str__(self): s = f"\n#### [{self.composant_name.upper()}] module parameters:\n[{self.composant_name}]" for k, v in sorted(list(self.d_pars.items())): # if type(v) == list and type(v[0]) is str: v = v.__str__().replace("'",'"') s += f"\n{k} = {v}" s += "\n####" return s def _check_add_default_dict(self): """Check only with json scheme """ return tpars.check_add_default_dict(self.json_schem, self.d_pars) def _load_check_file_in(self): """Load file in memory d_data_in attribut and check_params input data file: presence, type ,coherence, ... #TODO: utilisation du paramètre dir_in pour y lire les fichiers """ # must be defined in derived class # initialize self.d_data_in if not "working_in" in self.d_pars: self.status = 2 return False elif not os.path.exists(self.d_pars["working_in"]): self.status = 3 return False return True def _check_unknown_pars(self): """Return False if d_pars content a parameters not content in his scheme json #TODO: pour éviter les typos dans les paramètres passe sous silence par une redéfinition par sa valeur par défaut """ pass def _create_output_files(self): """ must be defined in derived class """ raise def _process_composant(self): """ must be defined in derived class """ raise def _check_extra(self): """Check more complex rules must be defined in derived class """ pass # # User interface #
[docs] def set_model_effect_detector(self, mod_dpix): if not isinstance(mod_dpix, me.ECLAIRsDetectorEffect): self.status = 5 return False self.mod_effect = mod_dpix return True
[docs] def set_dict_params(self, dict_pars): """Set dictionary parameters :param dict_pars: :type dict_pars: """# try: # detectim, eclo, error_code, error_msg = bube(self.d_data_in) # s_logger.debug(f"{error_code}: {error_msg} [bube]") # except Exception: # self.status = 24 # return False # if error_code == "NOK": # self.status = 24 # return False self.d_pars = dict_pars
[docs] def set_cfg_params(self, cfg_pars, section): """Set parameters for config, :param cfg_pars: :type cfg_aprs: dic :param section: name of ecpi section :type section: str """ cfg = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation()) if type(cfg_pars) is dict: cfg.read_dict(cfg_pars) else: cfg.read(cfg_pars) ret_parser = tpars.cfgparser_to_dict4json(cfg, section) if ret_parser is None: self.status = 4 return False self.d_pars = ret_parser self.sections = cfg.sections self.composant_name = section return True
[docs] def complete_params_with_dict(self, new_dict_pars): """Add params from section if not present in self.d_pars """ self.d_pars.update(new_dict_pars)
[docs] def check_params(self): if self._check_add_default_dict(): return self._check_extra() else: self.status = 1 return False
[docs] def run(self, data_in_obj=None): """Run/processing composant with parameters and d_data_in """ if data_in_obj is None: if not self._load_check_file_in(): return False else: self.d_data_in = data_in_obj if self._process_composant(): return self._create_output_files()
[docs] def get_data_out(self): return self.d_data_out
[docs] def status_int(self): return self.status + self.error_range
[docs] def status_msg(self): msg_err = self.d_status[self.status] return f"[{self.name}]: {msg_err}"