Source code for runners.sim_telarray_stage
"""sim_telarray as a simulation stage (telescope and camera response)."""
import shlex
from simtools.job_execution.process_accounting import build_accounting_command
from simtools.runners.simtel_runner import SIM_TELARRAY_ENV, sim_telarray_env_as_string
from simtools.runners.stages import CAMERA_EVENTS, CHERENKOV_PHOTONS, STDIN
from simtools.simtel.simulator_array import SimulatorArray
[docs]
class SimTelArrayStage:
"""
sim_telarray array simulation stage, one instance per array model.
Parameters
----------
simulation_parameters : SimulationParameters
Physical run settings.
array_model : ArrayModel
Telescope and site models.
label : str
Instance label.
"""
name = "sim_telarray"
consumes = CHERENKOV_PHOTONS
produces = CAMERA_EVENTS
streams = True
def __init__(self, simulation_parameters, array_model, label=None, context=None):
"""Initialize SimTelArrayStage."""
self.simulator_array = SimulatorArray(
simulation_parameters=simulation_parameters,
array_model=array_model,
label=label,
context=context,
)
self.array_model = array_model
[docs]
@classmethod
def instances(cls, inputs, label=None):
"""Return one sim_telarray stage per array model."""
return [
cls(
simulation_parameters=parameters,
array_model=array_model,
label=label,
context=inputs.context,
)
for parameters, array_model in zip(inputs.simulation_parameters, inputs.array_models)
]
@property
def file_list(self):
"""Files of this stage by file type."""
return self.simulator_array.file_list
@property
def runner_service(self):
"""File naming of this stage."""
return self.simulator_array.runner_service
[docs]
def prepare(self, run_number, input_file=None, output=None):
"""
Write the sim_telarray configuration and return the run lines.
Parameters
----------
run_number : int
Run number.
input_file : str or Path
CORSIKA output file, or ``STDIN`` when reading a stream.
output : None
sim_telarray writes its output file.
Returns
-------
list[str]
Shell lines running sim_telarray (one per run of a run set; one line when
reading a stream).
"""
if output is not None:
raise ValueError("sim_telarray output can only be written to its file.")
command = self.simulator_array.make_run_command(
run_number=run_number, input_file=input_file
)
resources_file = self.runner_service.get_file_name(
file_type="sim_telarray_resources", run_number=run_number
)
log_file = self.runner_service.get_file_name(
file_type="sim_telarray_log", run_number=run_number
)
streamed = input_file == STDIN
runs = 1 if streamed else self.simulator_array.runs_per_set
resource_files = [
resources_file.with_name(
f"{resources_file.stem}.part{run_index + 1:04d}{resources_file.suffix}"
)
if runs > 1
else resources_file
for run_index in range(runs)
]
lines = [
f"{sim_telarray_env_as_string()} "
+ shlex.join(
build_accounting_command(
command,
process_resources_file,
"sim_telarray",
run_number,
model_version=self.array_model.model_version,
log_file=log_file,
input_file=None if streamed else input_file,
)
)
for process_resources_file in resource_files
]
self.file_list["sim_telarray_resources"] = (
resource_files[0] if len(resource_files) == 1 else resource_files
)
return lines
[docs]
def output_file(self, run_number):
"""Return the sim_telarray output file."""
return self.runner_service.get_file_name("sim_telarray_output", run_number=run_number)
[docs]
def environment(self):
"""Return the sim_telarray environment variables."""
return dict(SIM_TELARRAY_ENV)
[docs]
def get_resources(self, runtime=None):
"""Return computing resources used."""
return self.runner_service.get_resources(runtime=runtime)