From 570436195ee5f2c0a6680a26891c052d022285a6 Mon Sep 17 00:00:00 2001 From: Dacheng Xu Date: Sun, 15 Dec 2024 23:48:32 -0500 Subject: [PATCH 1/2] Move `set_nan_defaults` to be a stand-alone function (#1497) --- straxen/plugins/events/event_basics_vanilla.py | 12 +----------- straxen/plugins/events/event_nearest_triggering.py | 3 +-- straxen/plugins/events/event_shadow.py | 4 +--- straxen/plugins/peaks/peak_nearest_triggering.py | 2 +- straxen/plugins/peaks/peak_per_event.py | 3 +-- 5 files changed, 5 insertions(+), 19 deletions(-) diff --git a/straxen/plugins/events/event_basics_vanilla.py b/straxen/plugins/events/event_basics_vanilla.py index 1c34b1875..7c25748d5 100644 --- a/straxen/plugins/events/event_basics_vanilla.py +++ b/straxen/plugins/events/event_basics_vanilla.py @@ -207,19 +207,9 @@ def _get_posrec_dtypes(self): return posrec_dtpye - @staticmethod - def set_nan_defaults(buffer): - """When constructing the dtype, take extra care to set values to np.Nan / -1 (for ints) as 0 - might have a meaning.""" - for field in buffer.dtype.names: - if np.issubdtype(buffer.dtype[field], np.integer): - buffer[field][:] = -1 - else: - buffer[field][:] = np.nan - def compute(self, events, peaks): result = np.zeros(len(events), dtype=self.dtype) - self.set_nan_defaults(result) + strax.set_nan_defaults(result) split_peaks = strax.split_by_containment(peaks, events) diff --git a/straxen/plugins/events/event_nearest_triggering.py b/straxen/plugins/events/event_nearest_triggering.py index 1c854bc33..493aab9b9 100644 --- a/straxen/plugins/events/event_nearest_triggering.py +++ b/straxen/plugins/events/event_nearest_triggering.py @@ -1,6 +1,5 @@ import numpy as np import strax -import straxen export, __all__ = strax.exporter() @@ -77,7 +76,7 @@ def compute(self, events, peaks): split_peaks = strax.split_by_containment(peaks, events) result = np.zeros(len(events), self.dtype) - straxen.EventBasicsVanilla.set_nan_defaults(result) + strax.set_nan_defaults(result) # 1. Assign peaks features to main S1 and main S2 in the event for event_i, (event, sp) in enumerate(zip(events, split_peaks)): diff --git a/straxen/plugins/events/event_shadow.py b/straxen/plugins/events/event_shadow.py index 2616432c8..d521987e7 100644 --- a/straxen/plugins/events/event_shadow.py +++ b/straxen/plugins/events/event_shadow.py @@ -1,8 +1,6 @@ import numpy as np import strax -import straxen - export, __all__ = strax.exporter() @@ -108,7 +106,7 @@ def compute(self, events, peaks): split_peaks = strax.split_by_containment(peaks, events) result = np.zeros(len(events), self.dtype) - straxen.EventBasicsVanilla.set_nan_defaults(result) + strax.set_nan_defaults(result) # 1. Assign peaks features to main S1 and main S2 in the event for event_i, (event, sp) in enumerate(zip(events, split_peaks)): diff --git a/straxen/plugins/peaks/peak_nearest_triggering.py b/straxen/plugins/peaks/peak_nearest_triggering.py index d7ab3366b..44435d47c 100644 --- a/straxen/plugins/peaks/peak_nearest_triggering.py +++ b/straxen/plugins/peaks/peak_nearest_triggering.py @@ -79,7 +79,7 @@ def compute_triggering(self, peaks, current_peak): _peaks = _peaks[_is_triggering] # init result result = np.zeros(len(current_peak), self.dtype) - straxen.EventBasicsVanilla.set_nan_defaults(result) + strax.set_nan_defaults(result) # use center_time as the anchor of things things = np.zeros(len(_peaks), dtype=strax.time_fields) diff --git a/straxen/plugins/peaks/peak_per_event.py b/straxen/plugins/peaks/peak_per_event.py index c6da7f0f9..0b2462949 100644 --- a/straxen/plugins/peaks/peak_per_event.py +++ b/straxen/plugins/peaks/peak_per_event.py @@ -1,6 +1,5 @@ import numpy as np import strax -import straxen export, __all__ = strax.exporter() @@ -30,7 +29,7 @@ def compute(self, events, peaks): split_peaks = strax.split_by_containment(peaks, events) split_peaks_ind = strax.fully_contained_in(peaks, events) result = np.zeros(len(peaks), self.dtype) - straxen.EventBasicsVanilla.set_nan_defaults(result) + strax.set_nan_defaults(result) # Assign peaks features to main S1 and main S2 in the event for event_i, (event, sp) in enumerate(zip(events, split_peaks)): From 713814930c085dff8c4ea8533997178f1dd1790e Mon Sep 17 00:00:00 2001 From: Dacheng Xu Date: Mon, 16 Dec 2024 00:50:57 -0500 Subject: [PATCH 2/2] Set CNF as the default S2 (x, y) position-reconstruction (#1494) * Set CNF as the default S2 (x, y) position-reconstruction * Hack into CMT and assign MLP maps when asked for CNF maps * Hack more * Fix bug --- straxen/analyses/posrec_comparison.py | 2 +- straxen/corrections_services.py | 16 +++++++++++++--- straxen/plugins/defaults.py | 2 +- tests/test_contexts.py | 4 ++-- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/straxen/analyses/posrec_comparison.py b/straxen/analyses/posrec_comparison.py index 4af155410..163b24265 100644 --- a/straxen/analyses/posrec_comparison.py +++ b/straxen/analyses/posrec_comparison.py @@ -13,7 +13,7 @@ def load_corrected_positions( alt_s1=False, alt_s2=False, cmt_version=None, - posrec_algos=("mlp"), # TODO: https://github.com/XENONnT/straxen/issues/1454 + posrec_algos=("mlp", "cnf"), # TODO: https://github.com/XENONnT/straxen/issues/1454 ): """Returns the corrected position for each position algorithm available, without the need to reprocess event_basics, as the needed information is already stored in event_basics. diff --git a/straxen/corrections_services.py b/straxen/corrections_services.py index 561176b87..18e83fb6a 100644 --- a/straxen/corrections_services.py +++ b/straxen/corrections_services.py @@ -15,11 +15,13 @@ export, __all__ = strax.exporter() corrections_w_file = [ - "mlp_model", + "mlp_model", # there is no cnf_model because CNF is using another jax protocol "s2_xy_map_mlp", - "s2_xy_map", + "s2_xy_map_cnf", "s1_xyz_map_mlp", + "s1_xyz_map_cnf", "fdc_map_mlp", + "fdc_map_cnf", "s1_aft_xyz_map", ] @@ -168,7 +170,15 @@ def _get_correction(self, run_id, correction, version): df = self.interface.interpolate(df, when) values.append(df.loc[df.index == when, version].values[0]) else: - df = self.interface.read_at(correction, when) + # TODO: remove this hack when fdc_map_cnf is available + if correction == "fdc_map_cnf": + df = self.interface.read_at("fdc_map_mlp", when) + elif correction == "s1_xyz_map_cnf": + df = self.interface.read_at("s1_xyz_map_mlp", when) + elif correction == "s2_xy_map_cnf": + df = self.interface.read_at("s2_xy_map_mlp", when) + else: + df = self.interface.read_at(correction, when) if df[version].isnull().values.any(): raise CMTnanValueError( f"For {correction} there are NaN values, this means no correction available" diff --git a/straxen/plugins/defaults.py b/straxen/plugins/defaults.py index da19bc1d5..ac2f6b0b0 100644 --- a/straxen/plugins/defaults.py +++ b/straxen/plugins/defaults.py @@ -1,6 +1,6 @@ """Some shared defaults.""" -DEFAULT_POSREC_ALGO = "mlp" +DEFAULT_POSREC_ALGO = "cnf" HE_PREAMBLE = """High energy channels: attenuated signals of the top PMT-array\n""" diff --git a/tests/test_contexts.py b/tests/test_contexts.py index 88d7dceb8..906f9d0ec 100644 --- a/tests/test_contexts.py +++ b/tests/test_contexts.py @@ -79,5 +79,5 @@ def test_cmt_versions(): ) test = unittest.TestCase() - # We should always work for one offline and the online version - test.assertTrue(len(success_for) >= 2) + # We should always work for the online version + test.assertTrue(len(success_for) >= 1)