Source code for testing.output_validation.model_parameters

"""Source-neutral model-parameter output validation."""

import numpy as np

from simtools.application.model_reader import create_model_reader_from_configuration
from simtools.io import ascii_handler
from simtools.testing.output_validation.reference import compare_values
from simtools.utils import value_conversion


[docs] def validate(path, rule, configuration, model_reader=None): """Compare a generated parameter value with its model reference. Parameters ---------- model_reader : object, optional Reader selected for the current validation run. A reader is created from configuration only when this is omitted. """ parameter_name = rule["reference_parameter_name"] if model_reader is None: model_reader = create_model_reader_from_configuration(configuration) reference = model_reader.get_model_parameter( parameter=parameter_name, site=configuration.get("site"), array_element_name=configuration.get("telescope"), parameter_version=configuration.get("parameter_version"), model_version=configuration.get("model_version"), ) generated_value = ascii_handler.collect_data_from_file(path)["value"] reference_value = reference[parameter_name]["value"] scaling = rule.get("scaling", 1.0) comparable_value = ( value_conversion.convert_string_to_list(generated_value) if isinstance(generated_value, str) else generated_value ) generated_value = comparable_value if not np.isclose(scaling, 1.0): try: generated_value = np.asarray(comparable_value) * scaling except (TypeError, ValueError) as exc: raise AssertionError( f"Output '{path}' model parameter '{parameter_name}' cannot be scaled by {scaling}." ) from exc if not compare_values(generated_value, reference_value, rule["tolerance"], True): raise AssertionError( f"Output '{path}' model parameter '{parameter_name}' differs from the model reference." )