From a8aa2fc7f2c9d22d792b2edbb63afdd770231f92 Mon Sep 17 00:00:00 2001 From: Luisa Date: Fri, 6 Mar 2026 08:56:13 -0700 Subject: [PATCH] add 90 efficency code --- .../tests/ultra/unit/test_lookup_utils.py | 2 +- .../tests/ultra/unit/test_ultra_l1b_extended.py | 2 +- .../tests/ultra/unit/test_ultra_l1c_pset_bins.py | 1 + imap_processing/ultra/l1b/lookup_utils.py | 14 +++++++++++--- imap_processing/ultra/l1b/ultra_l1b_extended.py | 10 ++++++++-- imap_processing/ultra/l1c/helio_pset.py | 1 + imap_processing/ultra/l1c/spacecraft_pset.py | 1 + imap_processing/ultra/l1c/ultra_l1c_pset_bins.py | 7 ++++++- 8 files changed, 30 insertions(+), 8 deletions(-) diff --git a/imap_processing/tests/ultra/unit/test_lookup_utils.py b/imap_processing/tests/ultra/unit/test_lookup_utils.py index fabe3a8804..3e4244808d 100644 --- a/imap_processing/tests/ultra/unit/test_lookup_utils.py +++ b/imap_processing/tests/ultra/unit/test_lookup_utils.py @@ -113,7 +113,7 @@ def test_get_angular_profiles(): def test_get_energy_efficiencies(ancillary_files): """Tests function get_get_energy_efficiencies.""" - u45_efficiencies = get_energy_efficiencies(ancillary_files) + u45_efficiencies = get_energy_efficiencies(ancillary_files, "ultra45") assert u45_efficiencies.shape == (58081, 157) diff --git a/imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py b/imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py index 0127477c1b..876b6cbea5 100644 --- a/imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py +++ b/imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py @@ -694,7 +694,7 @@ def test_get_efficiency(): / "imap_ultra_l1b-45sensor-logistic-interpolation_20250101_v000.csv" } - efficiency = get_efficiency(energy, phi, theta, ancillary_files) + efficiency = get_efficiency(energy, phi, theta, ancillary_files, "ultra45") expected_efficiency = np.array([0.0593281, 0.21803386, 0.0593281, 0.0628940]) np.testing.assert_allclose(efficiency, expected_efficiency, atol=1e-03, rtol=0) diff --git a/imap_processing/tests/ultra/unit/test_ultra_l1c_pset_bins.py b/imap_processing/tests/ultra/unit/test_ultra_l1c_pset_bins.py index 2d6f249571..1f3fb9cd29 100644 --- a/imap_processing/tests/ultra/unit/test_ultra_l1c_pset_bins.py +++ b/imap_processing/tests/ultra/unit/test_ultra_l1c_pset_bins.py @@ -374,6 +374,7 @@ def test_get_eff_and_gf(imap_ena_sim_metakernel, ancillary_files, spun_index_dat mock_theta, mock_phi, npix=pix, + sensor_id=45, ancillary_files=ancillary_files, apply_bsf=False, ) diff --git a/imap_processing/ultra/l1b/lookup_utils.py b/imap_processing/ultra/l1b/lookup_utils.py index 5642aa4730..eddca3c6e9 100644 --- a/imap_processing/ultra/l1b/lookup_utils.py +++ b/imap_processing/ultra/l1b/lookup_utils.py @@ -210,7 +210,7 @@ def get_angular_profiles( return lookup_table -def get_energy_efficiencies(ancillary_files: dict) -> pd.DataFrame: +def get_energy_efficiencies(ancillary_files: dict, sensor: str) -> pd.DataFrame: """ Lookup table for efficiencies for theta and phi. @@ -221,14 +221,22 @@ def get_energy_efficiencies(ancillary_files: dict) -> pd.DataFrame: ---------- ancillary_files : dict[Path] Ancillary files. + sensor : str + Sensor name: "ultra45" or "ultra90". Returns ------- lookup_table : DataFrame Efficiencies lookup table for a given sensor. """ - # TODO: add sensor to input when new lookup tables are available. - lookup_table = pd.read_csv(ancillary_files["l1b-45sensor-logistic-interpolation"]) + if sensor == "ultra45": + lookup_table = pd.read_csv( + ancillary_files["l1b-45sensor-logistic-interpolation"] + ) + else: + lookup_table = pd.read_csv( + ancillary_files["l1b-90sensor-logistic-interpolation"] + ) return lookup_table diff --git a/imap_processing/ultra/l1b/ultra_l1b_extended.py b/imap_processing/ultra/l1b/ultra_l1b_extended.py index 1ff755d5eb..1a9affa61f 100644 --- a/imap_processing/ultra/l1b/ultra_l1b_extended.py +++ b/imap_processing/ultra/l1b/ultra_l1b_extended.py @@ -1170,6 +1170,7 @@ def get_fwhm( def get_efficiency_interpolator( ancillary_files: dict, + sensor: str, ) -> tuple[RegularGridInterpolator, tuple, tuple]: """ Return a callable function that interpolates efficiency values for each event. @@ -1178,6 +1179,8 @@ def get_efficiency_interpolator( ---------- ancillary_files : dict Ancillary files. + sensor : str + Sensor name: "ultra45" or "ultra90". Returns ------- @@ -1188,7 +1191,7 @@ def get_efficiency_interpolator( phi_min_max : tuple Minimum and maximum phi values in the lookup table. """ - lookup_table = get_energy_efficiencies(ancillary_files) + lookup_table = get_energy_efficiencies(ancillary_files, sensor) theta_vals = np.sort(lookup_table["theta (deg)"].unique()) phi_vals = np.sort(lookup_table["phi (deg)"].unique()) @@ -1218,6 +1221,7 @@ def get_efficiency( phi_inst: NDArray, theta_inst: NDArray, ancillary_files: dict, + sensor: str, interpolator: RegularGridInterpolator = None, ) -> np.ndarray: """ @@ -1233,6 +1237,8 @@ def get_efficiency( Instrument-frame elevation angle for each event. ancillary_files : dict Ancillary files. + sensor : str + Sensor name: "ultra45" or "ultra90". interpolator : RegularGridInterpolator, optional Precomputed interpolator to use for efficiency lookup. If None, a new interpolator will be created from the ancillary files. @@ -1243,7 +1249,7 @@ def get_efficiency( Interpolated efficiency values. """ if not interpolator: - interpolator, _, _ = get_efficiency_interpolator(ancillary_files) + interpolator, _, _ = get_efficiency_interpolator(ancillary_files, sensor) return interpolator((theta_inst, phi_inst, energy)) diff --git a/imap_processing/ultra/l1c/helio_pset.py b/imap_processing/ultra/l1c/helio_pset.py index 7375d71fc8..d29b58ad5c 100644 --- a/imap_processing/ultra/l1c/helio_pset.py +++ b/imap_processing/ultra/l1c/helio_pset.py @@ -187,6 +187,7 @@ def calculate_helio_pset( theta_vals.values, phi_vals.values, n_pix, + sensor_id, ancillary_files, apply_bsf, ) diff --git a/imap_processing/ultra/l1c/spacecraft_pset.py b/imap_processing/ultra/l1c/spacecraft_pset.py index 3506c0e26d..0cab7add09 100644 --- a/imap_processing/ultra/l1c/spacecraft_pset.py +++ b/imap_processing/ultra/l1c/spacecraft_pset.py @@ -176,6 +176,7 @@ def calculate_spacecraft_pset( theta_vals, phi_vals, n_pix, + sensor_id, ancillary_files, apply_bsf, ) diff --git a/imap_processing/ultra/l1c/ultra_l1c_pset_bins.py b/imap_processing/ultra/l1c/ultra_l1c_pset_bins.py index ece5f0f0ef..10b919c699 100644 --- a/imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +++ b/imap_processing/ultra/l1c/ultra_l1c_pset_bins.py @@ -501,6 +501,7 @@ def get_efficiencies_and_geometric_function( theta_vals: np.ndarray, phi_vals: np.ndarray, npix: int, + sensor_id: int, ancillary_files: dict, apply_bsf: bool = True, ) -> tuple[np.ndarray, np.ndarray]: @@ -529,6 +530,8 @@ def get_efficiencies_and_geometric_function( corresponding phi for each pixel (and energy, if present). npix : int Number of HEALPix pixels. + sensor_id : int + Sensor ID, either 45 or 90. ancillary_files : dict Dictionary containing ancillary files. apply_bsf : bool, optional @@ -543,9 +546,10 @@ def get_efficiencies_and_geometric_function( Averaged efficiencies across all spin phases. Shape = (n_energy_bins, npix). """ + sensor_name = f"ultra{sensor_id}" # Load callable efficiency interpolator function eff_interpolator, theta_min_max, phi_min_max = get_efficiency_interpolator( - ancillary_files + ancillary_files, sensor_name ) # load geometric factor lookup table geometric_lookup_table = load_geometric_factor_tables( @@ -622,6 +626,7 @@ def get_efficiencies_and_geometric_function( phi_at_spin_clipped[pixel_inds], theta_at_spin_clipped[pixel_inds], ancillary_files, + sensor_name, interpolator=eff_interpolator, )