diff --git a/docs/changelog.md b/docs/changelog.md index 3bb21341..5d02c0a3 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -22,6 +22,8 @@ Changed: instead of zeros as a fill value for runs with a varying number of pulses (!347). - [imshow2()][extra.utils.imshow2] will now add a colorbar automatically (!351). +- [DelayLineDetector][extra.components.DelayLineDetector] now longer attaches an index level for each row in [hits()][extra.components.DelayLineDetector.hits] and [signals()][extra.components.DelayLineDetector.signals] (!362). +- [AdqRawChannel][extra.components.AdqRawChannel] now longer attaches an index level for each row in [train_edges()][extra.components.AdqRawChannel.train_edges] and [pulse_edges()][extra.components.AdqRawChannel.pulse_edges] (!362). ## [2025.1] diff --git a/src/extra/components/adq.py b/src/extra/components/adq.py index 38984a75..38f9f86a 100644 --- a/src/extra/components/adq.py +++ b/src/extra/components/adq.py @@ -447,9 +447,9 @@ def _shape_edges(self, edges, amplitudes, index): from . import DelayLineDetector edges = DelayLineDetector._build_reduced_pd( - None, edges, index, entry_level='edgeIndex') + None, edges, index) amplitudes = DelayLineDetector._build_reduced_pd( - None, amplitudes, index, entry_level='edgeIndex') + None, amplitudes, index) return pd.DataFrame({'edge': edges, 'amplitude': amplitudes}) diff --git a/src/extra/components/dld.py b/src/extra/components/dld.py index c0ae2fd1..7c38b300 100644 --- a/src/extra/components/dld.py +++ b/src/extra/components/dld.py @@ -185,8 +185,14 @@ def _build_reduced_pd(self, data, index, entry_level=None, mask_func=None): if entry_level is not None: index_df[entry_level] = np.flatnonzero(finite_mask) % num_rows - return pd_cls(np.ascontiguousarray(raw[finite_mask]), - pd.MultiIndex.from_frame(index_df)) + if len(index_df.columns) > 1: + # Multiple index columns, create a MultiIndex again. + index = pd.MultiIndex.from_frame(index_df) + else: + # If only a single column is left, build a simple index. + index = pd.Index(index_df[next(iter(index_df.columns))]) + + return pd_cls(np.ascontiguousarray(raw[finite_mask]), index) @staticmethod def insert_aligned_columns(df, columns): @@ -229,8 +235,7 @@ def insert_aligned_columns(df, columns): if shared_index[:2] == df.index.names[:2]: # Same pulse dimensions as the dataframe. if num_per_pulse is None: - num_per_pulse = df.groupby( - level=df.index.names[:-1]).size() + num_per_pulse = df.groupby(level=df.index.names).size() align = num_per_pulse @@ -386,8 +391,7 @@ def signals(self, pulse_dim='pulseId', extra_columns={}, max_method=None): df = self._build_reduced_pd( (kd := self._instrument_src['rec.signals']).ndarray(), - self._align_pulse_index(kd, pulse_dim), 'signalIndex', - mask_func) + self._align_pulse_index(kd, pulse_dim), None, mask_func) if extra_columns: self.insert_aligned_columns(df, extra_columns) @@ -427,8 +431,7 @@ def hits(self, pulse_dim='pulseId', extra_columns={}, max_method=None): df = self._build_reduced_pd( (kd := self._instrument_src['rec.hits']).ndarray(), - self._align_pulse_index(kd, pulse_dim), 'hitIndex', - mask_func) + self._align_pulse_index(kd, pulse_dim), None, mask_func) if extra_columns: self.insert_aligned_columns(df, extra_columns) diff --git a/tests/test_components_adq.py b/tests/test_components_adq.py index 8c3190c5..b58df37e 100644 --- a/tests/test_components_adq.py +++ b/tests/test_components_adq.py @@ -277,7 +277,7 @@ def test_train_edges(mock_sqs_remi_run): assert isinstance(df, pd.DataFrame) np.testing.assert_array_equal(df.columns, ['edge', 'amplitude']) - np.testing.assert_array_equal(df.index.names, ['trainId', 'edgeIndex']) + np.testing.assert_array_equal(df.index.name, 'trainId') assert len(df) == 100 np.testing.assert_allclose(df['edge'], 8944.0) @@ -311,7 +311,7 @@ def test_pulse_edges(mock_sqs_remi_run): assert isinstance(df, pd.DataFrame) np.testing.assert_array_equal(df.columns, ['edge', 'amplitude']) np.testing.assert_array_equal( - df.index.names, ['trainId', 'pulseId', 'edgeIndex']) + df.index.names, ['trainId', 'pulseId']) assert len(df) == 40 np.testing.assert_array_equal( diff --git a/tests/test_components_dld.py b/tests/test_components_dld.py index 7ff9e279..5e8d4cc1 100644 --- a/tests/test_components_dld.py +++ b/tests/test_components_dld.py @@ -70,8 +70,7 @@ def test_dld_df(mock_sqs_remi_run, key, pulse_dim): df = getattr(dld, f'{key}s')(pulse_dim) assert (df.columns == list(dtype.names)).all() - assert df.index.names == [ - 'trainId', pulse_dim, 'fel', 'ppl', f'{key}Index'] + assert df.index.names == ['trainId', pulse_dim, 'fel', 'ppl'] # Check counts per pulse, should be a repeating pattern of 1-4. np.testing.assert_equal(