Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
626f70a
After release (#4800)
alejoe91 Sep 21, 2026
b17c60f
Speed up Wobble peak search with a linear maximum filter (#4782)
JESUSROYETH Sep 22, 2026
80aa643
Fix: zarr pickling in `SortingAnalyzer` with `try`/`except` (#4801)
alejoe91 Sep 23, 2026
959e124
Fix: artifact detection crossing chunks (#4803)
alejoe91 Sep 28, 2026
e094b5e
Speed up template similarity with pair-level parallelism (#4785)
JESUSROYETH Sep 28, 2026
d7cdc97
Clarify PSD threshold units and recording scaling (#4808)
AtomicGlance Sep 28, 2026
ed12c03
Test empty postprocessing and metric extension outputs (#4807)
AtomicGlance Sep 28, 2026
398222d
Fix: speed up loading (and compute sparse PCA projections) in lazy mo…
alejoe91 Sep 28, 2026
4e0397b
Fix: drop new_unit_ids of non-mergeable units (#4804)
alejoe91 Sep 28, 2026
93c612f
Precompute unit-pair spatial overlap once in find_collisions (#4797)
JESUSROYETH Sep 28, 2026
1666a0e
Don't follow symlinks when storing extractor paths (#4812)
h-mayorquin Oct 2, 2026
7d7bd21
Enable case omission on `get_unit_spike_train_in_seconds` (#4811)
h-mayorquin Oct 2, 2026
0c9b6b9
Fix: provenance handling in `SortingAnalyzer` (#4805)
alejoe91 Oct 5, 2026
3d3ee44
Drop the separate core test workflow (#4822)
h-mayorquin Oct 5, 2026
b0aba19
Run the tests with `forkserver` on Linux (#4818)
h-mayorquin Oct 5, 2026
6bec8d9
Add a `dev` dependency group so uv installs pre-commit by default (#4…
h-mayorquin Oct 5, 2026
d0c9339
[pre-commit.ci] pre-commit autoupdate (#4828)
pre-commit-ci[bot] Oct 6, 2026
6fd8630
Don't mount remote paths when running a sorter in a container (#4821)
h-mayorquin Oct 6, 2026
04cae98
Read the last spike from the unit end offsets in `NwbSortingExtractor…
h-mayorquin Oct 6, 2026
2750986
fix: cast infinites to NaN is overflow error (#4830)
alejoe91 Oct 6, 2026
11e5ca4
Speed up FFT phase shifts for Neuropixels recordings (#4802)
JESUSROYETH Oct 7, 2026
d89765e
Fix sorting times segment propagation (#4796)
JoeZiminski Oct 7, 2026
10ffd52
Avoid dense waveform allocation when exporting PC features (#4789)
JESUSROYETH Oct 7, 2026
6ef7195
fix: remove `set_times` warning (#4834)
alejoe91 Oct 7, 2026
0421d0b
Add `NeuroExplorerSortingExtractor` (#4825)
h-mayorquin Oct 7, 2026
6708311
Extract waveforms to zarr dataset (#4708)
alejoe91 Oct 7, 2026
5cacee5
Build one probe per electrode group in NwbRecordingExtractor (#4820)
h-mayorquin Oct 7, 2026
a633c22
Fix group (and other property) propagation in channel slice (#4838)
alejoe91 Oct 7, 2026
6ab884d
Support python 3.14 (#4173)
h-mayorquin Oct 8, 2026
2182c28
UnitSelectionSorting improvements: remove lexsort, fix bug, save memo…
grahamfindlay Oct 8, 2026
9d01601
Optimize `SpikeRetriever` and RAM usage for extensions (#4809)
alejoe91 Oct 8, 2026
8462838
doc: add 0.105.1 release notes
alejoe91 Oct 8, 2026
74522cc
fix: pyproject.toml
alejoe91 Oct 8, 2026
c7cac34
fix: __init__
alejoe91 Oct 8, 2026
58ebbaf
Override search_cached_spikes_sorted for identity selections (#4845)
grahamfindlay Oct 9, 2026
1d0dd8b
doc: update PR list
alejoe91 Oct 9, 2026
64b126b
Fix manual split example in process_by_channel_group docs (#4846)
guptaishaan Oct 9, 2026
8e8b548
doc: add last PR
alejoe91 Oct 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 11 additions & 10 deletions .github/workflows/all-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.13"] # Lower and higher versions we support
python-version: ["3.10", "3.14"] # Lower and higher versions we support
os: [macos-latest, windows-latest, ubuntu-latest]
steps:
- uses: actions/checkout@v6
Expand Down Expand Up @@ -94,16 +94,20 @@ jobs:
- name: Pip list
run: uv pip list --system

- name: Test core
run: pytest -m "core"
shell: bash

- name: Install Dependencies for Timing Display
run: |
uv pip install --system tabulate
uv pip install --system pandas
shell: bash

- name: Set execute permissions on run_tests.sh
shell: bash
run: chmod +x .github/run_tests.sh

- name: Test core
shell: bash
run: ./.github/run_tests.sh core --no-virtual-env

- name: Get current hash (SHA) of the ephy_testing_data repo
shell: bash
id: repo_hash
Expand All @@ -125,7 +129,8 @@ jobs:
run: |
uv pip install --system datalad-installer
if [ ${{ runner.os }} = 'Linux' ]; then
datalad-installer --sudo ok git-annex --method datalad/packages
# TODO: remove the pin once datalad uploads the git-annex 10.20261006 package (its latest-version points to a missing file)
datalad-installer --sudo ok git-annex=10.20260901 --method datalad/packages
elif [ ${{ runner.os }} = 'macOS' ]; then
datalad-installer --sudo ok git-annex --method brew
elif [ ${{ runner.os }} = 'Windows' ]; then
Expand All @@ -137,10 +142,6 @@ jobs:
if: env.INSTALL_PLEXON_DEPENDENCIES == 'true'
uses: ./.github/actions/install-wine

- name: Set execute permissions on run_tests.sh
shell: bash
run: chmod +x .github/run_tests.sh

- name: Test extractors
shell: bash
env:
Expand Down
48 changes: 0 additions & 48 deletions .github/workflows/core-test.yml

This file was deleted.

2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ repos:
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/psf/black-pre-commit-mirror
rev: 26.5.1
rev: 26.10.0
hooks:
- id: black
files: ^src/
28 changes: 28 additions & 0 deletions conftest.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import platform
import pytest
from pathlib import Path

Expand All @@ -21,6 +22,24 @@ def pytest_addoption(parser):
default=False,
help="Enable debug plots during tests",
)
# Users on Linux get fork by default but the tests run with forkserver (the default since Python 3.14)
parser.addoption(
"--mp-context",
default="forkserver" if platform.system() == "Linux" else None,
help="Multiprocessing context used by the tests instead of the default one (forkserver on Linux)",
)


def pytest_configure(config):
mp_context = config.getoption("--mp-context")
if mp_context is not None:
import multiprocessing
import spikeinterface.core.globals as si_globals

# The default is patched as well so it survives reset_global_job_kwargs()
multiprocessing.set_start_method(mp_context, force=True)
si_globals._default_job_kwargs["mp_context"] = mp_context
si_globals.global_job_kwargs["mp_context"] = mp_context


def pytest_collection_modifyitems(config, items):
Expand All @@ -29,9 +48,18 @@ def pytest_collection_modifyitems(config, items):
Marking them in turn allows the tests to be run by using the pytest -m marker_name option.
"""

from spikeinterface.core.core_tools import _is_zarr_write_supported

rootdir = Path(config.rootdir)
modules_location = rootdir / "src" / "spikeinterface"
for item in items:
# TODO: remove once writing to zarr is supported with zarr>=3
if item.get_closest_marker("requires_zarr_write") and not _is_zarr_write_supported():
item.add_marker(pytest.mark.skip(reason="Writing to zarr is not supported yet with zarr>=3"))

if config.getoption("--mp-context") is not None and item.name == "test_global_job_kwargs":
item.add_marker(pytest.mark.skip(reason="--mp-context changes the default job kwargs"))

try:
rel_path = Path(item.fspath).relative_to(modules_location)
except:
Expand Down
1 change: 1 addition & 0 deletions doc/api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ NEO-based
.. autofunction:: read_neuralynx
.. autofunction:: read_neuralynx_sorting
.. autofunction:: read_neuroexplorer
.. autofunction:: read_neuroexplorer_sorting
.. autofunction:: read_neuroscope
.. autofunction:: read_nix
.. autofunction:: read_openephys
Expand Down
4 changes: 2 additions & 2 deletions doc/how_to/process_by_channel_group.rst
Original file line number Diff line number Diff line change
Expand Up @@ -188,9 +188,9 @@ to different groups.
for group, sub_recording in split_preprocessed_recording.items():
sorting = run_sorter(
sorter_name='kilosort2',
recording=split_preprocessed_recording,
recording=sub_recording,
folder=f"folder_KS2_group{group}"
)
)
sortings[group] = sorting


Expand Down
1 change: 1 addition & 0 deletions doc/modules/extractors.rst
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ For sorted data formats, we currently support:
* **Neurodata Without Borders** :py:func:`~spikeinterface.extractors.read_nwb_sorting()`
* **Neuroscope** :py:func:`~spikeinterface.extractors.read_neuroscope_sorting()`
* **Neuralynx spikes** :py:func:`~spikeinterface.extractors.read_neuralynx_sorting()`
* **NeuroExplorer spikes** :py:func:`~spikeinterface.extractors.read_neuroexplorer_sorting()`
* **NPZ (created by SpikeInterface)** :py:func:`~spikeinterface.core.read_npz_sorting()`
* **Plexon spikes** :py:func:`~spikeinterface.extractors.read_plexon_sorting()`
* **Plexon 2 spikes** :py:func:`~spikeinterface.extractors.read_plexon2_sorting()`
Expand Down
85 changes: 85 additions & 0 deletions doc/releases/0.105.1.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
.. _release0.105.1:

SpikeInterface 0.105.1 release notes
------------------------------------

October 9th 2026

Minor release with bug fixes and performance improvements


core:

* Override search_cached_spikes_sorted for identity selections (#4845)
* Fix group (and other property) propagation in channel slice (#4838)
* Fix: remove ``set_times`` warning (#4834)
* Enable case omission on ``get_unit_spike_train_in_seconds`` (#4811)
* Optimize ``SpikeRetriever`` and RAM usage for extensions (#4809)
* Fix: provenance handling in ``SortingAnalyzer`` (#4805)
* Fix: drop new_unit_ids of non-mergeable units (#4804)
* Fix: zarr pickling in ``SortingAnalyzer`` with ``try``/``except`` (#4801)
* Fix: make seed JSON serializable (#4798)
* Fix sorting times segment propagation (#4796)
* UnitSelectionSorting improvements: remove lexsort, fix bug, save memory by sharing parent cache when possible (#4783)
* Extract waveforms to zarr dataset (#4708)

extractors:

* Add ``NeuroExplorerSortingExtractor`` (#4825)
* Don't mount remote paths when running a sorter in a container (#4821)
* Build one probe per electrode group in NwbRecordingExtractor (#4820)
* Read the last spike from the unit end offsets in ``NwbSortingExtractor`` (#4819)
* Don't follow symlinks when storing extractor paths (#4812)

preprocessing:

* Fix: artifact detection crossing chunks (#4803)
* Speed up FFT phase shifts for Neuropixels recordings (#4802)
* Fix: frame slicing after resample/decimation (#4799)

sorters:

* Don't mount remote paths when running a sorter in a container (#4821)

postprocessing:

* Test empty postprocessing and metric extension outputs (#4807)
* Precompute unit-pair spatial overlap once in find_collisions (#4797)
* Avoid dense waveform allocation when exporting PC features (#4789)
* Speed up template similarity with pair-level parallelism (#4785)

curation:

* Fix: cast infinites to NaN is overflow error (#4830)

sortingcomponents:

* Speed up Wobble peak search with a linear maximum filter (#4782)

documentation:

* Fix manual split example in process_by_channel_group docs (#4846)
* Clarify PSD threshold units and recording scaling (#4808)

continuous integration:

* Drop the separate core test workflow (#4822)
* Run the tests with ``forkserver`` on Linux (#4818)

packaging:

* Support python 3.14 (#4173)

testing:

* Test empty postprocessing and metric extension outputs (#4807)

Contributors:

* @alejoe91
* @AtomicGlance
* @grahamfindlay
* @guptaishaan
* @h-mayorquin
* @JESUSROYETH
* @JoeZiminski
6 changes: 6 additions & 0 deletions doc/whatisnew.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ Release notes
.. toctree::
:maxdepth: 1

releases/0.105.1.rst
releases/0.105.0.rst
releases/0.104.9.rst
releases/0.104.8.rst
Expand Down Expand Up @@ -63,6 +64,11 @@ Release notes
releases/0.9.1.rst


Versions 0.105.1
================

* Minor releases with bug fixes and performance improvements

Version 0.105.0
===============

Expand Down
2 changes: 2 additions & 0 deletions examples/tutorials/core/plot_4_sorting_analyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
# First let's generate a simulated recording and sorting

recording, sorting = generate_ground_truth_recording()
# Make the recording JSON serializable, so it can be reloaded later
recording = recording.save(folder="recording_folder")
print(recording)
print(sorting)

Expand Down
18 changes: 14 additions & 4 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "spikeinterface"
version = "0.105.0"
version = "0.105.1"
authors = [
{ name="Alessio Buccino", email="alessiop.buccino@gmail.com" },
{ name="Samuel Garcia", email="sam.garcia.die@gmail.com" },
Expand All @@ -20,18 +20,21 @@ classifiers = [


dependencies = [
"numpy>=2.0.0",
"numpy>=2.0.0;python_version<'3.14'",
"numpy>=2.3.2;python_version>='3.14'",
"threadpoolctl>=3.0.0",
"tqdm",
"zarr>=2.18,<3",
"zarr>=2.18,<3;python_version<'3.14'",
"zarr>=3;python_version>='3.14'", # Zarr writing is not yet supported with zarr 3
# for release we need pypi, so this needs to be commented
# "neo @ git+https://github.com/NeuralEnsemble/python-neo.git",
# "probeinterface @ git+https://github.com/SpikeInterface/probeinterface.git",
"neo>=0.14.5",
"probeinterface>=0.4.0",
"packaging",
"pydantic",
"numcodecs<0.16.0", # For supporting zarr < 3
"numcodecs<0.16.0;python_version<'3.14'", # For supporting zarr < 3
"numcodecs>=0.16.5;python_version>='3.14'",
]

[build-system]
Expand Down Expand Up @@ -340,6 +343,12 @@ test-all = [
{include-group = "test-generation"},
]

# Tools for the pre-commit hooks. uv installs this group by default.
dev = [
"black",
"pre-commit",
]

[tool.pytest.ini_options]
testpaths = ["src"]
markers = [
Expand All @@ -358,6 +367,7 @@ markers = [
"widgets",
"sortingcomponents",
"streaming_extractors: extractors that require streaming such as ross and fsspec",
"requires_zarr_write: tests that write to zarr, skipped with zarr>=3 where writing is not supported yet",
]
filterwarnings =[
'ignore:.*distutils Version classes are deprecated.*:DeprecationWarning',
Expand Down
8 changes: 6 additions & 2 deletions src/spikeinterface/core/analyzer_extension_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,6 @@ def _run(self, verbose=False, **job_kwargs):

recording = self.sorting_analyzer.recording
sorting = self.sorting_analyzer.sorting
unit_ids = sorting.unit_ids

# retrieve spike vector and the sampling
some_spikes = self.sorting_analyzer.get_extension("random_spikes").get_random_spikes()
Expand All @@ -192,6 +191,10 @@ def _run(self, verbose=False, **job_kwargs):
file_path = self._get_binary_extension_folder() / "waveforms.npy"
mode = "memmap"
copy = False
elif self.format == "zarr":
file_path = self._get_binary_extension_folder() / "waveforms"
mode = "zarr"
copy = False
else:
file_path = None
mode = "shared_memory"
Expand All @@ -205,7 +208,6 @@ def _run(self, verbose=False, **job_kwargs):
all_waveforms = extract_waveforms_to_single_buffer(
recording,
some_spikes,
unit_ids,
self.nbefore,
self.nafter,
mode=mode,
Expand All @@ -218,6 +220,8 @@ def _run(self, verbose=False, **job_kwargs):
verbose=verbose,
**job_kwargs,
)
if not self.sorting_analyzer._lazy and not isinstance(all_waveforms, np.ndarray):
all_waveforms = materialize_array(all_waveforms)

self.data["waveforms"] = all_waveforms

Expand Down
Loading