From 86b820edc4ec4472a7417581de2797786c4f9781 Mon Sep 17 00:00:00 2001 From: Heberto Mayorquin Date: Wed, 18 Dec 2024 16:30:27 -0600 Subject: [PATCH 1/3] add failing test --- src/neuroconv/tools/testing/mock_interfaces.py | 6 ++++++ tests/test_ecephys/test_ecephys_interfaces.py | 14 +++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/neuroconv/tools/testing/mock_interfaces.py b/src/neuroconv/tools/testing/mock_interfaces.py index 38cc750ab..867ec12c4 100644 --- a/src/neuroconv/tools/testing/mock_interfaces.py +++ b/src/neuroconv/tools/testing/mock_interfaces.py @@ -220,6 +220,12 @@ def __init__( es_key=es_key, ) + # Adding this as a safeguard before the spikeinterface changes are merged: + # https://github.com/SpikeInterface/spikeinterface/pull/3588 + channel_ids = self.recording_extractor.get_channel_ids() + channel_ids_as_strings = [str(id) for id in channel_ids] + self.recording_extractor = self.recording_extractor.rename_channels(new_channel_ids=channel_ids_as_strings) + def get_metadata(self) -> dict: """ Returns the metadata dictionary for the current object. diff --git a/tests/test_ecephys/test_ecephys_interfaces.py b/tests/test_ecephys/test_ecephys_interfaces.py index 168ce5068..d2fdd68ba 100644 --- a/tests/test_ecephys/test_ecephys_interfaces.py +++ b/tests/test_ecephys/test_ecephys_interfaces.py @@ -119,7 +119,7 @@ def test_electrode_indices_assertion_error_when_missing_table(self, setup_interf class TestRecordingInterface(RecordingExtractorInterfaceTestMixin): data_interface_cls = MockRecordingInterface - interface_kwargs = dict(durations=[0.100]) + interface_kwargs = dict(num_channels=4, durations=[0.100]) def test_stub(self, setup_interface): interface = self.interface @@ -146,6 +146,18 @@ def test_always_write_timestamps(self, setup_interface): expected_timestamps = self.interface.recording_extractor.get_times() np.testing.assert_array_equal(electrical_series.timestamps[:], expected_timestamps) + def test_group_naming_not_adding_extra_devices(self, setup_interface): + + interface = self.interface + recording_extractor = interface.recording_extractor + recording_extractor.set_channel_groups(groups=[0, 1, 2, 3]) + recording_extractor.set_property(key="group_name", values=["group1", "group2", "group3", "group4"]) + + nwbfile = interface.create_nwbfile() + + assert len(nwbfile.devices) == 1 + assert len(nwbfile.electrode_groups) == 4 + class TestAssertions(TestCase): @pytest.mark.skipif(python_version.minor != 10, reason="Only testing with Python 3.10!") From 333ad6963713d7f54d7b6c72f8f7312c24cbead3 Mon Sep 17 00:00:00 2001 From: Heberto Mayorquin Date: Wed, 18 Dec 2024 16:34:46 -0600 Subject: [PATCH 2/3] add passing test --- .../datainterfaces/ecephys/baserecordingextractorinterface.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/neuroconv/datainterfaces/ecephys/baserecordingextractorinterface.py b/src/neuroconv/datainterfaces/ecephys/baserecordingextractorinterface.py index 6d0df14c1..c9df3ba52 100644 --- a/src/neuroconv/datainterfaces/ecephys/baserecordingextractorinterface.py +++ b/src/neuroconv/datainterfaces/ecephys/baserecordingextractorinterface.py @@ -88,7 +88,9 @@ def get_metadata_schema(self) -> dict: def get_metadata(self) -> DeepDict: metadata = super().get_metadata() - channel_groups_array = self.recording_extractor.get_channel_groups() + from ...tools.spikeinterface.spikeinterface import _get_group_name + + channel_groups_array = _get_group_name(recording=self.recording_extractor) unique_channel_groups = set(channel_groups_array) if channel_groups_array is not None else ["ElectrodeGroup"] electrode_metadata = [ dict(name=str(group_id), description="no description", location="unknown", device="DeviceEcephys") From c8f91c7e795edc2b92d0de2376db8211fe88207c Mon Sep 17 00:00:00 2001 From: Heberto Mayorquin Date: Wed, 18 Dec 2024 16:39:00 -0600 Subject: [PATCH 3/3] add changelog --- CHANGELOG.md | 2 ++ src/neuroconv/tools/testing/mock_interfaces.py | 6 ------ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68f5c9868..7488d5834 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ * Fix a bug where data in `DeepLabCutInterface` failed to write when `ndx-pose` was not imported. [#1144](https://github.com/catalystneuro/neuroconv/pull/1144) * `SpikeGLXConverterPipe` converter now accepts multi-probe structures with multi-trigger and does not assume a specific folder structure [#1150](https://github.com/catalystneuro/neuroconv/pull/1150) * `SpikeGLXNIDQInterface` is no longer written as an ElectricalSeries [#1152](https://github.com/catalystneuro/neuroconv/pull/1152) +* Fix a bug on ecephys interfaces where extra electrode group and devices were written if the property of the "group_name" was set in the recording extractor [#1164](https://github.com/catalystneuro/neuroconv/pull/1164) + ## Features * Propagate the `unit_electrode_indices` argument from the spikeinterface tools to `BaseSortingExtractorInterface`. This allows users to map units to the electrode table when adding sorting data [PR #1124](https://github.com/catalystneuro/neuroconv/pull/1124) diff --git a/src/neuroconv/tools/testing/mock_interfaces.py b/src/neuroconv/tools/testing/mock_interfaces.py index 867ec12c4..38cc750ab 100644 --- a/src/neuroconv/tools/testing/mock_interfaces.py +++ b/src/neuroconv/tools/testing/mock_interfaces.py @@ -220,12 +220,6 @@ def __init__( es_key=es_key, ) - # Adding this as a safeguard before the spikeinterface changes are merged: - # https://github.com/SpikeInterface/spikeinterface/pull/3588 - channel_ids = self.recording_extractor.get_channel_ids() - channel_ids_as_strings = [str(id) for id in channel_ids] - self.recording_extractor = self.recording_extractor.rename_channels(new_channel_ids=channel_ids_as_strings) - def get_metadata(self) -> dict: """ Returns the metadata dictionary for the current object.