Source code for simtools.simulation.configuration
"""Select software-specific configuration writers for resolved simulation models."""
def _simtel_writer(model, context=None):
"""Construct the sim_telarray model writer."""
# pylint: disable-next=import-outside-toplevel
from simtools.simtel.model_writer import SimtelModelWriter
return SimtelModelWriter(model, context=context)
_WRITERS = {"sim_telarray": _simtel_writer}
[docs]
def export_model_files(model, destination=None, update_if_necessary=False):
"""Export the parameter files of a model into its model directory.
Parameters
----------
model : ModelParameter
Model whose parameter files are exported.
destination : pathlib.Path, optional
Target directory. Defaults to the model configuration directory.
update_if_necessary : bool
Skip the export if the model files were already exported and not changed since.
"""
if update_if_necessary and model.model_files_exported:
return
model.model_reader.export_model_files(
parameters=model.parameters,
dest=destination or model.config_file_directory,
)
model.model_files_exported = True
[docs]
def get_model_writer(model, simulation_software="sim_telarray", context=None):
"""Return the selected model configuration writer, retaining its table cache.
Parameters
----------
model : ModelParameter or ArrayModel
Resolved simulation model.
simulation_software : str
Registered configuration writer.
context : RunContext, optional
Run context; the model's own context is used if not given.
Returns
-------
object
Software-specific model writer.
Raises
------
ValueError
If the selected software is not registered.
"""
try:
factory = _WRITERS[simulation_software]
except KeyError as exc:
raise ValueError(f"Unknown model configuration writer '{simulation_software}'.") from exc
if simulation_software not in model.configuration_writers:
model.configuration_writers[simulation_software] = factory(model, context=context)
return model.configuration_writers[simulation_software]
def _corsika_configuration(array_model, run_number, label=None, context=None):
"""Construct the CORSIKA7 configuration writer."""
# pylint: disable-next=import-outside-toplevel
from simtools.corsika.corsika_config import CorsikaConfig
return CorsikaConfig(
array_model=array_model, run_number=run_number, label=label, context=context
)
def _light_emission_writer(simulation):
"""Construct the current calibration-light configuration writer."""
# pylint: disable-next=import-outside-toplevel
from simtools.simtel.light_emission_config_writer import LightEmissionConfigWriter
return LightEmissionConfigWriter(simulation)
_SHOWER_WRITERS = {"corsika": _corsika_configuration}
_LIGHT_SOURCE_WRITERS = {"light_emission": _light_emission_writer}
[docs]
def get_shower_configuration(
array_model, run_number, label=None, simulation_software="corsika", context=None
):
"""Create a shower configuration for the selected software.
Parameters
----------
array_model : ArrayModel
Resolved array and site model.
run_number : int
Run identifier.
label : str, optional
File naming label.
simulation_software : str
Registered shower configuration writer.
Returns
-------
object
Shower configuration with common simulation parameters.
"""
try:
factory = _SHOWER_WRITERS[simulation_software]
except KeyError as exc:
raise ValueError(f"Unknown shower configuration writer '{simulation_software}'.") from exc
return factory(array_model=array_model, run_number=run_number, label=label, context=context)
[docs]
def get_light_source_writer(simulation):
"""Return the configuration writer for a calibration-source simulation.
Parameters
----------
simulation : SimulatorLightEmission
Physical setup with ``light_emission_config`` and resolved models.
Returns
-------
object
Selected calibration-source configuration writer.
"""
software = simulation.light_emission_config.get("light_source_software", "light_emission")
try:
factory = _LIGHT_SOURCE_WRITERS[software]
except KeyError as exc:
raise ValueError(f"Unknown light-source configuration writer '{software}'.") from exc
if not hasattr(simulation, "configuration_writers"):
simulation.configuration_writers = {}
if software not in simulation.configuration_writers:
simulation.configuration_writers[software] = factory(simulation)
return simulation.configuration_writers[software]