Source code for telescope_trigger_rates
"""Trigger rate calculation for telescopes and arrays of telescopes."""
import logging
import numpy as np
from astropy import units as u
from ctao_cr_spectra.definitions import IRFDOC_PROTON_SPECTRUM
from simtools.io import ascii_handler, io_handler
from simtools.layout.array_layout_utils import get_array_elements_from_db_for_layouts
from simtools.simtel.simtel_io_event_histograms import SimtelIOEventHistograms
from simtools.visualization import plot_simtel_event_histograms
_logger = logging.getLogger(__name__)
[docs]
def telescope_trigger_rates(args_dict, db_config):
"""
Calculate trigger rates for single telescopes or arrays of telescopes.
Main function to read event data, fill histograms, and derive trigger rates.
"""
if args_dict.get("array_layout_name"):
telescope_configs = get_array_elements_from_db_for_layouts(
args_dict["array_layout_name"],
args_dict.get("site"),
args_dict.get("model_version"),
db_config,
)
else:
telescope_configs = ascii_handler.collect_data_from_file(args_dict["telescope_ids"])[
"telescope_configs"
]
for array_name, telescope_ids in telescope_configs.items():
_logger.info(
f"Processing file: {args_dict['event_data_file']} with telescope config: {array_name}"
)
histograms = SimtelIOEventHistograms(
args_dict["event_data_file"], array_name=array_name, telescope_list=telescope_ids
)
histograms.fill()
_calculate_trigger_rates(histograms, array_name)
if args_dict["plot_histograms"]:
plot_simtel_event_histograms.plot(
histograms.histograms,
output_path=io_handler.IOHandler().get_output_directory(),
array_name=array_name,
)
def _calculate_trigger_rates(histograms, array_name):
"""
Calculate trigger rates from the filled histograms.
Missing
- custom definition of energy spectra
"""
efficiency = histograms.histograms.get("energy_eff", {}).get("histogram")
energy_axis = histograms.histograms.get("energy_eff", {}).get("bin_edges")
cr_spectrum = get_cosmic_ray_spectrum()
_logger.info(f"Cosmic ray spectrum: {cr_spectrum}")
e_min = energy_axis[:-1] * u.TeV
e_max = energy_axis[1:] * u.TeV
cr_rates = (
np.array(
[
cr_spectrum.integrate_energy(e1, e2).decompose(bases=[u.s, u.cm, u.sr]).value
for e1, e2 in zip(e_min, e_max)
]
)
* histograms.file_info["scatter_area"].to("cm2").value
* histograms.file_info["solid_angle"].to("sr").value
* u.Hz
)
trigger_rates = efficiency * cr_rates
trigger_rate = np.sum(trigger_rates, axis=0)
_logger.info(f"Scatter area from MC: {histograms.file_info['scatter_area'].to('m2')}")
_logger.info(f"Solid angle from MC: {histograms.file_info['solid_angle']}")
_logger.info(f"Trigger rate for {array_name} array: {trigger_rate.to('Hz')}")
histograms.histograms["cr_rates_mc"] = histograms.get_histogram_definition(
histogram=cr_rates.value,
bin_edges=energy_axis,
title="Cosmic Ray Rates (MC)",
axis_titles=["Energy (TeV)", "Cosmic Ray Rate (Hz)"],
plot_scales={"x": "log", "y": "log"},
)
histograms.histograms["trigger_rates"] = histograms.get_histogram_definition(
histogram=trigger_rates.value,
bin_edges=energy_axis,
title="Trigger Rates (MC)",
axis_titles=["Energy (TeV)", "Trigger Rate (Hz)"],
plot_scales={"x": "log", "y": "log"},
)
return cr_rates, trigger_rates, trigger_rate
[docs]
def get_cosmic_ray_spectrum():
"""
Return the cosmic ray spectrum.
To be extended in future to read a larger variety of spectra.
Returns
-------
astropy.units.Quantity
Cosmic ray spectrum.
"""
return IRFDOC_PROTON_SPECTRUM