From ae31b7605f244fe0d022722c7223686e7281b545 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Tue, 21 Jan 2025 16:47:43 +0100 Subject: [PATCH] Make CutOptimizers use DefaultRecoEnergyBins --- src/ctapipe/irf/optimize.py | 44 +++++++------------------------------ 1 file changed, 8 insertions(+), 36 deletions(-) diff --git a/src/ctapipe/irf/optimize.py b/src/ctapipe/irf/optimize.py index e6093934b17..65e10e857ff 100644 --- a/src/ctapipe/irf/optimize.py +++ b/src/ctapipe/irf/optimize.py @@ -13,7 +13,7 @@ from ..core import Component, QualityQuery from ..core.traits import AstroQuantity, Float, Integer, Path -from .binning import ResultValidRange, make_bins_per_decade +from .binning import DefaultRecoEnergyBins, ResultValidRange from .preprocessing import EventQualityQuery __all__ = [ @@ -143,26 +143,9 @@ def read(cls, file_name): ) -class CutOptimizerBase(Component): +class CutOptimizerBase(DefaultRecoEnergyBins): """Base class for cut optimization algorithms.""" - reco_energy_min = AstroQuantity( - help="Minimum value for Reco Energy bins", - default_value=u.Quantity(0.015, u.TeV), - physical_type=u.physical.energy, - ).tag(config=True) - - reco_energy_max = AstroQuantity( - help="Maximum value for Reco Energy bins", - default_value=u.Quantity(150, u.TeV), - physical_type=u.physical.energy, - ).tag(config=True) - - reco_energy_n_bins_per_decade = Integer( - help="Number of bins per decade for Reco Energy bins", - default_value=5, - ).tag(config=True) - min_bkg_fov_offset = AstroQuantity( help=( "Minimum distance from the fov center for background events " @@ -328,15 +311,10 @@ def __call__( precuts: EventQualityQuery, clf_prefix: str, ) -> OptimizationResult: - reco_energy_bins = make_bins_per_decade( - self.reco_energy_min.to(u.TeV), - self.reco_energy_max.to(u.TeV), - self.reco_energy_n_bins_per_decade, - ) gh_cuts = self.gh_cut_calculator( signal["gh_score"], signal["reco_energy"], - reco_energy_bins, + self.reco_energy_bins, ) gh_mask = evaluate_binned_cut( signal["gh_score"], @@ -347,7 +325,7 @@ def __call__( spatial_selection_table = self.theta_cut_calculator( signal["theta"][gh_mask], signal["reco_energy"][gh_mask], - reco_energy_bins, + self.reco_energy_bins, ) result = OptimizationResult( @@ -401,16 +379,10 @@ def __call__( precuts: EventQualityQuery, clf_prefix: str, ) -> OptimizationResult: - reco_energy_bins = make_bins_per_decade( - self.reco_energy_min.to(u.TeV), - self.reco_energy_max.to(u.TeV), - self.reco_energy_n_bins_per_decade, - ) - initial_gh_cuts = calculate_percentile_cut( signal["gh_score"], signal["reco_energy"], - bins=reco_energy_bins, + bins=self.reco_energy_bins, fill_value=0.0, percentile=100 * (1 - self.initial_gh_cut_efficency), min_events=10, @@ -426,7 +398,7 @@ def __call__( spatial_selection_table = self.theta_cut_calculator( signal["theta"][initial_gh_mask], signal["reco_energy"][initial_gh_mask], - reco_energy_bins, + self.reco_energy_bins, ) self.log.info("Optimizing G/H separation cut for best sensitivity") @@ -438,7 +410,7 @@ def __call__( opt_sens, gh_cuts = optimize_gh_cut( signal, background, - reco_energy_bins=reco_energy_bins, + reco_energy_bins=self.reco_energy_bins, gh_cut_efficiencies=gh_cut_efficiencies, op=operator.ge, theta_cuts=spatial_selection_table, @@ -458,7 +430,7 @@ def __call__( spatial_selection_table_opt = self.theta_cut_calculator( signal[signal["selected_gh"]]["theta"], signal[signal["selected_gh"]]["reco_energy"], - reco_energy_bins, + self.reco_energy_bins, ) result = OptimizationResult(