Source code for testing.output_validation.simtel

"""sim_telarray output and configuration validators."""

import logging
import re

from simtools.simtel import sim_telarray_metadata
from simtools.testing import assertions

_logger = logging.getLogger(__name__)
_CFG_IGNORE_KEYS = ("config_release", "Label", "simtools_")


[docs] def validate_output(path, rule): """Validate sim_telarray event data and metadata.""" expected_output = {"event_type": rule.get("event_type", "shower")} expected_output.update( {name: expectation["range"] for name, expectation in rule.get("event", {}).items()} ) config = {"expected_sim_telarray_output": expected_output} if "metadata" in rule: config["expected_sim_telarray_metadata"] = rule["metadata"] if not assertions.check_output_from_sim_telarray(path, config): raise AssertionError(f"Output '{path}' failed sim_telarray validation.")
def _assignment_metadata_keys(): registry = sim_telarray_metadata.get_meta_parameter_registry(validate=False) return { name for name, definition in registry["meta_parameters"].items() if definition["mode"] == "assign" } def _split_lines(lines, file_label): parameters = {} control_lines = [] metadata_keys = _assignment_metadata_keys() for raw_line in lines: line = raw_line.strip() if not line or line.startswith("%"): continue if any(ignore_key in line for ignore_key in _CFG_IGNORE_KEYS): _logger.debug(f"Ignoring line in {file_label}: {line}") continue if re.match(r"metaparam (global|telescope) (add|set)\b", line): continue key, separator, value = line.partition("=") key = key.strip() if separator and key.replace("_", "").isalnum(): if key not in metadata_keys: parameters[key] = value.strip() continue control_lines.append(line) return parameters, control_lines
[docs] def compare_config_files(reference_file, output_file): """Compare sim_telarray parameters and control lines.""" with ( open(reference_file, encoding="utf-8") as reference, open(output_file, encoding="utf-8") as output, ): reference_parts = _split_lines(reference, reference_file) output_parts = _split_lines(output, output_file) if reference_parts != output_parts: _logger.error(f"sim_telarray configuration differs: {reference_file} != {output_file}") return False return True