From 3f60f10e90a707392768b10166ecf8b72a5c0c3b Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 3 Jul 2026 08:12:54 +0200 Subject: [PATCH 1/8] Simplify naming of sim_telarray configuration files --- docs/changes/2318.maintenance.md | 4 ++ src/simtools/model/array_model.py | 11 ++-- src/simtools/model/model_parameter.py | 42 ++------------- src/simtools/simtel/simtel_config_writer.py | 9 ++++ src/simtools/simtel/simulator_ray_tracing.py | 4 +- src/simtools/utils/names.py | 51 ++++++------------- ...d_gamma_40_deg_south_sim_telarray_only.yml | 2 +- ...e_prod_gamma_62_deg_south_check_output.yml | 4 +- ..._prod_proton_20_deg_north_check_output.yml | 16 +++--- ...orth-LSTN-01_test.cfg => CTAO-LSTN-01.cfg} | 0 ...orth-LSTN-02_test.cfg => CTAO-LSTN-02.cfg} | 0 ...orth-MSTN-01_test.cfg => CTAO-MSTN-01.cfg} | 0 ...ha-North_test.cfg => CTAO-North-alpha.cfg} | 0 ...orth-LSTN-01_test.cfg => CTAO-LSTN-01.cfg} | 0 ...orth-LSTN-02_test.cfg => CTAO-LSTN-02.cfg} | 0 ...outh-LSTS-01_test.cfg => CTAO-LSTS-01.cfg} | 0 ...orth-MSTN-01_test.cfg => CTAO-MSTN-01.cfg} | 0 ...outh-MSTS-01_test.cfg => CTAO-MSTS-01.cfg} | 0 ...ha-North_test.cfg => CTAO-North-alpha.cfg} | 0 ...eta-South_test.cfg => CTAO-South-beta.cfg} | 0 tests/unit_tests/model/test_array_model.py | 2 +- .../simtel/test_simulator_ray_tracing.py | 4 +- tests/unit_tests/utils/test_names.py | 51 ++----------------- 23 files changed, 57 insertions(+), 143 deletions(-) create mode 100644 docs/changes/2318.maintenance.md rename tests/resources/generated/sim_telarray_configurations/5.0.0/{CTA-North-LSTN-01_test.cfg => CTAO-LSTN-01.cfg} (100%) rename tests/resources/generated/sim_telarray_configurations/5.0.0/{CTA-North-LSTN-02_test.cfg => CTAO-LSTN-02.cfg} (100%) rename tests/resources/generated/sim_telarray_configurations/5.0.0/{CTA-North-MSTN-01_test.cfg => CTAO-MSTN-01.cfg} (100%) rename tests/resources/generated/sim_telarray_configurations/5.0.0/{CTA-alpha-North_test.cfg => CTAO-North-alpha.cfg} (100%) rename tests/resources/generated/sim_telarray_configurations/6.0.2/{CTA-North-LSTN-01_test.cfg => CTAO-LSTN-01.cfg} (100%) rename tests/resources/generated/sim_telarray_configurations/6.0.2/{CTA-North-LSTN-02_test.cfg => CTAO-LSTN-02.cfg} (100%) rename tests/resources/generated/sim_telarray_configurations/6.0.2/{CTA-South-LSTS-01_test.cfg => CTAO-LSTS-01.cfg} (100%) rename tests/resources/generated/sim_telarray_configurations/6.0.2/{CTA-North-MSTN-01_test.cfg => CTAO-MSTN-01.cfg} (100%) rename tests/resources/generated/sim_telarray_configurations/6.0.2/{CTA-South-MSTS-01_test.cfg => CTAO-MSTS-01.cfg} (100%) rename tests/resources/generated/sim_telarray_configurations/6.0.2/{CTA-alpha-North_test.cfg => CTAO-North-alpha.cfg} (100%) rename tests/resources/generated/sim_telarray_configurations/6.0.2/{CTA-beta-South_test.cfg => CTAO-South-beta.cfg} (100%) diff --git a/docs/changes/2318.maintenance.md b/docs/changes/2318.maintenance.md new file mode 100644 index 0000000000..28fb4d0fd9 --- /dev/null +++ b/docs/changes/2318.maintenance.md @@ -0,0 +1,4 @@ +Simplify naming of sim_telarray configuration files written to disk for simulation production: +- telescope configuration files are now of type `CTAO-LSTS-01.cfg`, `CTAO-SSTS-25.cfg` +- array configuration files are of type `CTAO-South-beta.cfg` +Raises an exception if existing configuration files are overwritten by an application. diff --git a/src/simtools/model/array_model.py b/src/simtools/model/array_model.py index 8e44f9a842..948d747162 100644 --- a/src/simtools/model/array_model.py +++ b/src/simtools/model/array_model.py @@ -143,14 +143,11 @@ def config_file_path(self): Path Path of the exported config file for sim_telarray. """ - if self._config_file_path is None: - config_file_name = names.simtel_config_file_name( - array_name=self.layout_name, - site=self.site_model.site, - label=self.label, + return self._config_file_path or self.get_config_directory().joinpath( + names.sim_telarray_config_file_name( + array_name=self.layout_name, site=self.site_model.site ) - self._config_file_path = self.get_config_directory().joinpath(config_file_name) - return self._config_file_path + ) @property def number_of_telescopes(self): diff --git a/src/simtools/model/model_parameter.py b/src/simtools/model/model_parameter.py index ed7fe7b9be..81362ca064 100644 --- a/src/simtools/model/model_parameter.py +++ b/src/simtools/model/model_parameter.py @@ -272,13 +272,9 @@ def _set_config_file_directory_and_name(self): model_version=self.model_version ) - # Setting file name and the location - config_file_name = names.simtel_config_file_name( - self.site, - telescope_model_name=self.name, - label=self.label, + self._config_file_path = self.config_file_directory.joinpath( + names.sim_telarray_config_file_name(site=self.site, telescope_model_name=self.name) ) - self._config_file_path = self.config_file_directory.joinpath(config_file_name) def get_simulation_software_parameters(self, simulation_software): """ @@ -828,29 +824,7 @@ def export_model_files(self, destination_path=None, update_if_necessary=False): ) self._is_exported_model_files_up_to_date = True - def get_config_file_path(self, label=None): - """Return config file path for a given label. - - Parameters - ---------- - label : str or None - Label used for output file naming. If None, use this model's label. - - Returns - ------- - pathlib.Path - Path to the sim_telarray configuration file. - """ - config_file_name = names.simtel_config_file_name( - self.site, - telescope_model_name=self.name, - label=self.label if label is None else label, - ) - return self.config_file_directory.joinpath(config_file_name) - - def write_sim_telarray_config_file( - self, additional_models=None, label=None, config_file_path=None - ): + def write_sim_telarray_config_file(self, additional_models=None, label=None): """ Write the sim_telarray configuration file. @@ -860,24 +834,16 @@ def write_sim_telarray_config_file( Model object for additional parameter to be written to the config file. label: str or None Optional label override used for output file naming. - config_file_path: pathlib.Path or str or None - Optional explicit path of the config file. If not given, it is derived from ``label``. """ self.parameters.update(self._simulation_config_parameters.get("sim_telarray", {})) self.export_model_files(update_if_necessary=True) self._add_additional_models(additional_models) - config_file_path = ( - Path(config_file_path) - if config_file_path is not None - else self.get_config_file_path(label=label) - ) - # Ensure the writer label matches the config file naming label. self._load_simtel_config_writer(label=label) self.simtel_config_writer.write_telescope_config_file( - config_file_path=config_file_path, + config_file_path=self.config_file_path, parameters=self.parameters, ) diff --git a/src/simtools/simtel/simtel_config_writer.py b/src/simtools/simtel/simtel_config_writer.py index 106c8183e7..05f6ede516 100644 --- a/src/simtools/simtel/simtel_config_writer.py +++ b/src/simtools/simtel/simtel_config_writer.py @@ -303,8 +303,17 @@ def write_array_config_file( Site model. additional_metadata: dict Dictionary with additional metadata to include. + + Raises + ------ + FileExistsError + If the config file already exists. """ config_file_directory = Path(config_file_path).parent + config_file_path = Path(config_file_path) + if config_file_path.exists(): + raise FileExistsError(f"Array config file {config_file_path} already exists.") + with open(config_file_path, "w", encoding="utf-8") as file: self._write_header(file, "ARRAY CONFIGURATION FILE") diff --git a/src/simtools/simtel/simulator_ray_tracing.py b/src/simtools/simtel/simulator_ray_tracing.py index 3abccab372..034907abd8 100644 --- a/src/simtools/simtel/simulator_ray_tracing.py +++ b/src/simtools/simtel/simulator_ray_tracing.py @@ -108,7 +108,7 @@ def _load_required_files(self, force_simulate): self.__dict__["_" + base_name + "_file"] = file if not file.exists() or force_simulate: - config_file_path = self.telescope_model.get_config_file_path(label=self.label) + config_file_path = self.telescope_model.config_file_path # Adding header to photon list file. with self._photons_file.open("w", encoding="utf-8") as file: file.write(f"#{50 * '='}\n") @@ -147,7 +147,7 @@ def make_run_command(self, run_number=None, input_file=None): # pylint: disable label=self.label, ) - config_file_path = self.telescope_model.get_config_file_path(label=self.label) + config_file_path = self.telescope_model.config_file_path if self.config.single_mirror_mode: # Note: no mirror length defined for dual-mirror telescopes diff --git a/src/simtools/utils/names.py b/src/simtools/utils/names.py index 99de168229..ea5855a56c 100644 --- a/src/simtools/utils/names.py +++ b/src/simtools/utils/names.py @@ -17,7 +17,6 @@ import re from functools import cache from pathlib import Path -from uuid import uuid4 import yaml @@ -740,56 +739,38 @@ def get_simulation_software_name_from_parameter_name( return None -def simtel_config_file_name( - site, - array_name=None, - telescope_model_name=None, - label=None, - extra_label=None, -): +def sim_telarray_config_file_name(site, array_name=None, telescope_model_name=None): """ - sim_telarray config file name for a telescope. + sim_telarray configuration file name for an array or a telescope. Parameters ---------- site: str South or North. + array_name: str + Array name (e.g., CTAO-North-4-LSTs-1-MSTs) telescope_model_name: str - LST-1, MST-FlashCam, ... - label: str - Instance label. - extra_label: str - Extra label in case of multiple telescope config files. + Telescope name (e.g., LSTN-01, MSTS-05) Returns ------- str - File name. + Configuration file name. """ - name = "CTA" - name += f"-{array_name}" if array_name is not None else "" - name += f"-{site}" - name += f"-{telescope_model_name}" if telescope_model_name is not None else "" - name += f"_{label}" if label is not None else "" - name += f"_{extra_label}" if extra_label is not None else "" + name = "CTAO" + if array_name: + name += f"-{site}-{array_name}" + if telescope_model_name: + name += f"-{telescope_model_name}" name += ".cfg" # Telescope config files are included by the array config and parsed by sim_telarray - # through a fixed-size getword buffer. Keep include targets within that parser limit. + # through a fixed-size getword buffer. if telescope_model_name is not None and len(name) > SIM_TELARRAY_INCLUDE_FILENAME_MAX_LENGTH: - token = uuid4().hex[:8] - prefix = "CTA" - prefix += f"-{array_name}" if array_name is not None else "" - prefix += f"-{site}" - suffix = f"_{token}.cfg" - telescope_component = f"-{telescope_model_name}" - - available_length = SIM_TELARRAY_INCLUDE_FILENAME_MAX_LENGTH - len(prefix) - len(suffix) - if available_length < len(telescope_component): - telescope_component = telescope_component[: max(0, available_length)] - - name = f"{prefix}{telescope_component}{suffix}" - + raise ValueError( + f"Generated configuration file name {name} exceeds the maximum length of " + f"{SIM_TELARRAY_INCLUDE_FILENAME_MAX_LENGTH} characters." + ) return name diff --git a/tests/integration_tests/config/simulate_prod_gamma_40_deg_south_sim_telarray_only.yml b/tests/integration_tests/config/simulate_prod_gamma_40_deg_south_sim_telarray_only.yml index c036dcbe52..aa28a396ea 100644 --- a/tests/integration_tests/config/simulate_prod_gamma_40_deg_south_sim_telarray_only.yml +++ b/tests/integration_tests/config/simulate_prod_gamma_40_deg_south_sim_telarray_only.yml @@ -17,7 +17,7 @@ applications: integration_tests: - output_file: sim_telarray/run000007/gamma_run000007_za40deg_azm180deg_South_subsystem_lsts_6.0.2_test.simtel.zst - test_simtel_cfg_files: - "6.0.2": ${generated:sim_telarray_configurations/6.0.2/CTA-South-LSTS-01_test.cfg} + "6.0.2": ${generated:sim_telarray_configurations/6.0.2/CTAO-LSTS-01.cfg} - test_output_files: - expected_sim_telarray_output: pe_sum: diff --git a/tests/integration_tests/config/simulate_prod_gamma_62_deg_south_check_output.yml b/tests/integration_tests/config/simulate_prod_gamma_62_deg_south_check_output.yml index 1563478dbe..d8f2b495b7 100644 --- a/tests/integration_tests/config/simulate_prod_gamma_62_deg_south_check_output.yml +++ b/tests/integration_tests/config/simulate_prod_gamma_62_deg_south_check_output.yml @@ -28,9 +28,9 @@ applications: overwrite_model_parameters: tests/resources/static/info_test_model_parameter_changes.yml integration_tests: - test_simtel_cfg_files: - "6.0.2": ${generated:sim_telarray_configurations/6.0.2/CTA-South-MSTS-01_test.cfg} + "6.0.2": ${generated:sim_telarray_configurations/6.0.2/CTAO-MSTS-01.cfg} - test_simtel_cfg_files: - "6.0.2": ${generated:sim_telarray_configurations/6.0.2/CTA-beta-South_test.cfg} + "6.0.2": ${generated:sim_telarray_configurations/6.0.2/CTAO-South-beta.cfg} - test_output_files: - file: gamma_run000020_za62deg_azm180deg_South_beta_6.0.2_test.log_hist.tar.gz path_descriptor: pack_for_grid_register diff --git a/tests/integration_tests/config/simulate_prod_proton_20_deg_north_check_output.yml b/tests/integration_tests/config/simulate_prod_proton_20_deg_north_check_output.yml index e4f9be8447..0cfc9f4cf9 100644 --- a/tests/integration_tests/config/simulate_prod_proton_20_deg_north_check_output.yml +++ b/tests/integration_tests/config/simulate_prod_proton_20_deg_north_check_output.yml @@ -27,17 +27,17 @@ applications: zenith_angle: 20 integration_tests: - test_simtel_cfg_files: - "5.0.0": ${generated:sim_telarray_configurations/5.0.0/CTA-North-LSTN-01_test.cfg} - "6.0.2": ${generated:sim_telarray_configurations/6.0.2/CTA-North-LSTN-01_test.cfg} + "5.0.0": ${generated:sim_telarray_configurations/5.0.0/CTAO-LSTN-01.cfg} + "6.0.2": ${generated:sim_telarray_configurations/6.0.2/CTAO-LSTN-01.cfg} - test_simtel_cfg_files: - "5.0.0": ${generated:sim_telarray_configurations/5.0.0/CTA-North-LSTN-02_test.cfg} - "6.0.2": ${generated:sim_telarray_configurations/6.0.2/CTA-North-LSTN-02_test.cfg} + "5.0.0": ${generated:sim_telarray_configurations/5.0.0/CTAO-LSTN-02.cfg} + "6.0.2": ${generated:sim_telarray_configurations/6.0.2/CTAO-LSTN-02.cfg} - test_simtel_cfg_files: - "5.0.0": ${generated:sim_telarray_configurations/5.0.0/CTA-North-MSTN-01_test.cfg} - "6.0.2": ${generated:sim_telarray_configurations/6.0.2/CTA-North-MSTN-01_test.cfg} + "5.0.0": ${generated:sim_telarray_configurations/5.0.0/CTAO-MSTN-01.cfg} + "6.0.2": ${generated:sim_telarray_configurations/6.0.2/CTAO-MSTN-01.cfg} - test_simtel_cfg_files: - "5.0.0": ${generated:sim_telarray_configurations/5.0.0/CTA-alpha-North_test.cfg} - "6.0.2": ${generated:sim_telarray_configurations/6.0.2/CTA-alpha-North_test.cfg} + "5.0.0": ${generated:sim_telarray_configurations/5.0.0/CTAO-North-alpha.cfg} + "6.0.2": ${generated:sim_telarray_configurations/6.0.2/CTAO-North-alpha.cfg} - test_output_files: - file: proton_run000001_za20deg_azm180deg_North_alpha_6.0.2_test.log_hist.tar.gz path_descriptor: pack_for_grid_register diff --git a/tests/resources/generated/sim_telarray_configurations/5.0.0/CTA-North-LSTN-01_test.cfg b/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-LSTN-01.cfg similarity index 100% rename from tests/resources/generated/sim_telarray_configurations/5.0.0/CTA-North-LSTN-01_test.cfg rename to tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-LSTN-01.cfg diff --git a/tests/resources/generated/sim_telarray_configurations/5.0.0/CTA-North-LSTN-02_test.cfg b/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-LSTN-02.cfg similarity index 100% rename from tests/resources/generated/sim_telarray_configurations/5.0.0/CTA-North-LSTN-02_test.cfg rename to tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-LSTN-02.cfg diff --git a/tests/resources/generated/sim_telarray_configurations/5.0.0/CTA-North-MSTN-01_test.cfg b/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-MSTN-01.cfg similarity index 100% rename from tests/resources/generated/sim_telarray_configurations/5.0.0/CTA-North-MSTN-01_test.cfg rename to tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-MSTN-01.cfg diff --git a/tests/resources/generated/sim_telarray_configurations/5.0.0/CTA-alpha-North_test.cfg b/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-North-alpha.cfg similarity index 100% rename from tests/resources/generated/sim_telarray_configurations/5.0.0/CTA-alpha-North_test.cfg rename to tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-North-alpha.cfg diff --git a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTA-North-LSTN-01_test.cfg b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-LSTN-01.cfg similarity index 100% rename from tests/resources/generated/sim_telarray_configurations/6.0.2/CTA-North-LSTN-01_test.cfg rename to tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-LSTN-01.cfg diff --git a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTA-North-LSTN-02_test.cfg b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-LSTN-02.cfg similarity index 100% rename from tests/resources/generated/sim_telarray_configurations/6.0.2/CTA-North-LSTN-02_test.cfg rename to tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-LSTN-02.cfg diff --git a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTA-South-LSTS-01_test.cfg b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-LSTS-01.cfg similarity index 100% rename from tests/resources/generated/sim_telarray_configurations/6.0.2/CTA-South-LSTS-01_test.cfg rename to tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-LSTS-01.cfg diff --git a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTA-North-MSTN-01_test.cfg b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-MSTN-01.cfg similarity index 100% rename from tests/resources/generated/sim_telarray_configurations/6.0.2/CTA-North-MSTN-01_test.cfg rename to tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-MSTN-01.cfg diff --git a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTA-South-MSTS-01_test.cfg b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-MSTS-01.cfg similarity index 100% rename from tests/resources/generated/sim_telarray_configurations/6.0.2/CTA-South-MSTS-01_test.cfg rename to tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-MSTS-01.cfg diff --git a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTA-alpha-North_test.cfg b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-North-alpha.cfg similarity index 100% rename from tests/resources/generated/sim_telarray_configurations/6.0.2/CTA-alpha-North_test.cfg rename to tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-North-alpha.cfg diff --git a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTA-beta-South_test.cfg b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-South-beta.cfg similarity index 100% rename from tests/resources/generated/sim_telarray_configurations/6.0.2/CTA-beta-South_test.cfg rename to tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-South-beta.cfg diff --git a/tests/unit_tests/model/test_array_model.py b/tests/unit_tests/model/test_array_model.py index 8110f1428d..96f5312a01 100644 --- a/tests/unit_tests/model/test_array_model.py +++ b/tests/unit_tests/model/test_array_model.py @@ -81,7 +81,7 @@ def test_get_telescope_position_parameter(array_model_north): def test_get_config_file(array_model_north): am = array_model_north - assert am.config_file_path.name == "CTA-test_layout-North_test-lst-array.cfg" + assert am.config_file_path.name == "CTAO-North-test_layout.cfg" def test_get_config_directory(array_model_north): diff --git a/tests/unit_tests/simtel/test_simulator_ray_tracing.py b/tests/unit_tests/simtel/test_simulator_ray_tracing.py index fd43cef473..bf5c16cc30 100644 --- a/tests/unit_tests/simtel/test_simulator_ray_tracing.py +++ b/tests/unit_tests/simtel/test_simulator_ray_tracing.py @@ -157,9 +157,7 @@ def test_make_run_command(simulator_ray_tracing_sst, model_version): command, stdout_file, stderr_file = simulator_ray_tracing_sst.make_run_command() assert any("bin/sim_telarray" in str(cmd) for cmd in command) - assert any( - f"model/{model_version}/CTA-South-SSTS-design_{LABEL}.cfg" in str(cmd) for cmd in command - ) + assert any(f"model/{model_version}/CTAO-SSTS-design.cfg" in str(cmd) for cmd in command) # Check that the relevant options are present as substrings in the command assert any("altitude=2147.0" in str(cmd) for cmd in command) assert any("telescope_theta=20.0" in str(cmd) for cmd in command) diff --git a/tests/unit_tests/utils/test_names.py b/tests/unit_tests/utils/test_names.py index c60194c91d..1cc0314dae 100644 --- a/tests/unit_tests/utils/test_names.py +++ b/tests/unit_tests/utils/test_names.py @@ -5,7 +5,6 @@ import pytest -from simtools.constants import SIM_TELARRAY_INCLUDE_FILENAME_MAX_LENGTH from simtools.utils import names logging.getLogger().setLevel(logging.DEBUG) @@ -370,54 +369,14 @@ def test_generate_file_name_camera_efficiency(): ) -def test_simtel_telescope_config_file_name(): +def test_simtel_config_file_name(): assert ( - names.simtel_config_file_name( - "South", telescope_model_name="LSTS-01", label=None, extra_label=None - ) - == "CTA-South-LSTS-01.cfg" - ) - assert ( - names.simtel_config_file_name( - "South", telescope_model_name="LSTS-01", label="A", extra_label=None - ) - == "CTA-South-LSTS-01_A.cfg" - ) - assert ( - names.simtel_config_file_name( - "South", telescope_model_name="LSTS-01", label="A", extra_label="B" - ) - == "CTA-South-LSTS-01_A_B.cfg" - ) - - -def test_simtel_telescope_config_file_name_uses_uuid_suffix_when_too_long(): - file_name = names.simtel_config_file_name( - "South", - telescope_model_name="LSTS-01-" + "x" * 120, - label="very-long-label-" + "y" * 80, - extra_label="extra-long-label-" + "z" * 80, - ) - - assert len(file_name) <= SIM_TELARRAY_INCLUDE_FILENAME_MAX_LENGTH - assert file_name.startswith("CTA-South-") - assert file_name.endswith(".cfg") - assert "very-long-label" not in file_name - assert "extra-long-label" not in file_name - - token = file_name.rsplit("_", 1)[1].removesuffix(".cfg") - assert len(token) == 8 - assert all(character in "0123456789abcdef" for character in token) - - -def test_sim_telarray_config_file_name(): - assert ( - names.simtel_config_file_name(array_name="4LSTs", site="South", label=None) - == "CTA-4LSTs-South.cfg" + names.sim_telarray_config_file_name("South", telescope_model_name="LSTS-01") + == "CTAO-LSTS-01.cfg" ) assert ( - names.simtel_config_file_name(array_name="4LSTs", site="South", label="A") - == "CTA-4LSTs-South_A.cfg" + names.sim_telarray_config_file_name(array_name="4LSTs", site="South") + == "CTAO-South-4LSTs.cfg" ) From 2c443c3ef9cdc734c44871c6158049f3c8675c3b Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 3 Jul 2026 11:12:35 +0200 Subject: [PATCH 2/8] v0.34.0 configuration files --- .../5.0.0/CTAO-LSTN-01.cfg | 4 +-- .../5.0.0/CTAO-LSTN-02.cfg | 4 +-- .../5.0.0/CTAO-MSTN-01.cfg | 4 +-- .../5.0.0/CTAO-North-alpha.cfg | 32 +++++++++---------- .../6.0.2/CTAO-LSTN-01.cfg | 4 +-- .../6.0.2/CTAO-LSTN-02.cfg | 4 +-- .../6.0.2/CTAO-MSTN-01.cfg | 4 +-- .../6.0.2/CTAO-North-alpha.cfg | 32 +++++++++---------- 8 files changed, 44 insertions(+), 44 deletions(-) diff --git a/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-LSTN-01.cfg b/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-LSTN-01.cfg index a6b9dceb9e..df82fca817 100644 --- a/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-LSTN-01.cfg +++ b/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-LSTN-01.cfg @@ -69,7 +69,7 @@ fadc_max_sum = 16777215 fadc_mhz = 1024.0 fadc_noise = 6.7 fadc_pedestal = 400.0 -fadc_pulse_shape = fadc_pulse_shape-CTA-North-LSTN-01_test.dat +fadc_pulse_shape = fadc_pulse_shape-CTAO-LSTN-01.dat fadc_sensitivity = 1.0 fadc_sum_bins = 40 fadc_sum_offset = 9 @@ -135,7 +135,7 @@ save_pe_with_amplitude = 1 store_photoelectrons = 20 tailcut_scale = 2.6 stars = none -config_release = 5.0.0 with simtools v0.32.1.dev99+gb55cc6a0c +config_release = 5.0.0 with simtools v0.33.1.dev228+g5a60b2353.d20260702 config_version = 5.0.0 camera_config_name = LSTN-design camera_config_variant = LSTN-01 diff --git a/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-LSTN-02.cfg b/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-LSTN-02.cfg index a60a66eeec..fa9407f598 100644 --- a/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-LSTN-02.cfg +++ b/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-LSTN-02.cfg @@ -69,7 +69,7 @@ fadc_max_sum = 16777215 fadc_mhz = 1024.0 fadc_noise = 6.7 fadc_pedestal = 400.0 -fadc_pulse_shape = fadc_pulse_shape-CTA-North-LSTN-02_test.dat +fadc_pulse_shape = fadc_pulse_shape-CTAO-LSTN-02.dat fadc_sensitivity = 1.0 fadc_sum_bins = 40 fadc_sum_offset = 9 @@ -135,7 +135,7 @@ save_pe_with_amplitude = 1 store_photoelectrons = 20 tailcut_scale = 2.6 stars = none -config_release = 5.0.0 with simtools v0.32.1.dev99+gb55cc6a0c +config_release = 5.0.0 with simtools v0.33.1.dev228+g5a60b2353.d20260702 config_version = 5.0.0 camera_config_name = LSTN-design camera_config_variant = LSTN-02 diff --git a/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-MSTN-01.cfg b/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-MSTN-01.cfg index 63eb192758..de7de6f7c5 100644 --- a/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-MSTN-01.cfg +++ b/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-MSTN-01.cfg @@ -82,7 +82,7 @@ fadc_max_sum = 16777215 fadc_mhz = 1000.0 fadc_noise = 3.6 fadc_pedestal = 250.0 -fadc_pulse_shape = fadc_pulse_shape-CTA-North-MSTN-01_test.dat +fadc_pulse_shape = fadc_pulse_shape-CTAO-MSTN-01.dat fadc_sensitivity = 1.0 fadc_sum_bins = 60 fadc_sum_offset = 18 @@ -148,7 +148,7 @@ save_pe_with_amplitude = 1 store_photoelectrons = 26 tailcut_scale = 2.3 stars = none -config_release = 5.0.0 with simtools v0.32.1.dev99+gb55cc6a0c +config_release = 5.0.0 with simtools v0.33.1.dev228+g5a60b2353.d20260702 config_version = 5.0.0 camera_config_name = MSTx-NectarCam camera_config_variant = MSTN-01 diff --git a/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-North-alpha.cfg b/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-North-alpha.cfg index f04651f5e9..5abb85968d 100644 --- a/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-North-alpha.cfg +++ b/tests/resources/generated/sim_telarray_configurations/5.0.0/CTAO-North-alpha.cfg @@ -18,7 +18,7 @@ echo ***************************** % Simtools parameters - metaparam global set simtools_version = 0.32.1.dev99+gb55cc6a0c + metaparam global set simtools_version = 0.33.1.dev228+g5a60b2353.d20260702 metaparam global set simtools_model_production_version = 5.0.0 metaparam global set simtools_corsika_version = 78010 metaparam global set simtools_corsika_opt_patch_version = v1.1.0 @@ -29,7 +29,7 @@ metaparam global set simtools_hessio_version = v2025-12-01-rc metaparam global set simtools_stdtools_version = v2025-06-16-rc metaparam global set simtools_extra_defines = -DCTA_PROD6 -DMAXIMUM_TELESCOPES=99 - metaparam global set simtools_build_date = 2026-05-04T14:56:02Z + metaparam global set simtools_build_date = 2026-05-04T16:23:40Z metaparam global set simtools_corsika_exec = corsika_epos_urqmd % Site parameters array_triggers = array_triggers.dat @@ -39,7 +39,7 @@ nsb_scaling_factor = 1.0 nsb_sky_map = None stars = None - config_release = 5.0.0 with simtools v0.32.1.dev99+gb55cc6a0c + config_release = 5.0.0 with simtools v0.33.1.dev228+g5a60b2353.d20260702 config_version = 5.0.0 site_config_name = North site_config_variant = @@ -64,66 +64,66 @@ % LSTN-01 #elif TELESCOPE == 1 -# include +# include % LSTN-02 #elif TELESCOPE == 2 -# include +# include % LSTN-03 #elif TELESCOPE == 3 -# include +# include % LSTN-04 #elif TELESCOPE == 4 -# include +# include % MSTN-01 #elif TELESCOPE == 5 -# include +# include % MSTN-02 #elif TELESCOPE == 6 -# include +# include % MSTN-03 #elif TELESCOPE == 7 -# include +# include % MSTN-04 #elif TELESCOPE == 8 -# include +# include % MSTN-05 #elif TELESCOPE == 9 -# include +# include % MSTN-06 #elif TELESCOPE == 10 -# include +# include % MSTN-07 #elif TELESCOPE == 11 -# include +# include % MSTN-10 #elif TELESCOPE == 12 -# include +# include % MSTN-15 #elif TELESCOPE == 13 -# include +# include #endif diff --git a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-LSTN-01.cfg b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-LSTN-01.cfg index f937d8bb24..56210edb55 100644 --- a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-LSTN-01.cfg +++ b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-LSTN-01.cfg @@ -69,7 +69,7 @@ fadc_max_sum = 16777215 fadc_mhz = 1024.0 fadc_noise = 6.7 fadc_pedestal = 400.0 -fadc_pulse_shape = fadc_pulse_shape-CTA-North-LSTN-01_test.dat +fadc_pulse_shape = fadc_pulse_shape-CTAO-LSTN-01.dat fadc_sensitivity = 1.0 fadc_sum_bins = 40 fadc_sum_offset = 9 @@ -135,7 +135,7 @@ save_pe_with_amplitude = 1 store_photoelectrons = 20 tailcut_scale = 2.6 stars = none -config_release = 6.0.2 with simtools v0.32.1.dev99+gb55cc6a0c +config_release = 6.0.2 with simtools v0.33.1.dev228+g5a60b2353.d20260702 config_version = 6.0.2 camera_config_name = LSTN-design camera_config_variant = LSTN-01 diff --git a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-LSTN-02.cfg b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-LSTN-02.cfg index 2106192867..a510540605 100644 --- a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-LSTN-02.cfg +++ b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-LSTN-02.cfg @@ -69,7 +69,7 @@ fadc_max_sum = 16777215 fadc_mhz = 1024.0 fadc_noise = 6.7 fadc_pedestal = 400.0 -fadc_pulse_shape = fadc_pulse_shape-CTA-North-LSTN-02_test.dat +fadc_pulse_shape = fadc_pulse_shape-CTAO-LSTN-02.dat fadc_sensitivity = 1.0 fadc_sum_bins = 40 fadc_sum_offset = 9 @@ -135,7 +135,7 @@ save_pe_with_amplitude = 1 store_photoelectrons = 20 tailcut_scale = 2.6 stars = none -config_release = 6.0.2 with simtools v0.32.1.dev99+gb55cc6a0c +config_release = 6.0.2 with simtools v0.33.1.dev228+g5a60b2353.d20260702 config_version = 6.0.2 camera_config_name = LSTN-design camera_config_variant = LSTN-02 diff --git a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-MSTN-01.cfg b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-MSTN-01.cfg index 2b8436713d..0dee7674b1 100644 --- a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-MSTN-01.cfg +++ b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-MSTN-01.cfg @@ -82,7 +82,7 @@ fadc_max_sum = 16777215 fadc_mhz = 1000.0 fadc_noise = 3.6 fadc_pedestal = 250.0 -fadc_pulse_shape = fadc_pulse_shape-CTA-North-MSTN-01_test.dat +fadc_pulse_shape = fadc_pulse_shape-CTAO-MSTN-01.dat fadc_sensitivity = 1.0 fadc_sum_bins = 60 fadc_sum_offset = 18 @@ -148,7 +148,7 @@ save_pe_with_amplitude = 1 store_photoelectrons = 26 tailcut_scale = 2.3 stars = none -config_release = 6.0.2 with simtools v0.32.1.dev99+gb55cc6a0c +config_release = 6.0.2 with simtools v0.33.1.dev228+g5a60b2353.d20260702 config_version = 6.0.2 camera_config_name = MSTx-NectarCam camera_config_variant = MSTN-01 diff --git a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-North-alpha.cfg b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-North-alpha.cfg index e340fca982..3c977efa86 100644 --- a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-North-alpha.cfg +++ b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-North-alpha.cfg @@ -18,7 +18,7 @@ echo ***************************** % Simtools parameters - metaparam global set simtools_version = 0.32.1.dev99+gb55cc6a0c + metaparam global set simtools_version = 0.33.1.dev228+g5a60b2353.d20260702 metaparam global set simtools_model_production_version = 6.0.2 metaparam global set simtools_corsika_version = 78010 metaparam global set simtools_corsika_opt_patch_version = v1.1.0 @@ -29,7 +29,7 @@ metaparam global set simtools_hessio_version = v2025-12-01-rc metaparam global set simtools_stdtools_version = v2025-06-16-rc metaparam global set simtools_extra_defines = -DCTA_PROD6 -DMAXIMUM_TELESCOPES=99 - metaparam global set simtools_build_date = 2026-05-04T14:56:02Z + metaparam global set simtools_build_date = 2026-05-04T16:23:40Z metaparam global set simtools_corsika_exec = corsika_epos_urqmd % Site parameters array_triggers = array_triggers.dat @@ -39,7 +39,7 @@ nsb_scaling_factor = 1.0 nsb_sky_map = None stars = None - config_release = 6.0.2 with simtools v0.32.1.dev99+gb55cc6a0c + config_release = 6.0.2 with simtools v0.33.1.dev228+g5a60b2353.d20260702 config_version = 6.0.2 site_config_name = North site_config_variant = @@ -65,66 +65,66 @@ % LSTN-01 #elif TELESCOPE == 1 -# include +# include % LSTN-02 #elif TELESCOPE == 2 -# include +# include % LSTN-03 #elif TELESCOPE == 3 -# include +# include % LSTN-04 #elif TELESCOPE == 4 -# include +# include % MSTN-01 #elif TELESCOPE == 5 -# include +# include % MSTN-02 #elif TELESCOPE == 6 -# include +# include % MSTN-03 #elif TELESCOPE == 7 -# include +# include % MSTN-04 #elif TELESCOPE == 8 -# include +# include % MSTN-05 #elif TELESCOPE == 9 -# include +# include % MSTN-06 #elif TELESCOPE == 10 -# include +# include % MSTN-07 #elif TELESCOPE == 11 -# include +# include % MSTN-10 #elif TELESCOPE == 12 -# include +# include % MSTN-15 #elif TELESCOPE == 13 -# include +# include #endif From 7191caf87be983d5dc35446d0dc510e50c3078a0 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 3 Jul 2026 11:16:15 +0200 Subject: [PATCH 3/8] tests --- .../6.0.2/CTAO-LSTS-01.cfg | 4 +- .../6.0.2/CTAO-MSTS-01.cfg | 4 +- .../6.0.2/CTAO-South-beta.cfg | 122 +++++++++--------- .../testing/test_validate_output.py | 8 +- 4 files changed, 67 insertions(+), 71 deletions(-) diff --git a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-LSTS-01.cfg b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-LSTS-01.cfg index 61a15bf8ff..4370434a24 100644 --- a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-LSTS-01.cfg +++ b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-LSTS-01.cfg @@ -69,7 +69,7 @@ fadc_max_sum = 16777215 fadc_mhz = 1024.0 fadc_noise = 6.7 fadc_pedestal = 400.0 -fadc_pulse_shape = fadc_pulse_shape-CTA-South-LSTS-01_test.dat +fadc_pulse_shape = fadc_pulse_shape-CTAO-LSTS-01.dat fadc_sensitivity = 1.0 fadc_sum_bins = 40 fadc_sum_offset = 9 @@ -135,7 +135,7 @@ save_pe_with_amplitude = 1 store_photoelectrons = 20 tailcut_scale = 2.6 stars = none -config_release = 6.0.2 with simtools v0.32.1.dev99+gb55cc6a0c +config_release = 6.0.2 with simtools v0.33.1.dev228+g5a60b2353.d20260702 config_version = 6.0.2 camera_config_name = LSTS-design camera_config_variant = LSTS-01 diff --git a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-MSTS-01.cfg b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-MSTS-01.cfg index 427e626e7e..58a1b6a57e 100644 --- a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-MSTS-01.cfg +++ b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-MSTS-01.cfg @@ -85,7 +85,7 @@ fadc_max_sum = 16777215 fadc_mhz = 250.0 fadc_noise = 1.0 fadc_pedestal = 200.0 -fadc_pulse_shape = fadc_pulse_shape-CTA-South-MSTS-01_test.dat +fadc_pulse_shape = fadc_pulse_shape-CTAO-MSTS-01.dat fadc_sensitivity = 1.0 fadc_sum_bins = 24 fadc_sum_offset = 6 @@ -151,7 +151,7 @@ save_pe_with_amplitude = 1 store_photoelectrons = 22 tailcut_scale = 2.6 stars = none -config_release = 6.0.2 with simtools v0.32.1.dev99+gb55cc6a0c +config_release = 6.0.2 with simtools v0.33.1.dev228+g5a60b2353.d20260702 config_version = 6.0.2 camera_config_name = MSTx-FlashCam camera_config_variant = MSTS-01 diff --git a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-South-beta.cfg b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-South-beta.cfg index fd5db32507..11784e7fb9 100644 --- a/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-South-beta.cfg +++ b/tests/resources/generated/sim_telarray_configurations/6.0.2/CTAO-South-beta.cfg @@ -18,7 +18,7 @@ echo ***************************** % Simtools parameters - metaparam global set simtools_version = 0.32.1.dev99+gb55cc6a0c + metaparam global set simtools_version = 0.33.1.dev228+g5a60b2353.d20260702 metaparam global set simtools_model_production_version = 6.0.2 metaparam global set simtools_corsika_version = 78010 metaparam global set simtools_corsika_opt_patch_version = v1.1.0 @@ -29,7 +29,7 @@ metaparam global set simtools_hessio_version = v2025-12-01-rc metaparam global set simtools_stdtools_version = v2025-06-16-rc metaparam global set simtools_extra_defines = -DCTA_PROD6 -DMAXIMUM_TELESCOPES=99 - metaparam global set simtools_build_date = 2026-05-04T14:56:02Z + metaparam global set simtools_build_date = 2026-05-04T16:23:40Z metaparam global set simtools_corsika_exec = corsika_epos_urqmd % Site parameters array_triggers = array_triggers.dat @@ -39,7 +39,7 @@ nsb_scaling_factor = 1.0 nsb_sky_map = None stars = None - config_release = 6.0.2 with simtools v0.32.1.dev99+gb55cc6a0c + config_release = 6.0.2 with simtools v0.33.1.dev228+g5a60b2353.d20260702 config_version = 6.0.2 site_config_name = South site_config_variant = @@ -65,291 +65,291 @@ % LSTS-01 #elif TELESCOPE == 1 -# include +# include % LSTS-02 #elif TELESCOPE == 2 -# include +# include % MSTS-01 #elif TELESCOPE == 3 -# include +# include % MSTS-02 #elif TELESCOPE == 4 -# include +# include % MSTS-03 #elif TELESCOPE == 5 -# include +# include % MSTS-04 #elif TELESCOPE == 6 -# include +# include % MSTS-05 #elif TELESCOPE == 7 -# include +# include % MSTS-06 #elif TELESCOPE == 8 -# include +# include % MSTS-07 #elif TELESCOPE == 9 -# include +# include % MSTS-08 #elif TELESCOPE == 10 -# include +# include % MSTS-09 #elif TELESCOPE == 11 -# include +# include % MSTS-10 #elif TELESCOPE == 12 -# include +# include % MSTS-11 #elif TELESCOPE == 13 -# include +# include % MSTS-12 #elif TELESCOPE == 14 -# include +# include % MSTS-13 #elif TELESCOPE == 15 -# include +# include % MSTS-14 #elif TELESCOPE == 16 -# include +# include % SSTS-01 #elif TELESCOPE == 17 -# include +# include % SSTS-02 #elif TELESCOPE == 18 -# include +# include % SSTS-03 #elif TELESCOPE == 19 -# include +# include % SSTS-04 #elif TELESCOPE == 20 -# include +# include % SSTS-05 #elif TELESCOPE == 21 -# include +# include % SSTS-06 #elif TELESCOPE == 22 -# include +# include % SSTS-07 #elif TELESCOPE == 23 -# include +# include % SSTS-08 #elif TELESCOPE == 24 -# include +# include % SSTS-09 #elif TELESCOPE == 25 -# include +# include % SSTS-10 #elif TELESCOPE == 26 -# include +# include % SSTS-11 #elif TELESCOPE == 27 -# include +# include % SSTS-12 #elif TELESCOPE == 28 -# include +# include % SSTS-13 #elif TELESCOPE == 29 -# include +# include % SSTS-14 #elif TELESCOPE == 30 -# include +# include % SSTS-15 #elif TELESCOPE == 31 -# include +# include % SSTS-16 #elif TELESCOPE == 32 -# include +# include % SSTS-17 #elif TELESCOPE == 33 -# include +# include % SSTS-18 #elif TELESCOPE == 34 -# include +# include % SSTS-19 #elif TELESCOPE == 35 -# include +# include % SSTS-20 #elif TELESCOPE == 36 -# include +# include % SSTS-21 #elif TELESCOPE == 37 -# include +# include % SSTS-22 #elif TELESCOPE == 38 -# include +# include % SSTS-23 #elif TELESCOPE == 39 -# include +# include % SSTS-24 #elif TELESCOPE == 40 -# include +# include % SSTS-25 #elif TELESCOPE == 41 -# include +# include % SSTS-26 #elif TELESCOPE == 42 -# include +# include % SSTS-27 #elif TELESCOPE == 43 -# include +# include % SSTS-28 #elif TELESCOPE == 44 -# include +# include % SSTS-29 #elif TELESCOPE == 45 -# include +# include % SSTS-30 #elif TELESCOPE == 46 -# include +# include % SSTS-31 #elif TELESCOPE == 47 -# include +# include % SSTS-32 #elif TELESCOPE == 48 -# include +# include % SSTS-33 #elif TELESCOPE == 49 -# include +# include % SSTS-34 #elif TELESCOPE == 50 -# include +# include % SSTS-35 #elif TELESCOPE == 51 -# include +# include % SSTS-36 #elif TELESCOPE == 52 -# include +# include % SSTS-37 #elif TELESCOPE == 53 -# include +# include % SSTS-38 #elif TELESCOPE == 54 -# include +# include % SSTS-39 #elif TELESCOPE == 55 -# include +# include % SSTS-40 #elif TELESCOPE == 56 -# include +# include % SSTS-41 #elif TELESCOPE == 57 -# include +# include % SSTS-42 #elif TELESCOPE == 58 -# include +# include #endif diff --git a/tests/unit_tests/testing/test_validate_output.py b/tests/unit_tests/testing/test_validate_output.py index 995d98f8c5..38d78a9dc7 100644 --- a/tests/unit_tests/testing/test_validate_output.py +++ b/tests/unit_tests/testing/test_validate_output.py @@ -514,12 +514,8 @@ def test_validate_application_output_with_file_type( def test_compare_simtel_cfg_files(tmp_test_directory): - file1 = Path( - f"{TEST_RESOURCES_GENERATED}/sim_telarray_configurations/6.0.2/CTA-North-LSTN-01_test.cfg" - ) - file2 = Path( - f"{TEST_RESOURCES_GENERATED}/sim_telarray_configurations/6.0.2/CTA-North-LSTN-01_test.cfg" - ) + file1 = Path(f"{TEST_RESOURCES_GENERATED}/sim_telarray_configurations/6.0.2/CTAO-LSTN-01.cfg") + file2 = Path(f"{TEST_RESOURCES_GENERATED}/sim_telarray_configurations/6.0.2/CTAO-LSTN-01.cfg") assert validate_output._compare_simtel_cfg_files(file1, file2) From d95bc15a5ce6b03373012fd6b4aa346e9ebfa970 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 3 Jul 2026 12:15:23 +0200 Subject: [PATCH 4/8] run-level for model dir --- src/simtools/io/io_handler.py | 2 +- src/simtools/model/array_model.py | 8 ++++++++ src/simtools/model/model_parameter.py | 7 ++++--- src/simtools/simulator.py | 2 ++ src/simtools/testing/validate_output.py | 5 ++++- tests/unit_tests/io/test_io_handler.py | 2 +- tests/unit_tests/model/test_array_model.py | 15 +++++++++++++++ tests/unit_tests/test_simulator.py | 4 +++- tests/unit_tests/testing/test_validate_output.py | 4 +++- 9 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/simtools/io/io_handler.py b/src/simtools/io/io_handler.py index 087ac4cc57..31bafc5c5e 100644 --- a/src/simtools/io/io_handler.py +++ b/src/simtools/io/io_handler.py @@ -152,5 +152,5 @@ def get_model_configuration_directory(self, model_version, sub_dir=None): Path """ return self.get_output_directory( - sub_dir=[sub_dir, "model", model_version] if sub_dir else ["model", model_version] + sub_dir=["model", sub_dir, model_version] if sub_dir else ["model", model_version] ) diff --git a/src/simtools/model/array_model.py b/src/simtools/model/array_model.py index 948d747162..5b0aa18110 100644 --- a/src/simtools/model/array_model.py +++ b/src/simtools/model/array_model.py @@ -50,6 +50,7 @@ def __init__( calibration_device_types=None, overwrite_model_parameters=None, ignore_software_version=False, + model_directory_subdir=None, ): """Initialize ArrayModel.""" self._logger = logging.getLogger(__name__) @@ -72,6 +73,13 @@ def __init__( self.array_elements, self.site_model, self.telescope_models, self.calibration_models = ( self._initialize(site, array_elements, calibration_device_types) ) + if model_directory_subdir: + self._config_file_directory = self.io_handler.get_model_configuration_directory( + model_version=self.model_version, sub_dir=model_directory_subdir + ) + models = [self.site_model, *self.telescope_models.values()] + for model in models: + model._config_file_directory = self._config_file_directory self._telescope_model_files_exported = False self._array_model_file_exported = False diff --git a/src/simtools/model/model_parameter.py b/src/simtools/model/model_parameter.py index 81362ca064..b5c3700415 100644 --- a/src/simtools/model/model_parameter.py +++ b/src/simtools/model/model_parameter.py @@ -268,9 +268,10 @@ def _set_config_file_directory_and_name(self): if self.name is None and self.site is None: return - self._config_file_directory = self.io_handler.get_model_configuration_directory( - model_version=self.model_version - ) + if self._config_file_directory is None: + self._config_file_directory = self.io_handler.get_model_configuration_directory( + model_version=self.model_version + ) self._config_file_path = self.config_file_directory.joinpath( names.sim_telarray_config_file_name(site=self.site, telescope_model_name=self.name) diff --git a/src/simtools/simulator.py b/src/simtools/simulator.py index 6bf73a318b..a930cf18fd 100644 --- a/src/simtools/simulator.py +++ b/src/simtools/simulator.py @@ -124,6 +124,7 @@ def _initialize_array_models(self): array_model = [] corsika_configurations = [] + model_subdir = f"run{self.run_number:06d}" for version in versions: model = ArrayModel( @@ -134,6 +135,7 @@ def _initialize_array_models(self): model_version=version, calibration_device_types=self._get_calibration_device_types(self.run_mode), overwrite_model_parameters=settings.config.args.get("overwrite_model_parameters"), + model_directory_subdir=model_subdir, ) cfg = CorsikaConfig(array_model=model, label=self.label, run_number=self.run_number) model.initialize_seeds(cfg.zenith_angle, cfg.azimuth_angle) diff --git a/src/simtools/testing/validate_output.py b/src/simtools/testing/validate_output.py index 9af2620f6a..d96a55dd23 100644 --- a/src/simtools/testing/validate_output.py +++ b/src/simtools/testing/validate_output.py @@ -480,9 +480,12 @@ def _validate_simtel_cfg_files(config, simtel_cfg_file): """ reference_file = _resolve_path(simtel_cfg_file) + run_number = config["configuration"].get("run_number", 1) + config["configuration"].get( + "run_number_offset", 0 + ) test_file = ( Path(config["configuration"]["output_path"]) - / f"model/{config['configuration']['model_version']}" + / f"model/run{run_number:06d}/{config['configuration']['model_version']}" / reference_file.name.replace("_test", f"_{config['configuration']['label']}") ) _logger.info( diff --git a/tests/unit_tests/io/test_io_handler.py b/tests/unit_tests/io/test_io_handler.py index 032d89ab0b..c813656263 100644 --- a/tests/unit_tests/io/test_io_handler.py +++ b/tests/unit_tests/io/test_io_handler.py @@ -62,7 +62,7 @@ def test_get_model_configuration_directory(args_dict, io_handler): label = "test-io-handler" # Test directory creation - expected_path = Path(f"{args_dict['output_path']}/output/{label}/model/{model_version}") + expected_path = Path(f"{args_dict['output_path']}/output/model/{label}/{model_version}") assert ( io_handler.get_model_configuration_directory(sub_dir=label, model_version=model_version) == expected_path diff --git a/tests/unit_tests/model/test_array_model.py b/tests/unit_tests/model/test_array_model.py index 96f5312a01..0cd731be98 100644 --- a/tests/unit_tests/model/test_array_model.py +++ b/tests/unit_tests/model/test_array_model.py @@ -35,6 +35,21 @@ def test_array_model_north_from_file(model_version, get_test_data_file): assert am.number_of_telescopes == 13 +def test_array_model_run_specific_config_directory(model_version, io_handler): + am = ArrayModel( + site="North", + model_version=model_version, + array_elements=["LSTN-01"], + model_directory_subdir="run000010", + ) + + expected = io_handler.get_model_configuration_directory(model_version, "run000010") + assert am.get_config_directory() == expected + assert am.site_model.config_file_directory == expected + assert am.telescope_models["LSTN-01"].config_file_directory == expected + assert am.telescope_models["LSTN-01"].config_file_path.parent == expected + + def test_array_model_north_init_without_layout_or_telescope_list(model_version): with pytest.raises(ValueError, match=r"No array elements found."): ArrayModel(label="test", site="North", model_version=model_version) diff --git a/tests/unit_tests/test_simulator.py b/tests/unit_tests/test_simulator.py index 761109adab..f9ef59f210 100644 --- a/tests/unit_tests/test_simulator.py +++ b/tests/unit_tests/test_simulator.py @@ -259,13 +259,15 @@ def test_pack_for_register(array_simulator, mocker, model_version, caplog, tmp_t def test_initialize_array_models_with_single_version( - shower_simulator, model_version, mock_array_model + shower_simulator, model_version, mock_array_model, mocker ): """Test array models initialization with a single model version.""" + array_model_cls = mocker.patch("simtools.simulator.ArrayModel", return_value=mock_array_model) array_models, corsika_configurations = shower_simulator._initialize_array_models() assert len(array_models) == 1 assert array_models[0] == mock_array_model assert corsika_configurations is not None + assert array_model_cls.call_args.kwargs["model_directory_subdir"] == "run000001" def test_initialize_from_tool_configuration_with_corsika_file(shower_simulator, mocker): diff --git a/tests/unit_tests/testing/test_validate_output.py b/tests/unit_tests/testing/test_validate_output.py index 38d78a9dc7..f16e1e216f 100644 --- a/tests/unit_tests/testing/test_validate_output.py +++ b/tests/unit_tests/testing/test_validate_output.py @@ -546,12 +546,14 @@ def test_validate_simtel_cfg_files(mocker, test_path): "output_path": PATH_TO_OUTPUT, "model_version": "3.4.5", "label": "label", + "run_number": 42, + "run_number_offset": 1, }, "integration_tests": [{"test_simtel_cfg_files": test_path}], } validate_output._validate_simtel_cfg_files(config, test_path) - mock_compare.assert_called() + assert mock_compare.call_args.args[1].parent == Path(PATH_TO_OUTPUT) / "model/run000043/3.4.5" def test_compare_value_from_parameter_dict(): From b0bcdca24d6f7a2339587b2dc4d4ea18fe34d16d Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 3 Jul 2026 12:16:24 +0200 Subject: [PATCH 5/8] changelog --- docs/changes/2318.maintenance.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/changes/2318.maintenance.md b/docs/changes/2318.maintenance.md index 28fb4d0fd9..285c0fbcb6 100644 --- a/docs/changes/2318.maintenance.md +++ b/docs/changes/2318.maintenance.md @@ -1,4 +1,5 @@ Simplify naming of sim_telarray configuration files written to disk for simulation production: - telescope configuration files are now of type `CTAO-LSTS-01.cfg`, `CTAO-SSTS-25.cfg` - array configuration files are of type `CTAO-South-beta.cfg` -Raises an exception if existing configuration files are overwritten by an application. +- raises an exception if existing configuration files are overwritten by an application. +- add a run-number level to the model sub directory to avoid overwriting for applications using several models. From 1069745d108f617d927702a96b7adb145e1905eb Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 3 Jul 2026 12:20:20 +0200 Subject: [PATCH 6/8] run number fix --- src/simtools/testing/validate_output.py | 14 +++++++++----- tests/unit_tests/testing/test_validate_output.py | 7 ++++++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/simtools/testing/validate_output.py b/src/simtools/testing/validate_output.py index d96a55dd23..bbce1f356a 100644 --- a/src/simtools/testing/validate_output.py +++ b/src/simtools/testing/validate_output.py @@ -9,6 +9,7 @@ import simtools.utils.general as gen from simtools.db import db_handler from simtools.io import ascii_handler +from simtools.sim_events import file_info from simtools.testing import assertions _logger = logging.getLogger(__name__) @@ -480,13 +481,16 @@ def _validate_simtel_cfg_files(config, simtel_cfg_file): """ reference_file = _resolve_path(simtel_cfg_file) - run_number = config["configuration"].get("run_number", 1) + config["configuration"].get( - "run_number_offset", 0 + configuration = config["configuration"] + run_number = ( + file_info.get_corsika_run_number(configuration["corsika_file"]) + if configuration.get("corsika_file") + else configuration.get("run_number", 1) + configuration.get("run_number_offset", 0) ) test_file = ( - Path(config["configuration"]["output_path"]) - / f"model/run{run_number:06d}/{config['configuration']['model_version']}" - / reference_file.name.replace("_test", f"_{config['configuration']['label']}") + Path(configuration["output_path"]) + / f"model/run{run_number:06d}/{configuration['model_version']}" + / reference_file.name.replace("_test", f"_{configuration['label']}") ) _logger.info( f"Comparing simtel cfg files: {reference_file} and {test_file} " diff --git a/tests/unit_tests/testing/test_validate_output.py b/tests/unit_tests/testing/test_validate_output.py index f16e1e216f..cdb122aa0a 100644 --- a/tests/unit_tests/testing/test_validate_output.py +++ b/tests/unit_tests/testing/test_validate_output.py @@ -538,6 +538,9 @@ def test_compare_simtel_cfg_files(tmp_test_directory): def test_validate_simtel_cfg_files(mocker, test_path): """Test validation of simtel cfg files.""" + mock_run_number = mocker.patch( + "simtools.testing.validate_output.file_info.get_corsika_run_number", return_value=7 + ) mock_compare = mocker.patch( "simtools.testing.validate_output._compare_simtel_cfg_files", return_value=True ) @@ -548,12 +551,14 @@ def test_validate_simtel_cfg_files(mocker, test_path): "label": "label", "run_number": 42, "run_number_offset": 1, + "corsika_file": test_path, }, "integration_tests": [{"test_simtel_cfg_files": test_path}], } validate_output._validate_simtel_cfg_files(config, test_path) - assert mock_compare.call_args.args[1].parent == Path(PATH_TO_OUTPUT) / "model/run000043/3.4.5" + mock_run_number.assert_called_once_with(test_path) + assert mock_compare.call_args.args[1].parent == Path(PATH_TO_OUTPUT) / "model/run000007/3.4.5" def test_compare_value_from_parameter_dict(): From f6cbe5d990e6d9e8d75af5b4e89cbe2c39d5b00b Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 3 Jul 2026 12:38:04 +0200 Subject: [PATCH 7/8] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/simtools/utils/names.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/simtools/utils/names.py b/src/simtools/utils/names.py index ea5855a56c..0eb08dc53e 100644 --- a/src/simtools/utils/names.py +++ b/src/simtools/utils/names.py @@ -757,6 +757,9 @@ def sim_telarray_config_file_name(site, array_name=None, telescope_model_name=No str Configuration file name. """ + if bool(array_name) == bool(telescope_model_name): + raise ValueError("Provide exactly one of array_name or telescope_model_name.") + name = "CTAO" if array_name: name += f"-{site}-{array_name}" From 65996cebc31ae2c9d2a3f4b2fc2e8e97dc2ed60a Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 3 Jul 2026 13:09:06 +0200 Subject: [PATCH 8/8] unit tests --- src/simtools/utils/names.py | 3 --- tests/unit_tests/utils/test_names.py | 8 ++++++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/simtools/utils/names.py b/src/simtools/utils/names.py index 0eb08dc53e..ea5855a56c 100644 --- a/src/simtools/utils/names.py +++ b/src/simtools/utils/names.py @@ -757,9 +757,6 @@ def sim_telarray_config_file_name(site, array_name=None, telescope_model_name=No str Configuration file name. """ - if bool(array_name) == bool(telescope_model_name): - raise ValueError("Provide exactly one of array_name or telescope_model_name.") - name = "CTAO" if array_name: name += f"-{site}-{array_name}" diff --git a/tests/unit_tests/utils/test_names.py b/tests/unit_tests/utils/test_names.py index 1cc0314dae..87e4eebf9b 100644 --- a/tests/unit_tests/utils/test_names.py +++ b/tests/unit_tests/utils/test_names.py @@ -5,6 +5,7 @@ import pytest +from simtools.constants import SIM_TELARRAY_INCLUDE_FILENAME_MAX_LENGTH from simtools.utils import names logging.getLogger().setLevel(logging.DEBUG) @@ -380,6 +381,13 @@ def test_simtel_config_file_name(): ) +def test_simtel_config_file_name_too_long(): + too_long_telescope_name = "A" * SIM_TELARRAY_INCLUDE_FILENAME_MAX_LENGTH + + with pytest.raises(ValueError, match="exceeds the maximum length"): + names.sim_telarray_config_file_name("South", telescope_model_name=too_long_telescope_name) + + def test_simtel_single_mirror_list_file_name(model_version): assert ( names.simtel_single_mirror_list_file_name(