From ee92f9cd1e9202b0b89c26e2ccb8610ac0e0924e Mon Sep 17 00:00:00 2001 From: henrikjacobsenfys Date: Tue, 11 Aug 2026 07:33:25 +0200 Subject: [PATCH] Fix Experiment.rebin for data with bin-edge coordinates sc.bin cannot handle multi-dimensional dense data with bin-edge coordinates, so convert them to bin centers before binning. Co-Authored-By: Claude Fable 5 --- src/easydynamics/experiment/experiment.py | 4 +++- .../easydynamics/experiment/test_experiment.py | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/easydynamics/experiment/experiment.py b/src/easydynamics/experiment/experiment.py index 27df30315..d064326f5 100644 --- a/src/easydynamics/experiment/experiment.py +++ b/src/easydynamics/experiment/experiment.py @@ -404,7 +404,9 @@ def rebin(self, dimensions: dict[str, int | sc.Variable]) -> None: ) if self._data is None: raise ValueError('No data to rebin. Please load data first.') - binned_data = self._data.copy() + # sc.bin cannot handle multi-dimensional dense data with bin-edge + # coordinates, so convert them to bin centers first. + binned_data = self._convert_to_bin_centers(self._data.copy()) dim_copy = dimensions.copy() for dim, value in dim_copy.items(): if not isinstance(dim, str): diff --git a/tests/unit/easydynamics/experiment/test_experiment.py b/tests/unit/easydynamics/experiment/test_experiment.py index 21e63d2da..2329e29a2 100644 --- a/tests/unit/easydynamics/experiment/test_experiment.py +++ b/tests/unit/easydynamics/experiment/test_experiment.py @@ -238,6 +238,23 @@ def test_rebin(self, experiment, new_Q_bins, new_energy_bins): assert rebinned_data.sizes['Q'] == 6 assert rebinned_data.sizes['energy'] == 7 + def test_rebin_with_bin_edge_coordinate(self): + "Test rebinning data whose energy coordinate is at bin edges" + # WHEN + Q = sc.linspace('Q', 0.5, 1.5, num=10, unit='1/Angstrom') + energy_edges = sc.linspace('energy', -5, 5, num=12, unit='meV') + values = sc.array(dims=['Q', 'energy'], values=np.ones((10, 11))) + data = sc.DataArray(data=values, coords={'Q': Q, 'energy': energy_edges}) + experiment = Experiment(data=data) + + # THEN + experiment.rebin({'energy': 7}) + + # EXPECT + rebinned_data = experiment.binned_data + assert rebinned_data.sizes['Q'] == 10 + assert rebinned_data.sizes['energy'] == 7 + def test_rebin_no_data_raises(self): "Test rebinning data when no data is present" # WHEN