Source code for simtel.metadata_reader

"""Read sim_telarray metadata as format-neutral input-metadata fields."""

import logging

from simtools.constants import SIM_TELARRAY_META_PARAMETER_REGISTRY
from simtools.simtel import sim_telarray_metadata
from simtools.simtel.simtel_io_metadata import read_sim_telarray_metadata
from simtools.utils import names

_logger = logging.getLogger(__name__)


[docs] def read_metadata(metadata_file_name): """Return input-metadata fields of a sim_telarray file (see ``MetadataCollector``).""" global_metadata, telescope_metadata = read_sim_telarray_metadata(metadata_file_name) global_metadata = global_metadata or {} telescope_metadata = telescope_metadata or {} _logger.debug( "Validating sim_telarray metadata against %s", SIM_TELARRAY_META_PARAMETER_REGISTRY ) sim_telarray_metadata.validate_metadata_values(global_metadata) for metadata in telescope_metadata.values(): sim_telarray_metadata.validate_metadata_values(metadata) site = _get_valid_site(global_metadata.get("site_config_name")) return { "software_name": "sim_telarray", "software_version": global_metadata.get("simtools_simtel_tag"), "site": site, "instrument_id": global_metadata.get("array_config_name"), "format_name": "simtel", "raw_metadata": {"global": global_metadata, "telescopes": telescope_metadata}, "associated_elements": _associated_elements(telescope_metadata, site), }
def _get_valid_site(site): """Return a validated CTA site or ``None`` for unavailable metadata.""" if site is None: return None try: return names.validate_site_name(site) except TypeError, ValueError: return None def _associated_elements(telescope_metadata, site): """Convert sim_telarray telescope metadata into CTA instrument entries.""" associated_elements = [] for metadata in telescope_metadata.values(): telescope_name = metadata.get("optics_config_variant") or metadata.get( "camera_config_variant" ) if telescope_name is None: continue try: telescope_type = names.get_array_element_type_from_name(telescope_name) telescope_site = names.get_site_from_array_element_name(telescope_name) except TypeError, ValueError: telescope_type = None telescope_site = site associated_elements.append( { "site": telescope_site, "class": "telescope", "type": telescope_type, "id": telescope_name, } ) return associated_elements