From e624c2761f0ac4dd481246d83ac7631e2b13c16b Mon Sep 17 00:00:00 2001 From: Samuel Garcia Date: Thu, 17 Sep 2026 18:11:59 +0200 Subject: [PATCH 1/9] Szve recording attributes before run_sorter() --- src/spikeinterface/sorters/basesorter.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/spikeinterface/sorters/basesorter.py b/src/spikeinterface/sorters/basesorter.py index c0cd231441..6096bc2ec5 100644 --- a/src/spikeinterface/sorters/basesorter.py +++ b/src/spikeinterface/sorters/basesorter.py @@ -154,6 +154,12 @@ def initialize_folder(cls, recording, output_folder, verbose, remove_existing_fo "compatible binary file." ) + # save recording attributes in case the recording is not serializable or removed after sorting + rec_attributes = recording.get_rec_attributes() + rec_attributes_file = output_folder / "recording_attributes.json" + rec_attributes_file.write_text(json.dumps(check_json(rec_attributes), indent=4), encoding="utf8") + + return output_folder @classmethod From 3f0760210773f26e1334b8e352a32087042b50a7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 17 Sep 2026 16:13:13 +0000 Subject: [PATCH 2/9] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/spikeinterface/sorters/basesorter.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/spikeinterface/sorters/basesorter.py b/src/spikeinterface/sorters/basesorter.py index 6096bc2ec5..c1d67f268d 100644 --- a/src/spikeinterface/sorters/basesorter.py +++ b/src/spikeinterface/sorters/basesorter.py @@ -159,7 +159,6 @@ def initialize_folder(cls, recording, output_folder, verbose, remove_existing_fo rec_attributes_file = output_folder / "recording_attributes.json" rec_attributes_file.write_text(json.dumps(check_json(rec_attributes), indent=4), encoding="utf8") - return output_folder @classmethod From db38b1d9867f0b187cdefb74ea8c8ce2b9ee5b7c Mon Sep 17 00:00:00 2001 From: Samuel Garcia Date: Thu, 17 Sep 2026 19:08:07 +0200 Subject: [PATCH 3/9] oups --- src/spikeinterface/sorters/basesorter.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/spikeinterface/sorters/basesorter.py b/src/spikeinterface/sorters/basesorter.py index c1d67f268d..986c06ce77 100644 --- a/src/spikeinterface/sorters/basesorter.py +++ b/src/spikeinterface/sorters/basesorter.py @@ -14,6 +14,7 @@ from spikeinterface.core import load, BaseRecordingSnippets, BaseRecording from spikeinterface.core.core_tools import check_json +from spikeinterface.core.recording_tools import get_rec_attributes from spikeinterface.core.globals import get_global_job_kwargs from spikeinterface.core.job_tools import fix_job_kwargs, split_job_kwargs from .utils import SpikeSortingError, ShellScript @@ -155,10 +156,11 @@ def initialize_folder(cls, recording, output_folder, verbose, remove_existing_fo ) # save recording attributes in case the recording is not serializable or removed after sorting - rec_attributes = recording.get_rec_attributes() + rec_attributes = get_rec_attributes(recording) rec_attributes_file = output_folder / "recording_attributes.json" rec_attributes_file.write_text(json.dumps(check_json(rec_attributes), indent=4), encoding="utf8") + return output_folder @classmethod From 92eb9ec05e3de9eeb6e99bc6efd8ff133e6b61c0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 17 Sep 2026 17:08:40 +0000 Subject: [PATCH 4/9] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/spikeinterface/sorters/basesorter.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/spikeinterface/sorters/basesorter.py b/src/spikeinterface/sorters/basesorter.py index 986c06ce77..d0ec68533d 100644 --- a/src/spikeinterface/sorters/basesorter.py +++ b/src/spikeinterface/sorters/basesorter.py @@ -160,7 +160,6 @@ def initialize_folder(cls, recording, output_folder, verbose, remove_existing_fo rec_attributes_file = output_folder / "recording_attributes.json" rec_attributes_file.write_text(json.dumps(check_json(rec_attributes), indent=4), encoding="utf8") - return output_folder @classmethod From 4ae109934da93be473a5b88d303a03a6a329439e Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Fri, 18 Sep 2026 08:59:03 +0100 Subject: [PATCH 5/9] use recording attributes instead of recording --- src/spikeinterface/sorters/external/kilosortbase.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/spikeinterface/sorters/external/kilosortbase.py b/src/spikeinterface/sorters/external/kilosortbase.py index 5ca1f544a0..7f7f0004d6 100644 --- a/src/spikeinterface/sorters/external/kilosortbase.py +++ b/src/spikeinterface/sorters/external/kilosortbase.py @@ -255,8 +255,12 @@ def _get_result_from_folder(cls, sorter_output_folder): with params_file.open("r") as f: sorter_params = json.load(f)["sorter_params"] - recording = BaseSorter.load_recording_from_folder(sorter_output_folder.parent, with_warnings=False) - channel_ids = recording.channel_ids if recording is not None else None + channel_ids = None + recording_attributes_file = sorter_output_folder.parent / "recording_attributes.json" + if recording_attributes_file.is_file(): + with open(recording_attributes_file, "r") as f: + rec_attributes = json.load(f) + channel_ids = rec_attributes.get("channel_ids") keep_good_only = sorter_params.get("keep_good_only", False) sorting = KiloSortSortingExtractor( From 6c464a33417fa5d939adc5c1c9de00822101bf36 Mon Sep 17 00:00:00 2001 From: Chris Halcrow <57948917+chrishalcrow@users.noreply.github.com> Date: Fri, 18 Sep 2026 10:27:31 +0100 Subject: [PATCH 6/9] Update src/spikeinterface/sorters/external/kilosortbase.py Co-authored-by: Garcia Samuel --- src/spikeinterface/sorters/external/kilosortbase.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/spikeinterface/sorters/external/kilosortbase.py b/src/spikeinterface/sorters/external/kilosortbase.py index 7f7f0004d6..fe8c861615 100644 --- a/src/spikeinterface/sorters/external/kilosortbase.py +++ b/src/spikeinterface/sorters/external/kilosortbase.py @@ -261,6 +261,9 @@ def _get_result_from_folder(cls, sorter_output_folder): with open(recording_attributes_file, "r") as f: rec_attributes = json.load(f) channel_ids = rec_attributes.get("channel_ids") + else: + recording = BaseSorter.load_recording_from_folder(sorter_output_folder.parent, with_warnings=False) + channel_ids = recording.channel_ids if recording is not None else None keep_good_only = sorter_params.get("keep_good_only", False) sorting = KiloSortSortingExtractor( From 15597bb3ee2fd8ecc1a4e39acad3635e4b7321c8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 18 Sep 2026 09:28:00 +0000 Subject: [PATCH 7/9] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/spikeinterface/sorters/external/kilosortbase.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spikeinterface/sorters/external/kilosortbase.py b/src/spikeinterface/sorters/external/kilosortbase.py index fe8c861615..7d2f7d9d91 100644 --- a/src/spikeinterface/sorters/external/kilosortbase.py +++ b/src/spikeinterface/sorters/external/kilosortbase.py @@ -263,7 +263,7 @@ def _get_result_from_folder(cls, sorter_output_folder): channel_ids = rec_attributes.get("channel_ids") else: recording = BaseSorter.load_recording_from_folder(sorter_output_folder.parent, with_warnings=False) - channel_ids = recording.channel_ids if recording is not None else None + channel_ids = recording.channel_ids if recording is not None else None keep_good_only = sorter_params.get("keep_good_only", False) sorting = KiloSortSortingExtractor( From b9874de3578b726f964861863728378da2f08381 Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Fri, 18 Sep 2026 12:23:29 +0200 Subject: [PATCH 8/9] Apply suggestion from @alejoe91 --- src/spikeinterface/sorters/external/kilosortbase.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spikeinterface/sorters/external/kilosortbase.py b/src/spikeinterface/sorters/external/kilosortbase.py index 7d2f7d9d91..63a40471e2 100644 --- a/src/spikeinterface/sorters/external/kilosortbase.py +++ b/src/spikeinterface/sorters/external/kilosortbase.py @@ -263,7 +263,7 @@ def _get_result_from_folder(cls, sorter_output_folder): channel_ids = rec_attributes.get("channel_ids") else: recording = BaseSorter.load_recording_from_folder(sorter_output_folder.parent, with_warnings=False) - channel_ids = recording.channel_ids if recording is not None else None + channel_ids = recording.channel_ids if recording is not None else None keep_good_only = sorter_params.get("keep_good_only", False) sorting = KiloSortSortingExtractor( From 16521f2f114b766c8546eeabf2bd0a4546a80b03 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 18 Sep 2026 10:23:58 +0000 Subject: [PATCH 9/9] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/spikeinterface/sorters/external/kilosortbase.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/spikeinterface/sorters/external/kilosortbase.py b/src/spikeinterface/sorters/external/kilosortbase.py index 63a40471e2..15cbf4d3d0 100644 --- a/src/spikeinterface/sorters/external/kilosortbase.py +++ b/src/spikeinterface/sorters/external/kilosortbase.py @@ -262,8 +262,8 @@ def _get_result_from_folder(cls, sorter_output_folder): rec_attributes = json.load(f) channel_ids = rec_attributes.get("channel_ids") else: - recording = BaseSorter.load_recording_from_folder(sorter_output_folder.parent, with_warnings=False) - channel_ids = recording.channel_ids if recording is not None else None + recording = BaseSorter.load_recording_from_folder(sorter_output_folder.parent, with_warnings=False) + channel_ids = recording.channel_ids if recording is not None else None keep_good_only = sorter_params.get("keep_good_only", False) sorting = KiloSortSortingExtractor(