From 9908ad8508fe222afe0e9b63e8fa965671edbc23 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Fri, 24 Apr 2026 18:54:59 +0200 Subject: [PATCH 01/32] first pass --- pisa/stages/aeff/aeff.py | 24 +- pisa/stages/aeff/param.py | 20 +- pisa/stages/aeff/weight.py | 21 +- pisa/stages/aeff/weight_hnl.py | 24 +- pisa/stages/background/atm_muons.py | 14 +- pisa/stages/data/csv_data_hist.py | 20 +- pisa/stages/data/csv_icc_hist.py | 16 +- pisa/stages/data/csv_loader.py | 15 +- pisa/stages/data/grid.py | 19 +- pisa/stages/data/simple_data_loader.py | 7 +- pisa/stages/data/simple_signal.py | 16 +- pisa/stages/data/sqlite_loader.py | 14 +- pisa/stages/data/toy_event_generator.py | 13 +- pisa/stages/discr_sys/csv_hypersurfaces.py | 15 +- pisa/stages/discr_sys/hypersurfaces.py | 25 +- pisa/stages/discr_sys/ultrasurfaces.py | 20 +- pisa/stages/flux/airs.py | 16 +- pisa/stages/flux/astrophysical.py | 20 +- pisa/stages/flux/barr_simple.py | 25 +- pisa/stages/flux/barr_simple_backup.py | 293 ++++++++++++++++++ .../flux/distribution_maker_outputs.json.bz2 | Bin 0 -> 27021 bytes pisa/stages/flux/hillasg.py | 21 +- pisa/stages/flux/honda_ip.py | 22 +- pisa/stages/flux/mceq_barr.py | 23 +- pisa/stages/flux/mceq_barr_red.py | 29 +- .../likelihood/generalized_llh_params.py | 2 +- pisa/stages/osc/decoherence.py | 27 +- pisa/stages/osc/external.py | 35 +-- pisa/stages/osc/globes.py | 28 +- pisa/stages/osc/nusquids.py | 40 +-- pisa/stages/osc/two_nu_osc.py | 29 +- pisa/stages/reco/resolutions.py | 33 +- pisa/stages/reco/simple_param.py | 18 +- pisa/stages/utils/add_indices.py | 29 +- pisa/stages/utils/adhoc_sys.py | 16 +- pisa/stages/utils/bootstrap.py | 14 +- pisa/stages/utils/fix_error.py | 11 +- pisa/stages/utils/hist.py | 9 +- pisa/stages/utils/kfold.py | 11 +- pisa/stages/xsec/correct_charm_y.py | 5 +- pisa/stages/xsec/dis_sys.py | 41 +-- pisa/stages/xsec/genie_sys.py | 16 +- pisa/stages/xsec/nutau_xsec.py | 15 +- 43 files changed, 741 insertions(+), 370 deletions(-) create mode 100644 pisa/stages/flux/barr_simple_backup.py create mode 100644 pisa/stages/flux/distribution_maker_outputs.json.bz2 diff --git a/pisa/stages/aeff/aeff.py b/pisa/stages/aeff/aeff.py index a27b57a97..f0cce23d4 100644 --- a/pisa/stages/aeff/aeff.py +++ b/pisa/stages/aeff/aeff.py @@ -1,5 +1,5 @@ """ -PISA pi stage to apply effective area weights +Stage to apply effective area weights """ from __future__ import absolute_import, print_function, division @@ -14,7 +14,7 @@ class aeff(Stage): # pylint: disable=invalid-name """ - PISA Pi stage to apply aeff weights. + Stage to apply aeff weights. This combines the detector effective area with the flux weights calculated in an earlier stage to compute the weights. @@ -24,8 +24,8 @@ class aeff(Stage): # pylint: disable=invalid-name Parameters ---------- - params - Expected params are .. :: + params : ParamSet + Must have parameters:: livetime : Quantity with time units aeff_scale : dimensionless Quantity @@ -33,13 +33,14 @@ class aeff(Stage): # pylint: disable=invalid-name nutau_norm : dimensionless Quantity nu_nc_norm : dimensionless Quantity - Expected container keys are .. :: - - "weights" - "weighted_aeff" + Notes + ----- + Expected container keys are:: + "weights", "weighted_aeff" """ + def __init__( self, **std_kwargs, @@ -51,16 +52,19 @@ def __init__( 'nutau_norm', 'nu_nc_norm', ) - expected_container_keys = ( 'weights', 'weighted_aeff', ) - + # Implements no setup_function+compute_function + supported_reps = { + 'calc_mode': [None], + } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/aeff/param.py b/pisa/stages/aeff/param.py index 5643a8d80..880d57878 100644 --- a/pisa/stages/aeff/param.py +++ b/pisa/stages/aeff/param.py @@ -25,7 +25,7 @@ __author__ = 'T.C. Arlen, T. Ehrhardt, S. Wren, J. Weldert' -__license__ = '''Copyright (c) 2014-2017, The IceCube Collaboration +__license__ = '''Copyright (c) 2014-2026, The IceCube Collaboration Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at @@ -137,19 +137,19 @@ class param(Stage): # pylint: disable=invalid-name Parameters ---------- params : ParamSet or sequence with which to instantiate a ParamSet. - Expected params are .. :: + Must have parameters:: aeff_energy_paramfile : string aeff_coszen_paramfile : string livetime : Quantity [time] aeff_scale : Quantity [dimensionless] - Expected container keys are .. :: + Notes + ----- - "true_energy" - "true_coszen" - "weights" + Expected container keys are:: + "true_energy", "true_coszen", "weights" """ def __init__( @@ -162,16 +162,20 @@ def __init__( 'livetime', 'aeff_scale' ) - expected_container_keys = ( 'true_energy', 'true_coszen', 'weights', ) - + # Implements no setup_function+compute_function + supported_reps = { + 'calc_mode': [None], + } + # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/aeff/weight.py b/pisa/stages/aeff/weight.py index 4a20d02df..3ab560731 100644 --- a/pisa/stages/aeff/weight.py +++ b/pisa/stages/aeff/weight.py @@ -1,5 +1,5 @@ """ -PISA pi stage to apply weights +Stage to apply weights """ from __future__ import absolute_import, print_function, division @@ -13,25 +13,26 @@ class weight(Stage): # pylint: disable=invalid-name """ - PISA Pi stage to apply weights. + Stage to apply weights. This assumes a weight has already been calculated. The weight is then multiplied by the livetime to get an event count. Parameters ---------- - params : ParamSet or sequence with which to instantiate a ParamSet. - Expected params are: .. :: + Must have parameters:: livetime : Quantity [time] Detector livetime for scaling template weight_scale : Quantity [dimensionless] Overall scaling/normalisation of template - Expected container keys are .. :: + Notes + ----- - "weights" + Expected container keys are:: + "weights" """ def __init__( self, @@ -41,19 +42,21 @@ def __init__( 'livetime', 'weight_scale', ) - expected_container_keys = ( 'weights', ) - + # Implements no setup_function+compute_function + supported_reps = { + 'calc_mode': [None], + } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) - @profile def apply_function(self): weight_scale = self.params.weight_scale.m_as('dimensionless') diff --git a/pisa/stages/aeff/weight_hnl.py b/pisa/stages/aeff/weight_hnl.py index d92368b27..3e282755d 100644 --- a/pisa/stages/aeff/weight_hnl.py +++ b/pisa/stages/aeff/weight_hnl.py @@ -1,5 +1,5 @@ """ -PISA pi stage to apply HNL specific re-weighting +Stage to apply HNL specific re-weighting """ from __future__ import absolute_import, print_function, division @@ -77,15 +77,24 @@ def re_weight_hnl( class weight_hnl(Stage): # pylint: disable=invalid-name """ - PISA pi stage to apply HNL specific re-weighting. + Stage to apply HNL specific re-weighting. This re-weights HNL events from sampling 1/L to target exponential and applies . Parameters ---------- - params - Expected params are .. :: + params : ParamSet + Must have parameters:: + U_tau4_sq : dimensionless Quantity + + Notes + ----- + + Expected container keys are:: + + 'mHNL', 'hnl_true_energy', 'hnl_proper_lifetime', 'hnl_distance_min', + 'hnl_distance_max', 'hnl_decay_width', 'weights' """ def __init__( @@ -93,7 +102,6 @@ def __init__( **std_kwargs, ): expected_params = ("U_tau4_sq",) - expected_container_keys = ( 'mHNL', 'hnl_true_energy', @@ -103,11 +111,15 @@ def __init__( 'hnl_decay_width', 'weights', ) - + # Implements no setup_function+compute_function + supported_reps = { + 'calc_mode': [None], + } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/background/atm_muons.py b/pisa/stages/background/atm_muons.py index 60826ccc5..eef564297 100644 --- a/pisa/stages/background/atm_muons.py +++ b/pisa/stages/background/atm_muons.py @@ -18,7 +18,7 @@ class atm_muons(Stage): # pylint: disable=invalid-name """ - PISA stage to apply atmospheric muon background systematics. + Stage to apply atmospheric muon background systematics. Typically this is used with muons generated by MuonGun, but should be generic to other generators. Note that this stage only modifies an weights based on the systematics, @@ -28,7 +28,7 @@ class atm_muons(Stage): # pylint: disable=invalid-name Parameters ---------- params : ParamSet or instantiable thereto - Parameters for steering the stage. The following parameters must be included: .. :: + Must have parameters:: atm_muon_scale : quantity (dimensionless) Normalisation of atmospheric muons @@ -42,10 +42,12 @@ class atm_muons(Stage): # pylint: disable=invalid-name delta_gamma_mu : quantity (dimensionless) Parameter controlling variation in spectral index - Expected container keys are .. :: + Notes + ----- - "weights" + Expected container keys are:: + "true_coszen", "weights" """ def __init__(self, @@ -60,12 +62,10 @@ def __init__(self, 'delta_gamma_mu_variable', 'delta_gamma_mu', ) - expected_container_keys = ( 'true_coszen', 'weights', ) - # init base class super().__init__( expected_params=expected_params, @@ -76,8 +76,6 @@ def __init__(self, def setup_function(self): - self.data.representation = self.calc_mode - # Create the primary uncertainties spline that will be used for # re-weighting the muon flux self.prim_unc_spline = self._make_prim_unc_spline() diff --git a/pisa/stages/data/csv_data_hist.py b/pisa/stages/data/csv_data_hist.py index 85b16949d..07dec8226 100644 --- a/pisa/stages/data/csv_data_hist.py +++ b/pisa/stages/data/csv_data_hist.py @@ -1,5 +1,5 @@ """ -A Stage to load data from a CSV datarelease format file into a PISA pi ContainerSet +A Stage to load data from a CSV datarelease format file into a ContainerSet """ from __future__ import absolute_import, print_function, division @@ -16,14 +16,14 @@ class csv_data_hist(Stage): # pylint: disable=invalid-name """ - CSV file loader PISA Pi class + CSV file loader class Parameters ---------- - - events_file : csv file path - + events_file : str + csv file path """ + def __init__(self, events_file, **std_kwargs, @@ -33,15 +33,19 @@ def __init__(self, self.events_file = find_resource(events_file) expected_params = () - + expected_container_keys = () + # Implements no apply_function + supported_reps = { + 'apply_mode': [None], + } # init base class super().__init__( expected_params=expected_params, - expected_container_keys=(), + expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) - def setup_function(self): events = pd.read_csv(self.events_file) diff --git a/pisa/stages/data/csv_icc_hist.py b/pisa/stages/data/csv_icc_hist.py index d7abf8b0c..cb38a7ede 100644 --- a/pisa/stages/data/csv_icc_hist.py +++ b/pisa/stages/data/csv_icc_hist.py @@ -1,5 +1,5 @@ """ -A Stage to load data from a CSV datarelease format file into a PISA pi ContainerSet +A Stage to load data from a CSV datarelease format file into a ContainerSet """ from __future__ import absolute_import, print_function, division @@ -18,13 +18,19 @@ class csv_icc_hist(Stage): # pylint: disable=invalid-name """ - CSV file loader PISA class + CSV file loader class Parameters ---------- - events_file : csv file path + events_file : str + csv file path + params : ParamSet + Must have parameters:: + + atm_muon_scale : quantity (dimensionless) """ + def __init__( self, events_file, @@ -34,11 +40,11 @@ def __init__( self.events_file = find_resource(events_file) expected_params = ('atm_muon_scale',) - + expected_container_keys = () # init base class super().__init__( expected_params=expected_params, - expected_container_keys=(), + expected_container_keys=expected_container_keys, **std_kwargs, ) diff --git a/pisa/stages/data/csv_loader.py b/pisa/stages/data/csv_loader.py index 1d073d681..3b118b099 100644 --- a/pisa/stages/data/csv_loader.py +++ b/pisa/stages/data/csv_loader.py @@ -1,5 +1,5 @@ """ -A Stage to load data from a CSV datarelease format file into a PISA pi ContainerSet +A Stage to load data from a CSV datarelease format file into a ContainerSet """ from __future__ import absolute_import, print_function, division @@ -13,14 +13,15 @@ from pisa.core.container import Container from pisa.utils.format import split +__all__ = ['csv_loader', 'init_test'] + class csv_loader(Stage): # pylint: disable=invalid-name """ - CSV file loader PISA Pi class + CSV file loader class Parameters ---------- - events_file : str or sequence of str csv file path(s) @@ -50,8 +51,8 @@ class csv_loader(Stage): # pylint: disable=invalid-name scale_aeff : bool, default: False Convert effective area from cm^2 to m^2 (PISA flux tables are stored in m^2) if given in cm^2. - """ + def __init__( self, events_file, @@ -91,10 +92,16 @@ def __init__( self.dis_idx = None self.scale_aeff = scale_aeff + # apply_function sets representation to "events", so only accept that + # to be transparent + supported_reps = { + 'apply_mode': ["events"], + } # init base class super().__init__( expected_params=(), expected_container_keys=(), + supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/data/grid.py b/pisa/stages/data/grid.py index c4576ca73..521a35ce8 100644 --- a/pisa/stages/data/grid.py +++ b/pisa/stages/data/grid.py @@ -19,14 +19,16 @@ class grid(Stage): # pylint: disable=invalid-name Parameters ---------- - + grid_binning : :py:class:`~.MultiDimBinning` Binning object defining the grid to be generated entity : str - `entity` arg to be passed to `MultiDimBinning.meshgrid` (see that - fucntion docs for details) + `entity` arg to be passed to :py:meth:`~.MultiDimBinning.meshgrid` + output_names : array_like + List of output names (event types) """ + def __init__( self, grid_binning, @@ -35,20 +37,24 @@ def __init__( **std_kwargs, ): expected_params = () + expected_container_keys=() # store args self.grid_binning = grid_binning self.entity = entity self.output_names = output_names + # only intended to work with calc_mode="events" + supported_reps = { + 'calc_mode': ["events"], + } # init base class super(grid, self).__init__( expected_params=expected_params, - expected_container_keys=(), + expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) - - assert self.calc_mode == "events" assert self.output_names is not None def setup_function(self): @@ -83,7 +89,6 @@ def setup_function(self): self.data.add_container(container) - def apply_function(self): # reset weights for container in self.data: diff --git a/pisa/stages/data/simple_data_loader.py b/pisa/stages/data/simple_data_loader.py index 39283a80d..266c00c2b 100644 --- a/pisa/stages/data/simple_data_loader.py +++ b/pisa/stages/data/simple_data_loader.py @@ -1,5 +1,5 @@ """ -A Stage to load data from a PISA style hdf5 file into a PISA pi ContainerSet +A Stage to load data from a PISA style hdf5 file into a ContainerSet """ #TODO This class has become decreasingly "simple"! Make it into a more specific stage for our purposes and recreate a much more simple HDF5 file loader that is generic for any PISA task @@ -19,11 +19,10 @@ class simple_data_loader(Stage): # pylint: disable=invalid-name """ - HDF5 file loader PISA Pi class + HDF5 file loader class Parameters ---------- - events_file : hdf5 file path output from make_events, including flux weights and Genie systematics coefficients @@ -67,8 +66,8 @@ class simple_data_loader(Stage): # pylint: disable=invalid-name Looks for `initial_weights` fields in events file, which will serve as nominal weights for all events included. No fields named `weights` may already be present. - """ + def __init__(self, events_file, mc_cuts, diff --git a/pisa/stages/data/simple_signal.py b/pisa/stages/data/simple_signal.py index 3c70da590..9ef48eafa 100644 --- a/pisa/stages/data/simple_signal.py +++ b/pisa/stages/data/simple_signal.py @@ -23,12 +23,12 @@ class simple_signal(Stage): # pylint: disable=invalid-name """ - random toy event generator PISA class + random toy event generator class Parameters ---------- - params - Expected params .. :: + params : ParamSet + Must have parameters:: n_events : int Number of events to be generated per output name @@ -55,15 +55,19 @@ def __init__( 'mu', 'sigma' ) - + expected_container_keys = () + # setup_function sets representation to "events", so only accept that + # to be transparent + # FIXME: apply_mode=MultiDimBinning is assumed in setup_function, but + # apply_function sets rep. to "events" supported_reps = { + 'calc_mode': ["events"], 'apply_mode': [MultiDimBinning] } - # init base class super().__init__( expected_params=expected_params, - expected_container_keys=(), + expected_container_keys=expected_container_keys, supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/data/sqlite_loader.py b/pisa/stages/data/sqlite_loader.py index f164abf3a..e417d4779 100644 --- a/pisa/stages/data/sqlite_loader.py +++ b/pisa/stages/data/sqlite_loader.py @@ -15,18 +15,24 @@ # TODO: docstrings class sqlite_loader(Stage): # pylint: disable=invalid-name """ - SQLite loader PISA Pi class + SQLite loader class + Parameters ---------- database : path to sqlite database - **kwargs - Passed to Stage + + output_names : array_like + List of output names (event types) + + post_fix : str + + """ def __init__( self, database, output_names, - post_fix = '_pred', + post_fix='_pred', **std_kwargs, ): diff --git a/pisa/stages/data/toy_event_generator.py b/pisa/stages/data/toy_event_generator.py index 3e19e1503..b9f7cdbe9 100644 --- a/pisa/stages/data/toy_event_generator.py +++ b/pisa/stages/data/toy_event_generator.py @@ -17,24 +17,23 @@ class toy_event_generator(Stage): # pylint: disable=invalid-name """ - random toy event generator PISA Pi class + random toy event generator class Parameters ---------- + output_names : array_like + List of output names (event types) - output_names : str - list of output names - - params - Expected params .. :: + params : ParamSet + Must have parameters:: n_events : int Number of events to be generated per output name random seed : int Seed to be used for random - """ + def __init__( self, output_names, diff --git a/pisa/stages/discr_sys/csv_hypersurfaces.py b/pisa/stages/discr_sys/csv_hypersurfaces.py index d31852136..327f8ed1b 100644 --- a/pisa/stages/discr_sys/csv_hypersurfaces.py +++ b/pisa/stages/discr_sys/csv_hypersurfaces.py @@ -1,5 +1,5 @@ """ -PISA stage to apply hypersurface fits from discrete systematics parameterizations +Stage to apply hypersurface fits from discrete systematics parameterizations """ @@ -23,7 +23,7 @@ __author__ = "B. Benkel, J. Weldert" -__license__ = """Copyright (c) 2014-2025, The IceCube Collaboration +__license__ = """Copyright (c) 2014-2026, The IceCube Collaboration Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,15 @@ class csv_hypersurfaces(Stage): propagate_uncertainty : bool, optional Propagate the uncertainties from the hypersurface to the uncertainty of the output. + + Notes + ----- + + Expected container keys are:: + + "weights" and, if "error_method" is set, "errors" """ + def __init__( self, fit_results_file, @@ -118,9 +126,6 @@ def __init__( # pylint: disable=line-too-long def setup_function(self): """Load the fit results from the file and check compatibility with container names""" - - self.data.representation = self.calc_mode - for f in self.fit_results_file: k = os.path.splitext(os.path.basename(f))[0] if k.startswith('hs_'): # naming convention diff --git a/pisa/stages/discr_sys/hypersurfaces.py b/pisa/stages/discr_sys/hypersurfaces.py index 4423d2275..93e997ed9 100644 --- a/pisa/stages/discr_sys/hypersurfaces.py +++ b/pisa/stages/discr_sys/hypersurfaces.py @@ -1,5 +1,5 @@ """ -PISA stage to apply hypersurface fits from discrete systematics parameterizations +Stage to apply hypersurface fits from discrete systematics parameterizations """ #TODO Currently have to defined the `links` value in the stage config to match what the `combine_regex` does in @@ -24,7 +24,7 @@ __author__ = "P. Eller, T. Ehrhardt, T. Stuttard, J.L. Lanfranchi, A. Trettin" -__license__ = """Copyright (c) 2014-2018, The IceCube Collaboration +__license__ = """Copyright (c) 2014-2026, The IceCube Collaboration Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -70,7 +70,14 @@ class hypersurfaces(Stage): # pylint: disable=invalid-name fluctuate_seed : int, default: 12345 + Notes + ----- + + Expected container keys are:: + + "weights" and, if "error_method" is set, "errors" """ + def __init__( self, fit_results_file, @@ -81,8 +88,6 @@ def __init__( fluctuate_seed=12345, **std_kwargs, ): - # -- Only allowed/implemented modes -- # - assert isinstance(std_kwargs['calc_mode'], MultiDimBinning) # -- Load hypersurfaces -- # # Store args @@ -109,12 +114,14 @@ def __init__( #TODO: When in a pipeline after utils.hist, # this will cause a warning about missing presence of 'errors' # because hist adds this key during apply - - + supported_reps = { + 'calc_mode': [MultiDimBinning], + } # -- Initialize base class -- # super().__init__( expected_params=self.hypersurface_param_names + self.inter_params, expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) if links is None: @@ -135,9 +142,6 @@ def __init__( # pylint: disable=line-too-long def setup_function(self): """Load the fit results from the file and make some check compatibility""" - - self.data.representation = self.calc_mode - if self.links is not None: for key, val in self.links.items(): self.data.link_containers(key, val) @@ -158,9 +162,6 @@ def setup_function(self): # the linter thinks that "logging" refers to Python's built-in # pylint: disable=line-too-long, logging-not-lazy, deprecated-method def compute_function(self): - - self.data.representation = self.calc_mode - # Link containers if self.links is not None: for key, val in self.links.items(): diff --git a/pisa/stages/discr_sys/ultrasurfaces.py b/pisa/stages/discr_sys/ultrasurfaces.py index 0d277c7c3..bf116777e 100644 --- a/pisa/stages/discr_sys/ultrasurfaces.py +++ b/pisa/stages/discr_sys/ultrasurfaces.py @@ -23,7 +23,7 @@ __author__ = "A. Trettin, L. Fischer, T. Ehrhardt" -__license__ = """Copyright (c) 2014-2025, The IceCube Collaboration +__license__ = """Copyright (c) 2014-2026, The IceCube Collaboration Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -126,6 +126,13 @@ class ultrasurfaces(Stage): # pylint: disable=invalid-name params : ParamSet Note that the params required to be in `params` are determined from those listed in the `systematics`. + + Notes + ----- + + Expected container keys are:: + + `varnames` + "weights", and, if not already in `varnames`, "true_energy" """ def __init__( # pylint: disable=dangerous-default-value @@ -140,8 +147,6 @@ def __init__( # pylint: disable=dangerous-default-value distance_tol=0, **std_kwargs, ): - # evaluation only works on event-by-event basis - assert std_kwargs["calc_mode"] == "events" # Store args self.fit_results_file = find_resource(fit_results_file) @@ -183,10 +188,15 @@ def __init__( # pylint: disable=dangerous-default-value if 'true_energy' not in expected_container_keys: expected_container_keys.append('true_energy') + # evaluation only works on event-by-event basis + supported_reps = { + 'calc_mode': ["events"], + } # -- Initialize base class -- # super().__init__( expected_params=param_names, expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) @@ -197,8 +207,6 @@ def setup_function(self): import pandas as pd from sklearn.neighbors import KDTree - self.data.representation = self.calc_mode - # create containers for scale factors for container in self.data: container["us_scales"] = np.ones(container.size, dtype=FTYPE) @@ -302,8 +310,6 @@ def setup_function(self): @profile def compute_function(self): - self.data.representation = self.calc_mode - # Calculate the `delta_p` matrix containing the polynomial features. # If requested, these feature may be extrapolated using the strategy defined # by `self.extrapolation`. diff --git a/pisa/stages/flux/airs.py b/pisa/stages/flux/airs.py index e6570aeeb..1dec8659f 100644 --- a/pisa/stages/flux/airs.py +++ b/pisa/stages/flux/airs.py @@ -20,21 +20,25 @@ class airs(Stage): # pylint: disable=invalid-name """ + Stage to implement the atmospheric density uncertainty. + Uses the neutrino fluxes calculated in the mceq_barr stage, and scales the weights. + Parameters ---------- airs_spline : spline containing the 1-sigma shifts from AIRS data params : ParamSet - Must exclusively have parameters: .. :: + Must have parameters:: airs_scale : quantity (dimensionless) the scale by which the weights are perturbed via the airs 1-sigma shift - Expected container keys are .. :: + Notes + ----- + + Expected container keys are:: - "true_energy" - "true_coszen" - "weights" + "true_energy", "true_coszen", "weights" """ def __init__(self, airs_spline, **std_kwargs): @@ -44,13 +48,11 @@ def __init__(self, airs_spline, **std_kwargs): expected_params = [ "airs_scale", ] - expected_container_keys = ( 'true_energy', 'true_coszen', 'weights', ) - super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, diff --git a/pisa/stages/flux/astrophysical.py b/pisa/stages/flux/astrophysical.py index 761c52129..ebd496b3d 100644 --- a/pisa/stages/flux/astrophysical.py +++ b/pisa/stages/flux/astrophysical.py @@ -1,5 +1,5 @@ """ -stage to implement getting the contribution to fluxes from astrophysical neutrino sources +Stage to implement getting the contribution to fluxes from astrophysical neutrino sources """ import numpy as np @@ -19,17 +19,18 @@ class astrophysical(Stage): # pylint: disable=invalid-name Parameters ---------- - params - Expected params are .. :: + params : ParamSet + Must have parameters:: astro_delta : quantity (dimensionless) astro_norm : quantity (dimensionless) - - Expected container keys are .. :: - "true_energy" - "true_coszen" - "initial_weights" + Notes + ----- + + Expected container keys are:: + "true_energy", "true_coszen", "initial_weights" + TODO: flavor ratio as a parameter? Save for later. """ @@ -63,7 +64,6 @@ def setup_function(self): """ Setup the nominal flux """ - self.data.representation = self.calc_mode for container in self.data: container["astro_weights"] = np.ones(container.size, dtype=FTYPE) container["astro_flux"] = np.ones(container.size, dtype=FTYPE) @@ -91,8 +91,6 @@ def compute_function(self): """ Tilt it, scale it, bop it """ - self.data.representation = self.calc_mode - delta = self.params.astro_delta.value.m_as("dimensionless") norm = self.params.astro_norm.value diff --git a/pisa/stages/flux/barr_simple.py b/pisa/stages/flux/barr_simple.py index 310c075e5..19622ac4a 100644 --- a/pisa/stages/flux/barr_simple.py +++ b/pisa/stages/flux/barr_simple.py @@ -27,8 +27,8 @@ class barr_simple(Stage): # pylint: disable=invalid-name Parameters ---------- - params - Expected params are .. :: + params : ParamSet + Must have parameters:: nue_numu_ratio : quantity (dimensionless) nu_nubar_ratio : quantity (dimensionless) @@ -36,15 +36,15 @@ class barr_simple(Stage): # pylint: disable=invalid-name Barr_uphor_ratio : quantity (dimensionless) Barr_nu_nubar_ratio : quantity (dimensionless) - Expected container keys are .. :: + Notes + ----- - "true_energy" - "true_coszen" - "nu_flux_nominal" - "nubar_flux_nominal" - "nubar" + Expected container keys are:: + "true_energy", "true_coszen", "nu_flux_nominal", "nubar_flux_nominal", + "nubar" """ + def __init__( self, **std_kwargs, @@ -56,7 +56,6 @@ def __init__( "Barr_uphor_ratio", "Barr_nu_nubar_ratio", ) - expected_container_keys = ( "true_energy", "true_coszen", @@ -64,22 +63,24 @@ def __init__( "nubar_flux_nominal", "nubar" ) - + # Implements no apply_function (implicit caching! FIXME) + supported_reps = { + 'apply_mode': [None], + } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) def setup_function(self): - self.data.representation = self.calc_mode for container in self.data: container["nu_flux"] = np.empty((container.size, 2), dtype=FTYPE) @profile def compute_function(self): - self.data.representation = self.calc_mode # If a parameter below has not been modified by minimizer, # its magnitude below will be a native float, otherwise np.float64, diff --git a/pisa/stages/flux/barr_simple_backup.py b/pisa/stages/flux/barr_simple_backup.py new file mode 100644 index 000000000..ec4920702 --- /dev/null +++ b/pisa/stages/flux/barr_simple_backup.py @@ -0,0 +1,293 @@ +""" +Stage to implement the old PISA/oscfit flux systematics +""" + +from __future__ import absolute_import, print_function, division + +import math + +import numpy as np +from numba import guvectorize, cuda, jit, njit, void + +from pisa import FTYPE, TARGET +from pisa.core.param import Param, ParamSet +from pisa.core.stage import Stage +from pisa.utils.profiler import profile +from pisa.utils.numba_tools import myjit, myjit_2, ftype, FX, IX +from pisa.utils.barr_parameterization import modRatioNuBar, modRatioUpHor + +__all__ = ['barr_simple', 'apply_ratio_scale', 'spectral_index_scale', + 'apply_sys_kernel', 'apply_sys_vectorized', 'init_test'] + + +class barr_simple(Stage): # pylint: disable=invalid-name + """ + stage to apply Barr style flux uncertainties + uses parameterisations of plots from Barr 2006 paper + + Parameters + ---------- + params + Expected params are .. :: + + nue_numu_ratio : quantity (dimensionless) + nu_nubar_ratio : quantity (dimensionless) + delta_index : quantity (dimensionless) + Barr_uphor_ratio : quantity (dimensionless) + Barr_nu_nubar_ratio : quantity (dimensionless) + + Expected container keys are .. :: + + "true_energy" + "true_coszen" + "nu_flux_nominal" + "nubar_flux_nominal" + "nubar" + + """ + def __init__( + self, + **std_kwargs, + ): + expected_params = ( + "nue_numu_ratio", + "nu_nubar_ratio", + "delta_index", + "Barr_uphor_ratio", + "Barr_nu_nubar_ratio", + ) + + expected_container_keys = ( + "true_energy", + "true_coszen", + "nu_flux_nominal", + "nubar_flux_nominal", + "nubar" + ) + + # init base class + super().__init__( + expected_params=expected_params, + expected_container_keys=expected_container_keys, + **std_kwargs, + ) + + def setup_function(self): + self.data.representation = self.calc_mode + for container in self.data: + container["nu_flux"] = np.empty((container.size, 2), dtype=FTYPE) + + @profile + def compute_function(self): + self.data.representation = self.calc_mode + + # If a parameter below has not been modified by minimizer, + # its magnitude below will be a native float, otherwise np.float64, + # so convert to expected FTYPE + nue_numu_ratio = FTYPE(self.params.nue_numu_ratio.value.m_as("dimensionless")) + nu_nubar_ratio = FTYPE(self.params.nu_nubar_ratio.value.m_as("dimensionless")) + delta_index = FTYPE(self.params.delta_index.value.m_as("dimensionless")) + Barr_uphor_ratio = FTYPE(self.params.Barr_uphor_ratio.value.m_as("dimensionless")) + Barr_nu_nubar_ratio = FTYPE(self.params.Barr_nu_nubar_ratio.value.m_as("dimensionless")) + + for container in self.data: + apply_sys_vectorized( + container["true_energy"], + container["true_coszen"], + container["nu_flux_nominal"], + container["nubar_flux_nominal"], + container["nubar"], + nue_numu_ratio, + nu_nubar_ratio, + delta_index, + Barr_uphor_ratio, + Barr_nu_nubar_ratio, + out=container["nu_flux"], + ) + container.mark_changed('nu_flux') + + +#@njit(f"void({FX}, b1, {FX}, {FX}, {FX}[:])", inline='always') +@myjit_2(f"void({FX}, b1, {FX}, {FX}, {FX}[:])", inline="always") +def apply_ratio_scale(ratio_scale, sum_constant, in1, in2, out): + """ apply ratio scale to flux values + + Parameters + ---------- + ratio_scale : float + + sum_constant : bool + if Ture, then the sum of the new flux will be identical to the old flux + + in1 : float + + in2 : float + + out : array + + """ + if in1 == 0. and in2 == 0.: + out[0] = 0. + out[1] = 0. + return + + flag = 1 if sum_constant else 0 + + # when sum_constant = True + # just a single division operation + single_denom = in2 + ratio_scale * in1 + inv_denom = 1.0 / single_denom + + orig_sum = in1 + in2 + new = orig_sum * inv_denom + out0 = ratio_scale * in1 * new + out1 = new + + # sum_constant = False + out0_sum_not_const = ratio_scale * in1 + out1_sum_not_const = in2 + + # finally assign + out[0] = (1 - flag) * out0_sum_not_const + flag * out0 + out[1] = (1 - flag) * out1_sum_not_const + flag * out1 + + +@myjit +def spectral_index_scale(true_energy, egy_pivot, delta_index): + """ calculate spectral index scale """ + return math.pow((true_energy / egy_pivot), delta_index) + + +@myjit +def apply_sys_kernel( + true_energy, + true_coszen, + nu_flux_nominal, + nubar_flux_nominal, + nubar, + nue_numu_ratio, + nu_nubar_ratio, + delta_index, + Barr_uphor_ratio, + Barr_nu_nubar_ratio, + out, +): + # nue/numu ratio + new_nu_flux = cuda.local.array(shape=(2), dtype=ftype) + new_nubar_flux = cuda.local.array(2, dtype=ftype) + apply_ratio_scale( + nue_numu_ratio, True, nu_flux_nominal[0], nu_flux_nominal[1], new_nu_flux + ) + apply_ratio_scale( + nue_numu_ratio, + True, + nubar_flux_nominal[0], + nubar_flux_nominal[1], + new_nubar_flux, + ) + + # apply flux systematics + # spectral idx + idx_scale = spectral_index_scale(true_energy, 24.0900951261, delta_index) + new_nu_flux[0] *= idx_scale + new_nu_flux[1] *= idx_scale + new_nubar_flux[0] *= idx_scale + new_nubar_flux[1] *= idx_scale + + # nu/nubar ratio + new_nue_flux = cuda.local.array(2, dtype=ftype) + new_numu_flux = cuda.local.array(2, dtype=ftype) + apply_ratio_scale( + nu_nubar_ratio, True, new_nu_flux[0], new_nubar_flux[0], new_nue_flux + ) + apply_ratio_scale( + nu_nubar_ratio, True, new_nu_flux[1], new_nubar_flux[1], new_numu_flux + ) + if nubar < 0: + out[0] = new_nue_flux[1] + out[1] = new_numu_flux[1] + else: + out[0] = new_nue_flux[0] + out[1] = new_numu_flux[0] + + # Barr flux + out[0] *= modRatioNuBar(nubar, 0, true_energy, true_coszen, Barr_nu_nubar_ratio) + out[1] *= modRatioNuBar(nubar, 1, true_energy, true_coszen, Barr_nu_nubar_ratio) + + out[0] *= modRatioUpHor(0, true_energy, true_coszen, Barr_uphor_ratio) + out[1] *= modRatioUpHor(1, true_energy, true_coszen, Barr_uphor_ratio) + + +@guvectorize([f"({FX}, {FX}, {FX}[:], {FX}[:], {IX}, {FX}, {FX}, {FX}, {FX}, {FX}, {FX}[:])"], "(),(),(d),(d),(),(),(),(),(),()->(d)", target=TARGET) +def apply_sys_vectorized( + true_energy, + true_coszen, + nu_flux_nominal, + nubar_flux_nominal, + nubar, + nue_numu_ratio, + nu_nubar_ratio, + delta_index, + Barr_uphor_ratio, + Barr_nu_nubar_ratio, + out, +): + # nue/numu ratio + new_nu_flux = np.empty(shape=(2), dtype=ftype) + new_nubar_flux = np.empty(2, dtype=ftype) + apply_ratio_scale( + nue_numu_ratio, True, nu_flux_nominal[0], nu_flux_nominal[1], new_nu_flux + ) + apply_ratio_scale( + nue_numu_ratio, + True, + nubar_flux_nominal[0], + nubar_flux_nominal[1], + new_nubar_flux, + ) + + # apply flux systematics + # spectral idx + #idx_scale = spectral_index_scale(true_energy, 24.0900951261, delta_index) + energy_pivot = 24.0900951261 + idx_scale = math.exp(delta_index * math.log(true_energy / energy_pivot)) + new_nu_flux[0] *= idx_scale + new_nu_flux[1] *= idx_scale + new_nubar_flux[0] *= idx_scale + new_nubar_flux[1] *= idx_scale + + # nu/nubar ratio + new_nue_flux = np.empty(2, dtype=ftype) + new_numu_flux = np.empty(2, dtype=ftype) + apply_ratio_scale( + nu_nubar_ratio, True, new_nu_flux[0], new_nubar_flux[0], new_nue_flux + ) + apply_ratio_scale( + nu_nubar_ratio, True, new_nu_flux[1], new_nubar_flux[1], new_numu_flux + ) + if nubar < 0: + out[0] = new_nue_flux[1] + out[1] = new_numu_flux[1] + else: + out[0] = new_nue_flux[0] + out[1] = new_numu_flux[0] + + # Barr flux + out[0] *= modRatioNuBar(nubar, 0, true_energy, true_coszen, Barr_nu_nubar_ratio) + out[1] *= modRatioNuBar(nubar, 1, true_energy, true_coszen, Barr_nu_nubar_ratio) + + out[0] *= modRatioUpHor(0, true_energy, true_coszen, Barr_uphor_ratio) + out[1] *= modRatioUpHor(1, true_energy, true_coszen, Barr_uphor_ratio) + + +def init_test(**param_kwargs): + """Instantiation example""" + param_set = ParamSet([ + Param(name="nue_numu_ratio", value=1.0, **param_kwargs), + Param(name="nu_nubar_ratio", value=1.0, **param_kwargs), + Param(name="delta_index", value=0.0, **param_kwargs), + Param(name="Barr_uphor_ratio", value=0.0, **param_kwargs), + Param(name="Barr_nu_nubar_ratio", value=0.0, **param_kwargs) + ]) + + return barr_simple(params=param_set) diff --git a/pisa/stages/flux/distribution_maker_outputs.json.bz2 b/pisa/stages/flux/distribution_maker_outputs.json.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..133eefbeb84a414423931b081662bfde3dfe5204 GIT binary patch literal 27021 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 literal 0 HcmV?d00001 diff --git a/pisa/stages/flux/hillasg.py b/pisa/stages/flux/hillasg.py index 696a98bef..7a77094ef 100644 --- a/pisa/stages/flux/hillasg.py +++ b/pisa/stages/flux/hillasg.py @@ -21,16 +21,17 @@ class hillasg(Stage): # pylint: disable=invalid-name Parameters ---------- - params - Expected params .. :: + params : ParamSet + Must have parameters:: flux_table : str - Expected container keys are .. :: + Notes + ----- - "true_energy" - "true_coszen" + Expected container keys are:: + "true_energy", "true_coszen" """ def __init__(self, **std_kwargs): @@ -38,16 +39,19 @@ def __init__(self, **std_kwargs): expected_params = ( "flux_table", ) - expected_container_keys = ( 'true_energy', 'true_coszen', ) - + # Implements no apply_function + supported_reps = { + 'apply_mode': [None], + } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) @@ -55,7 +59,6 @@ def setup_function(self): self.flux_table = load_2d_table(self.params.flux_table.value) - self.data.representation = self.calc_mode if self.data.is_map: # speed up calculation by adding links # as nominal flux doesn't depend on the (outgoing) flavour @@ -87,8 +90,6 @@ def setup_function(self): @profile def compute_function(self): - self.data.representation = self.calc_mode - if self.data.is_map: # speed up calculation by adding links # as nominal flux doesn't depend on the (outgoing) flavour diff --git a/pisa/stages/flux/honda_ip.py b/pisa/stages/flux/honda_ip.py index 95157eb50..a57d5b480 100644 --- a/pisa/stages/flux/honda_ip.py +++ b/pisa/stages/flux/honda_ip.py @@ -23,15 +23,17 @@ class honda_ip(Stage): # pylint: disable=invalid-name Parameters ---------- - params - Expected params .. :: + params : ParamSet + Must have parameters:: + flux_table : str - Expected container keys are .. :: + Notes + ----- - "true_energy" - "true_coszen" + Expected container keys are:: + "true_energy", "true_coszen" """ def __init__( @@ -42,16 +44,19 @@ def __init__( expected_params = ( 'flux_table', ) - expected_container_keys = ( 'true_energy', 'true_coszen', ) - + # Implements no apply_function + supported_reps = { + 'apply_mode': [None], + } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) @@ -59,7 +64,6 @@ def setup_function(self): self.flux_table = load_2d_table(self.params.flux_table.value) - self.data.representation = self.calc_mode if self.data.is_map: # speed up calculation by adding links # as nominal flux doesn't depend on the (outgoing) flavour @@ -78,8 +82,6 @@ def setup_function(self): @profile def compute_function(self): - self.data.representation = self.calc_mode - if self.data.is_map: # speed up calculation by adding links # as nominal flux doesn't depend on the (outgoing) flavour diff --git a/pisa/stages/flux/mceq_barr.py b/pisa/stages/flux/mceq_barr.py index 1b7b0fd9a..09888f850 100644 --- a/pisa/stages/flux/mceq_barr.py +++ b/pisa/stages/flux/mceq_barr.py @@ -48,8 +48,10 @@ class mceq_barr(Stage): # pylint: disable=invalid-name nominal flux (since MCEq isued to derive these gradients). This is only relevent if using a different nominal flux, e.g. Honda et al 2025 + Parameters + ---------- params : ParamSet - Must exclusively have parameters: .. :: + Must have parameters:: delta_index : quantity (dimensionless) Shift in the spectral index of the neutrino flux. Prior with a mean of 0. @@ -78,15 +80,13 @@ class mceq_barr(Stage): # pylint: disable=invalid-name Uncertainty on K- and K+ production is assumed to be uncorrelated as the ratio is badly determined. - Expected container keys are .. :: - - "true_energy" - "true_coszen" - "nubar_flux_nominal" - "nubar" - Notes ----- + + Expected container keys are:: + + "true_energy", "true_coszen", "nubar_flux_nominal", "nubar" + The nominal flux is calculated ahead of time using MCEq, then multiplied with a shift in spectral index, and then modifications due to meson production (barr variables) are added. @@ -179,7 +179,6 @@ def __init__( "delta_index", "energy_pivot", ) - expected_container_keys = [ 'true_energy', 'true_coszen', @@ -187,6 +186,10 @@ def __init__( ] if use_honda_nominal_flux: expected_container_keys.append('nubar_flux_nominal') + # Implements no apply_function (implicit caching! FIXME) + supported_reps = { + 'apply_mode': [None], + } # store args self.table_file = table_file @@ -198,10 +201,10 @@ def __init__( super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) - def setup_function(self): self.data.representation = self.calc_mode diff --git a/pisa/stages/flux/mceq_barr_red.py b/pisa/stages/flux/mceq_barr_red.py index 48ef94070..91d9312c0 100644 --- a/pisa/stages/flux/mceq_barr_red.py +++ b/pisa/stages/flux/mceq_barr_red.py @@ -40,7 +40,7 @@ class mceq_barr_red(Stage): # pylint: disable=invalid-name table_file : pickle file containing pre-generated tables from MCEq params : ParamSet - Must exclusively have parameters: .. :: + Must have parameters:: delta_index : quantity (dimensionless) Shift in the spectral index of the neutrino flux. Prior with a mean of 0. @@ -69,17 +69,15 @@ class mceq_barr_red(Stage): # pylint: disable=invalid-name Uncertainty on K- and K+ production is assumed to be uncorrelated as the ratio is badly determined. - Expected container keys are .. :: - - "true_energy" - "true_coszen" - "nu_flux_nominal" - "nubar_flux_nominal" - "nubar" - Notes ----- - The nominal flux is calculated ahead of time using the honda_ip stage, + + Expected container keys are:: + + "true_energy", "true_coszen", "nu_flux_nominal", "nubar_flux_nominal", + "nubar" + + The nominal flux is calculated ahead of time using the :py:class:`.honda_ip` stage, then multiplied with a shift in spectral index, and then modifications due to meson production (barr variables) are added. @@ -160,7 +158,6 @@ def __init__( "delta_index", "energy_pivot", ) - expected_container_keys = ( "true_energy", "true_coszen", @@ -168,6 +165,10 @@ def __init__( "nubar_flux_nominal", "nubar" ) + # Implements no apply_function (implicit caching! FIXME) + supported_reps = { + 'apply_mode': [None], + } # Using Honda for nominal flux. Keys should already exist # what are keys added or altered in the calculation used during apply @@ -180,14 +181,12 @@ def __init__( super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) def setup_function(self): - - self.data.representation = self.calc_mode - # # Init arrays # @@ -339,8 +338,6 @@ def antipion_production(self, barr_var, pion_ratio): @profile def compute_function(self): - self.data.representation = self.calc_mode - if self.data.is_map: # speed up calculation by adding links # as nominal flux doesn't depend on the (outgoing) flavour diff --git a/pisa/stages/likelihood/generalized_llh_params.py b/pisa/stages/likelihood/generalized_llh_params.py index f960843ff..82c610631 100644 --- a/pisa/stages/likelihood/generalized_llh_params.py +++ b/pisa/stages/likelihood/generalized_llh_params.py @@ -75,7 +75,7 @@ def __init__(self, expected_container_keys = [ 'weights', ] - + # TODO: uses custom representations in setup_function supported_reps = { 'apply_mode' : [MultiDimBinning] } diff --git a/pisa/stages/osc/decoherence.py b/pisa/stages/osc/decoherence.py index 529daf320..5e60fbff1 100644 --- a/pisa/stages/osc/decoherence.py +++ b/pisa/stages/osc/decoherence.py @@ -249,12 +249,12 @@ def _calc_numu_disappearance_prob_3flav(decoh_params, E, L): class decoherence(Stage): """ - PISA Pi stage representing oscillations in the presence of decoherence + Stage representing oscillations in the presence of decoherence Parameters ---------- - params - Expected contents of `params` ParamSet: .. :: + params : ParamSet + Must have parameters:: detector_depth : float earth_model : PREM file path @@ -268,20 +268,18 @@ class decoherence(Stage): deltam21 : quantity (mass^2) deltam31 : quantity (mass^2) deltacp : quantity (angle) - gamma12 : quantity (energy) - gamma13 : quantity (energy) - gamma23 : quantity (energy) + gamma21 : quantity (energy) + gamma31 : quantity (energy) + gamma32 : quantity (energy) - Expected container keys are .. :: + Notes + ----- - "true_energy" - "true_coszen" - "weights" - "nubar" - "flav" - "sys_flux" + Expected container keys are:: + "true_energy", "true_coszen", "weights", "nubar", "flav", "sys_flux" """ + def __init__(self, **std_kwargs, ): @@ -392,9 +390,6 @@ def setup_function(self): @profile def compute_function(self): - # set the correct data mode - self.data.representation = self.calc_mode - if self.data.is_map: # speed up calculation by adding links self.data.link_containers('nu', ['nue_cc', 'numu_cc', 'nutau_cc', diff --git a/pisa/stages/osc/external.py b/pisa/stages/osc/external.py index 145f8836b..2fefdd462 100644 --- a/pisa/stages/osc/external.py +++ b/pisa/stages/osc/external.py @@ -23,12 +23,8 @@ class external(Stage): Parameters ---------- - params - - osc_prob : callable - the external function - - Expected params .. :: + params : ParamSet + Must have parameters:: detector_depth : float earth_model : PREM file path @@ -37,18 +33,22 @@ class external(Stage): YeO : quantity (dimensionless) YeM : quantity (dimensionless) - Expected container keys are .. :: + Attributes + ---------- + osc_prob : callable + the external function + external_params : + layers : :py:class:`~.layers.Layers` + YeI : quantity (dimensionless) + YeO : quantity (dimensionless) + YeM : quantity (dimensionless) + + Notes + ----- - "true_energy" - "true_coszen" - "nubar" - "flav" - "nu_flux" - "weights" + Expected container keys are:: - **kwargs - Other kwargs are handled by Stage - ----- + "true_energy", "true_coszen", "nubar", "flav", "nu_flux", "weights" """ def __init__( @@ -64,7 +64,6 @@ def __init__( 'YeO', 'YeM', ) - expected_container_keys = ( 'true_energy', 'true_coszen', @@ -73,8 +72,6 @@ def __init__( 'nu_flux', 'weights' ) - - # init base class super().__init__( expected_params=expected_params, diff --git a/pisa/stages/osc/globes.py b/pisa/stages/osc/globes.py index be7a5d94d..07b5549b2 100644 --- a/pisa/stages/osc/globes.py +++ b/pisa/stages/osc/globes.py @@ -1,5 +1,5 @@ """ -PISA pi stage wrapping GLoBES for the calculation of neutrino oscillation probabilities. +Stage wrapping GLoBES for the calculation of neutrino oscillation probabilities. Allows for the calculation of sterile neutrino oscillation probabilities. This needs Andrii's GLoBES wrapper, which has been forked to be @@ -32,16 +32,20 @@ class globes(Stage): # pylint: disable=invalid-name """ - GLoBES PISA Pi class + GLoBES class Parameters ---------- earth_model : PREM file path + globes_wrapper : path to globes wrapper + detector_depth : float + prop_height : quantity (dimensionless) + params : ParamSet or sequence with which to instantiate a ParamSet. - Expected params .. :: + Must have parameters:: theta12 : quantity (angle) theta13 : quantity (angle) @@ -53,16 +57,13 @@ class globes(Stage): # pylint: disable=invalid-name theta34 : quantity (angle) deltacp : quantity (angle) - Expected container keys are .. :: - - "true_energy" - "true_coszen" - "nubar" - "flav" - "nu_flux" - "weights" + Notes + ----- + Expected container keys are:: + "true_energy", "true_coszen", "nubar", "flav", "nu_flux", "weights" """ + def __init__( self, earth_model, @@ -132,9 +133,6 @@ def setup_function(self): # one to give GLoBES the raw densities. self.layers.setElecFrac(1., 1., 1.) - # set the correct data mode - self.data.representation = self.calc_mode - # --- calculate the layers --- if self.data.is_map: # speed up calculation by adding links @@ -229,8 +227,6 @@ def compute_function(self): 0.0 ] self.globes_calc.SetParametersArr(params) - # set the correct data mode - self.data.representation = self.calc_mode for container in self.data: # standard oscillations are only applied to charged current events, diff --git a/pisa/stages/osc/nusquids.py b/pisa/stages/osc/nusquids.py index ebae646c7..644063856 100644 --- a/pisa/stages/osc/nusquids.py +++ b/pisa/stages/osc/nusquids.py @@ -35,7 +35,7 @@ class `nuSQUIDSLayers` in nuSQuIDS as well as low-pass filtering and range avera class nusquids(Stage): # pylint: disable=invalid-name """ - PISA Pi stage for weighting events due to the effect of neutrino oscillations, using + Stage for weighting events due to the effect of neutrino oscillations, using nuSQuIDS as the oscillation probability calculator. One specialty here is that we have to specify an additional binning to determine where to place nodes for the exact calculation. The points where the actual probability is evaluated is @@ -45,8 +45,7 @@ class nusquids(Stage): # pylint: disable=invalid-name Parameters ---------- - Uses the standard parameters as required by a PISA pi stage - (see `pisa/core/stage.py`) + Uses the standard parameters as required by a :py:class:`.Stage` node_mode : MultiDimBinning Binning to determine where to place nodes at which the evaluation of interaction @@ -157,38 +156,43 @@ class nusquids(Stage): # pylint: disable=invalid-name Do not include matter effects. Greatly increases evaluation speed. params : ParamSet or sequence with which to instantiate a ParamSet. - Expected params .. :: + Must have parameters:: + theta12 : quantity (angle) theta13 : quantity (angle) theta23 : quantity (angle) deltam21 : quantity (mass^2) deltam31 : quantity (mass^2) deltacp : quantity (angle) - Additional expected params if `num_neutrinos == 4` .. :: + + Additional expected params if `num_neutrinos == 4`:: + theta14 : quantity (angle) theta24 : quantity (angle) deltam41 : quantity (mass^2) deltacp14 : quantity (angle) deltacp24 : quantity (angle) - Additional ParamSet params expected when using the `use_decoherence` argument: - n_energy : quantity (dimensionless) - * If using `num_decoherence_gamma` == 1: + Additional expected params when using the `use_decoherence` argument:: + + n_energy : quantity (dimensionless) + + If using `num_decoherence_gamma` == 1:: + gamma : quantity (energy) - * If using `num_decoherence_gamma` == 3: + + If using `num_decoherence_gamma` == 3:: + gamma12 : quantity (energy) gamma13 : quantity (energy) gamma23 : quantity (energy) - - Expected container keys are .. :: - "true_energy" - "true_coszen" - "nubar" - "flav" - "nu_flux" - "weights" + Notes + ----- + Expected container keys are:: + + "true_energy", "true_coszen", "nubar", "flav", "nu_flux", "weights" """ def __init__( @@ -337,7 +341,7 @@ def __init__( 'nu_flux', 'weights' ) - + #TODO: supported_reps? # init base class super().__init__( expected_params=expected_params, diff --git a/pisa/stages/osc/two_nu_osc.py b/pisa/stages/osc/two_nu_osc.py index a9ff857f3..1a74bf3f8 100644 --- a/pisa/stages/osc/two_nu_osc.py +++ b/pisa/stages/osc/two_nu_osc.py @@ -1,5 +1,5 @@ """ -PISA pi stage for the calculation osc. probabilities assuming two-neutrino model +Stage for the calculation osc. probabilities assuming two-neutrino model """ from __future__ import absolute_import, print_function, division @@ -17,28 +17,27 @@ class two_nu_osc(Stage): # pylint: disable=invalid-name """ - two neutrino osc PISA Pi class + two neutrino osc class Parameters ---------- - Expected params .. :: + params : ParamSet + Must have parameters:: theta : quantity (angle) deltam31 : quantity (mass^2) - - Expected container keys are .. :: - - "true_energy" - "true_coszen" - "nu_flux" - "weights" Notes ----- + + Expected container keys are:: + + "true_energy", "true_coszen", "nu_flux", "weights" + For two-neutrino model, there is only one mass-splitting term Atmospheric mixing angle is approximated by theta (sin^2(2*theta)) - """ + def __init__(self, **std_kwargs, ): @@ -47,22 +46,24 @@ def __init__(self, 'theta23', 'deltam31', ) - expected_container_keys = ( 'true_energy', 'true_coszen', 'nu_flux', 'weights' ) - + # Implements no setup_function+compute_function + supported_reps = { + 'calc_mode': [None], + } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) - @profile def apply_function(self): diff --git a/pisa/stages/reco/resolutions.py b/pisa/stages/reco/resolutions.py index 996f42190..0b48da064 100644 --- a/pisa/stages/reco/resolutions.py +++ b/pisa/stages/reco/resolutions.py @@ -15,14 +15,14 @@ class resolutions(Stage): # pylint: disable=invalid-name """ - stage to change the reconstructed information by a given amount - This can be used to esimate the impact of improved recosntruction - resolutions for instance + Stage to change the reconstructed information by a given amount. + This can be used to estimate the impact of improved reconstruction + resolutions for instance. Parameters ---------- - params - Expected params .. :: + params : ParamSet + Must have parameters:: energy_improvement : quantity (dimensionless) scale the reco error down by this fraction @@ -32,27 +32,25 @@ class resolutions(Stage): # pylint: disable=invalid-name applies a shift to the classification parameter [if relative_pid=False] scales the pid error down by this fraction [if relative_pid=True] - Expected container keys are .. :: + Notes + ----- - "true_energy" - "true_coszen" - "reco_energy" - "reco_coszen" - "pid" + Expected container keys are:: + "true_energy", "true_coszen", "reco_energy", "reco_coszen", "pid" """ + def __init__( self, relative_pid=False, **std_kwargs ): - + # FIXME: not meant to be expected_params, as only setup_function implemented expected_params = ( 'energy_improvement', 'coszen_improvement', 'pid_improvement', ) - expected_container_keys = ( 'true_energy', 'true_coszen', @@ -60,11 +58,14 @@ def __init__( 'reco_coszen', 'pid', ) - - # init base class + supported_reps = { + "calc_mode": ["events"], + "apply_mode": [None] + } super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) @@ -72,8 +73,6 @@ def __init__( def setup_function(self): - self.data.representation = self.apply_mode - for container in self.data: logging.info('Changing energy resolutions') container['reco_energy'] += (container['true_energy'] - container['reco_energy']) * self.params.energy_improvement.m_as('dimensionless') diff --git a/pisa/stages/reco/simple_param.py b/pisa/stages/reco/simple_param.py index f07592f39..3c56f7e17 100644 --- a/pisa/stages/reco/simple_param.py +++ b/pisa/stages/reco/simple_param.py @@ -386,7 +386,7 @@ class simple_param(Stage): # pylint: disable=invalid-name Parameters ---------- params : ParamSet - Must exclusively have parameters: + Must have parameters:: perfect_reco : bool If True, use "perfect reco": reco == true, numu(bar)_cc -> tracks, rest to cascades @@ -410,11 +410,12 @@ class simple_param(Stage): # pylint: disable=invalid-name cascade_pid : float The numerical 'pid' variable value to assign for cascades - Expected container keys are .. :: + Notes + ----- - "true_energy" - "true_coszen" + Expected container keys are:: + "true_energy", "true_coszen" """ def __init__(self, @@ -422,23 +423,26 @@ def __init__(self, ): expected_params = ( - "perfect_reco", #TODO move these to constructor args? (yes, please) + "perfect_reco", #FIXME move these to constructor args? (yes, please) "reco_energy_params", "reco_coszen_params", "pid_track_params", "track_pid", "cascade_pid", ) - expected_container_keys = ( 'true_energy', 'true_coszen', ) - + # Implements no apply_function (TODO: does any calc_mode work?) + supported_reps = { + 'apply_mode': [None], + } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/utils/add_indices.py b/pisa/stages/utils/add_indices.py index d17aab12b..951d4e562 100644 --- a/pisa/stages/utils/add_indices.py +++ b/pisa/stages/utils/add_indices.py @@ -1,5 +1,5 @@ ''' -PISA module to prep incoming data into formats that are +Module to prep incoming data into formats that are compatible with the mc_uncertainty likelihood formulation This module takes in events containers from the pipeline, and @@ -24,41 +24,34 @@ class add_indices(Stage): # pylint: disable=invalid-name """ - PISA Pi stage to map out the index of the analysis + Stage to map out the index of the analysis binning where each event falls into. - Parameters - ---------- - params - foo : Quantity - bar : Quanitiy with time dimension - - Notes: - ------ + Notes + ----- - input and calc specs are predetermined in the module - (inputs from the config files will be disregarded) - + (inputs from the config files will be disregarded) - stage appends an array quantity called bin_indices - stage also appends an array mask to access events by bin index later in the pipeline - """ - # this is the constructor with default arguments - def __init__(self, **std_kwargs, ): - - + # has no apply_function, but uses both in setup_function + supported_reps = { + "calc_mode": ["events"], + "apply_mode": [MultiDimBinning], + } # init base class super().__init__( expected_params=(), expected_container_keys=(), + supported_reps=supported_reps, **std_kwargs, ) - def setup_function(self): ''' Calculate the bin index where each event falls into diff --git a/pisa/stages/utils/adhoc_sys.py b/pisa/stages/utils/adhoc_sys.py index 996254d50..e3c141cdf 100644 --- a/pisa/stages/utils/adhoc_sys.py +++ b/pisa/stages/utils/adhoc_sys.py @@ -27,7 +27,6 @@ class adhoc_sys(Stage): # pylint: disable=invalid-name Parameters ---------- - variable_name : str Name of the variable to correct data/MC agreement for. The variable must be loaded in the data loading stage and it must be present in the loaded JSON file. @@ -36,7 +35,15 @@ class adhoc_sys(Stage): # pylint: disable=invalid-name Path to the file which contains the binning and the scale factors. The JSON file must contain a dictionary in which, for each variable, a 1D binning and an array of factors. This file is produced externally from PISA. + + Notes + ----- + + Expected container keys are:: + + "weights", `variable_name` """ + def __init__( self, data=None, @@ -47,16 +54,13 @@ def __init__( ): expected_params = () - expected_container_keys = [ 'weights', variable_name ] - supported_reps = { - 'calc_mode': 'events', - 'apply_mode': 'events' + 'calc_mode': ['events'], + 'apply_mode': ['events'] } - # init base class super().__init__( expected_params=expected_params, diff --git a/pisa/stages/utils/bootstrap.py b/pisa/stages/utils/bootstrap.py index 3b2e72290..a3210df81 100644 --- a/pisa/stages/utils/bootstrap.py +++ b/pisa/stages/utils/bootstrap.py @@ -17,7 +17,7 @@ __author__ = "A. Trettin" -__license__ = """Copyright (c) 2022, The IceCube Collaboration +__license__ = """Copyright (c) 2014-2026, The IceCube Collaboration Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -43,6 +43,13 @@ class bootstrap(Stage): # pylint: disable=invalid-name ---------- seed : int, optional Seed for the random number generator. + + Notes + ----- + + Expected container keys are:: + + "weights" """ def __init__( @@ -54,11 +61,14 @@ def __init__( expected_container_keys = ( 'weights', ) - + supported_reps = { + 'calc_mode': ["events"], + } # init base class super().__init__( expected_params=(), expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/utils/fix_error.py b/pisa/stages/utils/fix_error.py index ef1794051..b708fd03e 100644 --- a/pisa/stages/utils/fix_error.py +++ b/pisa/stages/utils/fix_error.py @@ -15,8 +15,16 @@ class fix_error(Stage): # pylint: disable=invalid-name """ - stage to fix the error returned by template_maker. + Stage to fix the error returned by template_maker. + + Notes + ----- + + Expected container keys are:: + + "errors" """ + def __init__( self, **std_kwargs, @@ -25,7 +33,6 @@ def __init__( expected_container_keys = ( 'errors', ) - # init base class super().__init__( expected_params=(), diff --git a/pisa/stages/utils/hist.py b/pisa/stages/utils/hist.py index e6c0648fb..b02ecbd35 100644 --- a/pisa/stages/utils/hist.py +++ b/pisa/stages/utils/hist.py @@ -23,10 +23,12 @@ class hist(Stage): # pylint: disable=invalid-name Return un-weighted event counts in each bin apply_unc_weights : bool, default False - Expected container keys are .. :: + Notes + ----- - "weights" - "unc_weights" (if `apply_unc_weights`) + Expected container keys are:: + + "weights", "unc_weights" (if `apply_unc_weights`) """ def __init__( @@ -45,7 +47,6 @@ def __init__( 'calc_mode': [MultiDimBinning, "events"], 'apply_mode': [None, MultiDimBinning], } - # init base class super().__init__( expected_params=(), diff --git a/pisa/stages/utils/kfold.py b/pisa/stages/utils/kfold.py index 493be5b74..124686285 100644 --- a/pisa/stages/utils/kfold.py +++ b/pisa/stages/utils/kfold.py @@ -51,6 +51,12 @@ class kfold(Stage): # pylint: disable=invalid-name by the number of splits shuffle (bool, optional): shuffle indeces before splitting + Notes + ----- + + Expected container keys are:: + + "weights" """ def __init__( @@ -67,11 +73,14 @@ def __init__( expected_container_keys = ( 'weights', ) - + supported_reps = { + 'calc_mode': ["events"], + } # init base class super().__init__( expected_params=(), expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/xsec/correct_charm_y.py b/pisa/stages/xsec/correct_charm_y.py index 71c7aeefd..52b26adc1 100644 --- a/pisa/stages/xsec/correct_charm_y.py +++ b/pisa/stages/xsec/correct_charm_y.py @@ -30,6 +30,9 @@ class correct_charm_y(Stage): ------ THIS STAGE IS FOR MC TESTING ONLY - do *NOT* use in real analysis!!! + Expected container keys are:: + + 'true_energy', 'true_coszen', 'bjorken_y', 'weights' References ---------- @@ -38,8 +41,8 @@ class correct_charm_y(Stage): Slides showing use for check with oscNext VS (osc. call, 19 Dec 2022): https://drive.google.com/file/d/14h0WYWPWn7yS7wLQpyMAPTenfKfFAq3k/view?usp=drive_link - """ + def __init__( self, nu_cc_container_keys = ['nue_cc', 'numu_cc', 'nutau_cc'], diff --git a/pisa/stages/xsec/dis_sys.py b/pisa/stages/xsec/dis_sys.py index 7d88829c2..fe93fb05e 100644 --- a/pisa/stages/xsec/dis_sys.py +++ b/pisa/stages/xsec/dis_sys.py @@ -24,23 +24,6 @@ class dis_sys(Stage): # pylint: disable=invalid-name Parameters ---------- - data - params - Must contain :: - dis_csms : quantity (dimensionless) [if combine_components=True] - or - dis_csms_tot, dis_csms_diff : quantity (dimensionless) [if combine_components=False] - - Expected container keys are .. :: - - "true_energy" - "bjorken_y" - "dis" - "nubar" - "weights" - - - combine_components : bool False -> allow the total and differential components to fit individually (params will then be: dis_csms_tot, dis_csms_diff) True -> vary the total and differential components together (param will then be: dis_csms) @@ -52,17 +35,20 @@ class dis_sys(Stage): # pylint: disable=invalid-name Below what energy (in GeV) to extrapolate Defaults to 100. CSMS not considered reliable below 50-100 GeV + params : ParamSet + Must have parameters:: + dis_csms : quantity (dimensionless) [if combine_components=True] + or + dis_csms_tot, dis_csms_diff : quantity (dimensionless) [if combine_components=False] + Notes ----- - Requires the events have the following keys :: - true_energy - Neutrino energy in GeV - bjorken_y - Inelasticity - dis - 1 if event is DIS, else 0 + Expected container keys are:: + + "true_energy", "bjorken_y", "dis", "nubar", "weights" """ + def __init__( self, extrapolation_type='constant', @@ -80,7 +66,6 @@ def __init__( 'dis_csms_tot', 'dis_csms_diff', ) - expected_container_keys = ( 'true_energy', 'bjorken_y', @@ -88,11 +73,15 @@ def __init__( 'nubar', 'weights', ) - + # explicitly sets "events" rep. in setup_function -> be transparent + supported_reps = { + 'calc_mode': ["events"], + } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/xsec/genie_sys.py b/pisa/stages/xsec/genie_sys.py index 30512a399..81879413a 100644 --- a/pisa/stages/xsec/genie_sys.py +++ b/pisa/stages/xsec/genie_sys.py @@ -20,21 +20,21 @@ class genie_sys(Stage): # pylint: disable=invalid-name Parameters ---------- - params - Must contain :: + params : ParamSet + Must have parameters:: - parameters specified in interactions (dimensionless) + parameters specified in `interactions` (dimensionless) Notes ----- - Requires the events have the following keys for each included interaction :: - linear_fit_{name} - Genie linear coefficient for interaction {name} - quad_fit_{name} - Genie quadratic coefficient for interaction {name} + Expected container keys are:: + "linear_fit_{name}" (Genie linear coefficient for interaction {name}), + "quad_fit_{name}" (Genie quadratic coefficient for interaction {name}), + "weights" """ + def __init__( self, interactions="Genie_Ma_QE, Genie_Ma_RES", diff --git a/pisa/stages/xsec/nutau_xsec.py b/pisa/stages/xsec/nutau_xsec.py index 5801a1473..1bbac57ae 100644 --- a/pisa/stages/xsec/nutau_xsec.py +++ b/pisa/stages/xsec/nutau_xsec.py @@ -32,18 +32,19 @@ class nutau_xsec(Stage): # pylint: disable=invalid-name `pisa_examples/resources/cross_sections/interp_nutau_xsec_protocol2.pckl` params : ParamSet or sequence with which to instantiate a ParamSet. - Expected params .. :: + Must have parameters:: nutau_xsec_scale : quantity (dimensionless) Scaling between different cross-section models. The range [-1, 1] covers all models tested in the paper. - Expected container keys are .. :: - - "true_energy" - "weights" + Notes + ----- + Expected container keys are:: + "true_energy", "weights" """ + def __init__( self, xsec_file="cross_sections/interp_nutau_xsec_protocol2.pckl", @@ -53,12 +54,11 @@ def __init__( expected_params = ( "nutau_xsec_scale", ) - expected_container_keys = ( 'true_energy', 'weights', ) - + #TODO: supported_reps? (temporarily sets rep. to apply_mode in setup_function) # init base class super(nutau_xsec, self).__init__( expected_params=expected_params, @@ -74,7 +74,6 @@ def setup_function(self): interp_nutau = interp_dict["NuTau"] interp_nutaubar = interp_dict["NuTauBar"] - self.data.representation = self.calc_mode for container in self.data: if container.name == "nutau_cc": energy = container["true_energy"] From f85ca04381accc4d3417c3eaeaa92096117f5c71 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Sat, 25 Apr 2026 02:32:37 +0200 Subject: [PATCH 02/32] Let Stage class listify supported_reps values if necessary, so that individual services don't need to --- pisa/core/stage.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/pisa/core/stage.py b/pisa/core/stage.py index 9988e00d0..2ae6d8947 100644 --- a/pisa/core/stage.py +++ b/pisa/core/stage.py @@ -6,7 +6,7 @@ from __future__ import absolute_import, division from copy import deepcopy -from collections.abc import Mapping +from collections.abc import Mapping, Sequence import inspect from time import time @@ -56,8 +56,8 @@ class Stage(): supported_reps : dict Dictionary containing the representations allowed for calc_mode and apply_mode. If nothing is specified, Container.array_representations - plus MultiDimBinning is assumed. Should have keys `calc_mode` and/or - `apply_mode`, they will be created if not there. + plus MultiDimBinning is assumed. Should have keys "calc_mode" and/or + "apply_mode", they will be created if not there. calc_mode : pisa.core.binning.MultiDimBinning, str, or None Specify the default data representation for `setup()` and `compute()` @@ -150,11 +150,18 @@ def __init__( if supported_reps is None: supported_reps = {} + assert isinstance(supported_reps, Mapping) - if 'calc_mode' not in supported_reps: - supported_reps['calc_mode'] = list(Container.array_representations) + [MultiDimBinning] - if 'apply_mode' not in supported_reps: - supported_reps['apply_mode'] = list(Container.array_representations) + [MultiDimBinning] + for mode_str in ['calc_mode', 'apply_mode']: + if mode_str not in supported_reps: + # reps for this mode not yet defined -> allow all + supported_reps[mode_str] = list(Container.array_representations) + [MultiDimBinning] + else: + # reps for this mode already defined -> listify + if (isinstance(supported_reps[mode_str], str) + or not isinstance(supported_reps[mode_str], Sequence)): + supported_reps[mode_str] = [supported_reps[mode_str]] + self.supported_reps = supported_reps self._check_representation(rep=calc_mode, mode='calc_mode', allow_None=True) @@ -317,18 +324,18 @@ def _check_representation(self, rep, mode, allow_None=False): # Should be removed once stages explicitely set modes. if None not in self.supported_reps[mode] and not allow_None: raise ValueError( - f"{mode} {rep} is not supported by {self.stage_name}" + f"{mode}='{rep}' is not supported by {self.stage_name}" f".{self.service_name}" ) elif isinstance(rep, str): if rep not in self.supported_reps[mode]: raise ValueError( - f"{mode} {rep} is not supported by {self.stage_name}" + f"{mode}='{rep}' is not supported by {self.stage_name}" f".{self.service_name}" ) elif type(rep) not in self.supported_reps[mode]: raise ValueError( - f"{mode} {type(rep)} is not supported by {self.stage_name}" + f"{mode} of type {type(rep)} is not supported by {self.stage_name}" f".{self.service_name}" ) From 9c75ee6abde9d2e469bf813e923ad3d22f7929b9 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Sat, 25 Apr 2026 02:34:43 +0200 Subject: [PATCH 03/32] second pass: delistify supported_reps values in individual services where possible --- pisa/stages/aeff/aeff.py | 2 +- pisa/stages/aeff/param.py | 2 +- pisa/stages/aeff/weight.py | 2 +- pisa/stages/aeff/weight_hnl.py | 2 +- pisa/stages/cont_sys/snowstorm_hist.py | 8 ++++---- pisa/stages/data/csv_data_hist.py | 2 +- pisa/stages/data/csv_loader.py | 4 ++-- pisa/stages/data/grid.py | 2 +- pisa/stages/data/meows_loader.py | 2 +- pisa/stages/data/simple_data_loader.py | 8 ++++++-- pisa/stages/data/simple_signal.py | 7 +++---- pisa/stages/discr_sys/csv_hypersurfaces.py | 2 +- pisa/stages/discr_sys/hypersurfaces.py | 2 +- pisa/stages/discr_sys/ultrasurfaces.py | 2 +- pisa/stages/flux/barr_simple.py | 2 +- pisa/stages/flux/hillasg.py | 2 +- pisa/stages/flux/honda_ip.py | 2 +- pisa/stages/flux/mceq_barr.py | 2 +- pisa/stages/flux/mceq_barr_red.py | 2 +- pisa/stages/likelihood/generalized_llh_params.py | 2 +- pisa/stages/osc/two_nu_osc.py | 2 +- pisa/stages/reco/resolutions.py | 5 +++-- pisa/stages/reco/simple_param.py | 2 +- pisa/stages/utils/add_indices.py | 4 ++-- pisa/stages/utils/adhoc_sys.py | 4 ++-- pisa/stages/utils/bootstrap.py | 2 +- pisa/stages/utils/kde.py | 4 ++-- pisa/stages/utils/kfold.py | 2 +- pisa/stages/utils/set_variance.py | 5 ++--- pisa/stages/xsec/dis_sys.py | 2 +- 30 files changed, 47 insertions(+), 44 deletions(-) diff --git a/pisa/stages/aeff/aeff.py b/pisa/stages/aeff/aeff.py index f0cce23d4..255c94e9b 100644 --- a/pisa/stages/aeff/aeff.py +++ b/pisa/stages/aeff/aeff.py @@ -58,7 +58,7 @@ def __init__( ) # Implements no setup_function+compute_function supported_reps = { - 'calc_mode': [None], + 'calc_mode': None, } # init base class super().__init__( diff --git a/pisa/stages/aeff/param.py b/pisa/stages/aeff/param.py index 880d57878..8e3901115 100644 --- a/pisa/stages/aeff/param.py +++ b/pisa/stages/aeff/param.py @@ -169,7 +169,7 @@ def __init__( ) # Implements no setup_function+compute_function supported_reps = { - 'calc_mode': [None], + 'calc_mode': None, } # init base class super().__init__( diff --git a/pisa/stages/aeff/weight.py b/pisa/stages/aeff/weight.py index 3ab560731..7309199a5 100644 --- a/pisa/stages/aeff/weight.py +++ b/pisa/stages/aeff/weight.py @@ -47,7 +47,7 @@ def __init__( ) # Implements no setup_function+compute_function supported_reps = { - 'calc_mode': [None], + 'calc_mode': None, } # init base class super().__init__( diff --git a/pisa/stages/aeff/weight_hnl.py b/pisa/stages/aeff/weight_hnl.py index 3e282755d..c2106227a 100644 --- a/pisa/stages/aeff/weight_hnl.py +++ b/pisa/stages/aeff/weight_hnl.py @@ -113,7 +113,7 @@ def __init__( ) # Implements no setup_function+compute_function supported_reps = { - 'calc_mode': [None], + 'calc_mode': None, } # init base class super().__init__( diff --git a/pisa/stages/cont_sys/snowstorm_hist.py b/pisa/stages/cont_sys/snowstorm_hist.py index a7637de85..cc4d7bd9b 100644 --- a/pisa/stages/cont_sys/snowstorm_hist.py +++ b/pisa/stages/cont_sys/snowstorm_hist.py @@ -39,9 +39,9 @@ class snowstorm_hist(Stage): # pylint: disable=invalid-name Service to apply detector systematics through splitting and histogramming of snowstorm simulation. - Expected container keys are: - "weights" - All detector systematics that should be used + Expected container keys are:: + + "weights" + all detector systematics that should be used The stage also expects that "regularized_output_binning" is part of the global auxilary variables of the `data` container set. This key is added by the @@ -113,7 +113,7 @@ def __init__( # evaluation only works on event-by-event basis supported_reps = { - 'calc_mode': ["events"], + 'calc_mode': "events", 'apply_mode': [None, MultiDimBinning], } diff --git a/pisa/stages/data/csv_data_hist.py b/pisa/stages/data/csv_data_hist.py index 07dec8226..4e8f30a5c 100644 --- a/pisa/stages/data/csv_data_hist.py +++ b/pisa/stages/data/csv_data_hist.py @@ -36,7 +36,7 @@ def __init__(self, expected_container_keys = () # Implements no apply_function supported_reps = { - 'apply_mode': [None], + 'apply_mode': None, } # init base class super().__init__( diff --git a/pisa/stages/data/csv_loader.py b/pisa/stages/data/csv_loader.py index 3b118b099..9987f63fc 100644 --- a/pisa/stages/data/csv_loader.py +++ b/pisa/stages/data/csv_loader.py @@ -93,9 +93,9 @@ def __init__( self.scale_aeff = scale_aeff # apply_function sets representation to "events", so only accept that - # to be transparent + # to be transparent (TODO: any calc_mode fine?) supported_reps = { - 'apply_mode': ["events"], + 'apply_mode': "events", } # init base class super().__init__( diff --git a/pisa/stages/data/grid.py b/pisa/stages/data/grid.py index 521a35ce8..3c330e7f8 100644 --- a/pisa/stages/data/grid.py +++ b/pisa/stages/data/grid.py @@ -46,7 +46,7 @@ def __init__( # only intended to work with calc_mode="events" supported_reps = { - 'calc_mode': ["events"], + 'calc_mode': "events", } # init base class super(grid, self).__init__( diff --git a/pisa/stages/data/meows_loader.py b/pisa/stages/data/meows_loader.py index c26b66dae..05d363688 100644 --- a/pisa/stages/data/meows_loader.py +++ b/pisa/stages/data/meows_loader.py @@ -16,7 +16,7 @@ class meows_loader(Stage): # pylint: disable=invalid-name """ - Docstring incoming... + Docstring incoming... (FIXME) """ def __init__(self, events_file: str, n_files: int, output_names, **std_kwargs): diff --git a/pisa/stages/data/simple_data_loader.py b/pisa/stages/data/simple_data_loader.py index 266c00c2b..af3cb0077 100644 --- a/pisa/stages/data/simple_data_loader.py +++ b/pisa/stages/data/simple_data_loader.py @@ -102,9 +102,13 @@ def __init__(self, # their values expected_params = () + # Even though service implements setup_function (recording event + # properties), representations of new containers in there are explicitly + # set to "events" (naturally). Hence, choice of calc_mode has no impact. + # Make decision not to accept setting calc_mode. supported_reps = { - 'calc_mode': [None], - 'apply_mode': ["events"], + 'calc_mode': None, + 'apply_mode': "events", } # init base class diff --git a/pisa/stages/data/simple_signal.py b/pisa/stages/data/simple_signal.py index 9ef48eafa..94c93300f 100644 --- a/pisa/stages/data/simple_signal.py +++ b/pisa/stages/data/simple_signal.py @@ -23,7 +23,7 @@ class simple_signal(Stage): # pylint: disable=invalid-name """ - random toy event generator class + random toy event generator class (FIXME) Parameters ---------- @@ -35,7 +35,6 @@ class simple_signal(Stage): # pylint: disable=invalid-name random seed : int Seed to be used for random - """ def __init__( @@ -61,8 +60,8 @@ def __init__( # FIXME: apply_mode=MultiDimBinning is assumed in setup_function, but # apply_function sets rep. to "events" supported_reps = { - 'calc_mode': ["events"], - 'apply_mode': [MultiDimBinning] + 'calc_mode': "events", + 'apply_mode': MultiDimBinning } # init base class super().__init__( diff --git a/pisa/stages/discr_sys/csv_hypersurfaces.py b/pisa/stages/discr_sys/csv_hypersurfaces.py index 327f8ed1b..c919d3490 100644 --- a/pisa/stages/discr_sys/csv_hypersurfaces.py +++ b/pisa/stages/discr_sys/csv_hypersurfaces.py @@ -104,7 +104,7 @@ def __init__( expected_container_keys.append('errors') supported_reps = { - 'calc_mode': [MultiDimBinning], + 'calc_mode': MultiDimBinning, 'apply_mode': [MultiDimBinning, 'events'], } diff --git a/pisa/stages/discr_sys/hypersurfaces.py b/pisa/stages/discr_sys/hypersurfaces.py index 93e997ed9..de9b90c8d 100644 --- a/pisa/stages/discr_sys/hypersurfaces.py +++ b/pisa/stages/discr_sys/hypersurfaces.py @@ -115,7 +115,7 @@ def __init__( # this will cause a warning about missing presence of 'errors' # because hist adds this key during apply supported_reps = { - 'calc_mode': [MultiDimBinning], + 'calc_mode': MultiDimBinning, } # -- Initialize base class -- # super().__init__( diff --git a/pisa/stages/discr_sys/ultrasurfaces.py b/pisa/stages/discr_sys/ultrasurfaces.py index bf116777e..83534b558 100644 --- a/pisa/stages/discr_sys/ultrasurfaces.py +++ b/pisa/stages/discr_sys/ultrasurfaces.py @@ -190,7 +190,7 @@ def __init__( # pylint: disable=dangerous-default-value # evaluation only works on event-by-event basis supported_reps = { - 'calc_mode': ["events"], + 'calc_mode': "events", } # -- Initialize base class -- # super().__init__( diff --git a/pisa/stages/flux/barr_simple.py b/pisa/stages/flux/barr_simple.py index 19622ac4a..ebd3f8d1d 100644 --- a/pisa/stages/flux/barr_simple.py +++ b/pisa/stages/flux/barr_simple.py @@ -65,7 +65,7 @@ def __init__( ) # Implements no apply_function (implicit caching! FIXME) supported_reps = { - 'apply_mode': [None], + 'apply_mode': None, } # init base class super().__init__( diff --git a/pisa/stages/flux/hillasg.py b/pisa/stages/flux/hillasg.py index 7a77094ef..42d6ebf82 100644 --- a/pisa/stages/flux/hillasg.py +++ b/pisa/stages/flux/hillasg.py @@ -45,7 +45,7 @@ def __init__(self, **std_kwargs): ) # Implements no apply_function supported_reps = { - 'apply_mode': [None], + 'apply_mode': None, } # init base class super().__init__( diff --git a/pisa/stages/flux/honda_ip.py b/pisa/stages/flux/honda_ip.py index a57d5b480..b0ea296ef 100644 --- a/pisa/stages/flux/honda_ip.py +++ b/pisa/stages/flux/honda_ip.py @@ -50,7 +50,7 @@ def __init__( ) # Implements no apply_function supported_reps = { - 'apply_mode': [None], + 'apply_mode': None, } # init base class super().__init__( diff --git a/pisa/stages/flux/mceq_barr.py b/pisa/stages/flux/mceq_barr.py index 09888f850..ce6894a6b 100644 --- a/pisa/stages/flux/mceq_barr.py +++ b/pisa/stages/flux/mceq_barr.py @@ -188,7 +188,7 @@ def __init__( expected_container_keys.append('nubar_flux_nominal') # Implements no apply_function (implicit caching! FIXME) supported_reps = { - 'apply_mode': [None], + 'apply_mode': None, } # store args diff --git a/pisa/stages/flux/mceq_barr_red.py b/pisa/stages/flux/mceq_barr_red.py index 91d9312c0..9bed306c2 100644 --- a/pisa/stages/flux/mceq_barr_red.py +++ b/pisa/stages/flux/mceq_barr_red.py @@ -167,7 +167,7 @@ def __init__( ) # Implements no apply_function (implicit caching! FIXME) supported_reps = { - 'apply_mode': [None], + 'apply_mode': None, } # Using Honda for nominal flux. Keys should already exist diff --git a/pisa/stages/likelihood/generalized_llh_params.py b/pisa/stages/likelihood/generalized_llh_params.py index 82c610631..de2aee883 100644 --- a/pisa/stages/likelihood/generalized_llh_params.py +++ b/pisa/stages/likelihood/generalized_llh_params.py @@ -77,7 +77,7 @@ def __init__(self, ] # TODO: uses custom representations in setup_function supported_reps = { - 'apply_mode' : [MultiDimBinning] + 'apply_mode': MultiDimBinning } if not 'apply_mode' in std_kwargs: diff --git a/pisa/stages/osc/two_nu_osc.py b/pisa/stages/osc/two_nu_osc.py index 1a74bf3f8..ecb248388 100644 --- a/pisa/stages/osc/two_nu_osc.py +++ b/pisa/stages/osc/two_nu_osc.py @@ -54,7 +54,7 @@ def __init__(self, ) # Implements no setup_function+compute_function supported_reps = { - 'calc_mode': [None], + 'calc_mode': None, } # init base class super().__init__( diff --git a/pisa/stages/reco/resolutions.py b/pisa/stages/reco/resolutions.py index 0b48da064..82e63858d 100644 --- a/pisa/stages/reco/resolutions.py +++ b/pisa/stages/reco/resolutions.py @@ -58,9 +58,10 @@ def __init__( 'reco_coszen', 'pid', ) + # Implements no apply_function supported_reps = { - "calc_mode": ["events"], - "apply_mode": [None] + "calc_mode": "events", + "apply_mode": None } super().__init__( expected_params=expected_params, diff --git a/pisa/stages/reco/simple_param.py b/pisa/stages/reco/simple_param.py index 3c56f7e17..940868cf8 100644 --- a/pisa/stages/reco/simple_param.py +++ b/pisa/stages/reco/simple_param.py @@ -436,7 +436,7 @@ def __init__(self, ) # Implements no apply_function (TODO: does any calc_mode work?) supported_reps = { - 'apply_mode': [None], + 'apply_mode': None, } # init base class super().__init__( diff --git a/pisa/stages/utils/add_indices.py b/pisa/stages/utils/add_indices.py index 951d4e562..f778c9444 100644 --- a/pisa/stages/utils/add_indices.py +++ b/pisa/stages/utils/add_indices.py @@ -41,8 +41,8 @@ def __init__(self, ): # has no apply_function, but uses both in setup_function supported_reps = { - "calc_mode": ["events"], - "apply_mode": [MultiDimBinning], + "calc_mode": "events", + "apply_mode": MultiDimBinning, } # init base class super().__init__( diff --git a/pisa/stages/utils/adhoc_sys.py b/pisa/stages/utils/adhoc_sys.py index e3c141cdf..121f7f8b3 100644 --- a/pisa/stages/utils/adhoc_sys.py +++ b/pisa/stages/utils/adhoc_sys.py @@ -58,8 +58,8 @@ def __init__( 'weights', variable_name ] supported_reps = { - 'calc_mode': ['events'], - 'apply_mode': ['events'] + 'calc_mode': 'events', + 'apply_mode': 'events' } # init base class super().__init__( diff --git a/pisa/stages/utils/bootstrap.py b/pisa/stages/utils/bootstrap.py index a3210df81..ed37cd72a 100644 --- a/pisa/stages/utils/bootstrap.py +++ b/pisa/stages/utils/bootstrap.py @@ -62,7 +62,7 @@ def __init__( 'weights', ) supported_reps = { - 'calc_mode': ["events"], + 'calc_mode': "events", } # init base class super().__init__( diff --git a/pisa/stages/utils/kde.py b/pisa/stages/utils/kde.py index 669c82634..05078c454 100644 --- a/pisa/stages/utils/kde.py +++ b/pisa/stages/utils/kde.py @@ -89,8 +89,8 @@ def __init__( self.stashed_errors = None supported_reps = { - 'calc_mode': ['events'], - 'apply_mode': [MultiDimBinning], + 'calc_mode': 'events', + 'apply_mode': MultiDimBinning, } # init base class diff --git a/pisa/stages/utils/kfold.py b/pisa/stages/utils/kfold.py index 124686285..9a9e67173 100644 --- a/pisa/stages/utils/kfold.py +++ b/pisa/stages/utils/kfold.py @@ -74,7 +74,7 @@ def __init__( 'weights', ) supported_reps = { - 'calc_mode': ["events"], + 'calc_mode': "events", } # init base class super().__init__( diff --git a/pisa/stages/utils/set_variance.py b/pisa/stages/utils/set_variance.py index 59c60af0a..67cde3c90 100644 --- a/pisa/stages/utils/set_variance.py +++ b/pisa/stages/utils/set_variance.py @@ -33,10 +33,9 @@ def __init__( ): supported_reps = { - 'calc_mode': [MultiDimBinning], - 'apply_mode': [MultiDimBinning] + 'calc_mode': MultiDimBinning, + 'apply_mode': MultiDimBinning } - # init base class super().__init__( expected_params=(), diff --git a/pisa/stages/xsec/dis_sys.py b/pisa/stages/xsec/dis_sys.py index fe93fb05e..7a1259a16 100644 --- a/pisa/stages/xsec/dis_sys.py +++ b/pisa/stages/xsec/dis_sys.py @@ -75,7 +75,7 @@ def __init__( ) # explicitly sets "events" rep. in setup_function -> be transparent supported_reps = { - 'calc_mode': ["events"], + 'calc_mode': "events", } # init base class super().__init__( From f7735ebfcc02fea40cb8abde6b00470f6407ef06 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Sat, 25 Apr 2026 02:36:39 +0200 Subject: [PATCH 04/32] adapt all example pipeline configs and let Pipeline class accept their new configurations --- pisa/core/pipeline.py | 16 ++++++++++++---- .../settings/pipeline/IceCube_3y_data.cfg | 2 +- .../settings/pipeline/IceCube_3y_neutrinos.cfg | 5 ++--- .../pipeline/IceCube_3y_neutrinos_daemon.cfg | 2 +- .../resources/settings/pipeline/example.cfg | 4 ++-- .../resources/settings/pipeline/fast_example.cfg | 4 ++-- .../resources/settings/pipeline/osc_example.cfg | 4 ++-- .../settings/pipeline/varbin_example.cfg | 4 ++-- 8 files changed, 24 insertions(+), 17 deletions(-) diff --git a/pisa/core/pipeline.py b/pisa/core/pipeline.py index dd220a7f2..32a913027 100755 --- a/pisa/core/pipeline.py +++ b/pisa/core/pipeline.py @@ -701,13 +701,17 @@ def assert_apply_modes_consistency(self): if isinstance(s.apply_mode, MultiDimBinning) and ref_binning is None: ref_binning = s.apply_mode ref_name = f"{s.stage_name}.{s.service_name}" - if isinstance(self.output_binning, MultiDimBinning) and ref_binning != self.output_binning: + if (isinstance(self.output_binning, MultiDimBinning) and + ref_binning != self.output_binning): raise ValueError( f"Stage {ref_name} has '{s.apply_mode}' as apply_mode, which " f"deviates from the pipeline output binning {self.output_binning}. " "This configuration would result in an unreliable pipeline output." ) - elif ref_binning is not None and s.apply_mode != ref_binning: + elif (ref_binning is not None and s.apply_mode is not None and + s.apply_mode != ref_binning): + # TODO: In case apply_mode=None, check whether calc_mode == ref_binning? + # (see also TODO in assert_varbinning_compat). raise ValueError( f"Stage {s.stage_name}.{s.service_name} has '{s.apply_mode}'" " as apply_mode, which deviates from a previously detected " @@ -724,11 +728,15 @@ def assert_varbinning_compat(self): ------ ValueError if at least one stage has apply_mode!='events' - """ incompat = [] for s in self.stages: - if not s.apply_mode == 'events': + # TODO: Check below still allows pipeline setups with any calc_mode, + # even though we cannot prevent compute to produce the service's + # output in a binned representation. Is this all we can and should + # do in terms of validating the general setup? + if s.apply_mode is not None and s.apply_mode != 'events': + # not None: apply_function is implemented -> require 'events' incompat.append(s) if len(incompat) >= 1: str_incompat = ", ".join( diff --git a/pisa_examples/resources/settings/pipeline/IceCube_3y_data.cfg b/pisa_examples/resources/settings/pipeline/IceCube_3y_data.cfg index f1c44a704..17e5d5c62 100644 --- a/pisa_examples/resources/settings/pipeline/IceCube_3y_data.cfg +++ b/pisa_examples/resources/settings/pipeline/IceCube_3y_data.cfg @@ -23,5 +23,5 @@ output_key = weights events_file = events/IceCube_3y_oscillations/data.csv.bz2 +# apply_mode must be None calc_mode = events -apply_mode = dragon_datarelease \ No newline at end of file diff --git a/pisa_examples/resources/settings/pipeline/IceCube_3y_neutrinos.cfg b/pisa_examples/resources/settings/pipeline/IceCube_3y_neutrinos.cfg index f6fa5b46f..493d1fdc5 100644 --- a/pisa_examples/resources/settings/pipeline/IceCube_3y_neutrinos.cfg +++ b/pisa_examples/resources/settings/pipeline/IceCube_3y_neutrinos.cfg @@ -47,14 +47,13 @@ data_dict = {'true_energy':'true_energy', \ [flux.honda_ip] calc_mode = true_allsky_fine -apply_mode = events param.flux_table = flux/honda-2015-spl-solmin-aa.d [flux.barr_simple] +# apply_mode must be None calc_mode = true_allsky_fine -apply_mode = events # * nu/nubar ratio param.nu_nubar_ratio = 1.0 +/- 0.1 @@ -137,7 +136,7 @@ param.ih.deltam31.range = [-0.007, -0.001] * units.eV**2 [aeff.aeff] -calc_mode = events +# calc_mode must be None apply_mode = events param.livetime = 2.5 * units.common_year diff --git a/pisa_examples/resources/settings/pipeline/IceCube_3y_neutrinos_daemon.cfg b/pisa_examples/resources/settings/pipeline/IceCube_3y_neutrinos_daemon.cfg index 102088d61..c52132be4 100644 --- a/pisa_examples/resources/settings/pipeline/IceCube_3y_neutrinos_daemon.cfg +++ b/pisa_examples/resources/settings/pipeline/IceCube_3y_neutrinos_daemon.cfg @@ -203,7 +203,7 @@ param.ih.deltam31.range = [-0.007, -0.001] * units.eV**2 [aeff.aeff] -calc_mode = events +# calc_mode must be None apply_mode = events param.livetime = 2.5 * units.common_year diff --git a/pisa_examples/resources/settings/pipeline/example.cfg b/pisa_examples/resources/settings/pipeline/example.cfg index b5f7587ee..6bcd093ba 100644 --- a/pisa_examples/resources/settings/pipeline/example.cfg +++ b/pisa_examples/resources/settings/pipeline/example.cfg @@ -83,8 +83,8 @@ data_dict = { [flux.barr_simple] +# apply_mode must be None calc_mode = events -apply_mode = events # nu/nubar ratio param.nu_nubar_ratio = 1.0 +/- 0.1 @@ -212,7 +212,7 @@ param.ih.deltam31.range = [-0.007, -0.001] * units.eV**2 [aeff.aeff] -calc_mode = events +# calc_mode must be None apply_mode = events # Detector livetime this template should be weighted to represent diff --git a/pisa_examples/resources/settings/pipeline/fast_example.cfg b/pisa_examples/resources/settings/pipeline/fast_example.cfg index 68385ba7d..06c6d2e26 100644 --- a/pisa_examples/resources/settings/pipeline/fast_example.cfg +++ b/pisa_examples/resources/settings/pipeline/fast_example.cfg @@ -83,8 +83,8 @@ data_dict = { [flux.barr_simple] +# apply_mode must be None calc_mode = events -apply_mode = events # nu/nubar ratio param.nu_nubar_ratio = 1.0 +/- 0.1 @@ -212,7 +212,7 @@ param.ih.deltam31.range = [-0.007, -0.001] * units.eV**2 [aeff.aeff] -calc_mode = events +# calc_mode must be None apply_mode = events # Detector livetime this template should be weighted to represent diff --git a/pisa_examples/resources/settings/pipeline/osc_example.cfg b/pisa_examples/resources/settings/pipeline/osc_example.cfg index dbeab52ca..511821134 100644 --- a/pisa_examples/resources/settings/pipeline/osc_example.cfg +++ b/pisa_examples/resources/settings/pipeline/osc_example.cfg @@ -11,7 +11,7 @@ [pipeline] -# Define order of stages to be excecuted one after another, and specify the +# Define order of stages to be executed one after another, and specify the # service to use for each of them as stage1:serviceA, stage2:serviceB, ... name = neutrinos @@ -46,8 +46,8 @@ param.random = False [flux.barr_simple] +# apply_mode must be None calc_mode = calc_grid -apply_mode = calc_grid # nu/nubar ratio param.nu_nubar_ratio = 1.0 +/- 0.1 diff --git a/pisa_examples/resources/settings/pipeline/varbin_example.cfg b/pisa_examples/resources/settings/pipeline/varbin_example.cfg index af85d977d..3fcb07efb 100644 --- a/pisa_examples/resources/settings/pipeline/varbin_example.cfg +++ b/pisa_examples/resources/settings/pipeline/varbin_example.cfg @@ -43,8 +43,8 @@ data_dict = { [flux.barr_simple] +# apply_mode must be None calc_mode = events -apply_mode = events param.nu_nubar_ratio = 1.0 +/- 0.1 param.nu_nubar_ratio.fixed = True @@ -130,7 +130,7 @@ param.ih.deltam31.range = [-0.007, -0.001] * units.eV**2 [aeff.aeff] -calc_mode = events +# calc_mode must be None apply_mode = events param.livetime = 2.5 * units.common_year From 5643a6ba219bb3a4ae5794a94a5371fbd5031641 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Sat, 25 Apr 2026 03:01:40 +0200 Subject: [PATCH 05/32] few small doc fixes --- pisa/stages/flux/astrophysical.py | 2 +- pisa/stages/osc/globes.py | 1 + pisa/stages/osc/prob3.py | 15 +++++---------- pisa/stages/osc/two_nu_osc.py | 2 +- pisa/stages/xsec/correct_charm_y.py | 4 ++-- pisa/stages/xsec/dis_sys.py | 1 + pisa/stages/xsec/nutau_xsec.py | 7 ++++--- 7 files changed, 15 insertions(+), 17 deletions(-) diff --git a/pisa/stages/flux/astrophysical.py b/pisa/stages/flux/astrophysical.py index ebd496b3d..6603d9bef 100644 --- a/pisa/stages/flux/astrophysical.py +++ b/pisa/stages/flux/astrophysical.py @@ -29,8 +29,8 @@ class astrophysical(Stage): # pylint: disable=invalid-name ----- Expected container keys are:: - "true_energy", "true_coszen", "initial_weights" + "true_energy", "true_coszen", "initial_weights" TODO: flavor ratio as a parameter? Save for later. """ diff --git a/pisa/stages/osc/globes.py b/pisa/stages/osc/globes.py index 07b5549b2..2e3a88ead 100644 --- a/pisa/stages/osc/globes.py +++ b/pisa/stages/osc/globes.py @@ -61,6 +61,7 @@ class globes(Stage): # pylint: disable=invalid-name ----- Expected container keys are:: + "true_energy", "true_coszen", "nubar", "flav", "nu_flux", "weights" """ diff --git a/pisa/stages/osc/prob3.py b/pisa/stages/osc/prob3.py index 05246111a..71f54c2a8 100644 --- a/pisa/stages/osc/prob3.py +++ b/pisa/stages/osc/prob3.py @@ -38,13 +38,9 @@ class prob3(Stage): # pylint: disable=invalid-name r""" Extended Prob3-like oscillations class. - Expected container keys are: - "true_energy", - "true_coszen", - "nubar", - "flav", - "nu_flux", - "weights" + Expected container keys are:: + + "true_energy", "true_coszen", "nubar", "flav", "nu_flux", "weights" Parameters ---------- @@ -125,8 +121,8 @@ class prob3(Stage): # pylint: disable=invalid-name one. See e.g. https://inspirehep.net/literature/2658147 (JHEP 08(2023)101) for such an analysis in the literature. - params - expected params are .. :: + params : ParamSet + Must have parameters:: detector_depth : float earth_model : PREM file path @@ -166,7 +162,6 @@ class prob3(Stage): # pylint: disable=invalid-name **std_kwargs Other kwargs are handled by Stage - """ def __init__( diff --git a/pisa/stages/osc/two_nu_osc.py b/pisa/stages/osc/two_nu_osc.py index ecb248388..99e6fba68 100644 --- a/pisa/stages/osc/two_nu_osc.py +++ b/pisa/stages/osc/two_nu_osc.py @@ -34,7 +34,7 @@ class two_nu_osc(Stage): # pylint: disable=invalid-name "true_energy", "true_coszen", "nu_flux", "weights" - For two-neutrino model, there is only one mass-splitting term + For two-neutrino model, there is only one mass-splitting term. Atmospheric mixing angle is approximated by theta (sin^2(2*theta)) """ diff --git a/pisa/stages/xsec/correct_charm_y.py b/pisa/stages/xsec/correct_charm_y.py index 52b26adc1..d9239f7de 100644 --- a/pisa/stages/xsec/correct_charm_y.py +++ b/pisa/stages/xsec/correct_charm_y.py @@ -26,8 +26,8 @@ class correct_charm_y(Stage): nubar_cc_container_keys : list of strings list of all anti-neutrino charged current container keys - Notes: - ------ + Notes + ----- THIS STAGE IS FOR MC TESTING ONLY - do *NOT* use in real analysis!!! Expected container keys are:: diff --git a/pisa/stages/xsec/dis_sys.py b/pisa/stages/xsec/dis_sys.py index 7a1259a16..e770d6b0a 100644 --- a/pisa/stages/xsec/dis_sys.py +++ b/pisa/stages/xsec/dis_sys.py @@ -37,6 +37,7 @@ class dis_sys(Stage): # pylint: disable=invalid-name params : ParamSet Must have parameters:: + dis_csms : quantity (dimensionless) [if combine_components=True] or dis_csms_tot, dis_csms_diff : quantity (dimensionless) [if combine_components=False] diff --git a/pisa/stages/xsec/nutau_xsec.py b/pisa/stages/xsec/nutau_xsec.py index 1bbac57ae..5615be29f 100644 --- a/pisa/stages/xsec/nutau_xsec.py +++ b/pisa/stages/xsec/nutau_xsec.py @@ -1,9 +1,9 @@ """ A stage to apply nutau cross-section uncertainties as implemented in -https://github.com/marialiubarska/nutau_xsec +https://github.com/marialiubarska/nutau_xsec. It interpolates between different nutau CC cross section models as compared in this paper: -https://arxiv.org/pdf/1008.2984.pdf?fname=cm&font=TypeI +https://arxiv.org/pdf/1008.2984.pdf """ import pickle @@ -27,7 +27,7 @@ class nutau_xsec(Stage): # pylint: disable=invalid-name Parameters ---------- - xsec_file : (string) + xsec_file : string Path to pickled interpolated function. Default is included in PISA in `pisa_examples/resources/cross_sections/interp_nutau_xsec_protocol2.pckl` @@ -42,6 +42,7 @@ class nutau_xsec(Stage): # pylint: disable=invalid-name ----- Expected container keys are:: + "true_energy", "weights" """ From 9ef0965b16d0144951057f3aeea05eabf1b03cdc Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Wed, 29 Apr 2026 19:11:52 +0200 Subject: [PATCH 06/32] these shouldn't have been there --- pisa/stages/flux/barr_simple_backup.py | 293 ------------------ .../flux/distribution_maker_outputs.json.bz2 | Bin 27021 -> 0 bytes 2 files changed, 293 deletions(-) delete mode 100644 pisa/stages/flux/barr_simple_backup.py delete mode 100644 pisa/stages/flux/distribution_maker_outputs.json.bz2 diff --git a/pisa/stages/flux/barr_simple_backup.py b/pisa/stages/flux/barr_simple_backup.py deleted file mode 100644 index ec4920702..000000000 --- a/pisa/stages/flux/barr_simple_backup.py +++ /dev/null @@ -1,293 +0,0 @@ -""" -Stage to implement the old PISA/oscfit flux systematics -""" - -from __future__ import absolute_import, print_function, division - -import math - -import numpy as np -from numba import guvectorize, cuda, jit, njit, void - -from pisa import FTYPE, TARGET -from pisa.core.param import Param, ParamSet -from pisa.core.stage import Stage -from pisa.utils.profiler import profile -from pisa.utils.numba_tools import myjit, myjit_2, ftype, FX, IX -from pisa.utils.barr_parameterization import modRatioNuBar, modRatioUpHor - -__all__ = ['barr_simple', 'apply_ratio_scale', 'spectral_index_scale', - 'apply_sys_kernel', 'apply_sys_vectorized', 'init_test'] - - -class barr_simple(Stage): # pylint: disable=invalid-name - """ - stage to apply Barr style flux uncertainties - uses parameterisations of plots from Barr 2006 paper - - Parameters - ---------- - params - Expected params are .. :: - - nue_numu_ratio : quantity (dimensionless) - nu_nubar_ratio : quantity (dimensionless) - delta_index : quantity (dimensionless) - Barr_uphor_ratio : quantity (dimensionless) - Barr_nu_nubar_ratio : quantity (dimensionless) - - Expected container keys are .. :: - - "true_energy" - "true_coszen" - "nu_flux_nominal" - "nubar_flux_nominal" - "nubar" - - """ - def __init__( - self, - **std_kwargs, - ): - expected_params = ( - "nue_numu_ratio", - "nu_nubar_ratio", - "delta_index", - "Barr_uphor_ratio", - "Barr_nu_nubar_ratio", - ) - - expected_container_keys = ( - "true_energy", - "true_coszen", - "nu_flux_nominal", - "nubar_flux_nominal", - "nubar" - ) - - # init base class - super().__init__( - expected_params=expected_params, - expected_container_keys=expected_container_keys, - **std_kwargs, - ) - - def setup_function(self): - self.data.representation = self.calc_mode - for container in self.data: - container["nu_flux"] = np.empty((container.size, 2), dtype=FTYPE) - - @profile - def compute_function(self): - self.data.representation = self.calc_mode - - # If a parameter below has not been modified by minimizer, - # its magnitude below will be a native float, otherwise np.float64, - # so convert to expected FTYPE - nue_numu_ratio = FTYPE(self.params.nue_numu_ratio.value.m_as("dimensionless")) - nu_nubar_ratio = FTYPE(self.params.nu_nubar_ratio.value.m_as("dimensionless")) - delta_index = FTYPE(self.params.delta_index.value.m_as("dimensionless")) - Barr_uphor_ratio = FTYPE(self.params.Barr_uphor_ratio.value.m_as("dimensionless")) - Barr_nu_nubar_ratio = FTYPE(self.params.Barr_nu_nubar_ratio.value.m_as("dimensionless")) - - for container in self.data: - apply_sys_vectorized( - container["true_energy"], - container["true_coszen"], - container["nu_flux_nominal"], - container["nubar_flux_nominal"], - container["nubar"], - nue_numu_ratio, - nu_nubar_ratio, - delta_index, - Barr_uphor_ratio, - Barr_nu_nubar_ratio, - out=container["nu_flux"], - ) - container.mark_changed('nu_flux') - - -#@njit(f"void({FX}, b1, {FX}, {FX}, {FX}[:])", inline='always') -@myjit_2(f"void({FX}, b1, {FX}, {FX}, {FX}[:])", inline="always") -def apply_ratio_scale(ratio_scale, sum_constant, in1, in2, out): - """ apply ratio scale to flux values - - Parameters - ---------- - ratio_scale : float - - sum_constant : bool - if Ture, then the sum of the new flux will be identical to the old flux - - in1 : float - - in2 : float - - out : array - - """ - if in1 == 0. and in2 == 0.: - out[0] = 0. - out[1] = 0. - return - - flag = 1 if sum_constant else 0 - - # when sum_constant = True - # just a single division operation - single_denom = in2 + ratio_scale * in1 - inv_denom = 1.0 / single_denom - - orig_sum = in1 + in2 - new = orig_sum * inv_denom - out0 = ratio_scale * in1 * new - out1 = new - - # sum_constant = False - out0_sum_not_const = ratio_scale * in1 - out1_sum_not_const = in2 - - # finally assign - out[0] = (1 - flag) * out0_sum_not_const + flag * out0 - out[1] = (1 - flag) * out1_sum_not_const + flag * out1 - - -@myjit -def spectral_index_scale(true_energy, egy_pivot, delta_index): - """ calculate spectral index scale """ - return math.pow((true_energy / egy_pivot), delta_index) - - -@myjit -def apply_sys_kernel( - true_energy, - true_coszen, - nu_flux_nominal, - nubar_flux_nominal, - nubar, - nue_numu_ratio, - nu_nubar_ratio, - delta_index, - Barr_uphor_ratio, - Barr_nu_nubar_ratio, - out, -): - # nue/numu ratio - new_nu_flux = cuda.local.array(shape=(2), dtype=ftype) - new_nubar_flux = cuda.local.array(2, dtype=ftype) - apply_ratio_scale( - nue_numu_ratio, True, nu_flux_nominal[0], nu_flux_nominal[1], new_nu_flux - ) - apply_ratio_scale( - nue_numu_ratio, - True, - nubar_flux_nominal[0], - nubar_flux_nominal[1], - new_nubar_flux, - ) - - # apply flux systematics - # spectral idx - idx_scale = spectral_index_scale(true_energy, 24.0900951261, delta_index) - new_nu_flux[0] *= idx_scale - new_nu_flux[1] *= idx_scale - new_nubar_flux[0] *= idx_scale - new_nubar_flux[1] *= idx_scale - - # nu/nubar ratio - new_nue_flux = cuda.local.array(2, dtype=ftype) - new_numu_flux = cuda.local.array(2, dtype=ftype) - apply_ratio_scale( - nu_nubar_ratio, True, new_nu_flux[0], new_nubar_flux[0], new_nue_flux - ) - apply_ratio_scale( - nu_nubar_ratio, True, new_nu_flux[1], new_nubar_flux[1], new_numu_flux - ) - if nubar < 0: - out[0] = new_nue_flux[1] - out[1] = new_numu_flux[1] - else: - out[0] = new_nue_flux[0] - out[1] = new_numu_flux[0] - - # Barr flux - out[0] *= modRatioNuBar(nubar, 0, true_energy, true_coszen, Barr_nu_nubar_ratio) - out[1] *= modRatioNuBar(nubar, 1, true_energy, true_coszen, Barr_nu_nubar_ratio) - - out[0] *= modRatioUpHor(0, true_energy, true_coszen, Barr_uphor_ratio) - out[1] *= modRatioUpHor(1, true_energy, true_coszen, Barr_uphor_ratio) - - -@guvectorize([f"({FX}, {FX}, {FX}[:], {FX}[:], {IX}, {FX}, {FX}, {FX}, {FX}, {FX}, {FX}[:])"], "(),(),(d),(d),(),(),(),(),(),()->(d)", target=TARGET) -def apply_sys_vectorized( - true_energy, - true_coszen, - nu_flux_nominal, - nubar_flux_nominal, - nubar, - nue_numu_ratio, - nu_nubar_ratio, - delta_index, - Barr_uphor_ratio, - Barr_nu_nubar_ratio, - out, -): - # nue/numu ratio - new_nu_flux = np.empty(shape=(2), dtype=ftype) - new_nubar_flux = np.empty(2, dtype=ftype) - apply_ratio_scale( - nue_numu_ratio, True, nu_flux_nominal[0], nu_flux_nominal[1], new_nu_flux - ) - apply_ratio_scale( - nue_numu_ratio, - True, - nubar_flux_nominal[0], - nubar_flux_nominal[1], - new_nubar_flux, - ) - - # apply flux systematics - # spectral idx - #idx_scale = spectral_index_scale(true_energy, 24.0900951261, delta_index) - energy_pivot = 24.0900951261 - idx_scale = math.exp(delta_index * math.log(true_energy / energy_pivot)) - new_nu_flux[0] *= idx_scale - new_nu_flux[1] *= idx_scale - new_nubar_flux[0] *= idx_scale - new_nubar_flux[1] *= idx_scale - - # nu/nubar ratio - new_nue_flux = np.empty(2, dtype=ftype) - new_numu_flux = np.empty(2, dtype=ftype) - apply_ratio_scale( - nu_nubar_ratio, True, new_nu_flux[0], new_nubar_flux[0], new_nue_flux - ) - apply_ratio_scale( - nu_nubar_ratio, True, new_nu_flux[1], new_nubar_flux[1], new_numu_flux - ) - if nubar < 0: - out[0] = new_nue_flux[1] - out[1] = new_numu_flux[1] - else: - out[0] = new_nue_flux[0] - out[1] = new_numu_flux[0] - - # Barr flux - out[0] *= modRatioNuBar(nubar, 0, true_energy, true_coszen, Barr_nu_nubar_ratio) - out[1] *= modRatioNuBar(nubar, 1, true_energy, true_coszen, Barr_nu_nubar_ratio) - - out[0] *= modRatioUpHor(0, true_energy, true_coszen, Barr_uphor_ratio) - out[1] *= modRatioUpHor(1, true_energy, true_coszen, Barr_uphor_ratio) - - -def init_test(**param_kwargs): - """Instantiation example""" - param_set = ParamSet([ - Param(name="nue_numu_ratio", value=1.0, **param_kwargs), - Param(name="nu_nubar_ratio", value=1.0, **param_kwargs), - Param(name="delta_index", value=0.0, **param_kwargs), - Param(name="Barr_uphor_ratio", value=0.0, **param_kwargs), - Param(name="Barr_nu_nubar_ratio", value=0.0, **param_kwargs) - ]) - - return barr_simple(params=param_set) diff --git a/pisa/stages/flux/distribution_maker_outputs.json.bz2 b/pisa/stages/flux/distribution_maker_outputs.json.bz2 deleted file mode 100644 index 133eefbeb84a414423931b081662bfde3dfe5204..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27021 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 From 41311aeee9743854a1f379e931360dc78171d190 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Wed, 29 Apr 2026 21:57:53 +0200 Subject: [PATCH 07/32] adapt test_Pipeline() function --- pisa/core/pipeline.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/pisa/core/pipeline.py b/pisa/core/pipeline.py index 32a913027..c88c046ea 100755 --- a/pisa/core/pipeline.py +++ b/pisa/core/pipeline.py @@ -42,7 +42,7 @@ __author__ = "J.L. Lanfranchi, P. Eller" -__license__ = """Copyright (c) 2014-2025, The IceCube Collaboration +__license__ = """Copyright (c) 2014-2026, The IceCube Collaboration Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -898,12 +898,13 @@ def test_Pipeline(): # binned_apply_mode = pipeline.output_binning assert isinstance(binned_apply_mode, MultiDimBinning) - pipeline.stages[1].apply_mode = binned_apply_mode + # osc.prob3 apply_mode: + pipeline.stages[2].apply_mode = binned_apply_mode try: out = pipeline.get_outputs() except ValueError: - # Needs to fail: going from a binned output (after flux) to events - # (after osc.) + # Needs to fail: going from a binned output (after osc.) to events + # (after aeff) pass else: assert False @@ -911,7 +912,8 @@ def test_Pipeline(): # # Test: passing a custom output binning to get_outputs # - pipeline.stages[1].apply_mode = "events" + # reset apply mode + pipeline.stages[2].apply_mode = "events" # first get the original event distribution as reference out = pipeline.get_outputs() counts_tot = sum(out.num_entries.values()) @@ -928,7 +930,7 @@ def test_Pipeline(): # a split into two event selections has to result in two MapSets assert len(out) == 2 # a binned apply_mode has to result in a ValueError - # first get a pre-existing binning + # first get a pre-existing binning (set calc_mode of osc.prob3 as apply_mode) binned_calc_mode = p.stages[2].calc_mode assert isinstance(binned_calc_mode, MultiDimBinning) p.stages[2].apply_mode = binned_calc_mode From 7aa6365be22f05649efaba243cd0469152a48b83 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Fri, 15 May 2026 19:06:01 +0200 Subject: [PATCH 08/32] fix bug that allowed running pipeline with invalid (None) stage modes --- pisa/core/pipeline.py | 29 ++++++++++++++++++++++++++++- pisa/core/stage.py | 27 +++++++++++++++++++-------- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/pisa/core/pipeline.py b/pisa/core/pipeline.py index dd220a7f2..f7c19a553 100755 --- a/pisa/core/pipeline.py +++ b/pisa/core/pipeline.py @@ -899,11 +899,38 @@ def test_Pipeline(): pass else: assert False + # reset apply_mode + pipeline.stages[1].apply_mode = "events" + + # + # Test: prevent computing outputs with representations deviating + # from supported ones in simple_data_loader + # First, setter mustn't accept apply_mode = None when it was != None + try: + pipeline.stages[0].apply_mode = None + except ValueError: + pass + else: + assert False + # now we initialise with simple_data_loader apply_mode set to None (has to work) + config = parse_pipeline_config("settings/pipeline/example.cfg") + config[list(config.keys())[1]]['apply_mode'] = None + invalid_pipeline = Pipeline(config) + # try to get outputs: has to fail, as apply_mode = None not supported by + # simple_data_loader + try: + _ = invalid_pipeline.get_outputs() + except ValueError: + pass + else: + assert False + # need to be able to set from None -> "events" and then get outputs + invalid_pipeline.stages[0].apply_mode = "events" + _ = invalid_pipeline.get_outputs() # # Test: passing a custom output binning to get_outputs # - pipeline.stages[1].apply_mode = "events" # first get the original event distribution as reference out = pipeline.get_outputs() counts_tot = sum(out.num_entries.values()) diff --git a/pisa/core/stage.py b/pisa/core/stage.py index 9988e00d0..c504a2eb8 100644 --- a/pisa/core/stage.py +++ b/pisa/core/stage.py @@ -157,10 +157,10 @@ def __init__( supported_reps['apply_mode'] = list(Container.array_representations) + [MultiDimBinning] self.supported_reps = supported_reps - self._check_representation(rep=calc_mode, mode='calc_mode', allow_None=True) + self._check_representation(rep=calc_mode, mode='calc_mode', always_allow_none=True) self._calc_mode = calc_mode - self._check_representation(rep=apply_mode, mode='apply_mode', allow_None=True) + self._check_representation(rep=apply_mode, mode='apply_mode', always_allow_none=True) self._apply_mode = apply_mode self._error_method = error_method @@ -274,7 +274,8 @@ def calc_mode(self, value): in standalone mode, rerun `setup()` if has already been executed at least once.""" if value != self.calc_mode: - self._check_representation(rep=value, mode='calc_mode') + self._check_representation(rep=value, mode='calc_mode', + always_allow_none=False) self._calc_mode = value if self.in_standalone_mode and self.param_hash is not None: # Only in standalone mode: repeat setup automatically only if @@ -308,14 +309,15 @@ def apply_mode(self): def apply_mode(self, value): """Set `apply_mode` after checking the validity of `value`""" if value != self.apply_mode: - self._check_representation(rep=value, mode='apply_mode') + self._check_representation(rep=value, mode='apply_mode', + always_allow_none=False) self._apply_mode = value - def _check_representation(self, rep, mode, allow_None=False): + def _check_representation(self, rep, mode, always_allow_none=False): if rep is None: - # allow_None is used to always allow None in the init of a stage. - # Should be removed once stages explicitely set modes. - if None not in self.supported_reps[mode] and not allow_None: + # `always_allow_none` is used to always allow None in the init of a stage + # (allows writing init_test functions that don't already decide on modes) + if None not in self.supported_reps[mode] and not always_allow_none: raise ValueError( f"{mode} {rep} is not supported by {self.stage_name}" f".{self.service_name}" @@ -465,6 +467,9 @@ def setup(self): self._check_exp_keys_in_data(error_on_missing=False) + # check that current calc_mode is compatible with supported reps. at all + self._check_representation(rep=self.calc_mode, mode='calc_mode', + always_allow_none=False) if self.calc_mode is not None: self.data.representation = self.calc_mode @@ -492,6 +497,9 @@ def compute(self): logging.trace("cached output") return + # be overly cautious and check consistency of current calc_mode + self._check_representation(rep=self.calc_mode, mode='calc_mode', + always_allow_none=False) if self.calc_mode is not None: self.data.representation = self.calc_mode @@ -510,6 +518,9 @@ def compute_function(self): def apply(self): + # be overly cautious and check consistency of current apply_mode + self._check_representation(rep=self.apply_mode, mode='apply_mode', + always_allow_none=False) if self.apply_mode is not None: self.data.representation = self.apply_mode From 138f0847d5990ef9764068edb17abc2ee56bdece Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Fri, 15 May 2026 19:46:54 +0200 Subject: [PATCH 09/32] minor fixes --- pisa/core/pipeline.py | 6 ++---- pisa/stages/data/csv_loader.py | 8 ++------ .../resources/settings/pipeline/IceCube_3y_neutrinos.cfg | 1 + 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/pisa/core/pipeline.py b/pisa/core/pipeline.py index eac2aefe8..e97b3e10f 100755 --- a/pisa/core/pipeline.py +++ b/pisa/core/pipeline.py @@ -908,8 +908,8 @@ def test_Pipeline(): pass else: assert False - # reset apply_mode - pipeline.stages[1].apply_mode = "events" + # reset apply mode + pipeline.stages[2].apply_mode = "events" # # Test: prevent computing outputs with representations deviating @@ -940,8 +940,6 @@ def test_Pipeline(): # # Test: passing a custom output binning to get_outputs # - # reset apply mode - pipeline.stages[2].apply_mode = "events" # first get the original event distribution as reference out = pipeline.get_outputs() counts_tot = sum(out.num_entries.values()) diff --git a/pisa/stages/data/csv_loader.py b/pisa/stages/data/csv_loader.py index 9987f63fc..00e028b28 100644 --- a/pisa/stages/data/csv_loader.py +++ b/pisa/stages/data/csv_loader.py @@ -92,10 +92,9 @@ def __init__( self.dis_idx = None self.scale_aeff = scale_aeff - # apply_function sets representation to "events", so only accept that - # to be transparent (TODO: any calc_mode fine?) supported_reps = { - 'apply_mode': "events", + "calc_mode": "events", + "apply_mode": "events", } # init base class super().__init__( @@ -167,9 +166,6 @@ def setup_function(self): ) def apply_function(self): - # reset data representation to events - self.data.representation = "events" - # reset weights to initial weights prior to downstream stages running for container in self.data: container['weights'] = np.copy(container['initial_weights']) diff --git a/pisa_examples/resources/settings/pipeline/IceCube_3y_neutrinos.cfg b/pisa_examples/resources/settings/pipeline/IceCube_3y_neutrinos.cfg index 493d1fdc5..286c248a3 100644 --- a/pisa_examples/resources/settings/pipeline/IceCube_3y_neutrinos.cfg +++ b/pisa_examples/resources/settings/pipeline/IceCube_3y_neutrinos.cfg @@ -31,6 +31,7 @@ output_key = weights, errors [data.csv_loader] +calc_mode = events apply_mode = events output_names = nue_cc, numu_cc, nutau_cc, nue_nc, numu_nc, nutau_nc, nuebar_cc, numubar_cc, nutaubar_cc, nuebar_nc, numubar_nc, nutaubar_nc From 70b0ad9c9111cdf1ea458335456e7ce1e181c585 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Sun, 24 May 2026 01:12:33 +0200 Subject: [PATCH 10/32] new Stage attributes (has_setup, has_compute, has_apply) indicating overriding of abstract base methods --- pisa/core/pipeline.py | 4 +--- pisa/core/stage.py | 7 +++++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/pisa/core/pipeline.py b/pisa/core/pipeline.py index e97b3e10f..8f2bb9224 100755 --- a/pisa/core/pipeline.py +++ b/pisa/core/pipeline.py @@ -143,9 +143,7 @@ def tabulate(self, tablefmt="plain"): table = [] for i, s in enumerate(self.stages): table.append([i, s.__class__.__name__, s.calc_mode, s.apply_mode]) - table[-1].append(s.setup_function.__func__.__module__ == s.__class__.__module__) - table[-1].append(s.compute_function.__func__.__module__ == s.__class__.__module__) - table[-1].append(s.apply_function.__func__.__module__ == s.__class__.__module__) + table[-1] += [s.has_setup, s.has_compute, s.has_apply] table[-1] += [len(s.params.fixed), len(s.params.free)] return tabulate(table, headers, tablefmt=tablefmt, colalign=colalign) diff --git a/pisa/core/stage.py b/pisa/core/stage.py index 320d55c49..6a32af9ea 100644 --- a/pisa/core/stage.py +++ b/pisa/core/stage.py @@ -190,6 +190,13 @@ def __init__( """Data based on which stage may make computations and which it may modify""" + self.has_setup = type(self).setup_function is not Stage.setup_function + """Whether subclass overrides :py:meth:`setup_function`""" + self.has_compute = type(self).compute_function is not Stage.compute_function + """Whether subclass overrides :py:meth:`compute_function`""" + self.has_apply = type(self).apply_function is not Stage.apply_function + """Whether subclass overrides :py:meth:`apply_function`""" + def __repr__(self): return 'Stage "%s"'%(self.__class__.__name__) From f71437e354405401d047897ff86a1012c80455ae Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Sun, 24 May 2026 02:13:50 +0200 Subject: [PATCH 11/32] use new Stage attributes to set supported reps. for given Stage mode by default, unless already set by subclass --- pisa/core/stage.py | 40 ++++++++++++++----- .../pipeline/IceCube_3y_neutrinos_daemon.cfg | 1 - 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/pisa/core/stage.py b/pisa/core/stage.py index 6a32af9ea..a9142117b 100644 --- a/pisa/core/stage.py +++ b/pisa/core/stage.py @@ -148,22 +148,47 @@ def __init__( else: self._debug_mode = None + self.has_setup = type(self).setup_function is not Stage.setup_function + """Whether subclass overrides :py:meth:`setup_function`""" + self.has_compute = type(self).compute_function is not Stage.compute_function + """Whether subclass overrides :py:meth:`compute_function`""" + self.has_apply = type(self).apply_function is not Stage.apply_function + """Whether subclass overrides :py:meth:`apply_function`""" + + # Subclass might not have set supported_reps attribute if supported_reps is None: supported_reps = {} assert isinstance(supported_reps, Mapping) - for mode_str in ['calc_mode', 'apply_mode']: + mode_keys = ('calc_mode', 'apply_mode') + assert set(supported_reps.keys()).issubset(mode_keys) + # Default configuration of supported representations, using information + # about overridden methods, unless subclass already defined them + # (don't question the values chosen by the subclass) + for mode_str in mode_keys: if mode_str not in supported_reps: - # reps for this mode not yet defined -> allow all - supported_reps[mode_str] = list(Container.array_representations) + [MultiDimBinning] + # Reps. for this mode not yet defined -> use information about + # overridden methods + mode_allowed = ( + self.has_setup or self.has_compute if mode_str == 'calc_mode' + else self.has_apply + ) + # either allow all representations or require setting mode to None + supported_reps[mode_str] = ( + list(Container.array_representations) + [MultiDimBinning] + if mode_allowed else [None] + ) else: - # reps for this mode already defined -> listify + # Reps. for this mode defined by subclass -> listify if needed if (isinstance(supported_reps[mode_str], str) or not isinstance(supported_reps[mode_str], Sequence)): supported_reps[mode_str] = [supported_reps[mode_str]] self.supported_reps = supported_reps + """Dictionary of supported representations. Override in subclass if desired.""" + # Check consistency of requested modes, allowing None in any case + # (inconsequential while we're only at initialisation) self._check_representation(rep=calc_mode, mode='calc_mode', always_allow_none=True) self._calc_mode = calc_mode @@ -190,13 +215,6 @@ def __init__( """Data based on which stage may make computations and which it may modify""" - self.has_setup = type(self).setup_function is not Stage.setup_function - """Whether subclass overrides :py:meth:`setup_function`""" - self.has_compute = type(self).compute_function is not Stage.compute_function - """Whether subclass overrides :py:meth:`compute_function`""" - self.has_apply = type(self).apply_function is not Stage.apply_function - """Whether subclass overrides :py:meth:`apply_function`""" - def __repr__(self): return 'Stage "%s"'%(self.__class__.__name__) diff --git a/pisa_examples/resources/settings/pipeline/IceCube_3y_neutrinos_daemon.cfg b/pisa_examples/resources/settings/pipeline/IceCube_3y_neutrinos_daemon.cfg index c52132be4..6d471fcc0 100644 --- a/pisa_examples/resources/settings/pipeline/IceCube_3y_neutrinos_daemon.cfg +++ b/pisa_examples/resources/settings/pipeline/IceCube_3y_neutrinos_daemon.cfg @@ -48,7 +48,6 @@ data_dict = {'true_energy':'true_energy', \ [flux.daemon_flux] calc_mode = events -apply_mode = events param.daemon_K_158G = 0.0 +/- 1.0 param.daemon_K_158G.fixed = False From 0e636822994feba1ec741120df1f24b53cfc2e4f Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Sun, 24 May 2026 14:55:59 +0200 Subject: [PATCH 12/32] remove explicit definition of supported_reps where not necessary any longer; add docstring note about absence of setup+compute/apply instead --- pisa/stages/absorption/earth_absorption.py | 10 +- pisa/stages/aeff/aeff.py | 6 +- pisa/stages/aeff/param.py | 6 +- pisa/stages/aeff/weight.py | 6 +- pisa/stages/aeff/weight_hnl.py | 6 +- pisa/stages/background/atm_muons.py | 2 - pisa/stages/cont_sys/snowstorm_hist.py | 3 +- pisa/stages/data/csv_data_hist.py | 9 +- pisa/stages/data/licloader_weighter.py | 2 + pisa/stages/data/simple_data_loader.py | 1 + pisa/stages/flux/barr_simple.py | 6 +- pisa/stages/flux/barr_simple_bckup.py | 293 +++++++++++++++++++++ pisa/stages/flux/daemon_flux.py | 8 +- pisa/stages/flux/hillasg.py | 6 +- pisa/stages/flux/honda_ip.py | 6 +- pisa/stages/flux/mceq_barr.py | 6 +- pisa/stages/flux/mceq_barr_red.py | 6 +- pisa/stages/osc/two_nu_osc.py | 6 +- pisa/stages/reco/resolutions.py | 3 +- pisa/stages/reco/simple_param.py | 7 +- pisa/stages/utils/hist.py | 1 + 21 files changed, 327 insertions(+), 72 deletions(-) create mode 100644 pisa/stages/flux/barr_simple_bckup.py diff --git a/pisa/stages/absorption/earth_absorption.py b/pisa/stages/absorption/earth_absorption.py index 22995d89b..ed0ab1390 100644 --- a/pisa/stages/absorption/earth_absorption.py +++ b/pisa/stages/absorption/earth_absorption.py @@ -1,5 +1,5 @@ """ -PISA pi stage for the calculation of earth layers and survival probabilities. +Stage for the calculation of earth layers and survival probabilities. The stage calculates first the depth of a water column that is mass-equivalent to the path traversed by the neutrino through the earth. This is done @@ -53,7 +53,7 @@ class earth_absorption(Stage): # pylint: disable=invalid-name """ - earth absorption PISA Pi class + earth absorption stage Parameters ---------- @@ -66,6 +66,12 @@ class earth_absorption(Stage): # pylint: disable=invalid-name prop_height : quantity (distance), optional height of neutrino production in the atmosphere + Notes + ----- + + Expected container keys are:: + + "true_coszen", "true_energy", "flav", "nubar", "weights" """ def __init__( self, diff --git a/pisa/stages/aeff/aeff.py b/pisa/stages/aeff/aeff.py index 255c94e9b..db29a4ac3 100644 --- a/pisa/stages/aeff/aeff.py +++ b/pisa/stages/aeff/aeff.py @@ -35,6 +35,7 @@ class aeff(Stage): # pylint: disable=invalid-name Notes ----- + Implements neither setup nor compute. Expected container keys are:: @@ -56,15 +57,10 @@ def __init__( 'weights', 'weighted_aeff', ) - # Implements no setup_function+compute_function - supported_reps = { - 'calc_mode': None, - } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, - supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/aeff/param.py b/pisa/stages/aeff/param.py index 8e3901115..153def752 100644 --- a/pisa/stages/aeff/param.py +++ b/pisa/stages/aeff/param.py @@ -146,6 +146,7 @@ class param(Stage): # pylint: disable=invalid-name Notes ----- + Implements neither setup nor compute. Expected container keys are:: @@ -167,15 +168,10 @@ def __init__( 'true_coszen', 'weights', ) - # Implements no setup_function+compute_function - supported_reps = { - 'calc_mode': None, - } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, - supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/aeff/weight.py b/pisa/stages/aeff/weight.py index 7309199a5..f1ef61343 100644 --- a/pisa/stages/aeff/weight.py +++ b/pisa/stages/aeff/weight.py @@ -29,6 +29,7 @@ class weight(Stage): # pylint: disable=invalid-name Notes ----- + Implements neither setup nor compute. Expected container keys are:: @@ -45,15 +46,10 @@ def __init__( expected_container_keys = ( 'weights', ) - # Implements no setup_function+compute_function - supported_reps = { - 'calc_mode': None, - } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, - supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/aeff/weight_hnl.py b/pisa/stages/aeff/weight_hnl.py index c2106227a..12af975c2 100644 --- a/pisa/stages/aeff/weight_hnl.py +++ b/pisa/stages/aeff/weight_hnl.py @@ -90,6 +90,7 @@ class weight_hnl(Stage): # pylint: disable=invalid-name Notes ----- + Implements neither setup nor compute. Expected container keys are:: @@ -111,15 +112,10 @@ def __init__( 'hnl_decay_width', 'weights', ) - # Implements no setup_function+compute_function - supported_reps = { - 'calc_mode': None, - } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, - supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/background/atm_muons.py b/pisa/stages/background/atm_muons.py index eef564297..c9e3c8592 100644 --- a/pisa/stages/background/atm_muons.py +++ b/pisa/stages/background/atm_muons.py @@ -96,8 +96,6 @@ def setup_function(self): @profile def apply_function(self): - #self.data.representation = self.calc_mode - # Apply muon normalisation/scaling atm_muon_scale = self.params['atm_muon_scale'].value.m_as("dimensionless") diff --git a/pisa/stages/cont_sys/snowstorm_hist.py b/pisa/stages/cont_sys/snowstorm_hist.py index cc4d7bd9b..23bd45870 100644 --- a/pisa/stages/cont_sys/snowstorm_hist.py +++ b/pisa/stages/cont_sys/snowstorm_hist.py @@ -111,7 +111,8 @@ def __init__( self.central_values = [] """Central values of the systematic parameters in the snowstorm set.""" - # evaluation only works on event-by-event basis + # Evaluation only works on event-by-event basis, and apply_mode can be + # detected automatically for convenience supported_reps = { 'calc_mode': "events", 'apply_mode': [None, MultiDimBinning], diff --git a/pisa/stages/data/csv_data_hist.py b/pisa/stages/data/csv_data_hist.py index 4e8f30a5c..518665539 100644 --- a/pisa/stages/data/csv_data_hist.py +++ b/pisa/stages/data/csv_data_hist.py @@ -22,6 +22,10 @@ class csv_data_hist(Stage): # pylint: disable=invalid-name ---------- events_file : str csv file path + + Notes + ----- + Implements no apply. """ def __init__(self, @@ -34,15 +38,10 @@ def __init__(self, expected_params = () expected_container_keys = () - # Implements no apply_function - supported_reps = { - 'apply_mode': None, - } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, - supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/data/licloader_weighter.py b/pisa/stages/data/licloader_weighter.py index cfba523c3..544479786 100644 --- a/pisa/stages/data/licloader_weighter.py +++ b/pisa/stages/data/licloader_weighter.py @@ -76,6 +76,8 @@ def __init__( LW.ConstantFlux(1.0 / n_files), self.xs_obj, self.lic_files ) + #FIXME: why no call to Stage init? + def setup_function(self): """ Load in the lic files, build the weighters, and get all the one-weights. To get the true diff --git a/pisa/stages/data/simple_data_loader.py b/pisa/stages/data/simple_data_loader.py index af3cb0077..d32f8b3a9 100644 --- a/pisa/stages/data/simple_data_loader.py +++ b/pisa/stages/data/simple_data_loader.py @@ -66,6 +66,7 @@ class simple_data_loader(Stage): # pylint: disable=invalid-name Looks for `initial_weights` fields in events file, which will serve as nominal weights for all events included. No fields named `weights` may already be present. + Setting of `calc_mode` is not accepted. """ def __init__(self, diff --git a/pisa/stages/flux/barr_simple.py b/pisa/stages/flux/barr_simple.py index ebd3f8d1d..b186721ae 100644 --- a/pisa/stages/flux/barr_simple.py +++ b/pisa/stages/flux/barr_simple.py @@ -38,6 +38,7 @@ class barr_simple(Stage): # pylint: disable=invalid-name Notes ----- + Implements no apply, so assumes implicit caching of nominal fluxes (FIXME). Expected container keys are:: @@ -63,15 +64,10 @@ def __init__( "nubar_flux_nominal", "nubar" ) - # Implements no apply_function (implicit caching! FIXME) - supported_reps = { - 'apply_mode': None, - } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, - supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/flux/barr_simple_bckup.py b/pisa/stages/flux/barr_simple_bckup.py new file mode 100644 index 000000000..ec4920702 --- /dev/null +++ b/pisa/stages/flux/barr_simple_bckup.py @@ -0,0 +1,293 @@ +""" +Stage to implement the old PISA/oscfit flux systematics +""" + +from __future__ import absolute_import, print_function, division + +import math + +import numpy as np +from numba import guvectorize, cuda, jit, njit, void + +from pisa import FTYPE, TARGET +from pisa.core.param import Param, ParamSet +from pisa.core.stage import Stage +from pisa.utils.profiler import profile +from pisa.utils.numba_tools import myjit, myjit_2, ftype, FX, IX +from pisa.utils.barr_parameterization import modRatioNuBar, modRatioUpHor + +__all__ = ['barr_simple', 'apply_ratio_scale', 'spectral_index_scale', + 'apply_sys_kernel', 'apply_sys_vectorized', 'init_test'] + + +class barr_simple(Stage): # pylint: disable=invalid-name + """ + stage to apply Barr style flux uncertainties + uses parameterisations of plots from Barr 2006 paper + + Parameters + ---------- + params + Expected params are .. :: + + nue_numu_ratio : quantity (dimensionless) + nu_nubar_ratio : quantity (dimensionless) + delta_index : quantity (dimensionless) + Barr_uphor_ratio : quantity (dimensionless) + Barr_nu_nubar_ratio : quantity (dimensionless) + + Expected container keys are .. :: + + "true_energy" + "true_coszen" + "nu_flux_nominal" + "nubar_flux_nominal" + "nubar" + + """ + def __init__( + self, + **std_kwargs, + ): + expected_params = ( + "nue_numu_ratio", + "nu_nubar_ratio", + "delta_index", + "Barr_uphor_ratio", + "Barr_nu_nubar_ratio", + ) + + expected_container_keys = ( + "true_energy", + "true_coszen", + "nu_flux_nominal", + "nubar_flux_nominal", + "nubar" + ) + + # init base class + super().__init__( + expected_params=expected_params, + expected_container_keys=expected_container_keys, + **std_kwargs, + ) + + def setup_function(self): + self.data.representation = self.calc_mode + for container in self.data: + container["nu_flux"] = np.empty((container.size, 2), dtype=FTYPE) + + @profile + def compute_function(self): + self.data.representation = self.calc_mode + + # If a parameter below has not been modified by minimizer, + # its magnitude below will be a native float, otherwise np.float64, + # so convert to expected FTYPE + nue_numu_ratio = FTYPE(self.params.nue_numu_ratio.value.m_as("dimensionless")) + nu_nubar_ratio = FTYPE(self.params.nu_nubar_ratio.value.m_as("dimensionless")) + delta_index = FTYPE(self.params.delta_index.value.m_as("dimensionless")) + Barr_uphor_ratio = FTYPE(self.params.Barr_uphor_ratio.value.m_as("dimensionless")) + Barr_nu_nubar_ratio = FTYPE(self.params.Barr_nu_nubar_ratio.value.m_as("dimensionless")) + + for container in self.data: + apply_sys_vectorized( + container["true_energy"], + container["true_coszen"], + container["nu_flux_nominal"], + container["nubar_flux_nominal"], + container["nubar"], + nue_numu_ratio, + nu_nubar_ratio, + delta_index, + Barr_uphor_ratio, + Barr_nu_nubar_ratio, + out=container["nu_flux"], + ) + container.mark_changed('nu_flux') + + +#@njit(f"void({FX}, b1, {FX}, {FX}, {FX}[:])", inline='always') +@myjit_2(f"void({FX}, b1, {FX}, {FX}, {FX}[:])", inline="always") +def apply_ratio_scale(ratio_scale, sum_constant, in1, in2, out): + """ apply ratio scale to flux values + + Parameters + ---------- + ratio_scale : float + + sum_constant : bool + if Ture, then the sum of the new flux will be identical to the old flux + + in1 : float + + in2 : float + + out : array + + """ + if in1 == 0. and in2 == 0.: + out[0] = 0. + out[1] = 0. + return + + flag = 1 if sum_constant else 0 + + # when sum_constant = True + # just a single division operation + single_denom = in2 + ratio_scale * in1 + inv_denom = 1.0 / single_denom + + orig_sum = in1 + in2 + new = orig_sum * inv_denom + out0 = ratio_scale * in1 * new + out1 = new + + # sum_constant = False + out0_sum_not_const = ratio_scale * in1 + out1_sum_not_const = in2 + + # finally assign + out[0] = (1 - flag) * out0_sum_not_const + flag * out0 + out[1] = (1 - flag) * out1_sum_not_const + flag * out1 + + +@myjit +def spectral_index_scale(true_energy, egy_pivot, delta_index): + """ calculate spectral index scale """ + return math.pow((true_energy / egy_pivot), delta_index) + + +@myjit +def apply_sys_kernel( + true_energy, + true_coszen, + nu_flux_nominal, + nubar_flux_nominal, + nubar, + nue_numu_ratio, + nu_nubar_ratio, + delta_index, + Barr_uphor_ratio, + Barr_nu_nubar_ratio, + out, +): + # nue/numu ratio + new_nu_flux = cuda.local.array(shape=(2), dtype=ftype) + new_nubar_flux = cuda.local.array(2, dtype=ftype) + apply_ratio_scale( + nue_numu_ratio, True, nu_flux_nominal[0], nu_flux_nominal[1], new_nu_flux + ) + apply_ratio_scale( + nue_numu_ratio, + True, + nubar_flux_nominal[0], + nubar_flux_nominal[1], + new_nubar_flux, + ) + + # apply flux systematics + # spectral idx + idx_scale = spectral_index_scale(true_energy, 24.0900951261, delta_index) + new_nu_flux[0] *= idx_scale + new_nu_flux[1] *= idx_scale + new_nubar_flux[0] *= idx_scale + new_nubar_flux[1] *= idx_scale + + # nu/nubar ratio + new_nue_flux = cuda.local.array(2, dtype=ftype) + new_numu_flux = cuda.local.array(2, dtype=ftype) + apply_ratio_scale( + nu_nubar_ratio, True, new_nu_flux[0], new_nubar_flux[0], new_nue_flux + ) + apply_ratio_scale( + nu_nubar_ratio, True, new_nu_flux[1], new_nubar_flux[1], new_numu_flux + ) + if nubar < 0: + out[0] = new_nue_flux[1] + out[1] = new_numu_flux[1] + else: + out[0] = new_nue_flux[0] + out[1] = new_numu_flux[0] + + # Barr flux + out[0] *= modRatioNuBar(nubar, 0, true_energy, true_coszen, Barr_nu_nubar_ratio) + out[1] *= modRatioNuBar(nubar, 1, true_energy, true_coszen, Barr_nu_nubar_ratio) + + out[0] *= modRatioUpHor(0, true_energy, true_coszen, Barr_uphor_ratio) + out[1] *= modRatioUpHor(1, true_energy, true_coszen, Barr_uphor_ratio) + + +@guvectorize([f"({FX}, {FX}, {FX}[:], {FX}[:], {IX}, {FX}, {FX}, {FX}, {FX}, {FX}, {FX}[:])"], "(),(),(d),(d),(),(),(),(),(),()->(d)", target=TARGET) +def apply_sys_vectorized( + true_energy, + true_coszen, + nu_flux_nominal, + nubar_flux_nominal, + nubar, + nue_numu_ratio, + nu_nubar_ratio, + delta_index, + Barr_uphor_ratio, + Barr_nu_nubar_ratio, + out, +): + # nue/numu ratio + new_nu_flux = np.empty(shape=(2), dtype=ftype) + new_nubar_flux = np.empty(2, dtype=ftype) + apply_ratio_scale( + nue_numu_ratio, True, nu_flux_nominal[0], nu_flux_nominal[1], new_nu_flux + ) + apply_ratio_scale( + nue_numu_ratio, + True, + nubar_flux_nominal[0], + nubar_flux_nominal[1], + new_nubar_flux, + ) + + # apply flux systematics + # spectral idx + #idx_scale = spectral_index_scale(true_energy, 24.0900951261, delta_index) + energy_pivot = 24.0900951261 + idx_scale = math.exp(delta_index * math.log(true_energy / energy_pivot)) + new_nu_flux[0] *= idx_scale + new_nu_flux[1] *= idx_scale + new_nubar_flux[0] *= idx_scale + new_nubar_flux[1] *= idx_scale + + # nu/nubar ratio + new_nue_flux = np.empty(2, dtype=ftype) + new_numu_flux = np.empty(2, dtype=ftype) + apply_ratio_scale( + nu_nubar_ratio, True, new_nu_flux[0], new_nubar_flux[0], new_nue_flux + ) + apply_ratio_scale( + nu_nubar_ratio, True, new_nu_flux[1], new_nubar_flux[1], new_numu_flux + ) + if nubar < 0: + out[0] = new_nue_flux[1] + out[1] = new_numu_flux[1] + else: + out[0] = new_nue_flux[0] + out[1] = new_numu_flux[0] + + # Barr flux + out[0] *= modRatioNuBar(nubar, 0, true_energy, true_coszen, Barr_nu_nubar_ratio) + out[1] *= modRatioNuBar(nubar, 1, true_energy, true_coszen, Barr_nu_nubar_ratio) + + out[0] *= modRatioUpHor(0, true_energy, true_coszen, Barr_uphor_ratio) + out[1] *= modRatioUpHor(1, true_energy, true_coszen, Barr_uphor_ratio) + + +def init_test(**param_kwargs): + """Instantiation example""" + param_set = ParamSet([ + Param(name="nue_numu_ratio", value=1.0, **param_kwargs), + Param(name="nu_nubar_ratio", value=1.0, **param_kwargs), + Param(name="delta_index", value=0.0, **param_kwargs), + Param(name="Barr_uphor_ratio", value=0.0, **param_kwargs), + Param(name="Barr_nu_nubar_ratio", value=0.0, **param_kwargs) + ]) + + return barr_simple(params=param_set) diff --git a/pisa/stages/flux/daemon_flux.py b/pisa/stages/flux/daemon_flux.py index edd38515b..3b3dbfe1e 100644 --- a/pisa/stages/flux/daemon_flux.py +++ b/pisa/stages/flux/daemon_flux.py @@ -60,12 +60,12 @@ class daemon_flux(Stage): # pylint: disable=invalid-name daemon_GSF_5 : quantity (dimensionless) daemon_GSF_6 : quantity (dimensionless) - Expected container keys are .. :: + Notes + ----- - "true_energy" - "true_coszen" - "nubar" + Expected container keys are:: + "true_energy", "true_coszen", "nubar" """ def __init__( diff --git a/pisa/stages/flux/hillasg.py b/pisa/stages/flux/hillasg.py index 42d6ebf82..ed40d6273 100644 --- a/pisa/stages/flux/hillasg.py +++ b/pisa/stages/flux/hillasg.py @@ -28,6 +28,7 @@ class hillasg(Stage): # pylint: disable=invalid-name Notes ----- + Implements no apply. Expected container keys are:: @@ -43,15 +44,10 @@ def __init__(self, **std_kwargs): 'true_energy', 'true_coszen', ) - # Implements no apply_function - supported_reps = { - 'apply_mode': None, - } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, - supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/flux/honda_ip.py b/pisa/stages/flux/honda_ip.py index b0ea296ef..a2413ee80 100644 --- a/pisa/stages/flux/honda_ip.py +++ b/pisa/stages/flux/honda_ip.py @@ -30,6 +30,7 @@ class honda_ip(Stage): # pylint: disable=invalid-name Notes ----- + Implements no apply. Expected container keys are:: @@ -48,15 +49,10 @@ def __init__( 'true_energy', 'true_coszen', ) - # Implements no apply_function - supported_reps = { - 'apply_mode': None, - } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, - supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/flux/mceq_barr.py b/pisa/stages/flux/mceq_barr.py index ce6894a6b..56408959a 100644 --- a/pisa/stages/flux/mceq_barr.py +++ b/pisa/stages/flux/mceq_barr.py @@ -82,6 +82,7 @@ class mceq_barr(Stage): # pylint: disable=invalid-name Notes ----- + Implements no apply, so assumes implicit caching of nominal fluxes (FIXME). Expected container keys are:: @@ -186,10 +187,6 @@ def __init__( ] if use_honda_nominal_flux: expected_container_keys.append('nubar_flux_nominal') - # Implements no apply_function (implicit caching! FIXME) - supported_reps = { - 'apply_mode': None, - } # store args self.table_file = table_file @@ -201,7 +198,6 @@ def __init__( super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, - supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/flux/mceq_barr_red.py b/pisa/stages/flux/mceq_barr_red.py index 9bed306c2..4ee27169c 100644 --- a/pisa/stages/flux/mceq_barr_red.py +++ b/pisa/stages/flux/mceq_barr_red.py @@ -71,6 +71,7 @@ class mceq_barr_red(Stage): # pylint: disable=invalid-name Notes ----- + Implements no apply, so assumes implicit caching of nominal fluxes (FIXME). Expected container keys are:: @@ -165,10 +166,6 @@ def __init__( "nubar_flux_nominal", "nubar" ) - # Implements no apply_function (implicit caching! FIXME) - supported_reps = { - 'apply_mode': None, - } # Using Honda for nominal flux. Keys should already exist # what are keys added or altered in the calculation used during apply @@ -181,7 +178,6 @@ def __init__( super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, - supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/osc/two_nu_osc.py b/pisa/stages/osc/two_nu_osc.py index 99e6fba68..83e7a50d5 100644 --- a/pisa/stages/osc/two_nu_osc.py +++ b/pisa/stages/osc/two_nu_osc.py @@ -29,6 +29,7 @@ class two_nu_osc(Stage): # pylint: disable=invalid-name Notes ----- + Implements neither setup nor compute. Expected container keys are:: @@ -52,15 +53,10 @@ def __init__(self, 'nu_flux', 'weights' ) - # Implements no setup_function+compute_function - supported_reps = { - 'calc_mode': None, - } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, - supported_reps=supported_reps, **std_kwargs, ) diff --git a/pisa/stages/reco/resolutions.py b/pisa/stages/reco/resolutions.py index 82e63858d..2c9195a14 100644 --- a/pisa/stages/reco/resolutions.py +++ b/pisa/stages/reco/resolutions.py @@ -34,6 +34,7 @@ class resolutions(Stage): # pylint: disable=invalid-name Notes ----- + Implements no apply. Expected container keys are:: @@ -58,10 +59,8 @@ def __init__( 'reco_coszen', 'pid', ) - # Implements no apply_function supported_reps = { "calc_mode": "events", - "apply_mode": None } super().__init__( expected_params=expected_params, diff --git a/pisa/stages/reco/simple_param.py b/pisa/stages/reco/simple_param.py index 940868cf8..331ff9629 100644 --- a/pisa/stages/reco/simple_param.py +++ b/pisa/stages/reco/simple_param.py @@ -412,6 +412,7 @@ class simple_param(Stage): # pylint: disable=invalid-name Notes ----- + Implements no apply. Expected container keys are:: @@ -434,15 +435,10 @@ def __init__(self, 'true_energy', 'true_coszen', ) - # Implements no apply_function (TODO: does any calc_mode work?) - supported_reps = { - 'apply_mode': None, - } # init base class super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, - supported_reps=supported_reps, **std_kwargs, ) @@ -450,7 +446,6 @@ def setup_function(self): #TODO Could add a number of discrete cases here that can be selected betweeen, e.g. ICU baseline (LoI?), DeepCore current best, etc... - # Get params perfect_reco = self.params.perfect_reco.value reco_energy_params = eval(self.params.reco_energy_params.value) diff --git a/pisa/stages/utils/hist.py b/pisa/stages/utils/hist.py index b02ecbd35..459cc4b5d 100644 --- a/pisa/stages/utils/hist.py +++ b/pisa/stages/utils/hist.py @@ -43,6 +43,7 @@ def __init__( if apply_unc_weights: expected_container_keys.append('unc_weights') + # apply_mode can be detected automatically for convenience supported_reps = { 'calc_mode': [MultiDimBinning, "events"], 'apply_mode': [None, MultiDimBinning], From a329272058a64abb5a1e01a121e5f9e12e988cff Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Sun, 24 May 2026 15:03:31 +0200 Subject: [PATCH 13/32] accidentally added file --- pisa/stages/flux/barr_simple_bckup.py | 293 -------------------------- 1 file changed, 293 deletions(-) delete mode 100644 pisa/stages/flux/barr_simple_bckup.py diff --git a/pisa/stages/flux/barr_simple_bckup.py b/pisa/stages/flux/barr_simple_bckup.py deleted file mode 100644 index ec4920702..000000000 --- a/pisa/stages/flux/barr_simple_bckup.py +++ /dev/null @@ -1,293 +0,0 @@ -""" -Stage to implement the old PISA/oscfit flux systematics -""" - -from __future__ import absolute_import, print_function, division - -import math - -import numpy as np -from numba import guvectorize, cuda, jit, njit, void - -from pisa import FTYPE, TARGET -from pisa.core.param import Param, ParamSet -from pisa.core.stage import Stage -from pisa.utils.profiler import profile -from pisa.utils.numba_tools import myjit, myjit_2, ftype, FX, IX -from pisa.utils.barr_parameterization import modRatioNuBar, modRatioUpHor - -__all__ = ['barr_simple', 'apply_ratio_scale', 'spectral_index_scale', - 'apply_sys_kernel', 'apply_sys_vectorized', 'init_test'] - - -class barr_simple(Stage): # pylint: disable=invalid-name - """ - stage to apply Barr style flux uncertainties - uses parameterisations of plots from Barr 2006 paper - - Parameters - ---------- - params - Expected params are .. :: - - nue_numu_ratio : quantity (dimensionless) - nu_nubar_ratio : quantity (dimensionless) - delta_index : quantity (dimensionless) - Barr_uphor_ratio : quantity (dimensionless) - Barr_nu_nubar_ratio : quantity (dimensionless) - - Expected container keys are .. :: - - "true_energy" - "true_coszen" - "nu_flux_nominal" - "nubar_flux_nominal" - "nubar" - - """ - def __init__( - self, - **std_kwargs, - ): - expected_params = ( - "nue_numu_ratio", - "nu_nubar_ratio", - "delta_index", - "Barr_uphor_ratio", - "Barr_nu_nubar_ratio", - ) - - expected_container_keys = ( - "true_energy", - "true_coszen", - "nu_flux_nominal", - "nubar_flux_nominal", - "nubar" - ) - - # init base class - super().__init__( - expected_params=expected_params, - expected_container_keys=expected_container_keys, - **std_kwargs, - ) - - def setup_function(self): - self.data.representation = self.calc_mode - for container in self.data: - container["nu_flux"] = np.empty((container.size, 2), dtype=FTYPE) - - @profile - def compute_function(self): - self.data.representation = self.calc_mode - - # If a parameter below has not been modified by minimizer, - # its magnitude below will be a native float, otherwise np.float64, - # so convert to expected FTYPE - nue_numu_ratio = FTYPE(self.params.nue_numu_ratio.value.m_as("dimensionless")) - nu_nubar_ratio = FTYPE(self.params.nu_nubar_ratio.value.m_as("dimensionless")) - delta_index = FTYPE(self.params.delta_index.value.m_as("dimensionless")) - Barr_uphor_ratio = FTYPE(self.params.Barr_uphor_ratio.value.m_as("dimensionless")) - Barr_nu_nubar_ratio = FTYPE(self.params.Barr_nu_nubar_ratio.value.m_as("dimensionless")) - - for container in self.data: - apply_sys_vectorized( - container["true_energy"], - container["true_coszen"], - container["nu_flux_nominal"], - container["nubar_flux_nominal"], - container["nubar"], - nue_numu_ratio, - nu_nubar_ratio, - delta_index, - Barr_uphor_ratio, - Barr_nu_nubar_ratio, - out=container["nu_flux"], - ) - container.mark_changed('nu_flux') - - -#@njit(f"void({FX}, b1, {FX}, {FX}, {FX}[:])", inline='always') -@myjit_2(f"void({FX}, b1, {FX}, {FX}, {FX}[:])", inline="always") -def apply_ratio_scale(ratio_scale, sum_constant, in1, in2, out): - """ apply ratio scale to flux values - - Parameters - ---------- - ratio_scale : float - - sum_constant : bool - if Ture, then the sum of the new flux will be identical to the old flux - - in1 : float - - in2 : float - - out : array - - """ - if in1 == 0. and in2 == 0.: - out[0] = 0. - out[1] = 0. - return - - flag = 1 if sum_constant else 0 - - # when sum_constant = True - # just a single division operation - single_denom = in2 + ratio_scale * in1 - inv_denom = 1.0 / single_denom - - orig_sum = in1 + in2 - new = orig_sum * inv_denom - out0 = ratio_scale * in1 * new - out1 = new - - # sum_constant = False - out0_sum_not_const = ratio_scale * in1 - out1_sum_not_const = in2 - - # finally assign - out[0] = (1 - flag) * out0_sum_not_const + flag * out0 - out[1] = (1 - flag) * out1_sum_not_const + flag * out1 - - -@myjit -def spectral_index_scale(true_energy, egy_pivot, delta_index): - """ calculate spectral index scale """ - return math.pow((true_energy / egy_pivot), delta_index) - - -@myjit -def apply_sys_kernel( - true_energy, - true_coszen, - nu_flux_nominal, - nubar_flux_nominal, - nubar, - nue_numu_ratio, - nu_nubar_ratio, - delta_index, - Barr_uphor_ratio, - Barr_nu_nubar_ratio, - out, -): - # nue/numu ratio - new_nu_flux = cuda.local.array(shape=(2), dtype=ftype) - new_nubar_flux = cuda.local.array(2, dtype=ftype) - apply_ratio_scale( - nue_numu_ratio, True, nu_flux_nominal[0], nu_flux_nominal[1], new_nu_flux - ) - apply_ratio_scale( - nue_numu_ratio, - True, - nubar_flux_nominal[0], - nubar_flux_nominal[1], - new_nubar_flux, - ) - - # apply flux systematics - # spectral idx - idx_scale = spectral_index_scale(true_energy, 24.0900951261, delta_index) - new_nu_flux[0] *= idx_scale - new_nu_flux[1] *= idx_scale - new_nubar_flux[0] *= idx_scale - new_nubar_flux[1] *= idx_scale - - # nu/nubar ratio - new_nue_flux = cuda.local.array(2, dtype=ftype) - new_numu_flux = cuda.local.array(2, dtype=ftype) - apply_ratio_scale( - nu_nubar_ratio, True, new_nu_flux[0], new_nubar_flux[0], new_nue_flux - ) - apply_ratio_scale( - nu_nubar_ratio, True, new_nu_flux[1], new_nubar_flux[1], new_numu_flux - ) - if nubar < 0: - out[0] = new_nue_flux[1] - out[1] = new_numu_flux[1] - else: - out[0] = new_nue_flux[0] - out[1] = new_numu_flux[0] - - # Barr flux - out[0] *= modRatioNuBar(nubar, 0, true_energy, true_coszen, Barr_nu_nubar_ratio) - out[1] *= modRatioNuBar(nubar, 1, true_energy, true_coszen, Barr_nu_nubar_ratio) - - out[0] *= modRatioUpHor(0, true_energy, true_coszen, Barr_uphor_ratio) - out[1] *= modRatioUpHor(1, true_energy, true_coszen, Barr_uphor_ratio) - - -@guvectorize([f"({FX}, {FX}, {FX}[:], {FX}[:], {IX}, {FX}, {FX}, {FX}, {FX}, {FX}, {FX}[:])"], "(),(),(d),(d),(),(),(),(),(),()->(d)", target=TARGET) -def apply_sys_vectorized( - true_energy, - true_coszen, - nu_flux_nominal, - nubar_flux_nominal, - nubar, - nue_numu_ratio, - nu_nubar_ratio, - delta_index, - Barr_uphor_ratio, - Barr_nu_nubar_ratio, - out, -): - # nue/numu ratio - new_nu_flux = np.empty(shape=(2), dtype=ftype) - new_nubar_flux = np.empty(2, dtype=ftype) - apply_ratio_scale( - nue_numu_ratio, True, nu_flux_nominal[0], nu_flux_nominal[1], new_nu_flux - ) - apply_ratio_scale( - nue_numu_ratio, - True, - nubar_flux_nominal[0], - nubar_flux_nominal[1], - new_nubar_flux, - ) - - # apply flux systematics - # spectral idx - #idx_scale = spectral_index_scale(true_energy, 24.0900951261, delta_index) - energy_pivot = 24.0900951261 - idx_scale = math.exp(delta_index * math.log(true_energy / energy_pivot)) - new_nu_flux[0] *= idx_scale - new_nu_flux[1] *= idx_scale - new_nubar_flux[0] *= idx_scale - new_nubar_flux[1] *= idx_scale - - # nu/nubar ratio - new_nue_flux = np.empty(2, dtype=ftype) - new_numu_flux = np.empty(2, dtype=ftype) - apply_ratio_scale( - nu_nubar_ratio, True, new_nu_flux[0], new_nubar_flux[0], new_nue_flux - ) - apply_ratio_scale( - nu_nubar_ratio, True, new_nu_flux[1], new_nubar_flux[1], new_numu_flux - ) - if nubar < 0: - out[0] = new_nue_flux[1] - out[1] = new_numu_flux[1] - else: - out[0] = new_nue_flux[0] - out[1] = new_numu_flux[0] - - # Barr flux - out[0] *= modRatioNuBar(nubar, 0, true_energy, true_coszen, Barr_nu_nubar_ratio) - out[1] *= modRatioNuBar(nubar, 1, true_energy, true_coszen, Barr_nu_nubar_ratio) - - out[0] *= modRatioUpHor(0, true_energy, true_coszen, Barr_uphor_ratio) - out[1] *= modRatioUpHor(1, true_energy, true_coszen, Barr_uphor_ratio) - - -def init_test(**param_kwargs): - """Instantiation example""" - param_set = ParamSet([ - Param(name="nue_numu_ratio", value=1.0, **param_kwargs), - Param(name="nu_nubar_ratio", value=1.0, **param_kwargs), - Param(name="delta_index", value=0.0, **param_kwargs), - Param(name="Barr_uphor_ratio", value=0.0, **param_kwargs), - Param(name="Barr_nu_nubar_ratio", value=0.0, **param_kwargs) - ]) - - return barr_simple(params=param_set) From 171746e76e70c1bba983340e7661d519b5e2ebd9 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Wed, 27 May 2026 03:33:34 +0200 Subject: [PATCH 14/32] expand and update service howto and add trace-level logging to Container.mark_changed [no ci] --- pisa/core/container.py | 2 + pisa/stages/how_to_service.md | 76 ++++++++++++++++++++++++----------- 2 files changed, 55 insertions(+), 23 deletions(-) diff --git a/pisa/core/container.py b/pisa/core/container.py index 94a787ceb..2e065ec15 100644 --- a/pisa/core/container.py +++ b/pisa/core/container.py @@ -426,6 +426,8 @@ def mark_changed(self, key): if key in self.current_data.keys(): self.mark_valid(key) + logging.trace("Marked changed variable '%s' in current representation '%s'.", + key, self.representation) def mark_valid(self, key): '''validate data as is in current representation, regardless''' diff --git a/pisa/stages/how_to_service.md b/pisa/stages/how_to_service.md index f5c909dda..ecd748094 100644 --- a/pisa/stages/how_to_service.md +++ b/pisa/stages/how_to_service.md @@ -75,26 +75,36 @@ Refer to the [general conventions](https://github.com/icecube/pisa/blob/master/p What is the purpose of this stage? Short 1-2 sentence description - Parameters: - ----------- + Parameters + ---------- params : ParamSet - Expected parameters are .. :: + Must have parameters:: + a : dimensionless Quantity b : dimensionless Quantity something_else : float Description + some_arg_with_default : bool (default: True) + Description + + + Notes + ----- + If you want to use both foo and bar, blah blah. + Does not implement setup/compute/apply because ... + Only allowed apply_mode is ... + More info, etc... + + Expected container keys are:: - Notes: - ------ - If you want to use both foo and bar, blah blah. More info, etc... + 'true_energy', 'true_coszen', 'weights' References ---------- Einstein, Albert. "The photoelectric effect." Ann. Phys 17.132 (1905): 4. - """ ``` @@ -102,6 +112,7 @@ Note that the "Parameters" section has parameter names optionally followed by ` This turns out to be quite useful for both developers and users, so include what type(s) your code expects here! The further-indented line(s) beneath the `name : type` specification then describe the parameters (arguments) for instantiating the class. This same convention is followed for method docstrings. +How to determine which parameters belong to the `ParamSet` (`params`) and which ones serve as class instantiation arguments is outlined below. ### The `__init__` method definition The definition of the init method is how the class must be called to be instantiated. @@ -110,20 +121,26 @@ The definition of the init method is how the class must be called to be instanti expected_params = ('a', 'b') expected_container_keys = ('true_energy', 'true_coszen', 'weights') + supported_reps = { + 'calc_mode': MultiDimBinning, + 'apply_mode': 'events' + } super().__init__( expected_params=expected_params, expected_container_keys=expected_container_keys, + supported_reps=supported_reps, **std_kwargs ) self.foo = something_else + """Description""" self.bar = some_arg_with_default + """Description""" ``` -The `std_kwargs` can only contain `data`, `params`, `expected_params`, `debug_mode`, `error_mode`, `calc_mode`, `apply_mode`, and `profile`. -Of these, `data` and `params` will be automatically populated. +The `std_kwargs` can only contain `data`, `params`, `expected_params`, `expected_container_keys`, `debug_mode`, `error_method`, `supported_reps`, `calc_mode`, `apply_mode`, `profile`, and `in_standalone_mode`. Of these, `data` and `params` will be automatically populated when a `Pipeline` containing the service is instantiated. -This means that a minimal example for the code instantiating the service will look something like +In turn, a minimal example for the code instantiating the service will look something like ```python from pisa.stages.osc.dummy import dummy as osc_dummy instantiated_dummy = osc_dummy(params=my_paramset, something_else=0.42) @@ -131,63 +148,76 @@ instantiated_dummy = osc_dummy(params=my_paramset, something_else=0.42) (of course there's code that would have to be written to instantiate `my_paramset`). In fact, we expect you to instantiate the service with some reasonable assumptions about params it expects in a test function at the bottom of the file (more on that below). -Note two important things about how this service is being instantiated above: +Note a few important things about how this service is being instantiated above: 1. All arguments are passed by keyword. Python allows you to just send arguments in order (positional args), but ***don't do this***. It's far better to be explicit than to save a few keystrokes. With a "duck-typed" language like Python, using the names explicitly provides a useful check that what the user sends to a function/method is what the user intends, and that the function/method receives what it expects to get. 1. Arguments like `some_arg_with_default=True` have default values set in the definition of init. These needn't be specified by the user (since they have default values set), but can be, for the user to override the defaults. The arguments without defaults (such as `something_else`) *must* be specified by the user. +1. Since the superclass `Stage` exclusively has keyword arguments, with default values of `None` or `False`, and since the service is not part of a pipeline, `instantiated_dummy.data` returns `None`. (We could in principle choose to pass `data` as an instantiation argument to `osc_dummy`, but it isn't required at `__init__` time). -The init method body is broken down into four parts in the example to hopefully make it easier to see what you have to do to implement your own. For example, you don't *need* to create the temporary variables of steps 1 and 2, but this format makes it very clear what's going on and makes the code much cleaner than trying to stuff those tuples into step 3 where they are passed to the superclass's init method. +The init method body is broken down into four parts in the example to hopefully make it easier to see what you have to do to implement your own. For example, you don't *need* to create the temporary variables of steps 1, 2, 3, but this format makes it very clear what's going on and makes the code much cleaner than trying to stuff those objects into step 4 where they are passed to the superclass's init method. 1. Define a temporary variable containing `expected_params`, the parameter names your service requires to be passed via the `params` argument. 1. Define a temporary variable `expected_container_keys`, the container keys expected to be present in each container in the `data` object assigned to this service. -1. Call the `__init__` method of the superclass (the service's superclass is `Stage`). See the `Stage`'s init method definition (and corresponding class docstring) in [stage.py](https://github.com/icecube/pisa/blob/master/pisa/core/stage.py) for details of the arguments it expects. +1. If desired, define a temporary variable `supported_reps`, containing the data representations (`calc_mode` and `apply_mode`) you want to allow. If you don't, PISA will populate `supported_reps` with sensible defaults. +1. Call the `__init__` method of the superclass (`Stage`). Don't forget to pass the above arguments. For details of all the arguments it accepts, see the `Stage`'s init method definition (and corresponding class docstring) in [stage.py](https://github.com/icecube/pisa/blob/master/pisa/core/stage.py). 1. Do any custom things that your class requires for setting itself up. +#### Defining service parameters: instantiation argument or `Param` object? +Instantiation arguments (`something_else` and `some_arg_with_default` in the dummy service above) configure the service and will *never* be passed to a fitter (minimizer, sampling algorithm, etc.). Within the corresponding section of a pipeline config file, they are specified simply by `name = value` or `name = value * units.xyz`. + +In contrast, `Param` objects *are modified* by a fitter. They correspond to the entries of `expected_params` (`a` and `b` in the dummy service above). They are characterized by (at least) a name, a value with units, a finite range, a flag indicating whether they are to be kept fixed or not, and a prior. In the pipeline config file, these properties are specified with a `param.name` prefix. + + ### Implementing the physics: three `{...}_function`s There are three abstract methods provided by the `Stage` class where the actual work of computing things should be implemented: * `setup_function` : executed upon instantiation -* `compute_function` : executed in a run if parameters changed (and first run) +* `compute_function` : executed in the first run and then only *whenever parameters change* (**caching**) * `apply_function` : executed in every run The `Stage` class implements some default logic before or after the execution of each of these methods, but for any service at least one of the above will need to be implemented (i.e. implemented in the service you're writing) in order to do anything non-trivial. -More specifically, the `Stage` class by default sets the data representation to `calc_mode` before calling the first two, and to `apply_mode` before the third. +More specifically, the `Stage` class by default sets the data representation to `calc_mode` before calling each of the first two, and to `apply_mode` before the third. Considering which of the abstract methods above should perform a given task for your service to output correct physics results in an efficient manner whenever parameter values change is of paramount importance. -In the following, "transform" shall refer to the result of any computation (e.g., multidimensional function based on external simulation, based on a parameterisation, etc.) with which the contents of the `data` object passed to the service are modified (create new arrays representing some physical quantities, manipulate existing ones, etc.). +In the following, "transform" shall refer to the result of any computation (e.g., multidimensional function based on external simulation, based on a parameterization, etc.) with which the contents of the `data` object passed to the service are modified (create new arrays representing some physical quantities, manipulate existing ones, etc.). #### Services that use nominal transforms -Implement **`setup_function`** and **`apply_function`** in your service's class +🠚 Implement **`setup_function`** and **`apply_function`** in your service's class Nominal transforms are generated e.g. when all params (if any) are set to their nominal values. It is useful to generate nominal transforms if it is slow to compute them or read them from a file, and the params modify these in some comparably cheap way to arrive at the final transform. #### Services that use transforms -Implement **`compute_function`** and **`apply_function`** in your service's class +🠚 Implement **`compute_function`** and **`apply_function`** in your service's class Even when there are no nominal transforms, it might be efficient to transfer any universal parts of the calculation to the `setup_function` and to store the results in `data` for use by the other two methods. #### Services that do not use transforms -Implement **`apply_function`** in your service's class +🠚 Implement **`apply_function`** in your service's class Consider an example in which the params of the service are directly applied to some contents of `data`, for instance as scaling factors. -An example of such an above function could look like: +#### `apply_function` example +An example of an `apply_function`—which performs some non-sensical scaling of 'weights'—could look like this: ```python def apply_function(self): - a_magnitude = self.params.b.m_as('dimensionless') + a_magnitude = self.params.a.m_as('dimensionless') b_magnitude = self.params.b.m_as('dimensionless') for container in self.data: container['weights'] *= a_magnitude * b_magnitude * container['true_energy'] * container['true_coszen'] container.mark_changed('weights') ``` -**N.B.:** If you use in-place array operations on your containers (e.g. `container['weights'][mask] = 0.0`, you need to mark theses changes via `container.mark_changed('weights')`) +```{admonition} Marking changes +:class: important + +If you use operations on your containers that do not result in execution of the `Container.__setitem__` dunder method (e.g. `container['weights'][mask] = 0.0`), you need to *mark these changes* via `container.mark_changed('weights')` *manually*. This will ensure that the variable 'weights' is invalidated in all other representations than the current one (namely that given by `apply_mode` in the case of the `apply_function` example). If 'weights' are ever requested in another representation, a transformation from a valid source representation to the target representation will first be performed. If in doubt, there is no harm in performing the manual call as in the example above. Alternatively, look for messages about marked changes in trace-level log outputs. +``` -### Service testing +## Testing At the bottom of the file, add a function called `init_test` which successfully creates and returns an instance of the service (consider this an important part of its documentation). This will be detected and called by the service-testing script that attempts to run every service existing within PISA. From 16d95bb80333eea672b8c67c22bf5cbb922845ff Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Wed, 27 May 2026 19:59:50 +0200 Subject: [PATCH 15/32] warn when non-trivial supported rep. is detected even though corresponding function isn't implemented (for now, possibly change later) [no ci] --- pisa/core/stage.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/pisa/core/stage.py b/pisa/core/stage.py index a9142117b..37fe99faf 100644 --- a/pisa/core/stage.py +++ b/pisa/core/stage.py @@ -164,15 +164,14 @@ def __init__( assert set(supported_reps.keys()).issubset(mode_keys) # Default configuration of supported representations, using information # about overridden methods, unless subclass already defined them - # (don't question the values chosen by the subclass) for mode_str in mode_keys: + mode_allowed = ( + self.has_setup or self.has_compute if mode_str == 'calc_mode' + else self.has_apply + ) if mode_str not in supported_reps: # Reps. for this mode not yet defined -> use information about # overridden methods - mode_allowed = ( - self.has_setup or self.has_compute if mode_str == 'calc_mode' - else self.has_apply - ) # either allow all representations or require setting mode to None supported_reps[mode_str] = ( list(Container.array_representations) + [MultiDimBinning] @@ -184,6 +183,19 @@ def __init__( or not isinstance(supported_reps[mode_str], Sequence)): supported_reps[mode_str] = [supported_reps[mode_str]] + if not mode_allowed and supported_reps[mode_str] != [None]: + # TODO: Pipeline currently only checks apply_modes + # for consistency + logging.warning( + "Service %s.%s purports to support %ss=%s," + " even though it does not implement the corresponding" + " functions. As a result, PISA could be tricked into" + " accepting a pipeline configuration which performs unphysical" + " representation transformations. Only proceed if you understand" + " what you are doing.", self.stage_name, self.service_name, + mode_str, supported_reps[mode_str] + ) + self.supported_reps = supported_reps """Dictionary of supported representations. Override in subclass if desired.""" From e83d6eaaa984b92758dd40dc304f96719145afda Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Thu, 28 May 2026 19:20:51 +0200 Subject: [PATCH 16/32] auto-generate a service implementation reference table (md or csv) and include md output in stage modes notebook for now (TODO: fix notebook) [no ci] --- pisa_examples/pisa_modes.ipynb | 358 ++++++++++----------------------- pisa_tests/test_services.py | 194 +++++++++++++++++- 2 files changed, 297 insertions(+), 255 deletions(-) diff --git a/pisa_examples/pisa_modes.ipynb b/pisa_examples/pisa_modes.ipynb index 92d6784ca..8a583def4 100644 --- a/pisa_examples/pisa_modes.ipynb +++ b/pisa_examples/pisa_modes.ipynb @@ -15,19 +15,74 @@ "If the output representation of a stage is different than what, for example, the next stage needs to have as input, the output is automatically translated by PISA (translation between data representations). So you can mix and match, but be aware that translations will introduce computational cost and hence may slow things down." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Service implementation reference\n", + "This [auto-generated](https://github.com/icecube/pisa/blob/master/pisa_tests/test_services.py) table documents which methods each service implements, which representations it supports, as well as any deviant behavior or properties to be aware of.\n", + "It currently only contains services that can be **instantiated without importing optional PISA dependencies**.\n", + "\n", + "**Legend:**\n", + "- **has_setup/compute/apply**: whether the service overrides setup/compute/apply_function (✓ = yes, ✗ = no)\n", + "- **calc_mode support**: allowed representations during setup/compute steps\n", + "- **apply_mode support**: allowed representations during apply step\n", + "- **Notes**: special behaviors, restrictions, problems, etc.\n", + "\n", + "| Service | has_setup | has_compute | has_apply | calc_mode support | apply_mode support | Notes |\n", + "|---------|:---------:|:-----------:|:---------:|:-----------------:|:------------------:|-------|\n", + "| **absorption.earth_absorption** | ✓ | ✓ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **aeff.aeff** | ✗ | ✗ | ✓ | None | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **aeff.param** | ✗ | ✗ | ✓ | None | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **aeff.weight** | ✗ | ✗ | ✓ | None | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **aeff.weight_hnl** | ✗ | ✗ | ✓ | None | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **background.atm_muons** | ✓ | ✗ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **cont_sys.snowstorm_hist** | ✓ | ✓ | ✓ | \"events\" | None, MultiDimBinning | |\n", + "| **data.csv_data_hist** | ✓ | ✗ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))**, setup only |\n", + "| **data.csv_icc_hist** | ✓ | ✗ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **data.csv_loader** | ✓ | ✗ | ✓ | \"events\" | \"events\" | |\n", + "| **data.grid** | ✓ | ✗ | ✓ | \"events\" | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **data.meows_loader** | ✓ | ✗ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **data.simple_data_loader** | ✓ | ✗ | ✓ | None | \"events\" | |\n", + "| **data.simple_signal** | ✓ | ✗ | ✓ | \"events\" | MultiDimBinning | |\n", + "| **data.sqlite_loader** | ✓ | ✗ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **data.toy_event_generator** | ✓ | ✗ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **discr_sys.csv_hypersurfaces** | ✓ | ✓ | ✓ | MultiDimBinning | MultiDimBinning, \"events\" | |\n", + "| **discr_sys.hypersurfaces** | ✓ | ✓ | ✓ | MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **discr_sys.ultrasurfaces** | ✓ | ✓ | ✓ | \"events\" | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **flux.astrophysical** | ✓ | ✓ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **flux.barr_simple** | ✓ | ✓ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))** |\n", + "| **flux.daemon_flux** | ✓ | ✓ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))** |\n", + "| **flux.hillasg** | ✓ | ✓ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))** |\n", + "| **flux.honda_ip** | ✓ | ✓ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))** |\n", + "| **flux.mceq_barr** | ✓ | ✓ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))** |\n", + "| **flux.mceq_barr_red** | ✓ | ✓ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))** |\n", + "| **likelihood.generalized_llh_params** | ✓ | ✗ | ✓ | \"events\", \"log_events\", MultiDimBinning | MultiDimBinning | |\n", + "| **osc.decoherence** | ✓ | ✓ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **osc.globes** | ✓ | ✓ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **osc.prob3** | ✓ | ✓ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **osc.two_nu_osc** | ✗ | ✗ | ✓ | None | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **reco.resolutions** | ✓ | ✗ | ✗ | \"events\" | None | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))**, setup only |\n", + "| **reco.simple_param** | ✓ | ✗ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))**, setup only |\n", + "| **utils.add_indices** | ✓ | ✗ | ✗ | \"events\" | MultiDimBinning | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))**, setup only |\n", + "| **utils.adhoc_sys** | ✓ | ✗ | ✓ | \"events\" | \"events\" | |\n", + "| **utils.bootstrap** | ✓ | ✗ | ✓ | \"events\" | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **utils.fix_error** | ✓ | ✓ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **utils.hist** | ✓ | ✗ | ✓ | MultiDimBinning, \"events\" | None, MultiDimBinning | |\n", + "| **utils.kde** | ✓ | ✗ | ✓ | \"events\" | MultiDimBinning | |\n", + "| **utils.kfold** | ✓ | ✗ | ✓ | \"events\" | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **utils.set_variance** | ✓ | ✓ | ✓ | MultiDimBinning | MultiDimBinning | |\n", + "| **xsec.correct_charm_y** | ✓ | ✗ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **xsec.dis_sys** | ✓ | ✗ | ✓ | \"events\" | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **xsec.genie_sys** | ✓ | ✗ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", + "| **xsec.nutau_xsec** | ✓ | ✓ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |" + ] + }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "<< PISA is running in double precision (FP64) mode; numba is running on CPU (single core) >>\n" - ] - } - ], + "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", @@ -50,8 +105,7 @@ "metadata": {}, "outputs": [], "source": [ - "mixed_modes_model = Pipeline(\"settings/pipeline/IceCube_3y_neutrinos.cfg\")\n", - "mixed_modes_model.profile = True" + "mixed_modes_model = Pipeline(\"settings/pipeline/IceCube_3y_neutrinos.cfg\", profile=True)" ] }, { @@ -60,8 +114,7 @@ "metadata": {}, "outputs": [], "source": [ - "events_modes_model = Pipeline(\"settings/pipeline/IceCube_3y_neutrinos.cfg\")\n", - "events_modes_model.profile = True\n", + "events_modes_model = Pipeline(\"settings/pipeline/IceCube_3y_neutrinos.cfg\", profile=True)\n", "\n", "events_modes_model.stages[1].calc_mode = \"events\"\n", "events_modes_model.stages[2].calc_mode = \"events\"\n", @@ -74,10 +127,23 @@ "cell_type": "code", "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "ValueError", + "evalue": "apply_mode of type is not supported by data.csv_loader", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mValueError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[4]\u001b[39m\u001b[32m, line 5\u001b[39m\n\u001b[32m 1\u001b[39m grid_modes_model = Pipeline(\u001b[33m\"settings/pipeline/IceCube_3y_neutrinos.cfg\"\u001b[39m, profile=\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[32m 2\u001b[39m \n\u001b[32m 3\u001b[39m true_binning = grid_modes_model.stages[\u001b[32m1\u001b[39m].calc_mode\n\u001b[32m 4\u001b[39m \n\u001b[32m----> \u001b[39m\u001b[32m5\u001b[39m grid_modes_model.stages[\u001b[32m0\u001b[39m].apply_mode = true_binning\n\u001b[32m 6\u001b[39m grid_modes_model.stages[\u001b[32m1\u001b[39m].apply_mode = true_binning\n\u001b[32m 7\u001b[39m grid_modes_model.stages[\u001b[32m2\u001b[39m].apply_mode = true_binning\n\u001b[32m 8\u001b[39m grid_modes_model.stages[\u001b[32m3\u001b[39m].apply_mode = true_binning\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/software/pisa/pisa/core/stage.py:356\u001b[39m, in \u001b[36mStage.apply_mode\u001b[39m\u001b[34m(self, value)\u001b[39m\n\u001b[32m 354\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"Set `apply_mode` after checking the validity of `value`\"\"\"\u001b[39;00m\n\u001b[32m 355\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m value != \u001b[38;5;28mself\u001b[39m.apply_mode:\n\u001b[32m--> \u001b[39m\u001b[32m356\u001b[39m \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_check_representation\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43mrep\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mvalue\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mmode\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43m'\u001b[39;49m\u001b[30;43mapply_mode\u001b[39;49m\u001b[30;43m'\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 357\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43malways_allow_none\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43;01mFalse\u001b[39;49;00m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 358\u001b[39m \u001b[38;5;28mself\u001b[39m._apply_mode = value\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/software/pisa/pisa/core/stage.py:376\u001b[39m, in \u001b[36mStage._check_representation\u001b[39m\u001b[34m(self, rep, mode, always_allow_none)\u001b[39m\n\u001b[32m 371\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 372\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmode\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m=\u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mrep\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m'\u001b[39m\u001b[33m is not supported by \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m.stage_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 373\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m.service_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 374\u001b[39m )\n\u001b[32m 375\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mtype\u001b[39m(rep) \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m.supported_reps[mode]:\n\u001b[32m--> \u001b[39m\u001b[32m376\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 377\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmode\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m of type \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mtype\u001b[39m(rep)\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m is not supported by \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m.stage_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 378\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m.service_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 379\u001b[39m )\n", + "\u001b[31mValueError\u001b[39m: apply_mode of type is not supported by data.csv_loader" + ] + } + ], "source": [ - "grid_modes_model = Pipeline(\"settings/pipeline/IceCube_3y_neutrinos.cfg\")\n", - "grid_modes_model.profile = True\n", + "grid_modes_model = Pipeline(\"settings/pipeline/IceCube_3y_neutrinos.cfg\", profile=True)\n", "\n", "true_binning = grid_modes_model.stages[1].calc_mode\n", "\n", @@ -94,168 +160,27 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
stage number name calc_mode apply_mode has setup has compute has apply # fixed params # free params
0 csv_loader events events True False True 0 0
1 honda_ip \"true_allsky_fine\":\n", - "200 (true_energy) x 200 (true_coszen) events True True False 1 0
2 barr_simple \"true_allsky_fine\":\n", - "200 (true_energy) x 200 (true_coszen) events True True False 1 4
3 prob3 \"true_allsky_fine\":\n", - "200 (true_energy) x 200 (true_coszen) events True True True 9 3
4 aeff events events False False True 2 3
5 hist events \"dragon_datarelease\":\n", - "8 (reco_energy) x 8 (reco_coszen) x 2 (pid) True False True 0 0
6hypersurfaces \"dragon_datarelease\":\n", - "8 (reco_energy) x 8 (reco_coszen) x 2 (pid) \"dragon_datarelease\":\n", - "8 (reco_energy) x 8 (reco_coszen) x 2 (pid) True True True 0 5
" - ], - "text/plain": [ - " stage number | name | calc_mode | apply_mode | has setup | has compute | has apply | # fixed params | # free params\n", - "----------------+---------------+---------------------------------------------+---------------------------------------------+-------------+---------------+-------------+------------------+-----------------\n", - " 0 | csv_loader | events | events | True | False | True | 0 | 0\n", - " 1 | honda_ip | \"true_allsky_fine\": | events | True | True | False | 1 | 0\n", - " | | 200 (true_energy) x 200 (true_coszen) | | | | | |\n", - " 2 | barr_simple | \"true_allsky_fine\": | events | True | True | False | 1 | 4\n", - " | | 200 (true_energy) x 200 (true_coszen) | | | | | |\n", - " 3 | prob3 | \"true_allsky_fine\": | events | True | True | True | 9 | 3\n", - " | | 200 (true_energy) x 200 (true_coszen) | | | | | |\n", - " 4 | aeff | events | events | False | False | True | 2 | 3\n", - " 5 | hist | events | \"dragon_datarelease\": | True | False | True | 0 | 0\n", - " | | | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | | | | |\n", - " 6 | hypersurfaces | \"dragon_datarelease\": | \"dragon_datarelease\": | True | True | True | 0 | 5\n", - " | | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | | | | |" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "mixed_modes_model" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
stage number name calc_mode apply_mode has setup has compute has apply # fixed params # free params
0 csv_loader events events True False True 0 0
1 honda_ip events events True True False 1 0
2 barr_simple events events True True False 1 4
3 prob3 events events True True True 9 3
4 aeff events events False False True 2 3
5 hist events \"dragon_datarelease\":\n", - "8 (reco_energy) x 8 (reco_coszen) x 2 (pid) True False True 0 0
6hypersurfaces \"dragon_datarelease\":\n", - "8 (reco_energy) x 8 (reco_coszen) x 2 (pid) \"dragon_datarelease\":\n", - "8 (reco_energy) x 8 (reco_coszen) x 2 (pid) True True True 0 5
" - ], - "text/plain": [ - " stage number | name | calc_mode | apply_mode | has setup | has compute | has apply | # fixed params | # free params\n", - "----------------+---------------+---------------------------------------------+---------------------------------------------+-------------+---------------+-------------+------------------+-----------------\n", - " 0 | csv_loader | events | events | True | False | True | 0 | 0\n", - " 1 | honda_ip | events | events | True | True | False | 1 | 0\n", - " 2 | barr_simple | events | events | True | True | False | 1 | 4\n", - " 3 | prob3 | events | events | True | True | True | 9 | 3\n", - " 4 | aeff | events | events | False | False | True | 2 | 3\n", - " 5 | hist | events | \"dragon_datarelease\": | True | False | True | 0 | 0\n", - " | | | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | | | | |\n", - " 6 | hypersurfaces | \"dragon_datarelease\": | \"dragon_datarelease\": | True | True | True | 0 | 5\n", - " | | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | | | | |" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "events_modes_model" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
stage number name calc_mode apply_mode has setup has compute has apply # fixed params # free params
0 csv_loader events \"true_allsky_fine\":\n", - "200 (true_energy) x 200 (true_coszen) True False True 0 0
1 honda_ip \"true_allsky_fine\":\n", - "200 (true_energy) x 200 (true_coszen) \"true_allsky_fine\":\n", - "200 (true_energy) x 200 (true_coszen) True True False 1 0
2 barr_simple \"true_allsky_fine\":\n", - "200 (true_energy) x 200 (true_coszen) \"true_allsky_fine\":\n", - "200 (true_energy) x 200 (true_coszen) True True False 1 4
3 prob3 \"true_allsky_fine\":\n", - "200 (true_energy) x 200 (true_coszen) \"true_allsky_fine\":\n", - "200 (true_energy) x 200 (true_coszen) True True True 9 3
4 aeff \"true_allsky_fine\":\n", - "200 (true_energy) x 200 (true_coszen) \"true_allsky_fine\":\n", - "200 (true_energy) x 200 (true_coszen) False False True 2 3
5 hist \"true_allsky_fine\":\n", - "200 (true_energy) x 200 (true_coszen) \"dragon_datarelease\":\n", - "8 (reco_energy) x 8 (reco_coszen) x 2 (pid) True False True 0 0
6hypersurfaces \"dragon_datarelease\":\n", - "8 (reco_energy) x 8 (reco_coszen) x 2 (pid) \"dragon_datarelease\":\n", - "8 (reco_energy) x 8 (reco_coszen) x 2 (pid) True True True 0 5
" - ], - "text/plain": [ - " stage number | name | calc_mode | apply_mode | has setup | has compute | has apply | # fixed params | # free params\n", - "----------------+---------------+---------------------------------------------+---------------------------------------------+-------------+---------------+-------------+------------------+-----------------\n", - " 0 | csv_loader | events | \"true_allsky_fine\": | True | False | True | 0 | 0\n", - " | | | 200 (true_energy) x 200 (true_coszen) | | | | |\n", - " 1 | honda_ip | \"true_allsky_fine\": | \"true_allsky_fine\": | True | True | False | 1 | 0\n", - " | | 200 (true_energy) x 200 (true_coszen) | 200 (true_energy) x 200 (true_coszen) | | | | |\n", - " 2 | barr_simple | \"true_allsky_fine\": | \"true_allsky_fine\": | True | True | False | 1 | 4\n", - " | | 200 (true_energy) x 200 (true_coszen) | 200 (true_energy) x 200 (true_coszen) | | | | |\n", - " 3 | prob3 | \"true_allsky_fine\": | \"true_allsky_fine\": | True | True | True | 9 | 3\n", - " | | 200 (true_energy) x 200 (true_coszen) | 200 (true_energy) x 200 (true_coszen) | | | | |\n", - " 4 | aeff | \"true_allsky_fine\": | \"true_allsky_fine\": | False | False | True | 2 | 3\n", - " | | 200 (true_energy) x 200 (true_coszen) | 200 (true_energy) x 200 (true_coszen) | | | | |\n", - " 5 | hist | \"true_allsky_fine\": | \"dragon_datarelease\": | True | False | True | 0 | 0\n", - " | | 200 (true_energy) x 200 (true_coszen) | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | | | | |\n", - " 6 | hypersurfaces | \"dragon_datarelease\": | \"dragon_datarelease\": | True | True | True | 0 | 5\n", - " | | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | | | | |" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "grid_modes_model" ] @@ -264,23 +189,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can compare timings. Event-by-event it takes around 8 minutes! The two other modes around 25 seconds." + "We can compare timings. Event-by-event it takes around 8 minutes! The two other modes around 25 seconds.\n", + "\n", + "**Note**: To speed up the following `get_outputs()` calls, consider running this notebook after having set the environment variables `PISA_TARGET=\"parallel\"` and `PISA_NUM_THREADS = 1>`." ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 7min 28s, sys: 349 ms, total: 7min 28s\n", - "Wall time: 7min 28s\n" - ] - } - ], + "outputs": [], "source": [ "%%time\n", "events = events_modes_model.get_outputs()" @@ -288,18 +206,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 23.5 s, sys: 51.9 ms, total: 23.6 s\n", - "Wall time: 23.6 s\n" - ] - } - ], + "outputs": [], "source": [ "%%time\n", "mixed = mixed_modes_model.get_outputs()" @@ -307,18 +216,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 26.5 s, sys: 3.95 s, total: 30.4 s\n", - "Wall time: 23.7 s\n" - ] - } - ], + "outputs": [], "source": [ "%%time\n", "grid = grid_modes_model.get_outputs()" @@ -333,22 +233,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "

" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig, ax = plt.subplots(2, 3, figsize=(20, 7))\n", "plt.subplots_adjust(hspace=0.5)\n", @@ -375,22 +262,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig, axes = plt.subplots(3,4, figsize=(24,10))\n", "plt.subplots_adjust(hspace=0.5)\n", @@ -404,22 +278,9 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig, axes = plt.subplots(3,4, figsize=(24,10))\n", "plt.subplots_adjust(hspace=0.5)\n", @@ -430,18 +291,11 @@ "for m, ax in zip(diff, axes):\n", " m.plot(ax=ax, symm=True)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -455,7 +309,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.4" + "version": "3.14.5" } }, "nbformat": 4, diff --git a/pisa_tests/test_services.py b/pisa_tests/test_services.py index f84e3e034..4e0ae786d 100755 --- a/pisa_tests/test_services.py +++ b/pisa_tests/test_services.py @@ -1,4 +1,4 @@ -#! /usr/bin/env python +#! /usr/bin/env python3 """ Try to simply run every existing service by automatically deriving as many @@ -14,9 +14,11 @@ from argparse import ArgumentDefaultsHelpFormatter, ArgumentParser from importlib import import_module +import os from os import walk from os.path import isfile, join, relpath import sys +from typing import List, Dict, Tuple import numpy as np @@ -47,7 +49,7 @@ __author__ = "T. Ehrhardt, J. Weldert" -__license__ = """Copyright (c) 2014-2024, The IceCube Collaboration +__license__ = """Copyright (c) 2014-2026, The IceCube Collaboration Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -202,8 +204,21 @@ def test_services( skip_services=SKIP_SERVICES, allow_missing=OPTIONAL_MODULES, verbosity=Levels.WARN, + output_matrix=None ): - """Modelled after `run_unit_tests.run_unit_tests`""" + """Modelled after `run_unit_tests.run_unit_tests` + + Parameters + ---------- + path : str (default: STAGES_PATH) + init_test : str (default: INIT_TEST_NAME) + skip_services : array-like (default: SKIP_SERVICES) + allow_missing : array-like (default: OPTIONAL_MODULES) + verbosity : int (default: Levels.WARN) + output_matrix : str, optional + If provided, write service implementation matrix to this file path. + Format controlled by file extension (.md or .csv accepted). + """ if allow_missing is None: allow_missing = [] elif isinstance(allow_missing, str): @@ -215,6 +230,7 @@ def test_services( nsuccesses = 0 stage_dot_services_failed_ignored = [] stage_dot_services_failed = [] + services_info = [] # for collecting service metadata set_verbosity(verbosity) for rel_file_path, service_names in services.items(): @@ -305,6 +321,14 @@ def test_services( stage_dot_services_failed.append(stage_dot_service) continue + # Collect service metadata + try: + services_info.append(collect_service_info(service)) + except Exception as e: + logging.warning( + PFX + f"Failed to collect metadata for {stage_dot_service}: {e}" + ) + if service.data is None: # For data services, setup usually adds to `data` attribute # (`Pipeline.setup()` assigns empty `ContainerSet`) @@ -394,6 +418,27 @@ def test_services( PFX + f"{nfail_ignored} out of {nfail} failures have been ignored." ) nfail_remain = nfail - nfail_ignored + + # Output matrix file if requested + if output_matrix and services_info: + rootname, ext = os.path.splitext(output_matrix) + logging.info(PFX + f"Generating service matrix ({ext} format)...") + try: + if ext.lower() == ".csv": + matrix_content = generate_csv_matrix(services_info) + else: + if ext.lower() != ".md": + logging.warning("Unknown service matrix format requested. " + "Will produce markdown format instead.") + matrix_content = generate_markdown_matrix(services_info) + + with open(output_matrix, 'w') as f: + f.write(matrix_content) + logging.info(PFX + f"Service matrix written to {output_matrix}") + + except Exception as e: + logging.error(PFX + f"Failed to generate service matrix: {e}") + if nfail_remain > 0: sys.stdout.flush() sys.stderr.write("\n\n\n") @@ -403,6 +448,140 @@ def test_services( ) +def format_supported_reps(reps_list) -> str: + """Format supported representations for display in the matrix.""" + if not reps_list: + return "None" + + formatted = [] + for rep in reps_list: + if rep is None: + formatted.append("None") + elif isinstance(rep, str): + formatted.append(f'"{rep}"') + elif rep is MultiDimBinning: + formatted.append("MultiDimBinning") + else: + formatted.append(str(rep)) + + if len(formatted) == 1: + return formatted[0] + return ", ".join(formatted) + + +def collect_service_info(service) -> Dict: + """Extract service implementation info from an instantiated Stage.""" + return { + 'stage_name': service.stage_name, + 'service_name': service.service_name, + 'has_setup': service.has_setup, + 'has_compute': service.has_compute, + 'has_apply': service.has_apply, + 'calc_mode_support': format_supported_reps(service.supported_reps.get('calc_mode', [])), + 'apply_mode_support': format_supported_reps(service.supported_reps.get('apply_mode', [])), + } + + +def generate_service_notes(info: Dict) -> str: + """Auto-detect caching issues and other possible oddities + and produce corresponding notes.""" + notes = [] + if not info['has_apply']: + notes.append("⚠️ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))**") + if not info['has_setup'] and not info['has_compute'] and not info['has_apply']: + notes.append("init. only") + elif not info['has_apply'] and not info['has_compute']: + notes.append("setup only") + notes = ", ".join(notes) + return notes + + +#TODO: document expected container keys also? +def generate_markdown_matrix(services_info: List[Dict]) -> str: + """Generate markdown table from collected service information.""" + # Sort by stage_name, then service_name + services_info = sorted( + services_info, + key=lambda x: (x['stage_name'], x['service_name']) + ) + + lines = [ + "## Service implementation reference", + "This [auto-generated](https://github.com/icecube/pisa/blob/master/pisa_tests/test_services.py) table" + " documents which methods each service implements, which representations it supports, as well as any" + " deviant behavior or properties to be aware of.", + "It currently only contains services that can be **instantiated without importing optional PISA dependencies**.", + "", + "**Legend:**", + "- **has_setup/compute/apply**: whether the service overrides setup/compute/apply_function (✓ = yes, ✗ = no)", + "- **calc_mode support**: allowed representations during setup/compute steps", + "- **apply_mode support**: allowed representations during apply step", + "- **Notes**: special behaviors, restrictions, problems, etc.", + "", + "| Service | has_setup | has_compute | has_apply | calc_mode support | apply_mode support | Notes |", + "|---------|:---------:|:-----------:|:---------:|:-----------------:|:------------------:|-------|", + ] + + for info in services_info: + setup_icon = "✓" if info['has_setup'] else "✗" + compute_icon = "✓" if info['has_compute'] else "✗" + apply_icon = "✓" if info['has_apply'] else "✗" + + service_full_name = f"**{info['stage_name']}.{info['service_name']}**" + notes = generate_service_notes(info) + + line = ( + f"| {service_full_name} | {setup_icon} | {compute_icon} | {apply_icon} | " + f"{info['calc_mode_support']} | {info['apply_mode_support']} | {notes} |" + ) + lines.append(line) + + return "\n".join(lines) + + +def generate_csv_matrix(services_info: List[Dict], filepath: str = None) -> str: + """Generate CSV table from collected service information (for external processing).""" + import csv + from io import StringIO + + # Sort by stage_name, then service_name + services_info = sorted( + services_info, + key=lambda x: (x['stage_name'], x['service_name']) + ) + + output = StringIO() + writer = csv.DictWriter( + output, + fieldnames=[ + 'Service', 'has_setup', 'has_compute', 'has_apply', + 'calc_mode_support', 'apply_mode_support', 'Notes' + ] + ) + + writer.writeheader() + for info in services_info: + setup_icon = "Yes" if info['has_setup'] else "No" + compute_icon = "Yes" if info['has_compute'] else "No" + apply_icon = "Yes" if info['has_apply'] else "No" + + notes = generate_service_notes(info) + + writer.writerow({ + 'Service': f"{info['stage_name']}.{info['service_name']}", + 'has_setup': setup_icon, + 'has_compute': compute_icon, + 'has_apply': apply_icon, + 'calc_mode_support': info['calc_mode_support'], + 'apply_mode_support': info['apply_mode_support'], + 'Notes': notes, + }) + + result = output.getvalue() + output.close() + return result + + def parse_args(description=__doc__): """Parse command line arguments""" parser = ArgumentParser(description=description, @@ -410,6 +589,14 @@ def parse_args(description=__doc__): parser.add_argument( "-v", action="count", default=Levels.WARN, help="set verbosity level" ) + parser.add_argument( + "--output-matrix", + metavar="FILE", + default=None, + help="""If desired, write a service implementation overview table to + this file, giving either .md (markdown) or .csv (comma-separated values) + file extension to indicate the desired format for the output table.""" + ) args = parser.parse_args() return args @@ -419,6 +606,7 @@ def main(): args = parse_args() kwargs = vars(args) kwargs["verbosity"] = kwargs.pop("v") + kwargs["output_matrix"] = kwargs.pop("output_matrix") test_services(**kwargs) logging.info(PFX + 'Services testing done.') From 2f7c937b005e2ca31d2b74afcf99297089376980 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Fri, 29 May 2026 19:07:25 +0200 Subject: [PATCH 17/32] change default translation mode for any 'weight'-like variable --- pisa/core/container.py | 94 ++++++++++++++++++++++++++++-------------- 1 file changed, 63 insertions(+), 31 deletions(-) diff --git a/pisa/core/container.py b/pisa/core/container.py index 2e065ec15..edc940996 100644 --- a/pisa/core/container.py +++ b/pisa/core/container.py @@ -438,23 +438,41 @@ def __getitem__(self, key): return data def __setitem__(self, key, data): - + """Set `self[key]` to `data`. + + Invalidates all representations but the current one, which is set to + valid, and set the translation mode to + :py:attr:`Container.default_translation_mode`, unless the string "weight" + is part of `key`, in which case the translation mode is set to "sum". + + Parameters + ---------- + key : string + data identifier/variable + data : ndarray, PISA Map or (array, binning)-tuple + data sample to add to the container + """ if self.is_map: if key in self.representation.names: - raise Exception(f'Cannot add variable {key}, as it is a binning dimension') - - self.__add_data(key, data) - if not key in self.tranlation_modes.keys(): - self.tranlation_modes[key] = self.default_translation_mode - + raise Exception( + f'Cannot add variable {key}, as it is a binning dimension' + ) + + self.__add_data(key, data) + + if not key in self.tranlation_modes: + if "weight" in key.lower(): + self.tranlation_modes[key] = "sum" + else: + self.tranlation_modes[key] = self.default_translation_mode self.mark_changed(key) - + def __add_data(self, key, data): """ Parameters ---------- key : string - identifier + data identifier/variable data : ndarray, PISA Map or (array, binning)-tuple is_flat : bool is the data already flattened (i.e. the binning dimensions unrolled) @@ -561,49 +579,53 @@ def get_map(self, key, error=None): def __iter__(self): """iterate over all keys in container""" return self.keys - + def translate(self, key, src_representation): - '''translate variable from source representation - + '''Translate data for variable `key` from source rep. to current rep. + + Afterwards, both source and destination representation will be valid. + + Parameters + ---------- key : str - src_representation : representation present in container - + data identifier/variable + src_representation : hashable object, e.g. str or MultiDimBinning + some representation present in container ''' - assert hash(src_representation) in self.representation_keys - + dest_representation = self.representation if hash(src_representation) == hash(dest_representation): # nothing to do - return - + return + from_map = isinstance(src_representation, MultiDimBinning) to_map = isinstance(dest_representation, MultiDimBinning) - - if self.tranlation_modes[key] == 'average': + + if self.tranlation_modes[key] == 'average': if from_map and to_map: out = self.resample(key, src_representation, dest_representation) self.representation = dest_representation self[key] = out - + elif to_map: out = self.array_to_binned(key, src_representation, dest_representation) self.representation = dest_representation self[key] = out - + elif from_map: out = self.binned_to_array(key, src_representation, dest_representation) self.representation = dest_representation - self[key] = out - + self[key] = out + elif src_representation == "events" and dest_representation == "log_events": self.representation = "events" logging.trace(f"Container `{self.name}`: taking log of {key}") sample = np.log(self[key]) self.representation = dest_representation self[key] = sample - + elif src_representation == "log_events" and dest_representation == "events": self.representation = "log_events" sample = np.exp(self[key]) @@ -611,8 +633,11 @@ def translate(self, key, src_representation): self[key] = sample else: - raise NotImplementedError(f"translating {src_representation} to {dest_representation}") - + raise NotImplementedError( + f"Translating {src_representation} to {dest_representation}" + " in 'average' mode!" + ) + elif self.tranlation_modes[key] == 'sum': if from_map and to_map: raise NotImplementedError("Map to Map in sum mode needs to integrate over bins.") @@ -623,15 +648,22 @@ def translate(self, key, src_representation): self[key] = out else: - raise NotImplementedError() + # destination rep. is an event-by-event rep., no matter the source rep. + raise NotImplementedError( + f"Translating {src_representation} to {dest_representation}" + " in 'sum' mode!" + ) else: - raise NotImplementedError() - + raise NotImplementedError( + f"Unknown translation mode for variable '{key}':" + f" {self.tranlation_modes[key]}!" + ) + # validate source! self.validity[key][hash(src_representation)] = True - + def auto_translate(self, key): src_representation = self.find_valid_representation(key) if src_representation is None: From 97962cbc80abb2e40f5bd0ab33a000fa4ae79322 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Mon, 1 Jun 2026 18:15:13 +0200 Subject: [PATCH 18/32] remove default_translation_mode Container attribute and rename tranlation_modes -> translation_modes; representation management unit test; update container module docs --- pisa/core/container.py | 144 ++++++++++++++++++++++++++++++----------- pisa/core/pipeline.py | 6 +- 2 files changed, 110 insertions(+), 40 deletions(-) diff --git a/pisa/core/container.py b/pisa/core/container.py index 65b796403..8487f8795 100644 --- a/pisa/core/container.py +++ b/pisa/core/container.py @@ -37,8 +37,10 @@ When :py:attr:`validity = True ` for multiple representations of the same data (e.g., energy), a :py:attr:`~Container.precedence` system determines which representation to use as the source for translation, implemented by -:py:meth:`~pisa.core.container.Container.find_valid_representation`. (As of now, all -representations have precedence = 0, however!) +:py:meth:`~pisa.core.container.Container.find_valid_representation`. + +.. attention:: + As of now, all representations have precedence = 0, however! For each variable, the container tracks which representations have valid (up-to-date) copies of that variable: @@ -64,28 +66,32 @@ when event-by-event weights are requested (see below). Instead, the exact event-by-event weights will remain available. -When accessing data with an invalid source representation, +When accessing data in a currently invalid representation, :py:meth:`~Container.auto_translate` is triggered, which ensures synchronization -across representations as needed, i.e., on demand. - -There are different translation modes available, defined on a per-variable basis -in the :py:attr:`~Container.tranlation_modes` (sic!) dictionary attribute, with a -default of "average" (see :py:attr:`~Container.default_translation_mode`): +across representations as needed, i.e., on demand. The feasibility and details +of the translation depend on the **translation mode** assigned to the desired +variable though: as specified by :py:attr:`~Container.valid_translation_modes`, +there are two translation modes available, defined on a per-variable basis in the +:py:attr:`~Container.translation_modes` dictionary attribute: -- "average" mode (default)---for quantities where bin-averaging makes sense +- "average" mode---select for quantities where bin-averaging makes sense - examples: oscillation probabilities, energy reconstruction parameters -- "sum" mode---for quantities where summation makes sense +- "sum" mode---select for quantities where summation makes sense - examples: event weights, raw counts -Specify translation mode for a given variable:: +By default, when data for some variable is initially entered into the container, +the translation mode is assumed to be "sum" by PISA whenever "weight" is part of +the variable name (cf. :py:meth:`~pisa.core.container.Container.__setitem__`), +otherwise "average". This choice can be overridden straightforwardly by +specifying:: container.translation_modes['variable_name'] = 'average' # (or 'sum') -The `Container` supports *three primary transformation types* (source-target combinations): +The `Container` supports **three primary transformation types** (**source-target combinations**): - "events" ↔ "log_events" (requires "average" mode) @@ -123,9 +129,17 @@ Access mechanism: 1. check if data exists in current representation 2. if not, search for valid representation of this variable - 3. if valid representation found: auto-translate to current representation - 4. if no valid representation: raise exception - 5. return data in current representation + 3. if valid representation found, and resulting source-target pair supported + for chosen translation mode: auto-translate to current representation; + otherwise: raise exception + 4. return data in current representation + +.. attention:: + Keep in mind that the above implies that weight-like data will not be translatable + from binned → binned, binned → "events", or binned → "log_events" + (unless its translation mode has been explicitly overriden and set to "average"). + In order to enable such transformations, knowledge of the weight distributions + within each bin would have to be assumed/exploited. For binned representations: * binning dimension arrays accessible by dimension name @@ -150,6 +164,11 @@ container_set.representation = binning # applied to all containers mapset = container_set.get_mapset('variable') # returns MapSet of all +A `ContainerSet` can store *global auxiliary metadata*:: + + container_set['metadata_key'] = arbitrary_python_object # name must be unlike any container's + value = container_set['metadata_key'] + Features: * unified representation management across containers * linking containers for treatment as single :py:class:`VirtualContainer` @@ -166,16 +185,16 @@ from collections.abc import Sequence from collections import defaultdict +import re import numpy as np -import re from pisa import FTYPE from pisa.core.binning import OneDimBinning, MultiDimBinning from pisa.core.map import Map, MapSet from pisa.core.translation import histogram, lookup, resample from pisa.utils.comparisons import ALLCLOSE_KW -from pisa.utils.log import logging +from pisa.utils.log import logging, set_verbosity class ContainerSet(): @@ -466,9 +485,9 @@ class Container(): Precedence for choosing translation source (lower = higher priority). Currently 0 for every representation (TODO). - tranlation_modes : dict[variable_name] -> str + translation_modes : dict[variable_name] -> str Translation mode to use for each variable, e.g. for binning or - resampling: "average" (default) or "sum". + resampling: "average" or "sum". _representations : dict[representation_hash] -> hashable object, e.g. `str` or :py:class:`.MultiDimBinning` Representation storage, organized by hash value @@ -484,11 +503,9 @@ class Container(): system. """ - default_translation_mode = "average" - translation_modes = ("average", "sum") + valid_translation_modes = ("average", "sum") array_representations = ("events", "log_events") - def __init__(self, name, representation='events'): self.name = name self._representation = None @@ -505,7 +522,7 @@ def __init__(self, name, representation='events'): # translation mode # dict of form [variable] - self.tranlation_modes = {} + self.translation_modes = {} # Actual data # dict of form [representation_hash][variable] @@ -640,8 +657,7 @@ def __setitem__(self, key, data): """Set `self[key]` to `data`. Invalidates all representations but the current one, which is set to - valid, and set the translation mode to - :py:attr:`Container.default_translation_mode`, unless the string "weight" + valid, and set the translation mode to "average", unless the string "weight" is part of `key`, in which case the translation mode is set to "sum", or unless a mode has already been set. @@ -660,11 +676,11 @@ def __setitem__(self, key, data): self.__add_data(key, data) - if not key in self.tranlation_modes: + if not key in self.translation_modes: if "weight" in key.lower(): - self.tranlation_modes[key] = "sum" + self.translation_modes[key] = "sum" else: - self.tranlation_modes[key] = self.default_translation_mode + self.translation_modes[key] = "average" self.mark_changed(key) def __add_data(self, key, data): @@ -735,11 +751,10 @@ def __get_data(self, key): if not key in self.keys: if key in self.all_keys: self.auto_translate(key) - #raise KeyError(f'Data {key} not present in chosen representation') else: if key in self._aux_data.keys(): return self._aux_data[key] - raise KeyError(f'Data {key} not present in Container') + raise KeyError(f'Key "{key}" not present in Container "{self.name}"') valid = self.validity[key][hash(self.representation)] if not valid: @@ -759,7 +774,7 @@ def get_hist(self, key): """Return reshaped data as normal n-dimensional histogram""" assert self.is_map, 'Cannot retrieve hists from non-map data' - # retrieve in case needs translation + # retrieve in case needs translation (TODO: unnecessary, cf. data = ...?) self[key] binning = self.representation @@ -808,7 +823,7 @@ def translate(self, key, src_representation): from_map = isinstance(src_representation, MultiDimBinning) to_map = isinstance(dest_representation, MultiDimBinning) - if self.tranlation_modes[key] == 'average': + if self.translation_modes[key] == 'average': if from_map and to_map: out = self.resample(key, src_representation, dest_representation) self.representation = dest_representation @@ -843,11 +858,11 @@ def translate(self, key, src_representation): " in 'average' mode!" ) - elif self.tranlation_modes[key] == 'sum': + elif self.translation_modes[key] == 'sum': if from_map and to_map: raise NotImplementedError("Map to Map in sum mode needs to integrate over bins.") - elif to_map: + if to_map: out = self.array_to_binned(key, src_representation, dest_representation, averaged=False) self.representation = dest_representation self[key] = out @@ -860,9 +875,9 @@ def translate(self, key, src_representation): ) else: - raise NotImplementedError( + raise ValueError( f"Unknown translation mode for variable '{key}':" - f" {self.tranlation_modes[key]}!" + f" '{self.translation_modes[key]}'!" ) # validate source! @@ -1025,6 +1040,9 @@ def get_keep_mask(self, keep_criteria): def test_container(): """Unit tests for :py:class:`Container` class.""" + # 1st set of tests + # ---------------- + # NOTE: Right now the numbers are tuned so that the weights are identical # per bin. If you change binning that's likely not the case anymore and you # inevitably end up with averaged values over bins, which are then not @@ -1043,7 +1061,7 @@ def test_container(): binning_x = OneDimBinning(name='x', num_bins=100, is_lin=True, domain=[0, 100]) binning_y = OneDimBinning(name='y', num_bins=100, is_lin=True, domain=[0, 100]) - binning = MultiDimBinning([binning_x, binning_y]) + binning = MultiDimBinning(name='xy binning', dimensions=[binning_x, binning_y]) logging.trace('Testing container and translation methods') @@ -1073,6 +1091,57 @@ def test_container(): assert np.allclose(a, w, **ALLCLOSE_KW), f'test:\n{a}\n!= ref:\n{w}' + # 2nd set of tests + # ---------------- + # NOTE: Also uses x, y, w arrays but doesn't depend on numerical values + + logging.trace('Testing container representation and validity management') + + container = Container('nue', 'events') + for weight_key in ('weights', 'initial_weights', 'oneweight'): + container[weight_key] = w + assert container.translation_modes[weight_key] == 'sum' + container['x'] = x + assert container.translation_modes['x'] == 'average' + container['y'] = y + assert container.translation_modes['y'] == 'average' + + container.representation = binning + binning_hash = hash(binning) + for k in container.all_keys: + if 'weight' in k: + container[k] *= 1.0 # invalidates 'events' rep. when __setitem__ called + assert container.validity[k][binning_hash] + assert not container.validity[k][hash('events')] + + # Setting invalid mode for binning dimension is irrelevant/ignored + # when attempting to get it in the binned rep. + container.translation_modes['y'] = 'median' + _ = container['y'] + _ = container['x'] # should work just as well + + # However, for other variables, setting invalid mode needs to fail when + # attempting to translate (here from binning -> 'events') + container.translation_modes['oneweight'] = 'division' + container.representation = 'events' + try: + container['oneweight'] + except ValueError: + pass + + # For the weight-like quantities with translation mode set to 'sum', no + # translation back to 'events' is implemented + for weight_key in ('weights', 'initial_weights'): + try: + container[weight_key] + except NotImplementedError: + pass + + # However, if we set 'events' rep. validity to True, this has to work again, + # because no translation is necessary + container.validity['weights'][hash('events')] = True + _ = container['weights'] + def test_container_set(): """Unit tests for :py:class:`ContainerSet` class.""" @@ -1133,5 +1202,6 @@ def test_container_set(): if __name__ == '__main__': + set_verbosity(3) test_container() test_container_set() diff --git a/pisa/core/pipeline.py b/pisa/core/pipeline.py index 8f2bb9224..26c106d96 100755 --- a/pisa/core/pipeline.py +++ b/pisa/core/pipeline.py @@ -425,12 +425,12 @@ def _get_outputs_varbinning(self, output_binning, output_key): if isinstance(output_key, tuple): assert len(output_key) == 2 cc[output_key[0]] = c[output_key[0]][keep] - cc.tranlation_modes[output_key[0]] = 'sum' + cc.translation_modes[output_key[0]] = 'sum' cc[output_key[1]] = np.square(c[output_key[0]][keep]) - cc.tranlation_modes[output_key[1]] = 'sum' + cc.translation_modes[output_key[1]] = 'sum' else: cc[output_key] = c[output_key][keep] - cc.tranlation_modes[output_key] = 'sum' + cc.translation_modes[output_key] = 'sum' containers.append(cc) From 09484fbdfa10d287dafbd7972fb61ece61e68a76 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Wed, 3 Jun 2026 16:05:49 +0200 Subject: [PATCH 19/32] remove apply_mode consistency checks at pipeline level and prepare for defining sum_mode_keys in Container --- pisa/core/container.py | 30 +++++++++--------------------- pisa/core/pipeline.py | 41 ++--------------------------------------- 2 files changed, 11 insertions(+), 60 deletions(-) diff --git a/pisa/core/container.py b/pisa/core/container.py index 8487f8795..9127da66c 100644 --- a/pisa/core/container.py +++ b/pisa/core/container.py @@ -83,10 +83,9 @@ - examples: event weights, raw counts By default, when data for some variable is initially entered into the container, -the translation mode is assumed to be "sum" by PISA whenever "weight" is part of -the variable name (cf. :py:meth:`~pisa.core.container.Container.__setitem__`), -otherwise "average". This choice can be overridden straightforwardly by -specifying:: +the translation mode is assumed to be "sum" by PISA only for variables in +:py:attr:`~pisa.core.container.Container.sum_mode_keys`, otherwise "average". +This choice can be overridden straightforwardly by specifying:: container.translation_modes['variable_name'] = 'average' # (or 'sum') @@ -504,7 +503,11 @@ class Container(): """ valid_translation_modes = ("average", "sum") + """Available translation modes""" + sum_mode_keys = () # TODO + """Variables for which "sum" is assumed as default translation mode""" array_representations = ("events", "log_events") + """Available unbinned data representations""" def __init__(self, name, representation='events'): self.name = name @@ -677,7 +680,7 @@ def __setitem__(self, key, data): self.__add_data(key, data) if not key in self.translation_modes: - if "weight" in key.lower(): + if key in self.sum_mode_keys: self.translation_modes[key] = "sum" else: self.translation_modes[key] = "average" @@ -1098,9 +1101,6 @@ def test_container(): logging.trace('Testing container representation and validity management') container = Container('nue', 'events') - for weight_key in ('weights', 'initial_weights', 'oneweight'): - container[weight_key] = w - assert container.translation_modes[weight_key] == 'sum' container['x'] = x assert container.translation_modes['x'] == 'average' container['y'] = y @@ -1122,6 +1122,7 @@ def test_container(): # However, for other variables, setting invalid mode needs to fail when # attempting to translate (here from binning -> 'events') + container['oneweight'] = w container.translation_modes['oneweight'] = 'division' container.representation = 'events' try: @@ -1129,19 +1130,6 @@ def test_container(): except ValueError: pass - # For the weight-like quantities with translation mode set to 'sum', no - # translation back to 'events' is implemented - for weight_key in ('weights', 'initial_weights'): - try: - container[weight_key] - except NotImplementedError: - pass - - # However, if we set 'events' rep. validity to True, this has to work again, - # because no translation is necessary - container.validity['weights'][hash('events')] = True - _ = container['weights'] - def test_container_set(): """Unit tests for :py:class:`ContainerSet` class.""" diff --git a/pisa/core/pipeline.py b/pisa/core/pipeline.py index 26c106d96..dd6216eac 100755 --- a/pisa/core/pipeline.py +++ b/pisa/core/pipeline.py @@ -119,8 +119,6 @@ def __init__(self, config, profile=False): if isinstance(self.data["output_binning"], VarBinning): self.assert_varbinning_compat() self.assert_exclusive_varbinning() - else: - self.assert_apply_modes_consistency() # check in case someone decided to add a non-daemonflux parameter with daemon_ # in it, which would potentially make penalty calculation incorrect @@ -542,8 +540,6 @@ def run(self): # possible that stage apply_modes got manipulated in between runs if isinstance(self.output_binning, VarBinning): self.assert_varbinning_compat() - else: - self.assert_apply_modes_consistency() if self.profile: start_t = time() self._run_function() @@ -685,38 +681,6 @@ def hash(self): def __hash__(self): return self.hash - def assert_apply_modes_consistency(self): - """Asserts that pipeline setup does not result in non-sensical - transformations between Maps or from Maps to events - (cf. Container.translate: rebinning without averaging is not - implemented because of lacking benefits, and similarly going - from a histogram to events). - """ - ref_binning = None - ref_name = None - for s in self.stages: - # it suffices to start from the first occurrence of a MultiDimBinning - if isinstance(s.apply_mode, MultiDimBinning) and ref_binning is None: - ref_binning = s.apply_mode - ref_name = f"{s.stage_name}.{s.service_name}" - if (isinstance(self.output_binning, MultiDimBinning) and - ref_binning != self.output_binning): - raise ValueError( - f"Stage {ref_name} has '{s.apply_mode}' as apply_mode, which " - f"deviates from the pipeline output binning {self.output_binning}. " - "This configuration would result in an unreliable pipeline output." - ) - elif (ref_binning is not None and s.apply_mode is not None and - s.apply_mode != ref_binning): - # TODO: In case apply_mode=None, check whether calc_mode == ref_binning? - # (see also TODO in assert_varbinning_compat). - raise ValueError( - f"Stage {s.stage_name}.{s.service_name} has '{s.apply_mode}'" - " as apply_mode, which deviates from a previously detected " - f"MultiDimBinning apply_mode, of stage {ref_name}. This " - "configuration would result in an unreliable pipeline output." - ) - def assert_varbinning_compat(self): """Asserts that pipeline setup is compatible with `VarBinning`: all stages need to apply to events (this precludes use with @@ -808,9 +772,8 @@ def output_binning(self, binning): self.assert_exclusive_varbinning(output_binning=binning) self.data["output_binning"] = binning if isinstance(binning, MultiDimBinning): - for s in self.stages: - if isinstance(s.apply_mode, MultiDimBinning): - s.apply_mode = binning + # The `ContainerSet` `self.data` has an updated "output_binning", + # so re-setup `self` (and all included services). self.setup() From cf20190b82ba81f037748cbafaa8603acd6197f5 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Wed, 3 Jun 2026 17:00:39 +0200 Subject: [PATCH 20/32] reintroduce overriding of all binned apply_modes for now, since utils.hist assertion fails otherwise, and adapt pipeline unit test temporarily --- pisa/core/pipeline.py | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/pisa/core/pipeline.py b/pisa/core/pipeline.py index dd6216eac..e465b758c 100755 --- a/pisa/core/pipeline.py +++ b/pisa/core/pipeline.py @@ -477,6 +477,7 @@ def _get_outputs(self, output_binning=None, output_key=None): outputs = self._get_outputs_varbinning(output_binning, output_key) if original_binning is not None: + # reset (FIXME: overrides all binned apply_modes) self.output_binning = original_binning return outputs @@ -772,6 +773,13 @@ def output_binning(self, binning): self.assert_exclusive_varbinning(output_binning=binning) self.data["output_binning"] = binning if isinstance(binning, MultiDimBinning): + for s in self.stages: + if isinstance(s.apply_mode, MultiDimBinning): + # FIXME: this was also done to avoid rebinning + logging.warning("Setting apply_mode of service '%s.%s' to" + " pipeline output binning %s", + s.stage_name, s.service_name, binning) + s.apply_mode = binning # The `ContainerSet` `self.data` has an updated "output_binning", # so re-setup `self` (and all included services). self.setup() @@ -855,20 +863,17 @@ def test_Pipeline(): #current_mat = new_mat # - # Test: detection of inconsistent apply_mode combinations + # Test: check allowed apply_mode combinations # - binned_apply_mode = pipeline.output_binning + binned_apply_mode = pipeline.stages[2].calc_mode assert isinstance(binned_apply_mode, MultiDimBinning) # osc.prob3 apply_mode: pipeline.stages[2].apply_mode = binned_apply_mode - try: - out = pipeline.get_outputs() - except ValueError: - # Needs to fail: going from a binned output (after osc.) to events - # (after aeff) - pass - else: - assert False + assert pipeline.stages[3].apply_mode == "events" + # allowed right now: going from a binned output (after osc.) to events + # (after aeff) + _ = pipeline.get_outputs() + # reset apply mode pipeline.stages[2].apply_mode = "events" @@ -905,7 +910,9 @@ def test_Pipeline(): out = pipeline.get_outputs() counts_tot = sum(out.num_entries.values()) # use an oversampled output binning instead and ensure identical total count - out2 = pipeline.get_outputs(output_binning=pipeline.output_binning.oversample(2)) + oversampled_binning = MultiDimBinning(pipeline.output_binning).oversample(2) + assert oversampled_binning.size == 8 * pipeline.output_binning.size + out2 = pipeline.get_outputs(output_binning=oversampled_binning) counts_tot2 = sum(out2.num_entries.values()) assert np.isclose(counts_tot2, counts_tot) From 2bd25f813ff7bc5ae4becee2e29dc5931f2c763c Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Wed, 3 Jun 2026 17:29:17 +0200 Subject: [PATCH 21/32] fix stage modes notebook again [no ci] --- pisa_examples/pisa_modes.ipynb | 277 ++++++++++++++++++++++++++++----- 1 file changed, 237 insertions(+), 40 deletions(-) diff --git a/pisa_examples/pisa_modes.ipynb b/pisa_examples/pisa_modes.ipynb index 8a583def4..5bf236386 100644 --- a/pisa_examples/pisa_modes.ipynb +++ b/pisa_examples/pisa_modes.ipynb @@ -127,60 +127,184 @@ "cell_type": "code", "execution_count": 4, "metadata": {}, - "outputs": [ - { - "ename": "ValueError", - "evalue": "apply_mode of type is not supported by data.csv_loader", - "output_type": "error", - "traceback": [ - "\u001b[31m---------------------------------------------------------------------------\u001b[39m", - "\u001b[31mValueError\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[4]\u001b[39m\u001b[32m, line 5\u001b[39m\n\u001b[32m 1\u001b[39m grid_modes_model = Pipeline(\u001b[33m\"settings/pipeline/IceCube_3y_neutrinos.cfg\"\u001b[39m, profile=\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[32m 2\u001b[39m \n\u001b[32m 3\u001b[39m true_binning = grid_modes_model.stages[\u001b[32m1\u001b[39m].calc_mode\n\u001b[32m 4\u001b[39m \n\u001b[32m----> \u001b[39m\u001b[32m5\u001b[39m grid_modes_model.stages[\u001b[32m0\u001b[39m].apply_mode = true_binning\n\u001b[32m 6\u001b[39m grid_modes_model.stages[\u001b[32m1\u001b[39m].apply_mode = true_binning\n\u001b[32m 7\u001b[39m grid_modes_model.stages[\u001b[32m2\u001b[39m].apply_mode = true_binning\n\u001b[32m 8\u001b[39m grid_modes_model.stages[\u001b[32m3\u001b[39m].apply_mode = true_binning\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/software/pisa/pisa/core/stage.py:356\u001b[39m, in \u001b[36mStage.apply_mode\u001b[39m\u001b[34m(self, value)\u001b[39m\n\u001b[32m 354\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"Set `apply_mode` after checking the validity of `value`\"\"\"\u001b[39;00m\n\u001b[32m 355\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m value != \u001b[38;5;28mself\u001b[39m.apply_mode:\n\u001b[32m--> \u001b[39m\u001b[32m356\u001b[39m \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_check_representation\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43mrep\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mvalue\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mmode\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43m'\u001b[39;49m\u001b[30;43mapply_mode\u001b[39;49m\u001b[30;43m'\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 357\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43malways_allow_none\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43;01mFalse\u001b[39;49;00m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 358\u001b[39m \u001b[38;5;28mself\u001b[39m._apply_mode = value\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/software/pisa/pisa/core/stage.py:376\u001b[39m, in \u001b[36mStage._check_representation\u001b[39m\u001b[34m(self, rep, mode, always_allow_none)\u001b[39m\n\u001b[32m 371\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 372\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmode\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m=\u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mrep\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m'\u001b[39m\u001b[33m is not supported by \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m.stage_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 373\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m.service_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 374\u001b[39m )\n\u001b[32m 375\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mtype\u001b[39m(rep) \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m.supported_reps[mode]:\n\u001b[32m--> \u001b[39m\u001b[32m376\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 377\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmode\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m of type \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mtype\u001b[39m(rep)\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m is not supported by \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m.stage_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 378\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m.service_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 379\u001b[39m )\n", - "\u001b[31mValueError\u001b[39m: apply_mode of type is not supported by data.csv_loader" - ] - } - ], + "outputs": [], "source": [ "grid_modes_model = Pipeline(\"settings/pipeline/IceCube_3y_neutrinos.cfg\", profile=True)\n", "\n", "true_binning = grid_modes_model.stages[1].calc_mode\n", "\n", - "grid_modes_model.stages[0].apply_mode = true_binning\n", - "grid_modes_model.stages[1].apply_mode = true_binning\n", - "grid_modes_model.stages[2].apply_mode = true_binning\n", - "grid_modes_model.stages[3].apply_mode = true_binning\n", - "grid_modes_model.stages[4].apply_mode = true_binning\n", - "grid_modes_model.stages[4].calc_mode = true_binning\n", + "for s in grid_modes_model.stages[:-2]:\n", + " try:\n", + " s.calc_mode = true_binning\n", + " except:\n", + " pass\n", + " try:\n", + " s.apply_mode = true_binning\n", + " except:\n", + " pass\n", "grid_modes_model.stages[5].calc_mode = true_binning\n", - "\n", "grid_modes_model.setup()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
stage number name calc_mode apply_mode has setup has compute has apply # fixed params # free params
0 csv_loader events events True False True 0 0
1 honda_ip "true_allsky_fine":\n", + "200 (true_energy) x 200 (true_coszen) True True False 1 0
2 barr_simple "true_allsky_fine":\n", + "200 (true_energy) x 200 (true_coszen) True True False 1 4
3 prob3 "true_allsky_fine":\n", + "200 (true_energy) x 200 (true_coszen) events True True True 9 3
4 aeff events False False True 2 3
5 hist events "dragon_datarelease":\n", + "8 (reco_energy) x 8 (reco_coszen) x 2 (pid) True False True 0 0
6hypersurfaces "dragon_datarelease":\n", + "8 (reco_energy) x 8 (reco_coszen) x 2 (pid) "dragon_datarelease":\n", + "8 (reco_energy) x 8 (reco_coszen) x 2 (pid) True True True 0 5
" + ], + "text/plain": [ + " stage number | name | calc_mode | apply_mode | has setup | has compute | has apply | # fixed params | # free params\n", + "----------------+---------------+---------------------------------------------+---------------------------------------------+-------------+---------------+-------------+------------------+-----------------\n", + " 0 | csv_loader | events | events | True | False | True | 0 | 0\n", + " 1 | honda_ip | \"true_allsky_fine\": | | True | True | False | 1 | 0\n", + " | | 200 (true_energy) x 200 (true_coszen) | | | | | |\n", + " 2 | barr_simple | \"true_allsky_fine\": | | True | True | False | 1 | 4\n", + " | | 200 (true_energy) x 200 (true_coszen) | | | | | |\n", + " 3 | prob3 | \"true_allsky_fine\": | events | True | True | True | 9 | 3\n", + " | | 200 (true_energy) x 200 (true_coszen) | | | | | |\n", + " 4 | aeff | | events | False | False | True | 2 | 3\n", + " 5 | hist | events | \"dragon_datarelease\": | True | False | True | 0 | 0\n", + " | | | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | | | | |\n", + " 6 | hypersurfaces | \"dragon_datarelease\": | \"dragon_datarelease\": | True | True | True | 0 | 5\n", + " | | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | | | | |" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "mixed_modes_model" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
stage number name calc_mode apply_mode has setup has compute has apply # fixed params # free params
0 csv_loader events events True False True 0 0
1 honda_ip events True True False 1 0
2 barr_simple events True True False 1 4
3 prob3 events events True True True 9 3
4 aeff events False False True 2 3
5 hist events "dragon_datarelease":\n", + "8 (reco_energy) x 8 (reco_coszen) x 2 (pid) True False True 0 0
6hypersurfaces "dragon_datarelease":\n", + "8 (reco_energy) x 8 (reco_coszen) x 2 (pid) "dragon_datarelease":\n", + "8 (reco_energy) x 8 (reco_coszen) x 2 (pid) True True True 0 5
" + ], + "text/plain": [ + " stage number | name | calc_mode | apply_mode | has setup | has compute | has apply | # fixed params | # free params\n", + "----------------+---------------+---------------------------------------------+---------------------------------------------+-------------+---------------+-------------+------------------+-----------------\n", + " 0 | csv_loader | events | events | True | False | True | 0 | 0\n", + " 1 | honda_ip | events | | True | True | False | 1 | 0\n", + " 2 | barr_simple | events | | True | True | False | 1 | 4\n", + " 3 | prob3 | events | events | True | True | True | 9 | 3\n", + " 4 | aeff | | events | False | False | True | 2 | 3\n", + " 5 | hist | events | \"dragon_datarelease\": | True | False | True | 0 | 0\n", + " | | | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | | | | |\n", + " 6 | hypersurfaces | \"dragon_datarelease\": | \"dragon_datarelease\": | True | True | True | 0 | 5\n", + " | | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | | | | |" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "events_modes_model" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
stage number name calc_mode apply_mode has setup has compute has apply # fixed params # free params
0 csv_loader events events True False True 0 0
1 honda_ip "true_allsky_fine":\n", + "200 (true_energy) x 200 (true_coszen) True True False 1 0
2 barr_simple "true_allsky_fine":\n", + "200 (true_energy) x 200 (true_coszen) True True False 1 4
3 prob3 "true_allsky_fine":\n", + "200 (true_energy) x 200 (true_coszen) "true_allsky_fine":\n", + "200 (true_energy) x 200 (true_coszen) True True True 9 3
4 aeff "true_allsky_fine":\n", + "200 (true_energy) x 200 (true_coszen) False False True 2 3
5 hist "true_allsky_fine":\n", + "200 (true_energy) x 200 (true_coszen) "dragon_datarelease":\n", + "8 (reco_energy) x 8 (reco_coszen) x 2 (pid) True False True 0 0
6hypersurfaces "dragon_datarelease":\n", + "8 (reco_energy) x 8 (reco_coszen) x 2 (pid) "dragon_datarelease":\n", + "8 (reco_energy) x 8 (reco_coszen) x 2 (pid) True True True 0 5
" + ], + "text/plain": [ + " stage number | name | calc_mode | apply_mode | has setup | has compute | has apply | # fixed params | # free params\n", + "----------------+---------------+---------------------------------------------+---------------------------------------------+-------------+---------------+-------------+------------------+-----------------\n", + " 0 | csv_loader | events | events | True | False | True | 0 | 0\n", + " 1 | honda_ip | \"true_allsky_fine\": | | True | True | False | 1 | 0\n", + " | | 200 (true_energy) x 200 (true_coszen) | | | | | |\n", + " 2 | barr_simple | \"true_allsky_fine\": | | True | True | False | 1 | 4\n", + " | | 200 (true_energy) x 200 (true_coszen) | | | | | |\n", + " 3 | prob3 | \"true_allsky_fine\": | \"true_allsky_fine\": | True | True | True | 9 | 3\n", + " | | 200 (true_energy) x 200 (true_coszen) | 200 (true_energy) x 200 (true_coszen) | | | | |\n", + " 4 | aeff | | \"true_allsky_fine\": | False | False | True | 2 | 3\n", + " | | | 200 (true_energy) x 200 (true_coszen) | | | | |\n", + " 5 | hist | \"true_allsky_fine\": | \"dragon_datarelease\": | True | False | True | 0 | 0\n", + " | | 200 (true_energy) x 200 (true_coszen) | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | | | | |\n", + " 6 | hypersurfaces | \"dragon_datarelease\": | \"dragon_datarelease\": | True | True | True | 0 | 5\n", + " | | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | | | | |" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "grid_modes_model" ] @@ -196,9 +320,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 6min 42s, sys: 36.8 ms, total: 6min 42s\n", + "Wall time: 6min 42s\n" + ] + } + ], "source": [ "%%time\n", "events = events_modes_model.get_outputs()" @@ -206,9 +339,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 25.2 s, sys: 15.8 ms, total: 25.2 s\n", + "Wall time: 25.4 s\n" + ] + } + ], "source": [ "%%time\n", "mixed = mixed_modes_model.get_outputs()" @@ -216,9 +358,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 21.8 s, sys: 8.19 ms, total: 21.8 s\n", + "Wall time: 21.5 s\n" + ] + } + ], "source": [ "%%time\n", "grid = grid_modes_model.get_outputs()" @@ -233,9 +384,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(
,\n", + " ,\n", + " ,\n", + " None)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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jR8/Xh988IGuuuoq5ebmesS8//77NWHCBF111VWaM2eOatWqpZtvvllvvPFGID6GiEUuAgAINnKRyEYuAgAINq/FHh/uAEJghe2Sbv3791d6ero+++wznTp1SoMHD9bw4cP1+uuvF3vesGHD9PDDD7t/jo+Pt7qrAIAyyooHJY8dO1avv/66YmJi3PtuuOEGNWnSRI8++qheffVVSdK0adOUlZWl77//XrVq1ZIktWnTRldddZUWLlyo4cOHS5J2796tmTNn6o477tAzzzwjSRo6dKg6dOigu+++W/369ZPdbi9ZJyGJXAQAEHzkIpGNXAQAEGw5eS6vyUZOSZMRnJOwvMNn48aN+vjjj/Xiiy+qbdu2at++vebMmaM33nhDe/bsKfbc+Ph4VatWzb0lJCSUUq8BAGWNFVfVXnbZZR5fsEhS3bp11ahRI23cuNG97z//+Y969uzp/oJFkrp06aJ69erprbfecu979913derUKY0cOdK9zzAM3X777dq1a5dWr15dwncNiVwEABAayEUiF7kIACAUcIdP6AnLgs/q1atVqVIltWrVyr2vS5custlsWrNmTbHnvvbaa6pSpYoaN26siRMn6sSJE0W2zcnJUUZGhscGAEA+K75kKYxpmtq3b5+qVKki6fSVsvv37/f4PZivTZs2Wr9+vfvn9evXq1y5cmrQoEGBdvnHUXLkIgCAUEAuErnIRQAAocDlQ7HHRcGnVIXlkm579+5V1apVPfZFRUUpMTFRe/fuLfK8m2++Weeff75SU1P1448/asKECfr999/19ttvF9p++vTpeuihhwLadwBA2eE0DTlNw2sbSQX+OI6NjVVsbKxPr/Paa69p9+7d7qU30tPTJUkpKSkF2qakpOjw4cPKyclRbGys0tPTlZycLMMwCrST5PUKUBSOXAQAEArIRSIXuQgAIBQ4TVNOs/iCjrfjCKyQusPn3nvvLfDwwL9uv/32m9/xhw8frq5du6pJkybq37+/Fi1apHfeeUdbtmwptP3EiRN17Ngx97Zz506/X7s4icOaWhJXkppd4bQk7v69pyyJu2mZNRNAznNvWhK3eVScJXEH1DtpSdxQUDnWmnU7956wpn6950S0JXF3Z1l3ZdwpV44lcaOMGO+N/NDsvHKWxC0NLtO3TZJq1qypihUrurfp06f79Bq//fab7rjjDrVr104D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08d37typhIQE9/7CCieS9NVXX6lTp04+vf7GjRtVv359xcXFFXrH0MmTJyWp2Gfp5B/z5fxzeZ3iXr+oAtfJkydLHJOCDwAAfvLlQcg8KBkAAFiFXAQAAASTL8/oyT+ekJDgUfApSv369bVgwQKfXj9/KbWUlBT30mxny9+XmprqNUZR5ycmJrqLUykpKVqxYoVM0/RY1s2X1ynu9Z1Op/bv3++xrFtubq4OHTpU4pgUfAAA8NPptWq9fclSSp0BAAARh1wEAAAEU0kKPr6qVq2aBg0aVKJzmjdvrlWrVsnlcslmO3N385o1axQfH6969eoVeW716tWVlJSkdevWFTi2du1aNW/e3ON1XnzxRW3cuFENGzb0eJ384yWVf866devUvXt39/5169bJ5XKVOCb3dgMA4CevD0n24apbAAAAf5GLAACAYHKZpk+b1fr27at9+/bp7bffdu87ePCgFi9erF69enksH7dlyxZt2bLF4/zrrrtOy5Yt086dO937li9frk2bNqlfv37ufb1791Z0dLSee+459z7TNDV37lxVr15dl112WYn7fuWVVyoxMVHPP/+8x/7nn39e8fHx6tGjR4niUfAJAba27S2LHXNpLUviOvdlWRI379MfLImbmL7XkrjXXeC0JG7XRicsiRsKzou1ZpI/lGPNH7IlvAjBZ9nWDB1Jkj3M/qavHm/9L36ruJyGTxsQDow27SyJG3vZ+ZbEzbMqF/n4e0vihlsuIpXdfIRc5DRykTPIRYDQMO7THZbEXfC3upbEvah2JUvilkso/JkW5yonO8+SuNmZBZ9lESjf/rrfstjBlD7emu/qZs943ZK4japXtCRudq41Y1KSbltjzaJWjbN/tyTu3izrPgur5d/h422zWt++fXXppZdq8ODBevjhh/Xcc8+pY8eOcjqdeuihhzzadu7cWZ07d/bYd9999yk+Pl6dOnXSnDlzNH36dPXr109NmjTR4MGD3e1q1Kihu+66S88++6z+7//+Ty+++KJ69eqlVatW6fHHH5fdbne33b59ux555BE98sgj7ruH8n9+5ZVX3O3i4uI0ZcoULVu2TP369dOLL76ogQMH6tVXX9X999+vxMTEEn0WLOnmh5+d2SofwD+QLq5YTerc3XtDP8QcPaDYlq0DHteILvkDqHyRGRclK1KFlXtOSPsCH/fdbdb8E9r4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i+7wGTp0qJYvX67x48erSZMmWrJkia6++mp98skn6t69e6n7ZWVl6bLLLtOJEyc0bdo0xcbGasGCBerRo4c2b96s2rVre9suXrxYd9xxhwYMGKCJEydq7dq1uvvuu3Xq1ClNmTLF0ppWCvjTHjJkiJYtW6abb75Zs2bN0l133aWPP/5Yr7zyilq2bKn+/fuXGOKs9vTTT+u8886Ty+VSly5d/M6Nu2zZMjVr1kwul0utW7fW+++/H6aeAgAqHcMI4EHJRsDl9u7dK4/Ho7vvvlvnn3++d1m/fr22bdum888/X3/5y1/UqlUrxcTEaOPGjT775+fna/PmzWrXrp13Xbt27bRt2zZlZmb6tF2/fr13e0VBFgEA4HfIImEXiXmELAIAsI1hBLaUw4YNG/T6669rzpw5mjt3rkaNGqWPP/5Y5557riZPnlzmvs8884y2b9+uFStWaPLkyZowYYJWrVqljIwMzZs3z9suJydH999/v/r166fly5dr5MiRevnll3XLLbdo5syZOnbsmKU1rRTwgM+qVav0zjvv6IEHHtCoUaM0btw4xcbG6v3339cvv/yilJQUde7cWTt37rSyvz7++c9/auLEiZo+fbq++eYbtW3bVn379tXBgwdLbP/ll1/qpptu0vDhw7Vp0yZdd911uu666/Tf//43bH0GAFQifr9gCeBKlzO0atVKb731VrGlZcuWatiwod566y0NHz5cNWrUUO/evbV06VKdPHnSu/8rr7yirKwsDRo0yLtu4MCBcrvdevbZZ73r8vLy9OKLL6pLly7FHuAcycgiAAD8Dlkk7CItj5BFAAC2CnEWkaTly5fL6XRq1KhR3nUul0vDhw/XunXrlJ6eXua+nTp1UqdOnbzrmjVrpl69eumNN97wrvvkk0905MgRjR492mf/MWPGKDs7WytXrrS0ppUC/rRTUlJ06tSpErede+65evbZZ3XnnXdq3LhxIeucP/Pnz9fIkSM1bNgwtWjRQosWLVKVKlX0wgsvlNj+8ccf15VXXql7771XzZs318yZM9W+fXs99dRTYeszAKASCXGwqVOnjveP7jOXOnXqqHr16rruuuvUunVrSdKsWbN09OhR9ejRQ4sWLdKf//xnjR07Vn369NGVV17prdmlSxcNGjRIU6dO1eTJk/Xss8/q8ssv165du/Too4+G/COxElkEAIDf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SqNHj9bf//539evXT5MmTVJsbKzmz5+vlJQU3XPPPd52CQkJmjlzpsaMGaNBgwapb9++Wrt2rZYuXapZs2YpKSnJ0ppWCmrAp3///rr++ut1xx136Pjx4+rSpYtiY2N1+PBhzZ8/X3feeWeo+1mqsWPHlnolypo1a4qtGzRokM/IGwAAwQrkQcg8KNkaZBEAAMgidouUPEIWAQDYJZAp28o74CNJL7/8sh544AG98sorOnbsmNq0aaMVK1bo0kvLfrZX9erVtWbNGk2YMEF//etf5fF41LNnTy1YsEDJyck+bUePHq3Y2FjNmzdP7777rho0aKAFCxZo3Lhxlte0UlBTun3zzTf6wx/+IElavny5UlJS9Ouvv+rll1/WE088EdIOAgAQqZg33z5kEQAAyCJ2I48AAKKdFVO6SZLL5dLcuXOVkZGh3Nxcbdiwodjds2vWrCmxdv369bVs2TKdOHFCJ0+e1HvvvafGjRuX+DojR47UTz/9pLy8PP38888aP368DMMIS02rBHWHz6lTp7wPI1q1apWuv/56ORwOXXzxxfr1119D2kEAACJVIPPiM2++NcgiAACQRexGHgEARDvP/xZ/bRA+Qd3h07hxY7399ttKT0/Xhx9+qD59+kiSDh48qMTExJB2EACASMVVtfYhiwAAQBaxG3kEABDtTDOwBeET1IDPgw8+qEmTJum8885Tly5d1LVrV0mnr2i56KKLQtpBAAAilUfugBaEHlkEAACyiN3IIwCAaOf2mAEtCJ+gpnQbOHCgunfvroyMDLVt29a7vlevXvp//+//haxzAABEskDmog1mrlr4RxYBAIAsYjfyCAAg2jGlW+QJasBHkurVq6d69er5rOvcufNZdwgAgIrClEemn+jibzuCRxYBAEQ7soj9yCMAgGhmyv+UbVx6El5BD/gcP35czz//vLZs2SJJatmypW6//XbVqFEjZJ0DACCS8aBke5FFAADRjixiP/IIACCaeUxTHj8jPv62I7SCeobPxo0bdcEFF2jBggU6evSojh49qvnz5+uCCy7QN998E+o+AgAQkXhQsn3IIgAAkEXsRh4BAEQ7M8AF4RPUHT4TJkzQtddeq7///e+KiTldorCwUCNGjND48eP12WefhbSTAABEotPBxd9VtbACWQQAALKI3cgjAIBo5zFPL/7aIHyCGvDZuHGjT6CR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tkzXXHONz900O3bs0I4dO3z2HzBggFasWKH09HTvutWrV2vbtm0aNGiQd13//v0VGxurZ555xrvONE0tWrRI55xzjrp161bumocOHSr2fvbu3asXXnhBbdq08d4tFCju8AEAIEimKfnLLSZX1QIAAIuQRQAAgJ3cHv938JRzRregDBw4UBdffLGGDRumH3/8UXXq1NEzzzwjt9utGTNm+LTt1auXJGnXrl3eddOmTdOyZct02WWXady4ccrKytLcuXPVunVrDRs2zNuufv36Gj9+vObOnauCggJ16tRJb7/9ttauXatXX31VTqez3DUnT56sHTt2qFevXkpLS9OuXbu0ePFiZWdn6/HHHy/3Z8GADwAAQWIaFQAAYCeyCAAAsJMVU7oFw+l06v3339e9996rJ554Qjk5OerUqZOWLFmiCy+80O/+DRo00KeffqqJEyfqvvvuU1xcnPr166d58+YVe9bOww8/rFq1amnx4sVasmSJmjRpoqVLl+rmm28OqmafPn20aNEiPf300zp27Jhq1qypSy+9VH/+85/Vvn37cn8WDPgAABAkvmQBAAB2IosAAAA7RcqAjyTVqlVLzz33nJ577rky2515Z8+ZWrZsqQ8//NDv6zgcDk2dOlVTp0712zaQmjfddJNuuukmv7UCxYAPAABBKvBIMX5uTS4Iw63LAAAgOpFFAACAnQrcHjkKyw4bBeGY0w1eDrs7EKyjR4/qlltuUWJiomrWrKnhw4crKyurzH169uwpwzB8ljvuuCNMPQYAVDZ+H5IcwFW3v/fVV19p7NixatmypapWraqGDRvqhhtu0LZt24q13bJli6688kpVq1ZNSUlJuu2220p82J/H49Gjjz6q888/Xy6XS23atNE//vGPYN82/ocsAgCwG1kkupFFAAB2K7rDx9+C8Kmwd/jccsstysjI0EcffaSCggINGzZMo0aN0muvvVbmfiNHjtRf/vIX77+rVKlidVcBAJWUJ4AvUcqbax555BF98cUXGjRokNq0aaP9+/frqaeeUvv27fWf//xHrVq1kiTt2bNHl156qWrUqKHZs2crKytLjz32mL7//ntt2LBBcXFx3pr333+/Hn74YY0cOVKdOnXSO++8o5tvvlmGYWjw4MHlfdv4H7IIAMBuZJHoRhYBANgtkqZ0w2kVcsBny5Yt+uCDD/TVV1+pY8eO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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "fig, ax = plt.subplots(2, 3, figsize=(20, 7))\n", "plt.subplots_adjust(hspace=0.5)\n", @@ -262,9 +437,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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q4rom4Xom0DVwthXiLHPXuiXheiXQNUS6rEvVOOeZG7s8zXuSYx9kULfpG8CVU0w495fzZ49WwMGDNCkSZOKba+KYx/jXvDom4Xom6js+AS3TTVt2lSZmZlKT0+Xx+PRhAkTNHz4cDVq1EhbtmzR4MGD1aNHD51++uklrjxq166dHA6HNm/e7PMx/D2uovr376+UlBRt2bJFOTk5evnll0tdpsMfmzZt0nHHHVfqvpSUlGJveiTp22+/VdOmTdWwYUPvMd26dfPuX79+fYkgK62OJNWvX18ul0t79+4ttn3v3r1q1KhRAM+mcqBvFopk3wQQfr7Gvj59+nivil67dq2GDh1a7L6MfeRyqNAvC5HJQNVS1tgXHx+v7t276/jjj1etWrXUvXt3XXLJJcXu68+YFqpxTzI39vka9yQyOVLom5HvmwDCK5hzhH91+umna9CgQZo6dWqx7VVx7KvouEcul0TfLBTpvgmEGhPcNtW0aVNJ0u+//64pU6YoLS1NTzzxhHJzczVmzBg988wz+uGHH3TllVfq2WefLXbfunXratCgQZo3b56ysrJK1D58+HCFjquo6tWrq23btmrRooViYgJfJGD58uXauHFjiROykpSdna0tW7bI7XZ7t3k8Hj322GMaOXKkJCk9PV07duzwDrBHjhzRjh07dOKJJxarVdYgHBcXpx49emjZsmXFHmPZsmUBXe1VWdA3I983AYRfWWOfZVnat2+f903jxo0biy2pKDH2kcuhQ7+MfL8EEH5ljX116tRRSkqKHn30UV122WVKSUnRokWLit3XnzEtVOOeZGbs8zXuSWRyJNE3I983AYRXMOcIS/PAAw/o/fffL/a90VVt7Atk3COXS6Jv2qNvAqHGBLdNFQ3Ct956q9555x199tlnSkpK0uLFi/Xjjz/q/PPPV/fu3fXYY48pNja2xP3nzZsnt9utXr166d///re2bNmiTZs26fHHHy8WbP4eF2q5ublKS0vT7t27tXbtWs2cOVNDhgzR+eefrxEjRpQ4fsOGDXK5XHrppZf0/fff6+eff9all16qnJwcTZkyRVLhFUUul0udOnXy3icmJkZdunTx1vntt9906NChMgfhiRMn6rnnntPLL7+sTZs26cYbb1RWVpauueYa87+EKEHftEffzMzMVEpKilJSUiQVLgeTkpKinTt3mv0FAJBU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ZZddptatW6tatWo6/vjjdeutt+rw4cMVek4AAISD6UwGAACBIZMBALAP37lMJocTn+AGANiGw+mQw+njynQf+0ozcuRILVq0SOPHj1e7du20YMECnXfeeVqxYoX69u1b5v0yMzPVv39/HTlyRHfccYdiY2P1yCOP6IwzzlBKSorq1avnPfaZZ57RDTfcoKFDh2rixIn68ssvdcsttyg7O1tTpkzxHjd69Gg1adJE//jHP9SiRQtt3LhRTz75pD788EOtXbtWiYmJFXpuAACEkulMBgAAgSGTAQCwD1+5TCaHF5cTAABsw+l0yunycXP6H1urV6/WG2+8oVmzZmnOnDkaPXq0li9frpYtW2ry5Mk+7/vUU09py5Yt+uCDDzR58mRNmDBBn3zyiVJTU/Xwww97j8vJydGdd96pwYMHa9GiRRo1apQWLlyo4cOHa/r06Tp06JD32EWLFmnDhg365z//qeuvv16PPfaYnnvuOW3evFmvvfZaxX9ZAACEkMlMBgAAgSOTAQCwD5+5HEAmh2MF0vnz52vYsGFq0aKFHA6HRo4cWeF22hGvgAAAtuGMc5V789eiRYvkcrk0evRo77aEhARdd911WrVqlXbt2uXzvieffLJOPvlk77YOHTrozDPP1FtvveXdtmLFCh04cEBjxowpdv+xY8cqKytLS5Ys8W7r169fice5+OKLJUmbNm3y+3kBABAOJjMZAAAEjkwGAMA+TGfyyJEjNXfuXA0fPlyPPfaYXC6XzjvvPH311Vc+71e0Aunnn3+uO+64Q/fdd5/WrVunM844QwcOHCh27OzZs7V8+XJ16tRJMTGVZ2FvJrgBALbhcDrLvUlSenp6sVtubm6JWuvWrVP79u2VlJRUbHuvXr0kSSkpKaW2wePxaMOGDerZs2eJfb169dK2bduUkZHhfQxJJY7t0aOHnE6nd39Z0tLSJEn169f3eRwAAOHmbyZXRDiuTJekF154QR07dlRCQoLatWunJ554osQxP//8syZMmKBTTz1VCQkJcjgc2rFjR4WfEwAAoRaKTAYAAIExmcnhWIFUkj7//HPt379fH330keLj4yv8nO2KV0AAANvwueza/26S1Lx5c9WqVct7mzVrVolaqampaty4cYntRdv27NlTahsOHjyo3Nxcv+6bmpoql8ulhg0bFjsuLi5O9erVK/MxisyePVsul0uXXHKJz+MAAAg3fzO5IsJxZfozzzyj66+/Xp06ddITTzyhPn366JZbbtHs2bOLHbdq1So9/vjjysjIUMeOHSv8XAAACJdQZHKoLzrbtWuX7rvvPvXq1Ut16tRR/fr11a9fP3322WcVbisAAHZiMpPDsQKpJLVs2VIOR+X7fvDK81l0AEDUc8TGyBlXdjQ5LEtS4ZvlYz+ZXdqVZzk5OaVuT0hI8O4vTdF2f+6bk5OjuLi4UuskJCSU+RiS9Prrr+uFF17Q5MmT1a5duzKPAwAgEvzNZH8VXZk+Z84cTZo0SZI0YsQIde7cWZMnT9Y333xT5n2LrkxfvXq19837ueeeq86dO+vhhx/WzJkzJRXm8p133qnBgwdr0aJFkqRRo0bJ4/Fo+vTpGj16tOrUqSNJuvDCC3X48GHVrFlTDz30UJkruwAAEGmmM1kqvOhs0aJFGj9+vNq1a6cFCxbovPPO04oVK9S3b98y71d00dmRI0d0xx13KDY2Vo888ojOOOMMpaSkqF69epKk9957T7Nnz9ZFF12kq6++WgUFBVq4cKHOOussvfjii7rmmmsq3GYAAOzAVy5XNJP9WYG0efPmJe5XtALptddeW2Jfr1699MknnygjI0M1a9asUHuiDZ/gBgDYhr9LryUlJRW7lTYZnZiYWOrS5UePHvXuL03Rdn/um5iYqLy8vFLrHD16tMzH+PLLL3Xddddp0KBBmjFjRqnHAAAQSaaXQw3HlekrVqzQgQMHNGbMmGL3Hzt2rLKysrRkyRLvtrp161b6N/sAgMrBdCaHYznU/v37a+fOnXr99dc1duxYjRs3Tt988406dOige+65J6DfAwAAdmDq6zWl8KxAWpkxwQ0AsA2HyymHy+Xj5n9sNW7cWKmpqSW2F21r0qRJqferW7eu4uPj/bpv48aN5Xa7tW/fvmLH5eXl6cCBA6U+xvr163XhhReqc+fOWrRokWJiWEwFAGA//mayv2/c/bkyvTRFV6b37NmzxL5evXpp27ZtysjI8D6GpBLH9ujRQ06n07sfAIBoYvJ9shSei846deqk+vXrF7tvfHy8zjvvPP3+++/e7AYAINr4zmX/v15TCs8KpJVZ1E9wz5s3T61atVJCQoJ69+6t1atXl3nsggUL5HA4it2K/rMBAJHnio0p9+av7t2765dfflF6enqx7d999513f2mcTqe6dOmiNWvWlNj33XffqXXr1t5PfBXV+Ouxa9askcfjKfEY27Zt0znnnKOGDRvqww8/VI0aNfx+PtGATAaAysPfTPb3jXs4rkxPTU2Vy+VSw4YNix0XFxenevXqVYkr2IuQyQBQefibyXa66KwsaWlpqlatmqpVq1be0640yGQAqFz8yeRdu3bpyJEj3tvUqVNLrRWOFUgrs6ie4H7zzTc1ceJETZs2TWvXrlW3bt00aNCgEp+kO1ZSUpJSU1O9t99++y2MLQYA+FJ4BZzvm78uueQSud1uPfvss95tubm5eumll9S7d2/v95fs3LlTmzdvLnHf77//vtjE9c8//6zly5dr2LBh3m0DBgxQ3bp1NX/+/GL3nz9/vqpVq6bBgwd7t6Wlpenss8+W0+nUxx9/rAYNGvj9XKIBmQwAlYu/mezvG/dwXJmek5OjuLi4UuskJCRUiSvYJTIZACobfzPZThedlWbr1q165513NHToULlcLt9PupIgkwGg8vEnk/35ek0pPCuQVmZRvS7q3LlzNWrUKF1zzTWSpKefflpLlizRiy++qNtvv73U+zgcDjVq1Miv+rm5ucWugPjrpwABAGaVN4ldkQnu3r17a9iwYZo6dar27duntm3b6uWXX9aOHTv0wgsveI8bMWKEPv/8c1mW5d02ZswYPffccxo8eLAmTZqk2NhYzZ07V8nJybr11lu9xyUmJmr69OkaO3ashg0bpkGDBunLL7/Uq6++qhkzZqhu3breY8855xz9+uuvmjx5sr766it99dVX3n3Jyck666yz/H5udhTqTJbIZQAIJ38zuegNe3nCcWV6YmKi8vLySq1z9OjRKnEFu0QmA0Bl428m79q1q1gml3UyPRLLoWZnZ2vYsGFKTEzUAw88UNZTqXTIZACofHzlckW/NqR79+5asWKF0tPTi2W4yRVIK7Oo/QR3Xl6efvjhBw0cONC7zel0auDAgVq1alWZ98vMzFTLli3VvHlzDRkyRD/++GOZx86aNavYlY9Fn/YDAISGMyZGzlgftwp+X/XChQs1fvx4vfLKK7rllluUn5+vDz74QKeffrrP+9WsWVMrV67U6aefrvvvv1933323unXrps8//7zEJ6/HjBmjZ599Vhs3btTYsWP19ddf65FHHinxCbb169dLkh588EFdddVVxW4zZsyo0POym3BkskQu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+te/Shy3evVqjRkzRj169FBsbKwcDkdQz88kMhkAKie7ZLLH49HgwYP1+uuv66abbtKDDz6offv2qV+/ftqyZUu59//99991+umna+vWrZo5c6YmTZqkJUuW6KyzzlJeXp73uOeff17PPfecevbsqYcfflgTJ07Uzz//rFNOOUWfffZZKJ+iMWQyAFRedshkFIrKCe5Vq1apdu3a6tmzp3fbwIED5XQ69d133/m872uvvab69eurc+fOmjp1qrKzs8s8Njc3V+np6cVuAIDQ8ZTzAsHDiwTbCVcmS+QyAISTHTI5XCfSJenOO+/UlClTdNZZZ+mJJ55QixYtdOWVV+qNN94odtyHH36o559/Xg6HQ61btzb6fINFJgNA5WSHTJakRYsW6ZtvvtGCBQs0bdo0jR07VitXrpTL5dK0adPKvf/MmTOVlZWl5cuX65ZbbtEdd9yht956S+vXr9eCBQu8x11xxRXatWuXnn/+eY0ePVq33XabvvvuO9WtW1f33ntv6J6gQWQyAFRevnI5nOeuw3Ux+IwZM3ThhRcqOTlZDofDVlkcE+kGBCItLU0NGzYsti0mJkZ169ZVWlpamfe78sor1bJlSzVp0kQbNmzQlClT9PPPP+udd94p9fhZs2bpvvvuM9p2AEDZ8tweyV32Ui55PvYhMsKVyRK5DADhZIdMLjqR/vbbb+uSSy6RJF166aVq3769pk2bptdff93n/YtOpP/www9q0aKFJKlXr14666yztGDBAu8yobt379bDDz+ssWPH6sknn5QkXX/99TrjjDN02223adiwYXK5XJKkG2+8UVOmTFFiYqJuuukm/fLLL6F6+hVGJgNA5WSHTJYKczk5OVl///vfvdsaNGigSy+9VK+++qpyc3MVHx9f5v3//e9/6/zzz/dmslQ46du+fXu99dZb3lzu0aNHifvWq1dPf/vb37Ry5UpzTyiEyGQAqLx85XK4MrnoYvD169frtttuU/369fXUU0+pX79++uGHH9SuXTuf9y+6GLxWrVqaOXOmMjMz9dBDD2njxo1avXq14uLivMfeddddatSokU488UR9/PHHoX5qFWKrT3DffvvtcjgcPm+bN28OuP7o0aM1aNAgdenSRcOHD9fChQv17rvvatu2baUeP3XqVB05csR727VrV8CPXZq6ibHGau08ctRYLUk6q009o/U6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t99+u2bPnu3zmE2bNqlDB/MnKssydepUTZw40fuzx+PRwYMHVa9ePTkcDuOPl56erubNm2vXrl1KSkoyXj+Uorntkn3bb1mWMjIy1KRJE5/HNWnSRLt27VLNmjXpm39B20PD377pr4SEBG3fvl15eeVffRsXF6eEhAQjj4uykcv2/hssD203j0wOXjS3XbJv+8nkyo9Mtu/fnz9ou3lkshnR3H67tp1MrvzIZPv+/fmDtocGuRw82m6e6UyW/M9lMjl8bDPBfeutt2rkyJE+j2ndunVAtRs1aiRJ2rt3rxo3buzdvnfvXnXv3r3M+8XHxys+vviyTLVr1w6oDRWRlJRkq8GgIqK57ZI92+/PFUZOp1PNmjULeVvs+PvxF203z9TVb0USEhIIfxshl/9k179Bf9B2s8hkM6K57ZI9208mV25k8p/s+PfnL9puFplsTjS3345tJ5MrNzL5T3b8+/MXbTePXDaDtptlOpMlctlubDPB3aBBAzVo0CAktY877jg1atRIy5Yt874gSE9P13fffacbb7wxJI8JAEA0I5cBALAHMhkAAHsgkwEAsA9npBsQiJ07dyolJUU7d+6U2+1WSkqKUlJSlJmZ6T2mQ4cOevfddyVJDodD48eP1/3336///Oc/2rhxo0aMGKEmTZrooosuitCzAACgciCXAQCwBzIZAAB7IJMBAAgt23yCuyLuuecevfzyy96fTzzxREnSihUr1K9fP0nSzz//rCNHjniPmTx5srKysjR69GgdPnxYffv21dKlS221nEB8fLymTZtWYlmZaBDNbZeiv/2hFs2/H9oOhB65bD+0vfKK5t9PNLddiv72o2ogk+2Htlde0f77ieb2R3PbUXWQyfZD2yu3aP4d0XYgMA7LsqxINwIAAAAAAAAAAAAAgPJE5RLlAAAAAAAAAAAAAICqhwluAAAAAAAAAAAAAEBUYIIbAAAAAAAAAAAAABAVmOAGAAAAAAAAAAAAAEQFJrhtwO126+6779Zxxx2nxMREtWnTRtOnT5dlWZFuWglffPGFLrjgAjVp0kQOh0OLFy8uccymTZt04YUXqlatWqpevbpOPvlk7dy5M/yN/Yv58+era9euSkpKUlJSkvr06aOPPvpIknTw4EHdfPPNOv7445WYmKgWLVrolltu0ZEjRyLc6siib4YHfROwD8a98GDcqzj6ZnjQ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FX2Tvgn74xPcldjatWt12mmnqW3btsVudevW1Y4dO9SlSxddfvnlOuGEE5STk6NXXnlFJ598srp166aJEyd667z44ovq2rWrunXrpkmTJnm3z549W507d1aXLl302muvldmO+vXr69ChQ96f27ZtK4fDoZ9//rnYca1bt1bbtm29A6UkZWZmSpKWLFmilJQU7+2nn37SokWLvMddd911+ve//62MjAy99NJLatOmjc4444wSbTl48KAkqUGDBv7+GhEC9E36JlAVMfYx9tkR/ZJ+CVRFjH2MfXZF36RvAlUN4x7jnl3RN+mbiAKRWx0dobRt2zZLkvXVV1+Vun/79u2Wy+Wy1q9fb1mWZf3000/W0KFDrfz8fMuyLOuqq66yPvjgA2vDhg1W586drUOHDlmWZVkHDhywLMuyVq9ebZ100klWTk6OdeDAAat169bW7t27S32sOXPmWN26dSu27eyzz7aaNm1qZWZmljj+jDPOsMaNG2dZlmWlp6db8fHx1sKFC30+34yMDKtGjRrW008/bTVr1syaMWNGqcc9//zzVrNmzXzWQmjRN+mbQFXE2MfYZ0f0S/olUBUx9jH22RV9k74JVDWMe4x7dkXfpG8iOrBEeSX1ww8/SJKSk5NLfCdCw4YNJUnt27dX165dJUnLli3Tt99+q549e0oqXGaiR48e2rZtmy677DLVrl1b0p9LcHz99dcaOnSoEhISlJCQoDPPPFPff/+9hgwZUqItgwYN0tSpU3Xo0CHVqVNHkvTUU0/ptNNOU8+ePXXvvfeqa9eucjqd+v7777V582b16NFDklSzZk1NmjRJEyZMkMfjUd++fXXkyBF9/fXXSkpK0tVXXy1JqlGjhi677DJNnTpV6enpGjlyZKm/ly+//FJnn312oL9WGEDfHFnq74W+CVRujH0jS/29MPZFFv1yZKm/F/olULkx9o0s9ffC2Bd59M2Rpf5e6JtA5cW4N7LU3wvjXuTRN0eW+nuhb8JumOCupNauXStJateuXbHt8fHxSk9PlyRVq1bNu93j8WjUqFGaNm1aseMff/zxoNvSpUsXnXTSSXrrrbf0f//3f5KkNm3aaN26dZo5c6amTp2q33//XfHx8TrhhBM0adIkjRkzxnv/6dOnq0GDBpo1a5Z+/fVX1a5dWyeddJLuuOOOYo9z3XXX6YUXXtB5552nJk2a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6KCNGzcWWrZ+/Xo1b95csbGxPjVOX3fjxo3yeDzFfkYBy7K0e/duxcfH+7S7PDVNoYMbAGAboU7HyWFeiplCnfRwAwAQDKYzecOGDXrzzTc1bdo0TZ8+XSNGjNDKlSvVrFkzjRs3zu+2c+bM0Y4dO7R8+XKNGzdOo0eP1qeffqrU1FTNnDmzyG1efPFFpaSk6Pbbby9VOwEAsBvTmczNdAAAys5fLpc2kwcOHCi3260XX3zROy83N1cLFixQly5dlJSUJEnas2ePfvrpp0Lbfv311z65uG3bNq1cuVKDBg3yzrvssstUt25dzZ0712f7uXPnKioqSv369fPOO3jwYKE2zp07VwcPHlSfPn3KVLMi0cENALAN/8OunZwAAEDFM53JS5culcvl0ogRI7zzIiIidNttt2ndunVKSUnxu23nzp3VuXNn77y2bduqR48eevvttwutf+TIET388MP6+9//rtq1a5eqnQAA2I3pTOZmOgAAZWcyk7t06aJBgwZp/PjxGjdunF588UVddtll2r17t5566inveoMHD1a7du18th05cqRatGihfv36afr06frHP/6hXr16KSEhQffdd593vcjISE2ePFnLly/XoEGDNG/ePN1666167bXXNGHCBNWtW9e7brNmzTR06FDNmjVLc+bM0Y033qi7775bHTt21F//+tcy1axIIUH5FAAAAlDSUC6u4DUFAIAaLdBMPv3bX+Hh4UW+83Pz5s1q3bq14uLifOYnJydLkrZs2eK9oX4qj8ej7777TsOGDSu0LDk5WZ9++qnS09O93xiTpEceeUQNGzbUX//6V02ePLn4HwIAgCrA9HXyqTfTDxw4oJYtW2rRokXavXu35s+f711v8ODBWrNmjSzL8s4bOXKkXnrpJfXr10/333+/QkNDNWvWrGJvpt91110aNGiQevfurbVr1+q1117T448/Xuhm+nXXXacOHTooIiJCX3zxhd58881ib6YHUhMAgIriL5fLcu/6lVde0SOPPKJXX31VR48e1TnnnKPly5frkksu8btdbGysVq9erdGjR2vKlCnyeDzq1q2bZs+e7TMCinQyv0NDQzVz5kx98MEHSkpK0uzZszVq1Cif9W666SZ99dVXeuedd5STk+MdcW3ChAmKiooqU82KRAc3AMA2wpwOhfl50s1t8Q1uAACCIdBMPr1TeuLEiZo0aVKh9VNTU5WYmFhofsG8ffv2Ffk5R44cUW5ubonbtmnTRpL03Xff6YUXXtBHH30kl4tH4wAAVV9FXCdzMx0AgLLxl8tlyeSIiAhNnz5d06dPL3ad1atXFzm/SZMmWrJkSUCfM3z4cA0fPtzvOi+99FJAtUpTsyLRwQ0AsA2XSngy3Sp+GQAAMCfQTE5JSfH5VnZR396WpOzs7CKXRUREeJcXt11xdYva9p577tHll1+uP//5z8U3HgCAKqQirpO5mQ4AQNn4y2XuXQcXHdwAANtwlvCuEifv4AYAICgCzeS4uLhCw44XJTIyUrm5uYXm5+TkeJcXt52kgLZ966239NVXX+k///lPie0BAKCq4DoZAAD78JfLZHJw0cENALCNMKdDYc7iTwROiJMEAACCwXQmJyYmau/evYXmp6amSpIaNWpU5HZ169ZVeHi4dz1/244dO1aDBg1SWFiYdu/eLUk6duyYpJPfNM/Lyyv2cwAAsCuukwEAsA9/uUwmBxcd3AAA23A5Shh6jXMEAACCwnQmd+zYUatWrVJaWprPN77Xr1/vXV4Up9OpDh06aOPGjYWWrV+/Xs2bN1dsbKykk53Yixcv1uLFiwute/755+vcc8/Vli1bStdwAAAqGdfJAADYh79cJpODy1nZDQAAoIDrv0O8+JsAAEDFM53JAwcOlNvt1osvvuidl5ubqwULFqhLly5KSkqSJO3Zs0c//fRToW2//vprn07ubdu2aeXKlRo0aJB33nvvvVdouu666yRJr7zyimbPnl3q3wMAAJWN62QAAOyDTLYPvsENALANV4hTLmfxz165PFYQWwMAQM1lOpO7dOmiQYMGafz48Tpw4IBatmypRYsWaffu3Zo/f753vcGDB2vNmjWyrD/qjxw5Ui+99JL69eun+++/X6GhoZo1a5YSEhJ03333ede7+uqrC31uwTe2L7/8ctWvX79UbQYAwA64TgYAwD785TKZHFx0cAMAbMPpcsjp591iTp6CAwAgKCoik1955RU98sgjevXVV3X06FGdc845Wr58uS655BK/28XGxmr16tUaPXq0pkyZIo/Ho27dumn27NmKj48vdTsAAKhKuE4GAMA+/OUymRxcdHADAOzD5ZTDz5PpcvAUHAAAQVEBmRwREaHp06dr+vTpxa6zevXqIuc3adJES5YsKfVnTpo0SZMm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tsLCiv6GYERERLGfIUmLFy/W/PnzNW7cOLVq1cpn2QcffODz76FDh+ryyy/XrFmz9Le//a3Y91RXFjIZAKqfQN7BnZKS4vOt7KKyUyKTy6tKd3Bfd911OnjwoB599FHt379fHTt21Mcff6yEhARJJzstnM4/drSjR49q+PDh2r9/v+rUqaMLLrhAX331lc46y+z7IwEAZeMMCZUrtPjh65wnAn+xQ5cuXTRo0CCNHz9eBw4cUMuWLbVo0SLt3r1b8+fP9643ePBgrVmzRtYpQ0CPHDlSL730kvr166f7779foaGhmjVrlhISEnTfffd514uMjNTkyZN11113adCgQerdu7fWrl2r1157TY8//rjq1v3jPYjNmjXTddddpw4dOigiIkJffPGF3nzzTXXs2FF//etfA/657IpMBoDqxWQmS/7fLfbQQw8pJSWlyKHXCrb1926xgg7u9u0LDwcYHh6uvn37atasWd4h2qo7MhkAqpdAMznQm+mRkZFFfrs7JyfHu7y47SQFtG1kZKTy8ooeHjYnJ6fYz1i7dq1uu+029e7dW48//niR65zK4XBo9OjR+uSTT7R69Wq/Q6xWBjIZAKoff7lckMlxcXEBveaYTC6fKt3BLUl333237r777iKXrV692uffs2fP1uzZs4PQKgBAWZj+ttgrr7yiRx55xOddn8uXL9cll1zid7vY2FitXr1ao0eP1pQpU+TxeNStWzfNnj270LewR44cqdDQUM2cOVMffPCBkpKSNHv27ELvG7npppv01Vdf6Z133lFOTo6aNWumcePGacKECYqKMvSin0pGJgNA9RFoJtvp3WLF2b9/v6KioqpN3gaCTAaA6iPQTA70ZnpiYqL27t1baH5qaqokqVGjRkVuV7duXYWHh3vX87dtYmKi3G63Dhw44DMkal5eng4fPlzkZ3z77be66qqrdPbZZ2vp0qUKCQnstnXB+cORI2beG28amQwA1Usg3+AOFJlcPlW+gxsAUH2Y7uCOiIjQ9OnTNX369GLXOf2CskCTJk20ZMmSgD5n+PDhGj58uN91XnrppYBqAQBgB6aHQ63od4u1adOmyO1//vlnvfvuuxo0aJBcLlexPw8AAHZl+jq5Y8eOWrVqldLS0nw6xNevX+9dXhSn06kOHTpo48aNhZatX79ezZs39z5wVlBj48aNPq/z2rhxozweT6HP2Llzp/r06aMGDRroo48+UkxMTMA/zy+//CJJhR5GBwCgIpjs4CaTy6d0v20AACqQMzSkxAkAAFS8QDM5JSVFx48f907jx48vsl4w3i12uqysLA0aNEiRkZF64oknSviJAQCwJ9PXyQMHDpTb7daLL77onZebm6sFCxaoS5cu3ofX9uzZo59++qnQtl9//bXPDfVt27Zp5cqVGjRokHfeZZddprp162ru3Lk+28+dO1dRUVHq16+fd97+/fv15z//WU6nU5988kmxN8WPHDkit9vtMy8/P19PPPGEwsLC1L1791L9HgAAKAsy2T6ZTE8BAMA2HE6H/yfTnY4gtgYAgJor0Ey207vFTuV2u3X99dfrxx9/1L/+9a9ih3YDAMDuTF8nd+nSRYMGDdL48eN14MABtWzZUosWLdLu3bs1f/5873qDBw/WmjVrZFmWd97IkSP10ksvqV+/frr//vsVGhqqWbNmKSEhQffdd593vcjISE2ePFl33XWXBg0apN69e2vt2rV67bXX9Pjjj6tu3bredfv06aNffvlF48aN0xdffKEvvvjCuywhIUG9evWSJH3wwQeaMmWKBg4cqDPPPFNHjhzR4sWL9Z///EdTp05Vw4YNS/V7AACgLPzlMpkc3EymgxsAYBsOp1MOp78LdwYeAQAgGExncjDeLXaq4cOHa/ny5Xr99dd12WWXlaqtAADYSUVcJ7/yyit65JFH9Oqrr+ro0aM655xztHz5cl1yySV+t4uNjdXq1as1evRoTZkyRR6PR926ddPs2bMLfctr5MiRCg0N1cyZM/XBBx8oKSlJs2fP1qhRo3zW+/bbbyVJTz31VKHPu/TSS7030zt06KCzzjpLr732mg4ePKiwsDB17NhRb7/9ts831QAAqEj+cplMDm4m08ENALANR0iYHCFhfpZ7gtgaAABqLtOZHIx3ixUYO3asFixYoH/84x+64YYbStVOAADspiKukyMiIjR9+nRNnz692HVWr15d5PwmTZpoyZIlAX3O8OHDNXz4cL/rnPptNH8uuOACffDBBwGtCwBARfGXy2RycPFVOACAfTidJU8AAKDiGc7kYLxbTJKmT5+uGTNm6KGHHir0NDoAAFUS18kAANgHmWwbfIMbAGAbDpdLDpfL73IAAFDxTGdyMN4t9t5772ncuHFq1aqV2rVrp9dee82nDb16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r7744gu/22VkZKh79+5as2aNHnroIT322GPavHmzLr30Uh0+fNhn3RdeeEG333672rdvr2eeeUZdu3bVPffcoyeffLLMNQNBLgMAKpLpTJbslcsmkckAgIpU3TPZZE0yGQBQ0fznMplckdfepwu4g3vw4MFasmSJbrzxRj3++OP629/+ppUrV+rVV19V+/bt1b9/f+3du7ci21qk5557TmeccYYiIiLUpUuXEt+bsmTJErVt21YRERHq0KGDPvrooyC1FABQIqer5ClAGzZs0Jtvvqlp06Zp+vTpGjFihFauXKlmzZpp3LhxfredM2eOduzYoeXLl2vcuHEaPXq0Pv30U6WmpmrmzJne9bKzszVhwgT169dPS5cu1fDhw/XKK6/opptu0uTJk3X06NFS1wyUHXOZTAaAasRgJkv2y2WTyGQAQIWq5plssiaZDACocGRypV17ny7gDu5PP/1U77//vh555BGNGDFCo0aNUmhoqD766CP98ssvSkhIUHJysnbt2lWR7fXx1ltvacyYMZo4caI2bdqkc889V71799aBAweKXP+rr77SDTfcoNtuu02bN2/W1Vdfrauvvlr/+c9/gtZmAIAfBodeW7p0qVwul0aMGOGdFxERodtuu03r1q1TSkqK3207d+6szp07e+e1bdtWPXr00Ntvv+2dt2rVKh0+fFgjR4702f6uu+5SZmamPvzww1LXDJTdcplMBoBqxvBwqHbLZZPIZABAharmmWyyJpkMAKhwZHKlXXufLuDfdkJCgrKysopc1qxZM7344ou68847NWrUKGONK8msWbM0fPhwDR06VGeddZaef/55RUVF6eWXXy5y/aefflp9+vTR2LFj1a5dO02ePFnnn3++nn322SLXz83NVVpams8EAKg4/oddOzlJKnRszs3NLVRr8+bNat26teLi4nzmJycnS5K2bNlSZBs8Ho++++47derUqdCy5ORk7dy5U+np6d7PkFRo3QsuuEBOp9O7vDQ1A2W3XK7oTJbIZQAIJpOZLNkrl00jk8lkAKhI1TmTTdckk8lkAKhoZHLlXXufLuAO7rvvvlvDhg3Tt99+W+w6N998s1auXGmkYSXJy8vTN998o549e3rnOZ1O9ezZU+vWrStym3Xr1vmsL0m9e/cudv1p06apVq1a3ikpKcncDwAAKMRyukqcJCkpKcnn+Dxt2rRCtVJTU5WYmFhofsG8ffv2FdmGI0eOKDc3N6BtU1NT5XK51KBBA5/1wsLCVK9ePe96pakZKDvlcjAyWSKXASCYTGayZK9cNo1MJpMBoCJV50w2XZNMJpMBoKKRyZV37X26gDu4x4wZoyuvvFLnn3+++vTpo+eff14ej0eOU16a/uabb6p+/foV0tDTHTp0SG63WwkJCT7zExIStH///iK32b9/f6nWHz9+vI4fP+6d/A0HUBZn5ew0Vis+OsxYLUk6lJVntN6PamislsNttm1RGUX//y+L7LBaxmpVpjfCko3VOvH7r8ZqSZIzp3TfcvUnKS84B9qyigkt3ZAm/qSk5xurVZEsq+RJklJSUnyOz+PHjy9UKzs7W+Hh4YXmR0REeJcXpWB+INtmZ2crLKzo429ERITPeoHWDJSdcjkYmSxVbC4fimlqrJYktTxh7r1uu7JDjNWSpGgrx1itTE/p3i1UolK+q6gkSRFuo/Uqw+iLmxmr9fdjZxmrJUnObz82Wu9Eqz8ZqxW5Y62xWpKU5yp8/C6rxn+fY6xWRTKZyZK9ctk0MtlsJtfdU/xN/LI4Kz7KaL3th83tR4cizF0nS5Ijz1zbdj13hbFaktRs7JdG61WGvYavqWLCzF3v9Wtt9vjStXldY7Ve3/ibsVqSlPztV0brTb9gmNF6FaE6Z7LpmmSy+fvXI5aaGx49r/mFxmpJUqvDm4zVsvN1tyRd3cbcPvtGo6uN1aosrqNms0WhEcZKNfAcM1ZLKkUHXoBa14s0VmvroaJHzCirQ+cNMFqvopDJlXftfbpSHblnzJihQYMGacaMGbrvvvuUnZ2tc889V/Xr19fx48eVk5OjhQsXVlBTgy88PLzI/5n5DVop/7QhA8rC4Tmh1uWu8t9aJ3LVxtyxSfKckGTu4m1Hboy2qfCTH2XRvI7ZzvzQw7sUfWy3kVoHo5sqyxFrpJYkpTusUq3fe/0cxUaU/wZs6G1TlK2+5a4jSdHb18hz/JCRWpK0q7G5m99n5u1RUs4eY/WeTzF78+zO2F+M1dpWv7P2ZZwwVi8j01ytU3ksSx6r+P2+YFlcXFyhoVtOFxkZWeTwLzk5Od7lxW0nKaBtIyMjlZdX9EM3OTk5PusFWrM0yOWT6lhZirPK1zHqyMuSFWouSD2RtXWmPEZq7c11aW9eqJFaktQ4wqNoQxmfaYUa7eSOltmH2A4/PV6mjszunNK1LcplKdpVuhwviivzsCZ2ii53HUk6EFJPB2XuYY7sEx4p08x+LknNj/8gRZf/HFuS9tU9W8ox94DDhzsOG6t1e6M0NRtT9MVtWaSlZ0hzlxqrV8BkJkv2yuWKQCaftDv+AsXElu/vODbc+cedIQNW/nLUWC1JGtAyRqaula969QcjdQrMv/5cY7V+S8/TO08MNFavwT/u1p6Zq43USs8t3e//mr9/JmdY+c8Ifv57R+lYuct4tXv8R2O1rruirbFaktTzkWFqaajWhVOGSj9/baiaVGvC11LbbsbqLV74mJYZuv2VlW/ugfxTVedMroiaZPJJZzeupYjo8t+jvK/JEWnvd+WuI0lr1VwKP9tILUm6sGG4zjRUa3empd055jq5I0OckqF7ApIU4XLoilb1jNTac8NVMnkGkpFfunuEVni0rPDyXeMeiWpUru1PF7f+TWO1Qludp0QdMFZvT2wrY7UkqdmxH9TEUfJ6gfit7tlyGzxv35eep5QWZh6yzEyvuNc1+MtlMrnir71PVeqjdpcuXbRkyRLl5eVp06ZN2r59u9LS0lS/fn1ddtllhb6SXlHq168vl8ul33//3Wf+77//roYNi34KumHDhqVaHwAQXG7r5ORveaASExO1d2/hb9GmpqZKkho1KvpkuG7dugoPD/eu52/bxMREud1uHThwwCf/8vLydPjwYe96palZWnbIZTIZAKofk5ks2SuXKwqZDACoCNU5kysq58lkAEBF8ZfLZHJwrr0LlHmEg7CwMF144YUaPHiw7r77bl1//fVB69wu+PwLLrhAK1as8M7zeDxasWKFunbtWuQ2Xbt29Vlfkj777LNi1wcABJdlWSVOgerYsaP3IvZU69ev9y4vitPpVIcOHbRx48ZCy9avX6/mzZsrNjbWp8bp627cuFEej8e7vDQ1y6oyc5lMBoDqx2QmS/bK5YpGJgMATKrOmVzROU8mAwBMI5Ptc+1tegj/oBozZoxeeuklLVq0SFu3btWdd96pzMxMDR06VJI0ePBgn7HtR40apY8//lgzZ87UTz/9pEmTJmnjxo26++67K+tHAACcwmOVPAVq4MCBcrvdevHFF73zcnNztWDBAnXp0kVJSUmSpD179uinn34qtO3XX3/tE9Lbtm3TypUrNWjQIO+8yy67THXr1tXcuXN9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XHCBT+e2JNWrV0//8z//o61btxr6aQAAKBs7ZDIAADjJXy6TycFFBzcAwDbcHqvECQAAVLxAMzktLc1nKqnTuTQ2b96s888/X06n72VrcnKysrKytH379mK33bt3rw4cOKBOnToVWpacnKzNmzeX+Pn79+9X/fr1S99wAAAMstN18rFjxzRixAjFx8crOjpa3bt316ZNmwLefuvWrerTp49iYmJUt25d3XLLLTp48GCh9Twej5566imdeeaZioiI0DnnnKM33nij0DoLFy7UVVddpaSkJEVHR+vss8/WlClTlJOTU6imw+EocnriiSdK/4sAANRYZLJ9MpkhygEAtuH2yO+JgJuH4AAACIpAMzkpKcln/sSJEzVp0iQjbUhNTdUll1xSaH5iYqIkad++ferQoUOx25667unbHzlyRLm5uQoPDy9y+7Vr12rdunV6+OGHy9p8AACMsMt1ssfjUb9+/fTtt99q7Nixql+/vubMmaNu3brpm2++UatWrfxu/9tvv+mSSy5RrVq1NHXqVGVkZGjGjBn6/vvvtWHDBoWFhXnXnTBhgp544gkNHz5cnTt31vvvv68bb7xRDodD119/vSQpKytLQ4cO1YUXXqg77rhDDRo00Lp16zRx4kStWLFCK1eulMPh8GlDr169NHjwYJ955513nqHfEACgJvCXy2RycDOZDm4AgG3knfDI6WcolzyGeQEAICgCzeSUlBTFxcV55xfXYezxeJSXlxfQZ4eHh8vhcCg7O7vIehEREZKk7OzsYmsULCtp+6KWHzhwQDfeeKPOPPNMjRs3LqA2AwBQUexynbx06VJ99dVXWrJkiQYOHChJuvbaa9W6dWtNnDhRixcv9rv91KlTlZmZqW+++cb7+pDk5GT16tVLCxcu1IgRIySdHIVl5syZuuuuu/Tss89Kkm6//XZdeumlGjt2rAYNGiSXy6WwsDB9+eWXuuiii7yfMXz4cJ1xxhneG+o9e/b0aUPr1q118803G/udAABqHn+5TCYHN5MZohwAYBueEoZ48TBEOQAAQRFoJsfFxflMxXVw//vf/1ZkZGRA07Zt2yRJkZGRRQ55XjDEWWRkZLHtL1hW2u0zMzN1xRVXKD09Xe+//36hd3MDABBsdrlOXrp0qRISEnTNNdd458XHx+vaa6/V+++/X+JrSt555x1dccUV3hvpktSzZ0+1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Y78ncT6Si/2e/9g2/8S2CZQfnI+cYvp8hP1e8Ng2T2HbRFnHE9w2VadOHaWlpSklJUUej0ejR4/W4MGDFR0drdatW+vcc89VpUqV1Lp1a/Xv3z/Pso0aNZLD4dBPP/3k8zP8nS9QXbt21aZNm7R9+3ZlZGTotddeK7CbDn9s3bpVZ599doHTNm3alOekR5L+97//qU6dOjrjjDO887Rq1co7ffPmzfmCrKA6klS9enW5XC7t378/z/j9+/erZs2axfg2ZQPb5ikluW0CCK/C9ns1a9bU9u3b1bt3b7Vt21adOnUq8m7gTp06qWfPnho/fnye8aHa70nm9n2+9nsSuVwS2DZPKeltE0D4+NrvdezY0fuU0oYNG9SvXz+ftQrb70mcj/iqI5HJBWHb/BPnykD5Ecw1wr/ifOTPfV+g+z1yOT+2zVNKetsEQo0GbpuqU6eOJOmPP/7Qvffeq3379umZZ55RlSpVtGnTJj355JMaNGiQNm3apEWLFuVZtmrVqurZs6eee+45paen56t97NixgOYLVIUKFdSwYUOdeeaZiogoficBS5cu1XfffVfgyd+JEye0fft2ud1u7ziPx6OnnnpKQ4cOlSSlpKRo586d3h3s8ePHtXPnTrVp0yZPrcJ2wlFRUWrbtq2WLFmS5zOWLFlSrLu9ygq2zZLfNgGEV2H7vczMTI0cOVIvvPCC1q9fr+uvv14vvvhikfUeffRRffTRR3nehRWq/Z5kZt/na78nkcslhW3THtsmgPApbL9nWZYOHDjgvYj73Xff5eniuDAF7fckzkdykcn+Y9s8paS3TQDhFcw1woJwPtK6WPs9cjk/tk17bJtAqNHAbVO5O+F77rlH7733nr788kslJCR4p//www8677zzCl3+ueeek9vtVlJSkt59911t375dW7du1dNPP50n2PydL9QyMzO1b98+7d69Wxs2bNDUqVPVt29f9enTR0OGDMk3/5YtW+RyuTR37lytXbtW27Zt08CBA5WRkaF7771X0qk7ilwul5o1a+ZdJiIiQi1atPDW+f3333X06NFCd8J33323XnrpJb322mvaunWrbrvtNqWnp2vYsGHmf4RSgm3THttmWlqaNm3apE2bNkk61R3Mpk2btGvXLrM/AIBC93sffPCBfvjhB/Xp00etW7fWU089pcjIyCLrtWjRQoMHD9bTTz+d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sjvG3HXT6DizueeMMnfMYPIcXpLSDbQdnM7kfjk6Ls1YrdOF81zZ5PV8SUqoUPi1qEBVMPxKJOPf1eA1oRjT57YG/z/kCkV3+L5yuTiZnJmZqQceeEBvvPGGjh49qpYtW+rhhx9Wjx49ilx29+7dGj16tD7//HN5PB517dpVs2bNUoMGDfLMV9jvMG3aNN13333FqmkHoWnxsKGOHTtqyZIlecZ98cUX6tixYwmtEQDgr1wOR5FDIDIzM3Xvvfeqdu3aio2NVYcOHfTFF1/4tezu3bs1cOBAVa5cWQkJCerbt69+/fVXn8t88803cjgccjgcOnToUEDrWp6QyQBgf/5mckJCQp6hsAbu2NjYPO+HzHXy5Env9MKWkxTwsm63W9dee61+/PFHLVq0SLVr1/bjW5dP5DIA2Jvp82TYF5kMAPZnOpOHDh2qmTNnavDgwXrqqafkcrnUq1cvffON717u0tLS1LVrV61YsUITJkzQlClTtHHjRnXu3FmHDx/ON3+PHj30xhtv5BmuuOKKoGqWtFL7BHdaWpp++eUX779/++03bdq0SVWrVtWZZ56p8ePHa/fu3Xr99dclSbfeequeffZZjRs3TjfddJOWLl2qBQsW6OOPPy6prwAA+Isop0NRPg4ELMshP14/5jV06FAtWrRId911lxo1aqR58+apV69eWrZsmS6++OJCl8sN8+PHj2vChAmKjIzUrFmz1LlzZ23atEnVqlXLt4zH49E///lPVahQQenp6f6vZBlAJgNA2WM6k2vVqqXdu3fnG79376nXMBTWAF21alVFR0d75/N32eHDh2vx4sV66623dOmlZructDtyGQDKFtOZjPAhkwGg7PGVy4Fm8po1a/T2229r+vTpGjNmjCRpyJAhat68ucaNG6eVK1cWuuzs2bO1fft2rVmzRu3bt5ckXX755WrevLmeeOIJTZ06Nc/8jRs31g033OBzfQKtWdJK7RPc69atU5s2bdSmTRtJ0t133602bdrogQcekHTqYseuXbu885999tn6+OOP9cUXX6hVq1Z64okn9PLLL6tnT7PvRAAAFJ/LUfTgr9wDhGnTpmn69OkaMWKEli5dqvr162vcON/viMkN88WLF2vcuHHebln27t2rJ554osBlXnzxRSUnJ+uWW8y+U6o0IJMBoOwxmcmS1Lp1a/38889KSUnJM3716tXe6QVxOp1q0aKF1q3L/z761atXq0GDBvneqzZ27FjNnTtXs2bN0nXXXRfYipYB5DIAlC2mMxnhQyYDQNljMpMXLVokl8ulESNGeMfFxMTo5ptv1qpVq5ScnOxz2fbt23sboiWpSZMm6tatmxYsWFDgMhkZGd6e0EzVLEml9gnuLl26yLIK78x+3rx5BS6zcePGEK4VACAYRXXl4pL/Rwm+DhAmTJig5ORk1atXr9BlfYX5X+9WO3LkiP71r3/pwQcf1IEDB/xex7KCTAaAssdkJktS//79NWPGDL344oveO9MzMzM1d+5cdejQwZvJu3bt0okTJ9SkSZM8y953331at26d2rVrJ0natm2bli5d6q2Va/r06ZoxY4YmTJigUaNGBbSOZQW5DABli+lMRviQyQBQ9vjK5dxM/uuN3dHR0QW+zmvjxo1q3LhxvvfSJyUlSZI2bdpU4PVrj8ejLVu26Kabbso3LSkpSZ9//rlSU1Pz3Aw+b948zZ49W5ZlqWnTpvrXv/6l66+/PqiaJa3UNnADAMqeCIdDkT5O3N0BHCSE8wBh4sSJqlmzpv7xj3/ooYceKuJbAgBgf/5msr86dOigAQMGaPz48Tpw4IAaNmyo1157TTt37tQrr7zinW/IkCFasWJFnovBI0eO1EsvvaTevXtrzJgxioyM1MyZM5WYmKh77rnHO9/777+vcePGqVGjRmratKnefPPNPOvQo0cPJSYmBrTeAACUNNOZDAAAis9XLudm8l+vOU+aNEmTJ0/ON//evXtVq1atfONzx+3Zs6fAzzly5IgyMzOLXPbcc8+VJF144YUaOHCgzj77bO3Zs0fPPfecBg8erOPHj+u2224rVk07oIEbAGAbRXXl4vr///pzkBCuA4QtW7bohRde0CeffCKXy5VvGQAASiN/MzkQr7/+uiZOnKg33nhDR48eVcuWLbV48WJ16tTJ53Lx8fFavny5Ro8erYcfflgej0ddunTRrFmzVKNGDe98mzdvliRt375dN954Y746y5Yto4EbAFDqhCKTAQBA8fjK5dxMTk5OzvPQVUFPb0unugwvaFpMTIx3emHLFVa3oGW//fbbPPPcdNNNatu2rSZMmKChQ4cqNjY24Jp2QAM3AMA2Th0g+Op67RR/DhLCdYBw55136vLLL9ff/va3QtcbAIDSxt9MDkRMTIymT5+u6dOnFzrP8uXLCxxft25dLVy40Gf9yZMnF3hXPAAApVkoMhkAABSPr1zOzeSEhIR8vYoWJDY2VpmZmfnG574nOzY2ttDlJBVrWUmKiorSHXfcoVtvvVXr16/XxRdfHHTNkkADNwDANqKcDkX5OHH3WKem+XOQEI4DhHfeeUcrV67U999/73NdAAAobfzNZAAAEFpkMgAA9uErlwPN5Fq1amn37t35xu/du1eSVLt27QKXq1q1qqKjo73zBbJsrtweUo8cOWKsZrjRwA0AsA1nEV2vOQOoFY4DhLFjx2rAgAGKiorSzp07JUnHjh2TdOop86ysLNsFPwAA/jCZyQAAoPjIZAAA7MNXLgeaya1bt9ayZcuUkpKS52Gu1atXe6cX+DlOp1q0aKF169blm7Z69Wo1aNBA8fHxPj/7119/lSTva79M1Aw3joEAALbhcjiKHPzVunVr/fzzz0pJSckz3uQBQnJysubPn6+zzz7bOzz11FOSpPPPP1+9evXye30BALATk5kMAACKj0wGAMA+TGZy//795Xa79eKLL3rHZWZmau7cuerQoYP3Ketdu3bpp59+yrfs2rVr81zD3rZtm5YuXaoBAwZ4xx08eDDf56ampurJJ59U9erV1bZt24Br2gVPcAMAbCPKKUX5OA5wW/7X6t+/v2bMmKEXX3xRY8aMkVT4AcKJEyfUpEmTPMved999Wrdundq1ayfpzzDPrSVJ77//fr7Pffvtt/XOO+/o9ddfV926df1fYQAAbMRkJgMAgOIjkwEAsA9fuRxoJnfo0EEDBgzQ+PHjdeDAATVs2FCvvfaadu7cqVdeecU735AhQ7RixQpZ1p8fMHLkSL300kvq3bu3xowZo8jISM2cOVOJiYm65557vPM999xz+uCDD3TFFVfozDPP1N69e/Xqq69q165deuONNxQVFRVwTbuggRsAYBtF3enmkv93wYXjAOGqq67K97mbNm2SJF1++eWqXr263+sLAICdmMxkAABQfGQyAAD24SuXi5PJr7/+uiZOnKg33nhDR48eVcuWLbV48WJ16tTJ53Lx8fFavny5Ro8erYcfflgej0ddunTRrFmzvN2OS9JFF12klStX6uWXX9bhw4dVoUIFJSUl6dVXX9Wll15arJp2QQM3AMA2XPL9bjFXgHfBhfoAAQCAssp0JgMAgOIhkwEAsA9fuVyc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1K/ySk5O1pQpU5SUlKQqVaqoevXq6tKli7788st89QrqSSR32LdvX8DfLdRKbQN3VlaW1q9fr+7du3vHOZ1Ode/eXatWrSp0ubS0NNWvX1/16tVT37599cMPPxQ6b2ZmZr6DQwBA6DgcTjmcPgZHYLFlpwOEsiwcmSyRywAQTv5msp0upoNMBoCyyN9MrlevnipVquQdpk2bVmC9vXv3qlatWvnG547bs2dPgcsdOXJEmZmZfi27d+9euVwunXHGGXnmi4qKUrVq1fJ8RpUqVXTHHXfohRde0KJFi3TLLbfonXfe0SWXXFKq84VMBoCyyWcuB3jtWgr9q7w+/PBDPfbYY2rYsKEefvhhTZw4UampqerRo4fmzp1bYO0HH3xQb7zxRp6hcuXKAX+3UCu1j8IdOnRIbrc7311siYmJ+umnnwpc5txzz9Wrr76qli1b6vjx45oxY4YuvPBC/fDDD6pbt26++adNm6YpU6aEZP0BAPkV9a6SQN9jMnToUC1atEh33XWXGjVqpHnz5qlXr15atmyZLr744kKXyz1AOH78uCZMmKDIyEjNmjVLnTt31qZNm1StWjVJfx4gXHXVVfr73/+unJwcvf766+rRo4deffVVDRs2LKD1La3CkckSuQwA4eRvJterVy/P+EmTJmny5Mn55g/1xfRzzz230HUtT8hkACh7/M3k5OTkPDeSFfaqjoyMjAKn5b7rOSMjo9DlCqv712UzMjIUFRVVYJ2YmJg8nzFq1Kg80/v166ekpCQNHjxYs2fP1n333VdgHbsjkwGgbPKVy4Feu859ldf06dM1ZswYSdKQIUPUvHlzjRs3TitXrix02dxXea1Zs8bb29nll1+u5s2b64knntDUqVMlSV27dtWuXbtUvXp177K33nqrWrdurQceeKDA69eXX355gTeZ202pfYK7ODp27KghQ4aodevW6ty5s9577z3VqFFDL7zwQoHzjx8/XsePH/cOvrrNK46x26sXPZOfLs783lgtSapV0ez76t6v1s1YrXrfvW+sliSZ7MHwQHqOuWIl6PZrzzNWa+BnhXe7VBznDXqi6Jn89NFdFxmrJUl3v7HeaL3VRyON1Vo/vq2xWqHkiooocvBXON71mXuAMH/+fN1+++0aNWqUVq5cqSZNmuiBBx4o9u9QHgSayVJoc/lklbOM1ZKklzvHGqt184YK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DybWBwBQjvnudu3UAN/IZQCACWRy8MhkAIAJZHLwyGQAgClksn0Y6aL8hx9+UJs2bdS4cWPFxcXJsiw5HA6tWbPGRHkAQHnhjJBcPqLJaSS2yjxyGQAQNDLZCDIZABA0MtkIMhkAYISvXCaTw8rIr/3RRx+ZKAMAKO/oes0IchkAEDQy2QgyGQAQNDLZCDIZAGAEXZTbhpFfu379+gUOAAAEJPcAwdcQgMzMTN17772qXbu2YmNj1aFDB33xxRd+Lbt7924NHDhQlStXVkJCgvr27atff/21wHlfeeUVNW3aVDExMWrUqJGeeeaZgNbTNHIZABA0w5kslc9cJpMBAEErB5kcSM3iIpMBAEaQybbh96+dmpqqe+65R02bNlWNGjXUsGFD9erVS4888oh++umnUK6jT88995zOOussxcTEqEOHDkV2K7Nw4UI1adJEMTExatGihT755JMwrSkAoCiW0yXLGeFjcAVUb+jQoZo5c6YGDx6sp556Si6XS7169dI333zjc7m0tDR17dpVK1as0IQJEzRlyhRt3LhRnTt31uHDh/PM+8ILL+iWW25Rs2bN9Mwzz6hjx46688479dhjjwX8/QNhx1wmkwGg7DCdyVLZzWUyGQAQSmU9kwOpWRQyGQAQar5zmUwOJ7+7KB8yZIjWr1+v4cOHKzExURkZGbr33nv166+/6oEHHlCfPn00e/Zs1alTJ5Trm8c777yju+++W88//7w6dOigJ598Uj179tS2bdt0xhln5Jt/5cqVuu666zRt2jT16dNH8+fP11VXXaUNGzaoefPmYVtvAEAhHI5Tg6/pflqzZo3efvttTZ8+XWPGjJF0KsuaN2+ucePGaeXKlYUuO3v2bG3fvl1r1qxR+/btJUmXX365mjdvrieeeEJTp06VJGVkZOj+++9X7969tWjRIknS8OHD5fF49NBDD2nEiBGqUqWK3+scCLvlMpkMAGWMwUyWynYuk8kAgJAq45nsb01/kMkAgJDzlctkclj5/QT3559/rg8//FATJ07UiBEjNGrUKEVGRuqTTz7Rr7/+qsTERCUlJem3334L5frmMXPmTA0fPlzDhg3Teeedp+eff15xcXF69dVXC5z/qaee0mWXXaaxY8eqadOmeuihh3T++efr2WefDds6AwB8MNj12qJFi+RyuTRixAjvuJiYGN18881atWqV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xqb3ZPLqek56YDcTVolxKT42uHPlhE+fDmr5fK4crayY+kZKRR/YZqROrtRqjYweG8f/sV46y8x1htfS6ks/HTJSS5KGOL4zVsuZZvaBjNP5yuVwXLuW7Hn9un79+ho0aJBatGihmJgYffPNN3r77bfVunVr/eMf/wjJ72CrBu4aNWqoRo0aRc7XsWNHHTt2TOvXr1fbtqcaqJYuXSqPx+MNfn9s2rRJUsF3DwIAws9teeT2FH4g4DZ8F2RBXC6XPvnkE40dO1ZPP/20MjIy1L59e82bN0/nnntukcvXq1dPK1as0N1336377rtPUVFR6t27t5544ok8J525GbRq1SqtWrUqX53ffvutRBu4yWQAKN9MZ7Ldu12zMzIZAMo3fzM5kPd9fvXVV+ratatf827dulVNmjQJW88qwXyOJI0ePVoTJ07Ul19+abyBm0wGAPjK5XBcu5bsef168ODBWrlypd59912dPHlS9evX17hx43T//fcrLi7OzBf/C1s1cPuradOmuuyyyzR8+HA9//zzys7O1h133KFrr73Wexf/7t271a1bN73++utKSkrSjh07NH/+fPXq1UvVqlXTli1bNHr0aHXq1EktW7Ys4W8EAJAkTxFduXjC1M1LlSpV9PLLL+vll1/2Od/pd76drlmzZvrss898Ljtv3jzNmzevmGtoH2QyAJRNdsjk/v37a9GiRXrvvffUv39/Sb67XZOU5+mmfv366bXXXlNycrL3XeG53a6NHj065OsfbmQyAJRNochkO/esUqtWLS1btkyWZeXpptyfz5FONYBXq1ZNR44c8TlfKJHJAFB2+crlcF27lux3/fqll17yaz6TSmUDtyS99dZbuuOOO9StWzc5nU7169dPTz/9Z9cU2dnZ2rZtm06cONUVQVRUlL788ks9+eSTSk9PV7169dSvXz/961//KqmvAAD4i8wcSx4fXblk54TvIAH+I5MBoOyxQyaHq9s1SXrjjTf0+++/e7Pqq6++0sMPPyxJuvHGG1W/vpkuC0ONTAaAsicUmWznnlVat26tl19+WVu3btV5552X53Nyp/uSmpqqQ4cO+fWkdSiRyQBQNvnKZa5dh1epbeCuWrWq5s+fX+j0s846S5b158aU+8g9AMC+3B5LTh93uvm6ax0lh0wGgLLHDpkcrm7XJOmVV17Jk03Lli3TsmXLJEkX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WdKpHki7du3q17xbt25VkyZNwtYDaUGqVq2qYcOG6dFHH9Uff/yhunXrBl2zuGjgBgDYhsfjlqOET9z79++vRYsW6b333lP//v0lSYcOHdLChQt1xRVX5LnTbMeOHZKkc845xzuuX79+eu2115ScnKx69epJkpYsWaKff/5Zo0ePliSdccYZev/99/N99tNPP61Vq1bp3//+d4FdugAAEC52yORFixZp5cqVWrhwoTeTBw4cqMaNG2vSpEmaP3++z+WnTp2q9PR0rV+/XmeeeaakU+//6tGjh+bNm6cRI0ZIkq677jpNnjxZFStW9C570003qWnTppo8eTIN3ACAEmWHTAYAAKf4yuXiZLJdeyD1Jfea95EjR1S3bl0jNYujVDZwP/LII/r444+1adMmRUVF6dixY0UuY1mWJk2apJdeeknHjh3TRRddpDlz5hR51z8AIHw8OdlyWI5Cp1vu0He91r9/f11wwQUaNmyYfvzxR+/TYm63O9/7srt16yZJ2rlzp3fchAkTtHDhQnXt2lWjRo1SWlqapk+frhYtWmjYsGGSpLi4OF111VX5PvuDDz7QmjVrCpxmZ+QyAJQ9dsjkRYsWKTExUddcc413XI0aNTRw4EC9+eabyszM9HmS/O6776pPnz7exm1J6t69uxo3bqwFCxZ4G7jbtm2bb9lq1arpkksu0fLly819oTAgkwGg7LFDJiNwZDIAlE2+crk4mWzXHkh9+fXXXyXJ++ovEzWLo/AXuNhYVlaWBgwYoNtuu83vZR5//HE9/fTTev7557V69WpVqFBBPXv29D4eDwAoeZbHXeQQai6XS5988okGDRqkp59+2tsl6tKlS3XuuecWuXy9evW0YsUKnXPOObrvvvv0+OOPq1evXvriiy9CcqeaHZDLAFD2+JvJKSkpeYaCuiQrro0bN+r888/Pc8IunXoK+8SJE/r5558LXXb37t06cOBAge/QTkpK0saNG4v8/H379ql69eqBr3gJIpMBoOyxw3kyAkcmA0DZZIdM7t+/v/bv36/33nvPO85XD6S5vZDm6tevnxYvXqzk5GTvuNweSAcMGOAdd/DgwXyfvXv3br366qtq2bJlnh5I/a1pUql8gjv3Cbp58+b5Nb9lWXryySf1r3/9S3379pUkvf7660pMTNQHH3yga6+9tsDlMjMz81ygOX78uCQpJS09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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "fig, axes = plt.subplots(3,4, figsize=(24,10))\n", "plt.subplots_adjust(hspace=0.5)\n", @@ -278,9 +464,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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d9daOJZakaQXXnhBnTt3VlxcnDp06KAnnnii1DFvv/22rrzySrVt21YJCQk69dRTddttt+n48eOV+pkAAAgH05kMAAACQyYDAGAfPnO5kpm8bNkyuVwujR8/3rMtLi5O119/vdavX6/U1FSf5/bu3dszaS1JnTp10qBBg7RkyRKvY1u3bl2lXi8wcQ0AsA2ny1nhozLGjBmj+fPn65prrtFjjz0ml8uliy66SJ999pnP80qWWlm7dq2mT5+umTNnavPmzTr33HN15Ij3d6A9++yzuuGGG9SlSxc98cQT6tevn26++WY9+OCDXseNHz9e27Zt05///Gc9/vjjuuCCC/Tkk0+qX79+ys01uyQmAADBMp3JAAAgMGQyAAD24U8mZ2RkeD3y8/PLrLV582Z17Nix1Nfa9OnTR5KUkpJS5nlut1tbt25Vr169Su3r06ePdu/ercxMM1+PGwksFQ4AsA1njFNOH9/l63T6/4Y8HEut5Obm6q677tLQoUO1bNkySdK4cePkdrs1a9YsjR8/XvXr15d08i64AQMGeD1Pz549NXr0aL322mu64YYb/P7ZAAAINZOZDAAAAkcmAwBgH75yuSSTW7Zs6bV9xowZuvfee0sdn5aWpqZNm5baXrLtwIEDZT7P0aNHlZ+fX+G5p556avk/iI3xygYAYBsm7yQPx1Irq1ev1pEjRzRhwgSv8ydOnKjs7Gy9//77nm2/nbSWpMsuu0yStG3bNr9/LgAAwoFPdwEAYA9kMgAA9uFPJqempurEiROex7Rp08qslZubq9jY2FLb4+LiPPvLO09SQOdWBbyyAQDYh8shh4+HXCe/i8Of5VbCsdTK5s2bJanUsT179pTT6fTsL096erokqVGjRj6PAwAg7PzMZAAAEGJkMgAA9uFHJicmJno9yppglqT4+Pgyr2vn5eV59pd3nqSAzq0KmLgGANiGK8olV7SPR5RL0snlVurWret5zJkzp1StUC+1UvIcLpdLjRs39jouJiZGDRs2LPc5Sjz44INyuVwaMWKEz+MAAAg3fzMZAACEVigyOT8/X3fccYeaNWum+Ph49e3bV5988olf5+7fv19XXHGF6tWrp8TERA0bNkw//PCD1zGpqamaOXOm+vTpo/r166tRo0YaMGCA/v3vf1e6rQAA2InPXK5kJjdt2lRpaWmltpdsa9asWZnnNWjQQLGxsQGdWxXwHdcAANtwuhxy+rhb3Ok+uS81NdXrk9Rl3bUWjqVWcnNzFRMTU2aduLg4n0uyvP7663rhhRc0depUdejQodzjAACIBH8zGQAAhFYoMnnMmDFatmyZbrnlFnXo0EGLFy/WRRddpNWrV+ucc84p97ysrCwNHDhQJ06c0PTp0xUdHa1HHnlE5557rlJSUtSwYUNJ0rvvvqsHH3xQf/zjHzV69GgVFRXp5Zdf1vnnn68XX3xRY8eOrXSbAQCwA1+5XNlM7tGjh1avXq2MjAyva90bNmzw7C/zeZxOde3aVZs2bSq1b8OGDWrbtq3q1KlTqbbYCZ+4BgDYhq/lzzxLrsi/5VbCsdRKfHy8CgoKyqyTl5dX7nOsW7dO119/vYYMGaL777+/zGMAAIgkfzMZAACElulM3rhxo9544w3NmTNHc+fO1fjx47Vq1Sq1bt1aU6dO9XnuggULtGvXLq1YsUJTp07V5MmT9fHHHystLU3z5s3zHDdw4EDt27dPr7/+uiZOnKhJkybp888/V6dOnfT3v/89oN8DAAB2YDKTR4wYoeLiYj333HOebfn5+Vq0aJH69u2rli1bSpL27dun7du3lzr3yy+/9Jq83rFjh1atWqWRI0cG8RNGHp+4BgDYhivGKVd0+UuquBxuv2s1bdpU+/fvL7Xd5FIrTZs2VXFxsQ4dOuS1XHhBQYGOHDlS5nNs2bJFl156qU4//XQtW7ZMUVFEMQDAfkxmMgAACJzpTF62bJlcLpfGjx/v2RYXF6frr79e06dPV2pqqudCeVnn9u7dW7179/Zs69SpkwYNGqQlS5Zo9uzZkqQuXbqUOjc2NlYXXXSR5s+fr8zMzCr9STAAQM3lK5crm8l9+/bVyJEjNW3aNB06dEjt27fXSy+9pL179+qFF17wHDdq1CitXbtWlmV5tk2YMEHPP/+8hg4dqttvv13R0dGaP3++kpOTddttt3k9z3vvvactW7ZIkgoLC7V161bdd999kqRLL71U3bp1q1S7Q42r5QAA23A4HXI4y78zzde+3wrHUislNTZt2qSLLrrIc9ymTZvkdrtLPcfu3bt1wQUXqHHjxvrggw9Uu3Ztv38eAADCyWQmAwCAwPmbyRkZGV7bY2Njy1ydbPPmzerYsaPX+2RJ6tOnjyQpJSWlzIlrt9utrVu36rrrriu1r0+fPvr4448rnJBOT09XQkKCEhISyj0GAAA785XLgbxPfvnll3XPPffolVde0bFjx9StWzetWLFC/fv393lenTp1tGbNGk2ePFn33Xef3G63BgwYoEceeURJSUlex7711lt66aWXPP/evHmzNm/eLElq0aKF7SauWSocAGAbTqdTTpePh9P/2ArHUivnnXeeGjRooKefftrr/KeffloJCQkaOnSoZ1t6err+8Ic/yOl06qOPPir1AgIAADsxmckAACBw/mZyy5YtVbduXc9jzpw5ZdZLS0tT06ZNS20v2XbgwIEyzzt69Kjy8/MDOleSvv/+e7399tsaPny4XK7yP0EOAICd+czlAN4nx8XFae7cuUpLS1NeXp42btyoIUOGeB2zZs0ar09bl2jRooWWLl2qEydOKDMzU++9957at29f6rjFixfLsqwyH2PGjKl0m0ONT1wDAGzDGeOSM6b8N7BO+b/cSjiWWomPj9esWbM0ceJEjRw5UkOGDNG6dev06quv6v7771eDBg08x15wwQX64YcfNHXqVH322Wf67LPPPPuSk5N1/vnn+/2zAQAQaiYzGQAABM7fTE5NTfX6FHVZn7aWpNzc3DL3xcXFefaXd155dSs6NycnRyNHjlR8fLweeOCB8n4UAABsz1cu8z7ZDCauAQC24XA65fBxZ5qvfWUJx1IrEyZMUHR0tObNm6d//vOfatmypR555BFNmjTJ67iS7xF56KGHSj3fueeey8Q1AMBWTGcyAAAIjL+ZnJiYWGr577LEx8crPz+/1Pa8vDzP/vLOk1Tpc4uLi3XVVVfpu+++07/+9S81a9aswjYCAGBXvnKZ98lm8FsEANiGz+XP/veojHAstSJJ48aN0/bt25Wfn6/vv/9et9xyixwO7+80KW85FsuytGbNmkr9XAAAhJrpTJZOXui+44471KxZM8XHx6tv37765JNP/Dp3//79uuKKK1SvXj0lJiZq2LBh+uGHH8o89oUXXlDnzp0VFxenDh066Iknnih1zI4dOzR58mSdffbZiouLk8Ph0N69eyv9MwEAEGqmM7lp06ZKS0srtb1kW3kTyw0aNFBsbGylzx03bpxWrFihxYsX67zzzqtUWwEAsBvT75NRGr9FAIBtOKKj5Iwp/+GIZqEQAADCIRSZPGbMGM2fP1/XXHONHnvsMblcLl100UVeX59RlqysLA0cOFBr167V9OnTNXPmTG3evFnnnnuujhw54nXss88+qxtuuEFdunTRE088oX79+unmm2/Wgw8+6HXc+vXr9fjjjyszM1OdO3eu9M8CAEC4mM7kHj16aOfOncrIyPDavmHDBs/+sjidTnXt2lWbNm0qtW/Dhg1q27at6tSp47V9ypQpWrRokR555BH96U9/qlQ7AQCwI1+5zLVrM5i4BgDYRslSK74eAAAg9Exn8saNG/XGG29ozpw5mjt3rsaPH69Vq1apdevWmjp1qs9zFyxYoF27dmnFihWaOnWqJk+erI8//lhpaWmaN2+e57jc3FzdddddGjp0qJYtW6Zx48bp5Zdf1jXXXKNZs2bp2LFjnmMvvfRSHT9+XN98842uueaayv1yAAAII9OZPGLECBUXF+u5557zbMvPz9eiRYvUt29ftWzZUpK0b98+bd++vdS5X375pdfk9Y4dO7Rq1SqNHDnS69i5c+fq4Ycf1vTp00t9lRYAAFUV165Dj+l/AIBtOFxOOVwuH/uLw9gaAABqLtOZvGzZMrlcLo0fP96zLS4uTtdff72mT5+u1NRUz4Xyss7t3bu3evfu7dnWqVMnDRo0SEuWLNHs2bMlSatXr9aRI0c0YcIEr/MnTpyo1157Te+//77+/Oc/Szq53CkAAFWB6Uzu27evRo4cqWnTpunQoUNq3769XnrpJe3du1cvvPCC57hRo0Zp7dq1Xl+tNWHCBD3//PMaOnSobr/9dkVHR2v+/PlKTk7Wbbfd5jnunXfe0dSpU9WhQwd17txZr776qlcbzj//fCUnJ1eq3QAA2IGvXObatRlVfvr/qaeeUps2bRQXF6e+fftq48aN5R67ePFiORwOr0dcXFwYWwsA8MUVHVXhA/ZFJgNA9eFvJmdkZHg98vPzy6y3efNmdezYUYmJiV7b+/TpI0lKSUkp8zy3262tW7eqV69epfb16dNHu3fvVmZmpuc5JJU6tmfPnnI6nZ79NQGZDADVRyjeJ7/88su65ZZb9Morr+jmm29WYWGhVqxYof79+/s8r06dOlqzZo369++v++67T/fcc4+6d++utWvXKikpyXPcli1bJEm7du3StddeW+qxbdu2Sre5qiKTAaB64dp16FXpies333xTt956q2bMmKGvv/5a3bt315AhQ3To0KFyz0lMTFRaWprn8eOPP4axxQAAX07e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NWPGDE2cOFFr1qyRy+XSjBkzKjx/9uzZys7O1qpVq3TzzTdr+vTpWrJkibZs2aLFixd7jvvTn/6k1NRULVy4UOPHj9eUKVO0YcMGNWjQQPfee2/ofkAAAPxgh0yu7qrsJ64BANWPu4KAdxP+AACEhR0yecSIETrrrLM0duxYfffdd55PdhUXF2vmzJlexw4aNEiStHfvXs+26dOna+nSpRo4cKAmTZqkrKwszZ07V127dtXYsWM9x7Vo0UK33HKL5s6dq8LCQvXu3VvLly/XunXr9Nprr8nlcnmO/fHHH/XKK69IkufT3Pfdd58kqXXr1rr22mtD8rsAANRcdshk6eTEdXJysi6//HLPtqSkJF1xxRV69dVXlZ+f73VT2W+99dZbuvjii9WqVSvPtsGDB6tjx45asmSJxo8fL0nq2bNnqXMbNmyo3//+91qzZo25HwgAgAD4ymWuXZvBJ64BALZRVOxWUZGPR3F4lls5fvy4xo8fr6SkJNWqVUsDBw7U119/7ff527Zt0wUXXKDatWurQYMGuvbaa/Xzzz+XOs7tduuhhx7SKaecori4OHXr1k3/+Mc/Sh2zePFiXXrppWrZsqVq1aql008/Xffdd5/y8vKC/lkBACiLHTLZ5XLpgw8+0JVXXqnHH3/csyzpqlWrdOqpp1Z4fsmSm+3atdOdd96phx56SBdddJE++eSTUhfWH3jgAc2ePVsfffSRJk6cqL179+rVV1/V1Vdf7XXcnj17dM899+iee+7xLCVe8u8XXnjB3A8PAMD/+JvJGRkZXo/8/Hyj7di8ebPOPPNMr6/vkKQ+ffooJydHO3fuLPfc/fv369ChQ2V+R3WfPn20efPmCp8/PT1djRo1qnzDAQAwyGcuh+nadXXHJ64BALbhdls+70wLx11r4freLkm666679MADD2jcuHHq3bu33n33XV199dVyOBy66qqrJEk5OTkaO3aszjrrLP31r39V48aNtX79es2YMUMrV67UqlWr5HA4Qvo7AQDUPHbIZEmqX7++Fi5cqIULF/o87teftP61Ll266KOPPqrweZxOp6ZNm6Zp06b5PG7AgAFe30cJAECo+ZvJLVu29No+Y8YMo0trp6WlqX///qW2N23aVJJ04MABde3atdxzf33sb88/evSoz09sr1u3TuvXr9fdd98daPMBADDCVy7ziWszmLgG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u3Zt6+mnn/baPnPmTOucc84x8WMhCPRN+iZQEzH2MfbZEf2SfgnURIx9jH12Rd+kbwI1DeMe455d0Tfpm4gcJq6rsddff92Kioqy8vLyItqOm2++2brgggs8/z58+LDlcDisOXPm+HX+fffdZ3Xq1Mn68MMPrd27d1uLFi2yYmNjrTVr1liWZVlTpkyx2rVr5zUgv/jii1Z8fLx1/Phxr1r/+te/rJiYmIj/Tmo6+iZ9E6iJGPsY++yIfkm/BGoixj7GPruib9I3gZqGcY9xz67om/RNRA7fcV2Nff311youLlbDhg1Vu3Ztz+Mvf/lLWNvx448/qlmzZp5/f//997IsS6eeeqrXcY0aNfK08Y477pAk5efna/bs2XrxxRc1ZMgQtW3bVmPGjNGf//xnPfvss5Kk6667Trt379batWs9tRYtWqThw4erbt26Xs/RrFkzFRQUKD09PVQ/LvxA36RvAjURYx9jnx3RL+mXQE3E2MfYZ1f0TfomUNMw7jHu2RV9k76JyImKdAMQOl9//bX+9Kc/aebMmV7bGzRo4PVvt9stpzN09zDk5uYqLi6uwuM2btwot9uta665Rvn5+ZJODsQ5OTk6//zzvY4tKCjQGWecIUnq1KmTzj77bL344osaMGCAvv/+e61bt07/93//V+o54uPjJUk5OTnB/lgIAn2TvgnURIx9jH12RL+kXwI1EWMfY59d0Tfpm0BNw7jHuGdX9E36JiKHT1xXY19//bV+97vfqX379l6PBg0aaO/everatauuuuoqnXbaacrNzdUrr7yi3r17q3v37rr11ls9dV588UV169ZN3bt31+233+7Z/uCDD+r0009X165d9dprr5XbjkaNGunYsWOef7dv314Oh0M7duzwOq5t27Zq3769ZwCUpKysLEnS+++/r5SUFM/ju+++07JlyzzHXX/99XrrrbeUmZmpRYsWqV27djr33HNLteXo0aOSpKSkJH9/jQgB+iZ9E6iJGPsY++yIfkm/BGoixj7GPruib9I3gZqGcY9xz67om/RNRFDkVilHKO3evduSZH322Wdl7t+zZ4/lcrmsLVu2WJZlWd999501fPhwq7Cw0LIsy7r22mutFStWWFu3brVOP/1069ixY5ZlWdaRI0csy7KsjRs3WmeeeaaVm5trHTlyxGrbtq21f//+Mp9r7ty5Vvfu3b22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wR3XAADbcJbzGyFOficEAIAq4WsmR0VFFXuVNXEdHh5e6mPEs7OzPevL2k+ST/u+/fbb+uqrr/TEE09U8NMCAGBfHCcDAGAf3nK5Mpmck5OjKVOmqHnz5goPD1evXr20YsUKn/bdu3evrrjiCjVs2FBRUVEaOnSofvnll1K3ffnll9WpUyeFhYWpXbt2euaZZ0ps895772nkyJFq06aNIiIi1KFDB9155506evRohT+XP5i4BgDYhulHoNkp+B944AE5HI4Sr6K7xQAAsBPTmRwXF6eUlJQSy4uWNW/evNT9oqOjFRoa6tO+kyZN0ogRIxQSEqLdu3dr9+7dngPs5OTkMh9HDgCAnfGocAAA7MN0Jo8ePVqzZ8/WNddco6eeekoul0sXXnihvvjiC6/7ZWRkqF+/flq7dq3uvvtuPfjgg9q8ebPOPfdcHTp0qNi2L774om688UZ17txZzzzzjHr37q3bbrtNjz32WLHtxo0bp23btunaa6/V008/rcGDB+vZZ59V7969y3xKWiDwqHAAgG24HOU8Aq2C2T969GgtXbpUt99+u9q1a6eFCxfqwgsv1OrVq3XOOeeUuV9R8B87dkx33323goODNWfOHJ177rlKSkpS48aNPdu++OKLuummmzRs2DDdcccdWrdunW677TYdP35cU6ZMKVH7+eefV/369f/4TPz+JgDAhkxncvfu3bV69WqlpaUVe7T4hg0bPOtL43Q61bVrV23atKnEug0bNqhNmzaKjIyUVDg5vXjxYi1evLjEtmeccYa6deumpKSkijUcAIBqZjqTAQBA5XnL5Ypm8saNG/XWW28pMTFRd911lyRp1KhR6tKliyZPnqyvvvqqzH3nzp2rHTt2aOPGjerZs6ck6YILLlCXLl30xBNPaMaMGZIKf1rrnnvu0ZAhQ7R06VJJ0tixY+V2u/XQQw9p3LhxatSokSRp6dKl6tu3b7H3OfPMM3XdddfpjTfe0I033lixD1hJ3HENALANb48/K3r5qij4Z86cqcTERI0bN06rVq3SSSedpMmTJ3vdtyj4ly9frsmTJ2vixIn69NNPlZKSUuzxo38O/rFjx+q1117TNddco4ceekhHjhwpUXv48OG69tprPa+rrrrK9z8QAABVxGQmS4X5V1BQoHnz5nmW5eTkaMGCBerVq5fi4+MlSXv27NGPP/5YYt+v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47B089NGaknSxJnLjdVy52VJ+thYvRN5y2XOXZtRY6f/Q0JCdOaZZ2rlypWeZW63WytXrlTv3r19qlFQUKCtW7cqLi4uUM0EAFQAd3fVTGQyANQ+gcjk0aNHa/bs2brmmmv01FNPyeVy6cILL9QXX3i/kycjI0P9+vXT2rVrdffdd+vBBx/U5s2bde655+rQoT8m1j744AM99thjatu2recusPT0dA0cOFALFiyocHtrIjIZAGofjpNrJjIZAGonMjnwauwd15J0xx136LrrrlOPHj2UkJCgJ598UpmZmRozZoykwt9iadGihWbOnClJ+sc//qGzzjpLbdu21dGjR5WYmKhff/1VN954Y3V+DADA/5QX8IS/fZHJAFC7mM7kjRs36q233lJiYqLuuqvwcemjRo1Sly5dNHnyZH311Vdl7jt37lzt2LFDGzduVM+ehY+IveCCC9SlSxc98cQTmjFjhiSpX79+2rNnj5o0aeLZ96abblL37t11//33ezKptiOTAaB24Ti55iKTAaD28ZbLZLIZNXrieuTIkfr99991//33KzU1Vd27d9fHH3+s2NhYSdKePXvkdP7RUY4cOaKxY8cqNTVVjRo10plnnqmvvvpKp55q7remAQCV5wwKliu47McFOfMNPksRRpHJAFC7mM7kpUuXyuVyady4Px5zGBYWphtuuEF33323kpOTFR9f+s/BLF26VD179vRMWktSx44d1b9/f73zzjueievOnTuX2Dc0NFQXXnihZs+erfT0dEVGmnkEoJ2RyQBQu3CcXHORyQBQ+3jLZTLZjBo9cS1Jt956q269tfTf4/3zb7HMmTNHc+aY+z05AIBZXEles5HJAFB7+JrJaWlpxZaX9TuLmzdvVvv27RUVVfy33xMSEiRJSUlJpU5cu91ufffdd7r++utLrEtISNCnn35a7oR0amqqIiIiFBERUeY2tQ2ZDAC1B8fJNRuZDAC1C3dcBx5/RQCAbfDbXQAA2IOvmRwfH68GDRp4XkWPuvyzlJSUUn+fsWjZvn37St3v8OHDysnJqdS+kvTzzz/rvffe07Bhw+Ryubx/aAAAbIjjZAAA7INMDrwaf8c1AKD2cAYHyRlcdjQ58wuqsDUAANRdvmZycnJysbuoS7vbWpKysrJKXRcWFuZZX9Z+ZdUtb9/jx49rxIgRCg8P16OPPlrWRwEA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3r3q2LGjNm7cKEnauXOnHnroIX3zzTfavXu3/vnPf2rUqFHq06ePTjvN3G91AAAqz06/3QXfkMkAUDuRyTUPmQwAtZNdMnnz5s0644wz5HQWP52ckJCg48ePa/v2sn+Kb+/evTpw4IB69OhRYl1CQoI2b95c7H3q1aunTp06ldiuaL03Rb8h3aRJE+8fKIDIZACoveyQybWdre64rog33nhDt956q/r37y+n06lhw4bp6aef9qzPy8vTTz/9pOPHj0uSQkJC9Nlnn+nJJ59UZmam4uPjNWzYMN17773V9REAAH+Sk2/JnV/27wzn5RP+dkQmA0DtQybXTGQyANQ+vmZyWlpaseVl/fZxZaWkpKhPnz4llhfdDbxv3z517dq1zH1P3PbP+x8+fNhzx3ZKSopiY2NL/D71ie/jzaxZsxQVFaULLrig/A8VQGQyANRO3nKZ42QzauzEdXR0tNffTmndurUs649OEh8fr7Vr11ZF0wAAlVTgtuT0cmUaV63ZE5kMALUPmVwzkckAUPv4msnx8fHFlk+fPl0PPPBAqfu43W7l5ub69P6hoaFyOBzKysoqdSI8LCxMkpSVlVVmjaJ15e0fGhrq1/vMmDFDn332mebOnauGDRuW/aGqAJkMALWTt1zmONmMGjtxDQCofThJDgCAPZDJAADYg6+ZnJycrKioKM9yb3dbf/755+rXr59P779t2zZ17NhR4eHhysnJKbE+OztbkhQeHl5mjaJ1vuxf2fd5++23de+99+qGG27QzTff7O0jAQBQaUxcBx4T1wAA28jLd8vy8gi0fC/rAACAOWQyAAD24GsmR0VFFZu49qZjx45asGCBT9sWPaI7Li7O88jvExUtK/rtZm81yto/OjraM9EeFxen1atXy7KsYo8L9/Y+K1as0KhRozRkyBC98MILPn0uAAAqw1suc5xsBhPXAADbsCxLlpcr0058jBYAAAgcMhkAAHsIRCY3a9ZMo0ePrtA+3bt317p16+R2u+V0Oj3LN2zYoIiICLVv377MfVu0aKGYmBht2rSpxLqNGzeqe/fuxd5n/vz52rZtm0499dRi71O0/kQbNmzQZZddph49euidd95RUBCnuwEAgeMtlzlONsNZ/iYAAFQNt9sq9wUAAAKPTAYAwB7sksnDhw/X/v379d5773mWHTx4UEuWLNHFF19c7NHkO3fu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ltMZuGsYsrKyFBoaWux669evl9vt1i233KKcnBxJ5zrizMxM9e3b12vd3NxcdezYUZLUqlUrXX755Vq4cKF69eqlX375RatXr9Zjjz1W4DXCwsIkSZmZmWV9WygD2iZtE6iO6Pvo++yIdkm7BKoj+j76PruibdI2geqGfo9+z65om7RNVBzuuK7CNm3apCuuuELNmzf3murWrau9e/eqXbt2uummm3TppZcqKytLb7zxhrp27aoOHTpo/PjxnjoLFy5U+/bt1aFDB02YMMEz/+mnn1bbtm3Vrl07vfXWW0XuR/369XXy5EnP382bN5fD4dD27du91mvWrJmaN2/u6QAlKT09XZL08ccfKykpyTP9/PPPWrZsmWe9O++8U++9957S0tK0aNEiXXzxxerZs2eBfTlx4oQkKTo62t+PEQFA26RtAtURfR99nx3RLmmXQHVE30ffZ1e0TdomUN3Q79Hv2RVtk7aJClRxTylHIO3atcuSZH377beFLt+zZ4/lcrmsH374wbIsy/r555+twYMHW2fOnLEsy7Juu+02a/ny5daWLVustm3bWidPnrQsy7KOHz9uWZZlrV+/3urUqZOVlZVlHT9+3GrWrJl14MCBQl9r5syZVocOHbzmXXPNNVajRo2s9PT0Auv37NnTGjt2rGVZlpWammqFhIRYr7/+us/3m5aWZkVERFgvvvii1bhxY+vJJ58sdL0FCxZYjRs39lkLgUXbpG0C1RF9H32fHdEuaZdAdUTfR99nV7RN2iZQ3dDv0e/ZFW2TtomKxaPCq6iNGzdKkmJiYgr85sAFF1wgSWrZsqXat28vSVqxYoX+85//qEuXLpLOPe6hc+fO2rVrl2688UbVrl1b0m+Pwvjuu+80ePBghYaGKjQ0VL1799b333+v66+/vsC+9OvXT5MnT9bJkydVp04dSdK8efN0xRVXqEuXLpo6darat28vp9Op77//Xtu2bVPnzp0lSZGRkZowYYLGjRsnt9utK6+8UqdPn9Z3332nqKgo3X777ZKkiIgI3XjjjZo8ebJSU1M1cuTIQj+X1atX65prrintxwoDaJsjC/1caJtA1UbfN7LQz4W+r2LRLkcW+rnQLoGqjb5vZKGfC31fxaNtjiz0c6FtAlUX/d7IQj8X+r2KR9scWejnQttEeWHguoratGmTJKlFixZe80NCQpSamipJ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HTpUYWFheuqpp/x4xwAA2JO/mQwAAAKLTAYAwD585jKZbAR3XAMAbMPhcsrhKvqaKof73LLk5GSvR4AXNsgcFhamnJycAvOzs7M9ywuTP7+k2+bl5emmm27Szz//rH//+99q2LBhke8DAAC78zeTAQBAYJHJAADYh69cJpPNYOAaAGAbrmCnXEFFB7zLcW5ZVFRUgd+u/r3Y2FgdOHCgwPyUlBRJKnJguW7dugoJCfGs5++2o0eP1vLly/XWW2/p6quv9rlvAADYnb+ZDAAAAotMBgDAPnzlMplsBgPXAADbMHkleXx8vL7++mulpqZ6DXKvW7fOs7wwTqdT7dq104YNGwosW7dunZo1a6bIyEiv+RMnTtSiRYv0zDPPaPjw4X7vIwAAdsXdXQAA2AOZDACAfXDHdeDxKQIAbMPpkpwuh4/J/1pDhgxRXl6eXn75Zc+8nJwcLVq0SN26dVNcXJwkad++fdq2bVuBbb///nuvwevt27frq6++0tChQ73WnTlzpmbNmqUpU6Zo7NixpXjXAADYj8lMzpeTk6MHHnhADRs2VFhYmLp166YvvvjCr20PHDigYcOGqXbt2oqKitL111+v3bt3e62TnJysadOmKSEhQXXq1FH9+vXVq1cvffnllyXfWQAAbKIyZnK+V199Va1bt1ZoaKhatGih559/vsA6U6dOlcPhKDCFhoaW/I0BABBgvnO5oveuauCOawCAbbhquOQKKjrhXZbb71rdunXT0KFDNXnyZB05ckTNmzfXa6+9pr179+rVV1/1rDdixAitWrVKlmV55t1999165ZVXNHDgQE2YMEFBQUGaM2eOYmJidP/993vW++CDDzRp0iS1aNFCrVu31ptvvum1D3379lVMTIzf+wwAgF2YzOR8I0eO1LJly3TfffepRYsWWrx4sQYMGKCvv/5aV155ZZHbpaenKzExUadPn9aUKVMUFBSkuXPnqmfPnkpKSlK9evUkSR999JGefvpp/eEPf9Dtt9+us2fP6vXXX1ffvn21cOFCjRo1qsT7DABARauMmSxJL730kv785z9r8ODBGj9+vFavXq2//e1vyszM1AMPPFCg9vz58xUREfHb+3Jx9h8AYD++crk0mYyCGLgGANiGw+WQw+XwubwkXn/9dT388MN64403dPLkSbVv317Lly9Xjx49fG4XGRmplStXaty4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JycrKirKMz8kJKTIem63W7m5uX69dkhIiBwOh7KysgqtGRoaKknKysoqskb+suK2L2z5kSNHdPPNN+uiiy7SpEmTvJaNHTvW6+/BgwcrISFBt9xyi+bNm6cHH3ywmHf3G+64BgDYhruYR624OSAHAKBckMkAANgDmQwAgH34yuX8TI6KivKafA1cf/PNNwoLC/Nr2r59uyQpLCys0Luis7OzPcuLkr+spNtnZGRo0KBBSktL00cffVTgt68Lc/PNN6tBgwb68ssvi133fJV24PrEiRO65ZZbFBUVpdq1a+vOO+9Uenq6z2169eolh8PhNf35z38upz0GABQnN8/X48/cys1zV/QuohBkMgBUPWRy5UQmA0DVQyZXTmQyAFRNPnO5FJncqlUrLVq0yK8p//HesbGxnkd+ny9/XsOGDYt8vfwaRW1ft27dAgPtubm5uuGGG7RlyxZ99NFHatu2rd/vLy4uTidOnPB7fakSPyr8lltuUUpKir744gudOXNGo0aN0pgxY/T222/73G706NF67LHHPH+Hh4cHelcBAH7iEWiVE5kMAFUPmVw5kckAUPWQyZUTmQwAVZM/jwoviQYNGmjkyJEl2iY+Pl6rV6+W2+2W0/nb/cnr1q1TeHi4WrZsWeS2jRo1UnR0tDZs2FBg2fr16xUfH+81z+12a8SIEVqxYoWWLFminj17+r2flmVp79696tixo9/bSJV04Hrr1q369NNP9f3336tLly6SpOeff14DBgzQrFmzfF5NEB4ergYNGpTXrgIASuCs25LLR8Cf5YDcdshkAKiayOTKh0wGgKqJTK58yGQAqLp85XJ5ZfKQIUO0bNkyvf/++xoyZIgk6dixY1q6dKmuu+46rzumd+3aJUm6+OKLPfMGDx6s1157TcnJyYqLi5MkrVixQjt27NC4ceO8Xuuvf/2r3n33Xb300ku64YYbityno0ePKjo62mve/PnzdfToUfXv379E769SPip87dq1ql27tif4JalPnz5yOp1at26dz23feust1a9fX23bttXkyZOVmZlZ5Lo5OTlKTU31mgAAgXPG1+PPzrp15iyPQLOb8spkiVwGgPJEJlc+ZDIAVE1kcuVDJgNA1eUrl8srk4cMGaLLLrtMo0aN0mOPPaZ58+apV69eysvL07Rp07zW7d27t3r37u01b8qUKQoPD1diYqKe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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "fig, axes = plt.subplots(3,4, figsize=(24,10))\n", "plt.subplots_adjust(hspace=0.5)\n", From c9b2e4655ce6c7c295e21de44c1d9aeef67fc817 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Thu, 4 Jun 2026 15:51:46 +0200 Subject: [PATCH 22/32] fix Container.__setitem__ and __add_data docstrings and actually auto document all __getitem__ and __setitem__ methods throughout code base [no ci] --- docs/source/conf.py | 12 ++++++++++++ pisa/core/container.py | 10 +++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 222687873..74d6ee829 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -72,6 +72,18 @@ # make sure the target is unique autosectionlabel_prefix_document = True +# -- autodoc configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html + +# Just documenting all dunder members clutters docs, so select a few which have +# useful docstrings in PISA (extend if desired). Alternatively, can specify +# 'exclude-members' in dictionary below. +special_members_to_doc = '__getitem__, __setitem__' + +autodoc_default_options = { + 'special-members': special_members_to_doc +} + # -- intersphinx configuration ----------------------------------------------- # To look up all available targets in python docs, for instance: # python -m sphinx.ext.intersphinx https://docs.python.org/3/objects.inv diff --git a/pisa/core/container.py b/pisa/core/container.py index 9127da66c..053c73570 100644 --- a/pisa/core/container.py +++ b/pisa/core/container.py @@ -660,15 +660,15 @@ def __setitem__(self, key, data): """Set `self[key]` to `data`. Invalidates all representations but the current one, which is set to - valid, and set the translation mode to "average", unless the string "weight" - is part of `key`, in which case the translation mode is set to "sum", or - unless a mode has already been set. + valid, and set the translation mode to "average", unless the `key` is + part of :py:attr:`~Container.sum_mode_keys`, in which case the + translation mode is set to "sum", or unless a mode has already been set. Parameters ---------- key : string data identifier/variable - data : ndarray, :py:class:`~.Map` or (array, binning)-tuple + data : ndarray, :py:class:`~.Map` or (binning, array)-tuple data sample to add to the container """ if self.is_map: @@ -694,7 +694,7 @@ def __add_data(self, key, data): ---------- key : string data identifier/variable - data : ndarray, :py:class:`~.Map` or (array, binning)-tuple + data : ndarray, :py:class:`~.Map` or (binning, array)-tuple data sample to add to the container """ if isinstance(data, np.ndarray): From 9659368b550854a2fe483ceb4ef62ad2ae9638ab Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Fri, 5 Jun 2026 18:09:31 +0200 Subject: [PATCH 23/32] set translation modes of 'weights' and 'initial_weights' to 'sum' and rewrite utils.hist (with calc_mode=binning) accordingly; also give Container a convenient item setter that doesn't invalidate any reps. and extend tests --- pisa/core/container.py | 176 +++++++++++++++++++++++++++----------- pisa/stages/utils/hist.py | 68 ++++++++++++--- 2 files changed, 180 insertions(+), 64 deletions(-) diff --git a/pisa/core/container.py b/pisa/core/container.py index 053c73570..d464d1f42 100644 --- a/pisa/core/container.py +++ b/pisa/core/container.py @@ -66,6 +66,15 @@ when event-by-event weights are requested (see below). Instead, the exact event-by-event weights will remain available. +However, the above execution of `__setitem__` has the disadvantage that *all* other +(but the current) representations are made invalid, so that they would also have to +be set to valid manually to prevent unnecessary data transformations in the future. +Hence, when one is certain that invalidation is unnecessary, one can call:: + + container.set_item_no_invalidate(key, data) + +which does not invalidate any representations. + When accessing data in a currently invalid representation, :py:meth:`~Container.auto_translate` is triggered, which ensures synchronization across representations as needed, i.e., on demand. The feasibility and details @@ -478,7 +487,8 @@ class Container(): Auxiliary data not tied to any representation validity : dict[variable_name][representation_hash] -> bool - Tracks which representations have current valid data + Tracks validities of the various representations for the + various variables precedence : dict[representation_hash] -> int Precedence for choosing translation source (lower = higher priority). @@ -504,7 +514,7 @@ class Container(): valid_translation_modes = ("average", "sum") """Available translation modes""" - sum_mode_keys = () # TODO + sum_mode_keys = ("weights", "initial_weights") """Variables for which "sum" is assumed as default translation mode""" array_representations = ("events", "log_events") """Available unbinned data representations""" @@ -684,8 +694,35 @@ def __setitem__(self, key, data): self.translation_modes[key] = "sum" else: self.translation_modes[key] = "average" + logging.trace("Set translation mode = '%s' for variable '%s'.", + self.translation_modes[key], key) self.mark_changed(key) + def set_item_no_invalidate(self, key, data): + """Set `self[key]` to `data`, but without invalidating representations + that aren't already invalid. + + Parameters + ---------- + key : string + data identifier/variable + data: ndarray, :py:class:`~.Map` or (binning, array)-tuple + data sample to add to the container + """ + # First we need to find out which representations are currently valid, + # as these should remain valid + valid_rep_hashs_for_key = [rep_hash for rep_hash in self.validity[key] if + self.validity[key][rep_hash]] + logging.trace("Found %d currently valid representation(s) for variable '%s'", + len(valid_rep_hashs_for_key), key) + + self[key] = data # causes all but current rep. to become invalid + + for rep_hash in valid_rep_hashs_for_key: + self.validity[key][rep_hash] = True + logging.trace("Re-validated variable '%s' in representation '%s'.", + key, self._representations[rep_hash]) + def __add_data(self, key, data): """Add data for a given variable, after performing consistency checks or flattening it. @@ -806,7 +843,9 @@ def __iter__(self): def translate(self, key, src_representation): '''Translate data for variable `key` from source rep. to current rep. - Afterwards, both source and destination representation will be valid. + Afterwards, the current representation will be valid, and all valid + representations will remain valid (since the data doesn't actually get + modified by translating, i.e., switching the representation). Parameters ---------- @@ -816,84 +855,85 @@ def translate(self, key, src_representation): some representation present in container ''' assert hash(src_representation) in self.representation_keys + if not self.translation_modes[key] in self.valid_translation_modes: + raise ValueError( + f"Unknown translation mode for variable '{key}':" + f" '{self.translation_modes[key]}'!" + ) dest_representation = self.representation if hash(src_representation) == hash(dest_representation): - # nothing to do + logging.trace("Attempting to translate from one representation to" + " itself, so there is nothing to do.") return from_map = isinstance(src_representation, MultiDimBinning) to_map = isinstance(dest_representation, MultiDimBinning) - if self.translation_modes[key] == 'average': - if from_map and to_map: + if from_map and to_map: + if self.translation_modes[key] == 'average': out = self.resample(key, src_representation, dest_representation) self.representation = dest_representation - self[key] = out + self.set_item_no_invalidate(key=key, data=out) + elif self.translation_modes[key] == 'sum': + raise NotImplementedError( + "Map to Map in sum mode needs to integrate over bins." + ) - elif to_map: + elif to_map: + if self.translation_modes[key] == 'average': out = self.array_to_binned(key, src_representation, dest_representation) self.representation = dest_representation - self[key] = out - - elif from_map: - out = self.binned_to_array(key, src_representation, dest_representation) - self.representation = dest_representation - self[key] = out - - elif src_representation == "events" and dest_representation == "log_events": - self.representation = "events" - logging.trace(f"Container `{self.name}`: taking log of {key}") - sample = np.log(self[key]) + self.set_item_no_invalidate(key=key, data=out) + elif self.translation_modes[key] == 'sum': + out = self.array_to_binned(key, src_representation, dest_representation, + averaged=False) self.representation = dest_representation - self[key] = sample + self.set_item_no_invalidate(key=key, data=out) - elif src_representation == "log_events" and dest_representation == "events": - self.representation = "log_events" - sample = np.exp(self[key]) + elif from_map: + if self.translation_modes[key] == 'average': + out = self.binned_to_array(key, src_representation, dest_representation) self.representation = dest_representation - self[key] = sample - - else: + self.set_item_no_invalidate(key=key, data=out) + elif self.translation_modes[key] == 'sum': + # Destination rep. is from map to an event-by-event rep., which would + # require using information about weight distribution (TODO) raise NotImplementedError( f"Translating {src_representation} to {dest_representation}" - " in 'average' mode!" + " in 'sum' mode!" ) - elif self.translation_modes[key] == 'sum': - if from_map and to_map: - raise NotImplementedError("Map to Map in sum mode needs to integrate over bins.") - - if to_map: - out = self.array_to_binned(key, src_representation, dest_representation, averaged=False) - self.representation = dest_representation - self[key] = out + # Do not distinguish between average and sum modes in case of one-to-one + # relationship + elif src_representation == "events" and dest_representation == "log_events": + self.representation = "events" + logging.trace(f"Container `{self.name}`: taking log of {key}") + sample = np.log(self[key]) + self.representation = dest_representation + self.set_item_no_invalidate(key=key, data=sample) - else: - # destination rep. is an event-by-event rep., no matter the source rep. - raise NotImplementedError( - f"Translating {src_representation} to {dest_representation}" - " in 'sum' mode!" - ) + elif src_representation == "log_events" and dest_representation == "events": + self.representation = "log_events" + sample = np.exp(self[key]) + self.representation = dest_representation + self.set_item_no_invalidate(key=key, data=sample) else: - raise ValueError( - f"Unknown translation mode for variable '{key}':" - f" '{self.translation_modes[key]}'!" + raise NotImplementedError( + f"Translating from {src_representation} to {dest_representation}" + " is not implemented!" ) - # validate source! - self.validity[key][hash(src_representation)] = True - - def auto_translate(self, key): + '''Auto translate to current representation after auto-determining a + preferred source representation''' src_representation = self.find_valid_representation(key) if src_representation is None: raise Exception(f'No valid representation for {key} in container') - # logging.debug(f'Auto-translating variable `{key}` from {src_representation}') + logging.trace('Auto-translating "%s" from %s', key, src_representation) self.translate(key, src_representation) - def find_valid_representation(self, key): ''' Find valid, and best representation for key''' @@ -1073,12 +1113,12 @@ def test_container(): m = np.meshgrid(binning.midpoints[0].m, binning.midpoints[1].m)[1].ravel() assert np.allclose(bx, m, **ALLCLOSE_KW), f'test:\n{bx}\n!= ref:\n{m}' - # array repr + # array repr (should not attempt to translate, since 'w' still valid in 'events') container.representation = 'events' array_weights = container['w'] assert np.allclose(array_weights, w, **ALLCLOSE_KW), f'test:\n{array_weights}\n!= ref:\n{w}' - # binned repr + # binned repr (needs to translate 'w') container.representation = binning diag = np.diag(np.arange(100) + 0.5) bd = container['w'] @@ -1101,6 +1141,9 @@ def test_container(): logging.trace('Testing container representation and validity management') container = Container('nue', 'events') + for weight_key in Container.sum_mode_keys: + container[weight_key] = w + assert container.translation_modes[weight_key] == 'sum' container['x'] = x assert container.translation_modes['x'] == 'average' container['y'] = y @@ -1110,6 +1153,22 @@ def test_container(): binning_hash = hash(binning) for k in container.all_keys: if 'weight' in k: + # First artificially invalidate current rep., so a translation is required + container.validity[k][binning_hash] = False + data = container[k] * 1.01 + # Should already have been translated to binned rep due to statement + # `container[k]`, without invalidating anything + assert container.validity[k][binning_hash] + assert container.validity[k][hash('events')] + # But entry not yet rescaled + assert not np.allclose(container[k], data, **ALLCLOSE_KW) + # Test modification via method that doesn't invalidate reps. + container.set_item_no_invalidate(key=k, data=data) + assert container.validity[k][binning_hash] + # 'events' rep again needs to remain valid + assert container.validity[k][hash('events')] + assert np.allclose(container[k], data, **ALLCLOSE_KW) + # Now test "traditional" in-place modification container[k] *= 1.0 # invalidates 'events' rep. when __setitem__ called assert container.validity[k][binning_hash] assert not container.validity[k][hash('events')] @@ -1130,6 +1189,19 @@ def test_container(): except ValueError: pass + # For the weight-like quantities with translation mode set to 'sum', no + # translation back to 'events' is implemented + for weight_key in Container.sum_mode_keys: + try: + container[weight_key] + except NotImplementedError: + pass + + # However, if we set 'events' rep. validity to True, this has to work again, + # because no translation is necessary + container.validity[Container.sum_mode_keys[0]][hash('events')] = True + _ = container[Container.sum_mode_keys[0]] + def test_container_set(): """Unit tests for :py:class:`ContainerSet` class.""" diff --git a/pisa/stages/utils/hist.py b/pisa/stages/utils/hist.py index 459cc4b5d..a6237b256 100644 --- a/pisa/stages/utils/hist.py +++ b/pisa/stages/utils/hist.py @@ -15,13 +15,16 @@ class hist(Stage): # pylint: disable=invalid-name - """Stage to histogram events + """Stage to histogram events. Parameters ---------- unweighted : bool, default False Return un-weighted event counts in each bin apply_unc_weights : bool, default False + The corresponding "unc_weights" (see notes) will be used to rescale + the "weights". If, in addition, error_method="sumw2", they will be + used in computing "errors" and "bin_unc2". Notes ----- @@ -29,6 +32,17 @@ class hist(Stage): # pylint: disable=invalid-name Expected container keys are:: "weights", "unc_weights" (if `apply_unc_weights`) + + In case `calc_mode` is a :py:class:`~.core.binning.MultiDimBinning`, a transfer + matrix containing fractions/probabilities is computed, which distributes weights + from the `calc_mode` bins to the `apply_mode` bins proportionally. Hence, weights + in `calc_mode` representation are expected to correspond to *summed* weights. + In contrast, the translation mode for "unc_weights" is explicitly set to "average" + by this service, i.e., before they are obtained in binned `calc_mode`. + + In case `error_method = "sumw2", variables "errors" and "bin_unc2" will be added + to the containers. The variable "unc_weights" is not required for this, but is + in case of `apply_unc_weights` and will then modify "errors" and "bin_unc2". """ def __init__( @@ -68,20 +82,35 @@ def setup_function(self): if isinstance(self.calc_mode, MultiDimBinning): - # The two binning must be exclusive + # The two binnings must be exclusive assert len(set(self.calc_mode.names) & set(self.apply_mode.names)) == 0 transform_binning = self.calc_mode + self.apply_mode - # go to "events" mode to create the transforms - + # Create a transfer matrix: transform[i,j] = fraction of calc_bin_i's + # events that go to apply_bin_j for container in self.data: self.data.representation = "events" + # Get all binning variables in event-by-event representation sample = [container[name] for name in transform_binning.names] - hist = histogram(sample, None, transform_binning, averaged=False) - transform = hist.reshape(self.calc_mode.shape + (-1,)) + # Unweighted histogram: no. events in each [calc_bin_i, apply_bin_j] + joint_counts = histogram(sample, None, transform_binning, averaged=False) + # Automatically determine size of final dimension (apply_mode.size) + joint_counts_reshaped = joint_counts.reshape(self.calc_mode.shape + (-1,)) + assert joint_counts_reshaped.shape[-1] == self.apply_mode.size + # Sum along apply_bins to get total event no. per calc_bin + calc_bin_totals = joint_counts_reshaped.sum(axis=-1, keepdims=True) + # Normalize to these totals (replace NaN -> 0 in case of 0/0) + # (-> 1 along apply_bin axis for each populated calc_bin, otherwise 0) + with np.errstate(divide='ignore', invalid='ignore'): + transform = joint_counts_reshaped / calc_bin_totals + transform = np.nan_to_num(transform) + assert transform.shape == tuple(self.calc_mode.num_bins + [self.apply_mode.size]) + self.data.representation = self.calc_mode container["hist_transform"] = transform + # calc_mode dimensions now flattened by Container.__add_data + assert container["hist_transform"].shape == (self.calc_mode.size, self.apply_mode.size) elif self.calc_mode == "events": # For dimensions where the binning is irregular, we pre-compute the @@ -143,15 +172,27 @@ def apply_function(self): else: weights = container["weights"] if self.apply_unc_weights: + # These need to be bin-averaged, otherwise we are double counting + container.translation_modes["unc_weights"] = "average" unc_weights = container["unc_weights"] else: unc_weights = np.ones(weights.shape) + logging.trace("Using 'unc_weights' histogram %s for '%s'", + unc_weights, container.name) transform = container["hist_transform"] - hist = (unc_weights*weights) @ transform + weights_to_transform = unc_weights * weights + hist = weights_to_transform @ transform + logging.trace( + "Performed matrix multiplication of 'weights' with shape" + " %s with transform with shape %s to yield histogram with" + " shape %s.", weights_to_transform.shape, transform.shape, + hist.shape + ) + if self.error_method == "sumw2": - sumw2 = np.square(unc_weights*weights) @ transform - bin_unc2 = (np.square(unc_weights)*weights) @ transform + sumw2 = np.square(weights_to_transform) @ transform + bin_unc2 = (np.square(unc_weights) * weights) @ transform container.representation = self.apply_mode container["weights"] = hist @@ -192,20 +233,23 @@ def apply_function(self): unc_weights = container["unc_weights"] else: unc_weights = np.ones(weights.shape) + logging.trace("Using 'unc_weights' array %s for '%s'", + unc_weights, container.name) + full_weights = unc_weights * weights # The hist is now computed using a binning that is completely linear # and regular hist = histogram( sample, - unc_weights*weights, + full_weights, self.data["regularized_output_binning"], averaged=False ) if self.error_method == "sumw2": - sumw2 = histogram(sample, np.square(unc_weights*weights), + sumw2 = histogram(sample, np.square(full_weights), self.data["regularized_output_binning"], averaged=False) - bin_unc2 = histogram(sample, np.square(unc_weights)*weights, + bin_unc2 = histogram(sample, np.square(unc_weights) * weights, self.data["regularized_output_binning"], averaged=False) container.representation = self.apply_mode From 6d7bf42a79acf2d769b11de32beaf728b96ea770 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Fri, 5 Jun 2026 19:57:43 +0200 Subject: [PATCH 24/32] update/improve modes notebook [no ci] --- pisa_examples/pisa_modes.ipynb | 190 ++++++++++++++++++++------------- 1 file changed, 114 insertions(+), 76 deletions(-) diff --git a/pisa_examples/pisa_modes.ipynb b/pisa_examples/pisa_modes.ipynb index 5bf236386..4c7f3554a 100644 --- a/pisa_examples/pisa_modes.ipynb +++ b/pisa_examples/pisa_modes.ipynb @@ -6,13 +6,13 @@ "source": [ "# PISA stage modes\n", "\n", - "Every PISA [stage](https://github.com/icecube/pisa/blob/master/pisa/core/stage.py) of a [pipeline](https://github.com/icecube/pisa/blob/master/pisa/core/pipeline.py) has a `calc_mode` and an `apply_mode`. Both instance attributes specify the \"representation\" in which generic [data](https://github.com/icecube/pisa/blob/master/pisa/core/container.py) (e.g., neutrino MC events) is processed through the pipeline. Often calculations can be faster when performed on grids, but we need to be careful in order to ensure that we are not introducing large errors.\n", + "Every PISA [`Stage`](https://github.com/icecube/pisa/blob/master/pisa/core/stage.py) of a [pipeline](https://github.com/icecube/pisa/blob/master/pisa/core/pipeline.py) (also: \"service\" or \"stage\") has a `calc_mode` and an `apply_mode`. Both instance attributes specify the [\"representation\"](https://icecube.github.io/pisa/pisa.core.html#module-pisa.core.container) in which generic [data](https://github.com/icecube/pisa/blob/master/pisa/core/container.py) (e.g., neutrino MC events) is processed through the pipeline. Often calculations can be faster when performed on grids, but we need to be careful in order to ensure that we are not introducing large errors.\n", "\n", - "More specifically, `calc_mode` by default defines the representation during the `setup()`and `compute()` steps, and `apply_mode` that during the `apply` step, see the [stages readme](https://github.com/icecube/pisa/blob/master/pisa/stages/README.md). The latter two steps are executed successively whenever a given stage instance is `run()`, during the pipeline output calculation. Like this, complex event-by-event calculations (e.g., oscillation probabilities) can for example be executed during the `compute()` step, which also has a basic caching mechanism to avoid redundant calculations. The `apply()` step typically performs simple transformations (using results of a preceding `compute()` step or not) of the data in the representation determined by `apply_mode`. Take a look at different stage implementations (\"services\") and example pipeline configuration files to get a better feel for the concept.\n", + "More specifically, `calc_mode` by default defines the representation during the `setup()`and `compute()` steps, and `apply_mode` that during the `apply` step (refer to the [HOWTO](https://icecube.github.io/pisa/stubs/howto_service_stub.html) on creating a service for more details). The latter two steps are executed successively whenever a given `Stage` instance is `run()`, during the pipeline output calculation. Like this, complex event-by-event calculations (e.g., oscillation probabilities) can for example be executed during the `compute()` step, which also has a basic caching mechanism to avoid redundant calculations—in contrast to the `apply()` step. It typically performs simple transformations (using results of a preceding `compute()` step or not) of the data in the representation determined by `apply_mode`. Take a look at different services and example pipeline configuration files to get a better feel for the concept.\n", "\n", - "Note that you can change the modes on runtime, but after doing so need to `setup()` the stage or pipeline again (exercise: can you find a service which only defines its `setup()` step, but neither `compute()` nor `apply()`?).\n", + "As the stages of the pipeline are `run()` in succession, PISA automatically translates between different representations of the pipeline data, depending on the entirety of `calc_mode`s and `apply_mode`s in the pipeline. You can mix and match to some extent, but be aware that every translation will introduce computational cost and hence may slow things down. Also, rebinning a histogram to some finer binning or inverting the histogramming procedure are ill-posed problems when the weight distributions within the bins are unknown.\n", "\n", - "If the output representation of a stage is different than what, for example, the next stage needs to have as input, the output is automatically translated by PISA (translation between data representations). So you can mix and match, but be aware that translations will introduce computational cost and hence may slow things down." + "As demonstrated in this notebook, the above modes cannot just be specified during stage or pipeline instantiation, but can also be changed at runtime. However, for such a change of `calc_mode` to take effect, one has to make sure to `setup()` the stage or pipeline again." ] }, { @@ -38,33 +38,32 @@ "| **aeff.weight_hnl** | ✗ | ✗ | ✓ | None | \"events\", \"log_events\", MultiDimBinning | |\n", "| **background.atm_muons** | ✓ | ✗ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", "| **cont_sys.snowstorm_hist** | ✓ | ✓ | ✓ | \"events\" | None, MultiDimBinning | |\n", - "| **data.csv_data_hist** | ✓ | ✗ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))**, setup only |\n", + "| **data.csv_data_hist** | ✓ | ✗ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠️ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))**, setup only |\n", "| **data.csv_icc_hist** | ✓ | ✗ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", "| **data.csv_loader** | ✓ | ✗ | ✓ | \"events\" | \"events\" | |\n", "| **data.grid** | ✓ | ✗ | ✓ | \"events\" | \"events\", \"log_events\", MultiDimBinning | |\n", "| **data.meows_loader** | ✓ | ✗ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", "| **data.simple_data_loader** | ✓ | ✗ | ✓ | None | \"events\" | |\n", - "| **data.simple_signal** | ✓ | ✗ | ✓ | \"events\" | MultiDimBinning | |\n", "| **data.sqlite_loader** | ✓ | ✗ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", "| **data.toy_event_generator** | ✓ | ✗ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", "| **discr_sys.csv_hypersurfaces** | ✓ | ✓ | ✓ | MultiDimBinning | MultiDimBinning, \"events\" | |\n", "| **discr_sys.hypersurfaces** | ✓ | ✓ | ✓ | MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", "| **discr_sys.ultrasurfaces** | ✓ | ✓ | ✓ | \"events\" | \"events\", \"log_events\", MultiDimBinning | |\n", "| **flux.astrophysical** | ✓ | ✓ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", - "| **flux.barr_simple** | ✓ | ✓ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))** |\n", - "| **flux.daemon_flux** | ✓ | ✓ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))** |\n", - "| **flux.hillasg** | ✓ | ✓ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))** |\n", - "| **flux.honda_ip** | ✓ | ✓ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))** |\n", - "| **flux.mceq_barr** | ✓ | ✓ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))** |\n", - "| **flux.mceq_barr_red** | ✓ | ✓ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))** |\n", + "| **flux.barr_simple** | ✓ | ✓ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠️ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))** |\n", + "| **flux.daemon_flux** | ✓ | ✓ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠️ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))** |\n", + "| **flux.hillasg** | ✓ | ✓ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠️ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))** |\n", + "| **flux.honda_ip** | ✓ | ✓ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠️ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))** |\n", + "| **flux.mceq_barr** | ✓ | ✓ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠️ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))** |\n", + "| **flux.mceq_barr_red** | ✓ | ✓ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠️ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))** |\n", "| **likelihood.generalized_llh_params** | ✓ | ✗ | ✓ | \"events\", \"log_events\", MultiDimBinning | MultiDimBinning | |\n", "| **osc.decoherence** | ✓ | ✓ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", "| **osc.globes** | ✓ | ✓ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", "| **osc.prob3** | ✓ | ✓ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", "| **osc.two_nu_osc** | ✗ | ✗ | ✓ | None | \"events\", \"log_events\", MultiDimBinning | |\n", - "| **reco.resolutions** | ✓ | ✗ | ✗ | \"events\" | None | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))**, setup only |\n", - "| **reco.simple_param** | ✓ | ✗ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))**, setup only |\n", - "| **utils.add_indices** | ✓ | ✗ | ✗ | \"events\" | MultiDimBinning | ⚠ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))**, setup only |\n", + "| **reco.resolutions** | ✓ | ✗ | ✗ | \"events\" | None | ⚠️ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))**, setup only |\n", + "| **reco.simple_param** | ✓ | ✗ | ✗ | \"events\", \"log_events\", MultiDimBinning | None | ⚠️ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))**, setup only |\n", + "| **utils.add_indices** | ✓ | ✗ | ✗ | \"events\" | MultiDimBinning | ⚠️ **Implicit caching ([#821](https://github.com/icecube/pisa/issues/821))**, setup only |\n", "| **utils.adhoc_sys** | ✓ | ✗ | ✓ | \"events\" | \"events\" | |\n", "| **utils.bootstrap** | ✓ | ✗ | ✓ | \"events\" | \"events\", \"log_events\", MultiDimBinning | |\n", "| **utils.fix_error** | ✓ | ✓ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |\n", @@ -78,6 +77,13 @@ "| **xsec.nutau_xsec** | ✓ | ✓ | ✓ | \"events\", \"log_events\", MultiDimBinning | \"events\", \"log_events\", MultiDimBinning | |" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Three example pipeline configurations" + ] + }, { "cell_type": "code", "execution_count": null, @@ -94,61 +100,32 @@ "metadata": {}, "source": [ "We will configure our neutrino pipeline in 3 different ways:\n", - "* The standard form with *some* calculation on grids\n", - "* All calculations on an event-by-event basis (the most correct, but by far slowest way)\n", - "* All calculations on grids (usually faster for large event samples)" + "1. The standard form with *some* calculation on grids\n", + "2. All calculations that allow it on an event-by-event basis (the most correct, but by far slowest way)\n", + "3. All calculations that allow it on grids (usually faster for large event samples)" ] }, { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "mixed_modes_model = Pipeline(\"settings/pipeline/IceCube_3y_neutrinos.cfg\", profile=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "events_modes_model = Pipeline(\"settings/pipeline/IceCube_3y_neutrinos.cfg\", profile=True)\n", - "\n", - "events_modes_model.stages[1].calc_mode = \"events\"\n", - "events_modes_model.stages[2].calc_mode = \"events\"\n", - "events_modes_model.stages[3].calc_mode = \"events\"\n", - "\n", - "events_modes_model.setup()" + "### 1. Default/mixed configuration" ] }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, + "execution_count": 2, + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ - "grid_modes_model = Pipeline(\"settings/pipeline/IceCube_3y_neutrinos.cfg\", profile=True)\n", - "\n", - "true_binning = grid_modes_model.stages[1].calc_mode\n", - "\n", - "for s in grid_modes_model.stages[:-2]:\n", - " try:\n", - " s.calc_mode = true_binning\n", - " except:\n", - " pass\n", - " try:\n", - " s.apply_mode = true_binning\n", - " except:\n", - " pass\n", - "grid_modes_model.stages[5].calc_mode = true_binning\n", - "grid_modes_model.setup()" + "mixed_modes_model = Pipeline(\"settings/pipeline/IceCube_3y_neutrinos.cfg\", profile=True)" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -192,7 +169,7 @@ " | | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | | | | |" ] }, - "execution_count": 5, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -201,6 +178,30 @@ "mixed_modes_model" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Event-by-event configuration\n", + "\n", + "Now `compute()` of the 2nd to 4th service (flux and oscillations) is performed in event-by-event mode instead (while data-loading, histogramming, and discrete-systematics service configurations remain unchanged)." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "events_modes_model = Pipeline(\"settings/pipeline/IceCube_3y_neutrinos.cfg\", profile=True)\n", + "\n", + "events_modes_model.stages[1].calc_mode = \"events\"\n", + "events_modes_model.stages[2].calc_mode = \"events\"\n", + "events_modes_model.stages[3].calc_mode = \"events\"\n", + "\n", + "events_modes_model.setup()" + ] + }, { "cell_type": "code", "execution_count": 6, @@ -250,10 +251,42 @@ "events_modes_model" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3. Grid calculations\n", + "\n", + "Now all calculations, whether `compute()` or `apply()`, are performed on grids (where the service allows)." + ] + }, { "cell_type": "code", "execution_count": 7, "metadata": {}, + "outputs": [], + "source": [ + "grid_modes_model = Pipeline(\"settings/pipeline/IceCube_3y_neutrinos.cfg\", profile=True)\n", + "\n", + "true_binning = grid_modes_model.stages[1].calc_mode\n", + "\n", + "for s in grid_modes_model.stages[:-2]:\n", + " try:\n", + " s.calc_mode = true_binning\n", + " except:\n", + " pass\n", + " try:\n", + " s.apply_mode = true_binning\n", + " except:\n", + " pass\n", + "grid_modes_model.stages[5].calc_mode = true_binning\n", + "grid_modes_model.setup()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, "outputs": [ { "data": { @@ -300,7 +333,7 @@ " | | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | 8 (reco_energy) x 8 (reco_coszen) x 2 (pid) | | | | |" ] }, - "execution_count": 7, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -313,22 +346,23 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can compare timings. Event-by-event it takes around 8 minutes! The two other modes around 25 seconds.\n", + "### Output analysis\n", "\n", - "**Note**: To speed up the following `get_outputs()` calls, consider running this notebook after having set the environment variables `PISA_TARGET=\"parallel\"` and `PISA_NUM_THREADS = 1>`." + "#### Timings\n", + "We can compare timings in the following. Event by event it takes around 8 minutes! The two other modes around 25 seconds. (Absolute and relative timings depend on the sizes of the event sample and the grids of course.)" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 6min 42s, sys: 36.8 ms, total: 6min 42s\n", - "Wall time: 6min 42s\n" + "CPU times: user 6min 51s, sys: 80.2 ms, total: 6min 52s\n", + "Wall time: 6min 52s\n" ] } ], @@ -339,15 +373,15 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 25.2 s, sys: 15.8 ms, total: 25.2 s\n", - "Wall time: 25.4 s\n" + "CPU times: user 21.8 s, sys: 0 ns, total: 21.8 s\n", + "Wall time: 21.8 s\n" ] } ], @@ -358,15 +392,17 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, + "execution_count": 11, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 21.8 s, sys: 8.19 ms, total: 21.8 s\n", - "Wall time: 21.5 s\n" + "CPU times: user 21.4 s, sys: 0 ns, total: 21.4 s\n", + "Wall time: 21.2 s\n" ] } ], @@ -379,12 +415,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can see that in this configuration we probably have fine enough grids, such that differences are at the sub-percent level. This may or may not be acceptable for the specific analysis you want to do." + "#### Comparisons between total binwise counts\n", + "\n", + "From the following output-comparison plots we can see that in this scenario we probably have fine enough grids, such that differences are at the sub-percent level. This may or may not be acceptable for the specific physics analysis you are performing." ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -392,11 +430,11 @@ "text/plain": [ "(
,\n", " ,\n", - " ,\n", + " ,\n", " None)" ] }, - "execution_count": 11, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, @@ -432,12 +470,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In depth comparison of single maps:" + "#### In-depth comparisons between single maps (by neutrino type, flavor, and interaction)" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -464,7 +502,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 17, "metadata": {}, "outputs": [ { From a6ff8b7b3cdd656cbde524f80871bbeaea9e840b Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Wed, 24 Jun 2026 19:20:09 +0200 Subject: [PATCH 25/32] remove mark_changed call erroneously introduced when resolving merge conflicts; adapt pipeline unit test to reflect new treatment of weights; finally wile -> while --- pisa/core/container.py | 3 +-- pisa/core/pipeline.py | 9 +++++++-- pisa_tests/run_unit_tests.py | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/pisa/core/container.py b/pisa/core/container.py index 35d03fb84..763e48117 100644 --- a/pisa/core/container.py +++ b/pisa/core/container.py @@ -724,7 +724,6 @@ def set_item_no_invalidate(self, key, data): self.validity[key][rep_hash] = True logging.trace("Re-validated variable '%s' in representation '%s'.", key, self._representations[rep_hash]) - self.mark_changed(key) def __add_data(self, key, data): """Add data for a given variable, after performing consistency checks @@ -895,7 +894,7 @@ def translate(self, key, src_representation): # Destination rep. is from map to an event-by-event rep., which would # require using information about weight distribution (TODO) raise NotImplementedError( - f"Translating {src_representation} to {dest_representation}" + f"Translating from {src_representation} to {dest_representation}" " in 'sum' mode!" ) # Do not distinguish between average and sum modes in case of one-to-one diff --git a/pisa/core/pipeline.py b/pisa/core/pipeline.py index e465b758c..196b36950 100755 --- a/pisa/core/pipeline.py +++ b/pisa/core/pipeline.py @@ -870,9 +870,14 @@ def test_Pipeline(): # osc.prob3 apply_mode: pipeline.stages[2].apply_mode = binned_apply_mode assert pipeline.stages[3].apply_mode == "events" - # allowed right now: going from a binned output (after osc.) to events + # not allowed: going from a binned output (after osc.) to events # (after aeff) - _ = pipeline.get_outputs() + try: + _ = pipeline.get_outputs() + except NotImplementedError: + pass + else: + assert False # reset apply mode pipeline.stages[2].apply_mode = "events" diff --git a/pisa_tests/run_unit_tests.py b/pisa_tests/run_unit_tests.py index 6f80a7826..ece4dc420 100755 --- a/pisa_tests/run_unit_tests.py +++ b/pisa_tests/run_unit_tests.py @@ -195,7 +195,7 @@ def run_unit_tests( err_name = err.name # pylint: disable=no-member module_pypaths_failed_ignored.append(module_pypath) logging.warning( - f"{PFX}module {err_name} failed to import wile importing" + f"{PFX}module {err_name} failed to import while importing" f" {module_pypath}, but ok to ignore" ) continue From e44b335681f7f11096d35573e8afc52c816d3f95 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Fri, 31 Jul 2026 20:58:52 +0200 Subject: [PATCH 26/32] fix links in notebook [no ci] --- pisa_examples/pisa_modes.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pisa_examples/pisa_modes.ipynb b/pisa_examples/pisa_modes.ipynb index 4c7f3554a..02d029817 100644 --- a/pisa_examples/pisa_modes.ipynb +++ b/pisa_examples/pisa_modes.ipynb @@ -6,9 +6,9 @@ "source": [ "# PISA stage modes\n", "\n", - "Every PISA [`Stage`](https://github.com/icecube/pisa/blob/master/pisa/core/stage.py) of a [pipeline](https://github.com/icecube/pisa/blob/master/pisa/core/pipeline.py) (also: \"service\" or \"stage\") has a `calc_mode` and an `apply_mode`. Both instance attributes specify the [\"representation\"](https://icecube.github.io/pisa/pisa.core.html#module-pisa.core.container) in which generic [data](https://github.com/icecube/pisa/blob/master/pisa/core/container.py) (e.g., neutrino MC events) is processed through the pipeline. Often calculations can be faster when performed on grids, but we need to be careful in order to ensure that we are not introducing large errors.\n", + "Every PISA [`Stage`](https://github.com/icecube/pisa/blob/master/pisa/core/stage.py) of a [pipeline](https://github.com/icecube/pisa/blob/master/pisa/core/pipeline.py) (also: \"service\" or \"stage\") has a `calc_mode` and an `apply_mode`. Both instance attributes specify the [\"representation\"](https://icecube.github.io/pisa/docs/pisa.core.html#module-pisa.core.container) in which generic data (e.g., neutrino MC events) is processed through the pipeline. Often calculations can be faster when performed on grids, but we need to be careful in order to ensure that we are not introducing large errors.\n", "\n", - "More specifically, `calc_mode` by default defines the representation during the `setup()`and `compute()` steps, and `apply_mode` that during the `apply` step (refer to the [HOWTO](https://icecube.github.io/pisa/stubs/howto_service_stub.html) on creating a service for more details). The latter two steps are executed successively whenever a given `Stage` instance is `run()`, during the pipeline output calculation. Like this, complex event-by-event calculations (e.g., oscillation probabilities) can for example be executed during the `compute()` step, which also has a basic caching mechanism to avoid redundant calculations—in contrast to the `apply()` step. It typically performs simple transformations (using results of a preceding `compute()` step or not) of the data in the representation determined by `apply_mode`. Take a look at different services and example pipeline configuration files to get a better feel for the concept.\n", + "More specifically, `calc_mode` by default defines the representation during the `setup()`and `compute()` steps, and `apply_mode` that during the `apply` step (refer to the [HOWTO](https://icecube.github.io/pisa/docs/stubs/howto_service_stub.html) on creating a service for more details). The latter two steps are executed successively whenever a given `Stage` instance is `run()`, during the pipeline output calculation. Like this, complex event-by-event calculations (e.g., oscillation probabilities) can for example be executed during the `compute()` step, which also has a basic caching mechanism to avoid redundant calculations—in contrast to the `apply()` step. This step typically performs simple transformations (using results of a preceding `compute()` step or not) of the data in the representation determined by `apply_mode`. Take a look at different services and example pipeline configuration files to get a better feel for the concept.\n", "\n", "As the stages of the pipeline are `run()` in succession, PISA automatically translates between different representations of the pipeline data, depending on the entirety of `calc_mode`s and `apply_mode`s in the pipeline. You can mix and match to some extent, but be aware that every translation will introduce computational cost and hence may slow things down. Also, rebinning a histogram to some finer binning or inverting the histogramming procedure are ill-posed problems when the weight distributions within the bins are unknown.\n", "\n", From a81734dc7aebf3915f940e04ec4934a242fbd40e Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Fri, 31 Jul 2026 23:18:44 +0200 Subject: [PATCH 27/32] make events<->log_events translation more robust --- pisa/core/container.py | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/pisa/core/container.py b/pisa/core/container.py index 763e48117..7b5926279 100644 --- a/pisa/core/container.py +++ b/pisa/core/container.py @@ -842,6 +842,43 @@ def __iter__(self): """Iterate over all keys in container""" return self.keys + def _events_to_log_events(self, key): + '''One-to-one translation: take (guarded) log of per-event quantities + + Rejects negative values, zeros produce -inf, and raises if NaNs are + present. + ''' + arr = self[key] + if np.any(np.isnan(arr)): + raise ValueError(f"Cannot take log of NaNs for '{key}'.") + if np.any(arr < 0): + raise ValueError(f"Cannot take log of negative values for '{key}'.") + # use numpy.errstate to avoid noisy warnings for log(0) -> -inf + with np.errstate(divide='ignore'): + log_arr = np.log(arr) + return log_arr + + def _log_events_to_events(self, key): + '''One-to-one translation: (guarded) exponentiation of per-event quantities. + + Rejects NaNs in the log array, -inf produces 0, and warns when + exponentiation yields +inf. + ''' + log_arr = self[key] + if np.any(np.isnan(log_arr)): + raise ValueError(f"Cannot exponentiate NaNs for '{key}'.") + with np.errstate(over='ignore'): + # an overflow is treated afterwards + arr = np.exp(log_arr) + pos_inf_mask = np.isposinf(arr) + if np.any(pos_inf_mask): + logging.warning( + "Container `%s`: exponentiation produced +inf for variable '%s'" + " in %d element(s). Check input values in 'log_events'" + " representation!", self.name, key, int(pos_inf_mask.sum()) + ) + return arr + def translate(self, key, src_representation): '''Translate data for variable `key` from source rep. to current rep. @@ -901,11 +938,10 @@ def translate(self, key, src_representation): # relationship elif src_representation == "events" and dest_representation == "log_events": self.representation = "events" - logging.trace(f"Container `{self.name}`: taking log of {key}") - out = np.log(self[key]) + out = self._events_to_log_events(key) elif src_representation == "log_events" and dest_representation == "events": self.representation = "log_events" - out = np.exp(self[key]) + out = self._log_events_to_events(key) else: raise NotImplementedError( f"Translating from {src_representation} to {dest_representation}" From 8e2fe21e4c4b2441cc2511e33219a0ce40576ca8 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Sat, 1 Aug 2026 00:17:57 +0200 Subject: [PATCH 28/32] add a test showing that set_item_no_invalidate() works with a new variable, add comments, and integrate additional sanity checks into translate() --- pisa/core/container.py | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/pisa/core/container.py b/pisa/core/container.py index 7b5926279..a0a7abdbd 100644 --- a/pisa/core/container.py +++ b/pisa/core/container.py @@ -702,7 +702,8 @@ def __setitem__(self, key, data): def set_item_no_invalidate(self, key, data): """Set `self[key]` to `data`, but without invalidating representations - that aren't already invalid. + that aren't already invalid. If the variable `key` is new, no other + representations than the current one are involved. Parameters ---------- @@ -718,7 +719,10 @@ def set_item_no_invalidate(self, key, data): logging.trace("Found %d currently valid representation(s) for variable '%s'", len(valid_rep_hashs_for_key), key) - self[key] = data # causes all but current rep. to become invalid + # We want this call to __setitem__ to reuse its checks, assignments, + # and bookkeeping, even though it will initially cause all but the + # current representation to become invalid. + self[key] = data for rep_hash in valid_rep_hashs_for_key: self.validity[key][rep_hash] = True @@ -893,7 +897,16 @@ def translate(self, key, src_representation): src_representation : hashable object, e.g. str or MultiDimBinning some representation present in container ''' - assert hash(src_representation) in self.representation_keys + src_hash = hash(src_representation) + assert src_hash in self.representation_keys + + # ensure src is actually valid + if not self.validity[key].get(src_hash, False): + raise ValueError( + f"Source representation {src_representation} for variable '{key}'" + " is not valid; call auto_translate() or provide a valid" + " representation before calling translate()!" + ) if not self.translation_modes[key] in self.valid_translation_modes: raise ValueError( @@ -902,8 +915,9 @@ def translate(self, key, src_representation): ) dest_representation = self.representation + dest_hash = hash(dest_representation) - if hash(src_representation) == hash(dest_representation): + if src_hash == dest_hash: logging.trace("Attempting to translate from one representation to" " itself, so there is nothing to do.") return @@ -950,6 +964,9 @@ def translate(self, key, src_representation): self.representation = dest_representation self.set_item_no_invalidate(key=key, data=out) + # Sanity check on source and dest + assert self.validity[key][src_hash] + assert self.validity[key][dest_hash] def auto_translate(self, key): '''Auto translate to current representation after auto-determining a @@ -1104,7 +1121,6 @@ def get_keep_mask(self, keep_criteria): return eval(keep_criteria) # pylint: disable=eval-used - def test_container(): """Unit tests for :py:class:`Container` class.""" @@ -1227,6 +1243,17 @@ def test_container(): container.validity[Container.sum_mode_keys[0]][hash('events')] = True _ = container[Container.sum_mode_keys[0]] + # Also try to set a previously unseen variable via `set_item_no_invalidate` + new_key = 'newkey' + assert new_key not in container.all_keys + container.set_item_no_invalidate(key=new_key, data=data) + assert 'newkey' in container.all_keys + assert container.translation_modes['newkey'] == 'average' + # only current "events" rep. should be valid + valid_flags = container.validity['newkey'] + assert valid_flags.get(hash('events'), False) + assert sum(1 for v in valid_flags.values() if v) == 1 + def test_container_set(): """Unit tests for :py:class:`ContainerSet` class.""" From 51b8412118868fa5fc6234f022f49b1d5395624a Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Sat, 1 Aug 2026 01:19:47 +0200 Subject: [PATCH 29/32] avoid globally enabling matplotlib's tex.usetex (and never enable if no tex engine is present) --- pisa/scripts/test_flux_weights.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pisa/scripts/test_flux_weights.py b/pisa/scripts/test_flux_weights.py index 63cda4ac3..49cc723d2 100755 --- a/pisa/scripts/test_flux_weights.py +++ b/pisa/scripts/test_flux_weights.py @@ -7,12 +7,10 @@ from __future__ import absolute_import, division -from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter import os import numpy as np from matplotlib import pyplot as plt -plt.rcParams['text.usetex'] = True import matplotlib.colors as colors from pisa.utils.log import logging, set_verbosity @@ -1460,6 +1458,15 @@ def do_2d_3d_honda_test(spline_dict, flux_dict, outdir, oversample, save_name, def main(): + from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter + import shutil + print(shutil.which('latex')) + # only use LaTeX rendering if an engine is actually available + if shutil.which('latex'): + plt.rcParams['text.usetex'] = True + else: + plt.rcParams['text.usetex'] = False + parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) parser.add_argument('--flux-file-2d', type=str, default=None, From 3f787381992463720719219db9f6fc1c7e030568 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Tue, 4 Aug 2026 17:38:02 +0200 Subject: [PATCH 30/32] implement a few more test scenarios demonstrating different ways of mutating Container data with or without invalidating other reps --- pisa/core/container.py | 99 ++++++++++++++++++++++++++++++++---------- 1 file changed, 76 insertions(+), 23 deletions(-) diff --git a/pisa/core/container.py b/pisa/core/container.py index a0a7abdbd..3b885424d 100644 --- a/pisa/core/container.py +++ b/pisa/core/container.py @@ -193,6 +193,7 @@ from collections.abc import Sequence from collections import defaultdict +from copy import deepcopy import re import numpy as np @@ -1190,29 +1191,77 @@ def test_container(): container['y'] = y assert container.translation_modes['y'] == 'average' + # Test translation logic for variables transforming in sum mode container.representation = binning binning_hash = hash(binning) - for k in container.all_keys: - if 'weight' in k: - # First artificially invalidate current rep., so a translation is required - container.validity[k][binning_hash] = False - data = container[k] * 1.01 - # Should already have been translated to binned rep due to statement - # `container[k]`, without invalidating anything - assert container.validity[k][binning_hash] - assert container.validity[k][hash('events')] - # But entry not yet rescaled - assert not np.allclose(container[k], data, **ALLCLOSE_KW) - # Test modification via method that doesn't invalidate reps. - container.set_item_no_invalidate(key=k, data=data) - assert container.validity[k][binning_hash] - # 'events' rep again needs to remain valid - assert container.validity[k][hash('events')] - assert np.allclose(container[k], data, **ALLCLOSE_KW) - # Now test "traditional" in-place modification - container[k] *= 1.0 # invalidates 'events' rep. when __setitem__ called - assert container.validity[k][binning_hash] - assert not container.validity[k][hash('events')] + # Just pick last weight key from above + k = weight_key + # Artificially invalidate current (=binned) rep., so a translation to it + # will be required + container.validity[k][binning_hash] = False + data = container[k] * 1.01 + # Should now already have been translated to binned rep due to statement + # `container[k]`, without invalidating anything (e.g. 'events') + assert container.validity[k][binning_hash] + assert container.validity[k][hash('events')] + # But entry not yet rescaled + assert not np.allclose(container[k], data, **ALLCLOSE_KW) + + # 1. Test modification via method that doesn't invalidate reps. + container.set_item_no_invalidate(key=k, data=data) + assert container.validity[k][binning_hash] + # 'events' rep again needs to remain valid + assert container.validity[k][hash('events')] + # Entry has to be the rescaled one + assert np.allclose(container[k], data, **ALLCLOSE_KW) + + # 2. "Traditional" subscription augmented assignment + # (triggers __setitem__ and therefore mark_changed) + container[k] *= 1.0 + assert container.validity[k][binning_hash] + assert not container.validity[k][hash('events')] + + # 3. Mutating returned object in-place (here: in binned rep.) + # Re-validate 'events' manually, so we can check for invalidation + container.validity[k][hash('events')] = True + assert container.representation == binning + arr = container[k] + orig_arr = deepcopy(arr) + arr += 5. + # -> Local reference mutated - the container data should have been modified + assert np.allclose(container[k] - orig_arr, 5., **ALLCLOSE_KW) + # But without marking the data as changed! + assert container.validity[k][hash('events')] + assert container.validity[k][binning_hash] + container.mark_changed(k) + assert not container.validity[k][hash('events')] + assert container.validity[k][binning_hash] + + # 4. Overwrite an index into the returned array (same outcome as in 3.) + # Re-validate 'events' manually, so we can check for invalidation + container.validity[k][hash('events')] = True + orig_arr = deepcopy(container[k]) + container[k][0] = np.inf + assert container[k][0] != orig_arr[0] + assert container.validity[k][hash('events')] + assert container.validity[k][binning_hash] + container.mark_changed(k) + assert not container.validity[k][hash('events')] + assert container.validity[k][binning_hash] + + # 5. Directly manipulate internal storage (same outcome as in 3.+4.) + # Re-validate 'events' manually, so we can check for invalidation + container.validity[k][hash('events')] = True + new_data = np.ones_like(orig_arr) + # Instead of `current_data[k]`, could also set `data[hash(rep)][k]` here + container.current_data[k] = new_data + assert np.allclose(container[k], new_data, **ALLCLOSE_KW) + assert container.validity[k][hash('events')] + assert container.validity[k][binning_hash] + container.mark_changed(k) + assert not container.validity[k][hash('events')] + assert container.validity[k][binning_hash] + # Setting invalid mode for binning dimension is irrelevant/ignored # when attempting to get it in the binned rep. @@ -1243,13 +1292,17 @@ def test_container(): container.validity[Container.sum_mode_keys[0]][hash('events')] = True _ = container[Container.sum_mode_keys[0]] - # Also try to set a previously unseen variable via `set_item_no_invalidate` + + # 3rd set of tests + # ---------------- + # Assumes `container` and `data` exist and that we are in 'events' rep. + # Try to set a previously unseen variable via `set_item_no_invalidate` new_key = 'newkey' assert new_key not in container.all_keys container.set_item_no_invalidate(key=new_key, data=data) assert 'newkey' in container.all_keys assert container.translation_modes['newkey'] == 'average' - # only current "events" rep. should be valid + # only current "events" rep. should be valid, no others valid_flags = container.validity['newkey'] assert valid_flags.get(hash('events'), False) assert sum(1 for v in valid_flags.values() if v) == 1 From 60108fa27de66df072c37f8d3551d6dc7ba611e8 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Wed, 12 Aug 2026 18:55:50 +0200 Subject: [PATCH 31/32] document cases in which modification of container data is or isn't automatically accompanied by automatic representation management --- pisa/core/container.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/pisa/core/container.py b/pisa/core/container.py index 3b885424d..88fec3378 100644 --- a/pisa/core/container.py +++ b/pisa/core/container.py @@ -53,6 +53,20 @@ 1. that representation is marked as *valid* for that variable, and 2. all other representations are marked as *invalid*. +.. caution:: + Not all modifications will result in a call to `__setitem__()` and therefore + trigger the above automatic representation validation/invalidation + management. The following ways of modifying the data *will* do so: + + - direct assignment to variable subscript (``container[key] = new_data``) + - augmented assignment to variable subscript (e.g. ``container[key] *= 2``) + + The following ways *will not* do so (among others): + + - in-place modification of returned object (e.g. ``data = container[key]; data *= 2`` for mutable types) + - assignment to particular index/subscript of the data (e.g. ``container[key][0] = 0``) + - bypassing user interface/direct manipulation of internal storage (e.g. ``container.current_data[key] = new_data``) + If custom validity configuration is required, the methods :py:meth:`~Container.mark_changed` and :py:meth:`~Container.mark_valid` may be called and the attribute :py:attr:`~Container.validity` manipulated as desired. @@ -75,6 +89,11 @@ which does not invalidate any representations. +.. tip:: + In case of uncertainty, in particular when devising a new service which + modifies data in some representation, include an explicit call to + :py:meth:`~Container.mark_changed`. + When accessing data in a currently invalid representation, :py:meth:`~Container.auto_translate` is triggered, which ensures synchronization across representations as needed, i.e., on demand. The feasibility and details From 39ed269a8dcbe98647ad9fb8cf4238de51187547 Mon Sep 17 00:00:00 2001 From: T Ehrhardt Date: Wed, 12 Aug 2026 21:51:28 +0200 Subject: [PATCH 32/32] slighty improve container & translation docstrings --- pisa/core/container.py | 8 ++++++++ pisa/core/translation.py | 10 +++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/pisa/core/container.py b/pisa/core/container.py index 88fec3378..b42d650d6 100644 --- a/pisa/core/container.py +++ b/pisa/core/container.py @@ -871,6 +871,10 @@ def _events_to_log_events(self, key): Rejects negative values, zeros produce -inf, and raises if NaNs are present. + + Raises + ------ + ValueError : if NaNs or negative values are present in data for `key` ''' arr = self[key] if np.any(np.isnan(arr)): @@ -887,6 +891,10 @@ def _log_events_to_events(self, key): Rejects NaNs in the log array, -inf produces 0, and warns when exponentiation yields +inf. + + Raises + ------ + ValueError : if NaNs are present in data for `key` ''' log_arr = self[key] if np.any(np.isnan(log_arr)): diff --git a/pisa/core/translation.py b/pisa/core/translation.py index 1920fe7aa..4ada64eff 100644 --- a/pisa/core/translation.py +++ b/pisa/core/translation.py @@ -54,9 +54,9 @@ def resample(weights, old_sample, old_binning, new_sample, new_binning): ---------- weights : np.ndarray old_sample : list of np.ndarray - old_binning : PISA MultiDimBinning + old_binning : MultiDimBinning new_sample : list of np.ndarray - new_binning : PISA MultiDimBinning + new_binning : MultiDimBinning Returns ------- @@ -96,7 +96,7 @@ def histogram(sample, weights, binning, averaged, apply_weights=True): weights : np.ndarray - binning : PISA MultiDimBinning + binning : MultiDimBinning averaged : bool If True, the histogram entries are averages of the numbers that end up @@ -107,6 +107,10 @@ def histogram(sample, weights, binning, averaged, apply_weights=True): apply_weights : bool wether to use weights or not + Returns + ------- + flat_hist : np.ndarray + 1D array of length `binning.size` """ if not isinstance(binning, MultiDimBinning): raise ValueError("Binning should be a PISA MultiDimBinning")