From 10e22cc0f583ac1d2549516b41d2057be9510ed6 Mon Sep 17 00:00:00 2001 From: Jonathan Karlsen Date: Mon, 23 Sep 2024 13:26:23 +0200 Subject: [PATCH] Add `validate_pre_experiment-method` to DESIGN_KW forward model --- src/semeio/forward_models/__init__.py | 14 +++++-- .../forward_models/design_kw/design_kw.py | 42 ++++++++++++++++++- .../forward_models/scripts/design_kw.py | 4 +- .../hook_implementations/forward_models.py | 2 + 4 files changed, 57 insertions(+), 5 deletions(-) diff --git a/src/semeio/forward_models/__init__.py b/src/semeio/forward_models/__init__.py index 979795b5..dfb08b22 100644 --- a/src/semeio/forward_models/__init__.py +++ b/src/semeio/forward_models/__init__.py @@ -4,10 +4,12 @@ ForwardModelStepDocumentation, ForwardModelStepJSON, ForwardModelStepPlugin, + ForwardModelStepWarning, ) from .scripts.design2params import description as design2params_description from .scripts.design_kw import description as design_kw_description +from .scripts.design_kw import design_kw as DesignKWScript class Design2Params(ForwardModelStepPlugin): @@ -45,7 +47,8 @@ class DesignKW(ForwardModelStepPlugin): def __init__(self): super().__init__( name="DESIGN_KW", - command=["design_kw", "", ""], + command=["design_kw", "", "", ""], + default_mapping={"": "false"}, ) def validate_pre_realization_run( @@ -54,7 +57,13 @@ def validate_pre_realization_run( return fm_step_json def validate_pre_experiment(self, fm_step_json: ForwardModelStepJSON) -> None: - pass + errors = DesignKWScript.validate_configuration(fm_step_json.get("argList")[0]) + should_fail_on_validation_error = ( + fm_step_json.get("argList")[2].lower() == "true" + ) + if errors and should_fail_on_validation_error: + error_message = f"DESIGN_KW configuration validation failed:\n{errors}" + ForwardModelStepWarning.warn(error_message) @staticmethod def documentation() -> Optional[ForwardModelStepDocumentation]: @@ -65,7 +74,6 @@ def documentation() -> Optional[ForwardModelStepDocumentation]: description=design_kw_description, ) - from .scripts.gendata_rft import description as gendata_rft_description diff --git a/src/semeio/forward_models/design_kw/design_kw.py b/src/semeio/forward_models/design_kw/design_kw.py index 0557c630..432a761a 100644 --- a/src/semeio/forward_models/design_kw/design_kw.py +++ b/src/semeio/forward_models/design_kw/design_kw.py @@ -1,4 +1,5 @@ import logging +import os import re import shlex from typing import List @@ -6,6 +7,7 @@ _STATUS_FILE_NAME = "DESIGN_KW.OK" _logger = logging.getLogger(__name__) +errors = [] def run( @@ -65,7 +67,9 @@ def all_matched(line, template_file_name, template): f"but this is probably an xml file" ) else: - _logger.error(f"{unmatched} not found in design matrix") + error_msg = f"{unmatched} not found in design matrix" + _logger.error(error_msg) + errors.append(error_msg) valid = False return valid @@ -178,3 +182,39 @@ def rm_genkw_prefix(paramsdict, ignoreprefixes="LOG10_"): for keyvalue in keyvalues if keys.count(keyvalue[0]) == 1 } + + +def validate_configuration( + template_file_name: str, parameters_file_name: str = "parameters.txt" +) -> List[str]: + try: + if not os.path.exists(template_file_name): + raise ValueError( + f"Argument template_file: '{template_file_name}' is not an existing file" + ) + + if not os.path.exists(parameters_file_name): + raise ValueError( + f"Could not find required parameters file from DESIGN2PARAMS: '{parameters_file_name}'" + ) + with open(parameters_file_name, encoding="utf-8") as parameters_file: + parameters = parameters_file.readlines() + + key_vals = extract_key_value(parameters) + + key_vals.update(rm_genkw_prefix(key_vals)) + + with open(template_file_name, encoding="utf-8") as template_file: + template = template_file.readlines() + + for line in template: + if not is_comment(line): + for key, value in key_vals.items(): + line = line.replace(f"<{key}>", str(value)) + + all_matched(line, template_file_name, template) + + except ValueError as e: + errors.append(str(e)) + + return errors diff --git a/src/semeio/forward_models/scripts/design_kw.py b/src/semeio/forward_models/scripts/design_kw.py index 84669e31..a249473c 100755 --- a/src/semeio/forward_models/scripts/design_kw.py +++ b/src/semeio/forward_models/scripts/design_kw.py @@ -20,6 +20,8 @@ Example: If ``parameters.txt`` has the line ``MULTFLT:FLT_A10_B18 0.001``, both of the templates ```` and ```` will expand to ``0.001``. + +Configuration validation pre experiment can be disabled by explicitly setting ``=false`` """ @@ -44,7 +46,7 @@ def create_parser(): default="WARNING", type=logging.getLevelName, ) - + parser.add_argument("--validate", required=False, type=bool, default=True) return parser diff --git a/src/semeio/hook_implementations/forward_models.py b/src/semeio/hook_implementations/forward_models.py index 3d0a2bc3..831858e0 100644 --- a/src/semeio/hook_implementations/forward_models.py +++ b/src/semeio/hook_implementations/forward_models.py @@ -5,6 +5,7 @@ import importlib_resources from semeio.forward_models import ( + JONAK_FM, OTS, Design2Params, DesignKW, @@ -117,4 +118,5 @@ def installable_forward_model_steps(): InsertNoSim, RemoveNoSim, ReplaceString, + JONAK_FM ]