Source code for pyirf.irf.effective_area

import numpy as np
import astropy.units as u
from ..binning import create_histogram_table


__all__ = [
    "effective_area",
    "effective_area_per_energy",
    "effective_area_per_energy_and_fov",
]


[docs] @u.quantity_input(area=u.m ** 2) def effective_area(n_selected, n_simulated, area): """ Calculate effective area for histograms of selected and total simulated events Parameters ---------- n_selected: int or numpy.ndarray[int] The number of surviving (e.g. triggered, analysed, after cuts) n_simulated: int or numpy.ndarray[int] The total number of events simulated area: astropy.units.Quantity[area] Area in which particle's core position was simulated """ return (n_selected / n_simulated) * area
[docs] def effective_area_per_energy(selected_events, simulation_info, true_energy_bins): """ Calculate effective area in bins of true energy. Parameters ---------- selected_events: astropy.table.QTable DL2 events table, required columns for this function: `true_energy`. simulation_info: pyirf.simulations.SimulatedEventsInfo The overall statistics of the simulated events true_energy_bins: astropy.units.Quantity[energy] The bin edges in which to calculate effective area. """ area = np.pi * simulation_info.max_impact ** 2 hist_selected = create_histogram_table( selected_events, true_energy_bins, "true_energy" ) hist_simulated = simulation_info.calculate_n_showers_per_energy(true_energy_bins) return effective_area(hist_selected["n"], hist_simulated, area)
[docs] def effective_area_per_energy_and_fov( selected_events, simulation_info, true_energy_bins, fov_offset_bins ): """ Calculate effective area in bins of true energy and field of view offset. Parameters ---------- selected_events: astropy.table.QTable DL2 events table, required columns for this function: - `true_energy` - `true_source_fov_offset` simulation_info: pyirf.simulations.SimulatedEventsInfo The overall statistics of the simulated events true_energy_bins: astropy.units.Quantity[energy] The true energy bin edges in which to calculate effective area. fov_offset_bins: astropy.units.Quantity[angle] The field of view radial bin edges in which to calculate effective area. """ area = np.pi * simulation_info.max_impact ** 2 hist_simulated = simulation_info.calculate_n_showers_per_energy_and_fov( true_energy_bins, fov_offset_bins ) hist_selected, _, _ = np.histogram2d( selected_events["true_energy"].to_value(u.TeV), selected_events["true_source_fov_offset"].to_value(u.deg), bins=[ true_energy_bins.to_value(u.TeV), fov_offset_bins.to_value(u.deg), ], ) return effective_area(hist_selected, hist_simulated, area)