Source code for generate_regular_arrays
#!/usr/bin/python3
"""
Make a regular array of telescopes and save it as astropy table.
The arrays consist of one telescope at the center of the array and or of 4 telescopes
in a square grid. These arrays are used for trigger rate simulations.
The array layout files created will be available at the data/layout directory.
Command line arguments
----------------------
site (str, required)
observatory site (e.g., North or South).
model_version (str, optional)
Model version to use (e.g., 6.0.0). If not provided, the latest version is used.
Example
-------
Runtime < 10 s.
.. code-block:: console
simtools-generate-regular-arrays --site=North
"""
import logging
import os
from pathlib import Path
import astropy.units as u
from astropy.table import QTable
import simtools.data_model.model_data_writer as writer
import simtools.utils.general as gen
from simtools.configuration import configurator
from simtools.utils import names
# Telescope distances for 4 tel square arrays
# !HARDCODED
telescope_distance = {"LST": 57.5 * u.m, "MST": 70 * u.m, "SST": 80 * u.m}
def _parse():
config = configurator.Configurator(
label=Path(__file__).stem,
description=(
"Generate a regular array of telescope and save as astropy table.\n"
"Default telescope distances for 4 telescope square arrays are: \n"
f" LST: {telescope_distance['LST']}\n"
f" MST: {telescope_distance['MST']}\n"
f" SST: {telescope_distance['SST']}\n"
),
)
return config.initialize(db_config=False, simulation_model="site", output=True)
[docs]
def main():
"""Create layout array files (ecsv) of regular arrays."""
args_dict, _ = _parse()
logger = logging.getLogger()
logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))
if args_dict["site"] == "South":
array_list = ["1SST", "4SST", "1MST", "4MST", "1LST", "4LST"]
else:
array_list = ["1MST", "4MST", "1LST", "4LST"]
for array_name in array_list:
logger.info(f"Processing array {array_name}")
tel_name, pos_x, pos_y, pos_z = [], [], [], []
tel_size = array_name[1:4]
# Single telescope at the center
if array_name[0] == "1":
tel_name.append(
names.get_array_element_name_from_type_site_id(tel_size, args_dict["site"], "01")
)
pos_x.append(0 * u.m)
pos_y.append(0 * u.m)
pos_z.append(0 * u.m)
# 4 telescopes in a regular square grid
else:
for i in range(1, 5):
tel_name.append(
names.get_array_element_name_from_type_site_id(
tel_size, args_dict["site"], f"0{i}"
)
)
pos_x.append(telescope_distance[tel_size] * (-1) ** (i // 2))
pos_y.append(telescope_distance[tel_size] * (-1) ** (i % 2))
pos_z.append(0 * u.m)
table = QTable(meta={"array_name": array_name, "site": args_dict["site"]})
table["telescope_name"] = tel_name
table["position_x"] = pos_x
table["position_y"] = pos_y
table["position_z"] = pos_z
table.sort("telescope_name")
table.pprint()
output_file = args_dict.get("output_file", None)
if output_file is not None:
base_name, file_extension = os.path.splitext(output_file)
output_file = f"{base_name}-{args_dict['site']}-{array_name}{file_extension}"
writer.ModelDataWriter.dump(
args_dict=args_dict,
output_file=output_file,
metadata=None,
product_data=table,
)
if __name__ == "__main__":
main()