From def83a4895ceee82a15f3cfaa2394dcb540a838f Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Thu, 12 Nov 2026 10:33:52 +0100 Subject: [PATCH 1/4] fix: remove type_checking from core --- src/spikeinterface/core/time_series.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/spikeinterface/core/time_series.py b/src/spikeinterface/core/time_series.py index 2307647f27..3776602bc1 100644 --- a/src/spikeinterface/core/time_series.py +++ b/src/spikeinterface/core/time_series.py @@ -1,15 +1,13 @@ from abc import ABC, abstractmethod from bisect import bisect_right -from typing import Optional, TYPE_CHECKING, TypeAlias +from typing import Optional, TypeAlias import warnings import numpy as np +import zarr from spikeinterface.core.base import BaseExtractor, BaseSegment -if TYPE_CHECKING: - import zarr - # A recording segment's time vector: a 1-D array of per-sample times (in seconds). # The backing store depends on how the recording was created/loaded: # - np.ndarray : set_times() (writeable, in-memory) @@ -18,7 +16,7 @@ # - zarr.Array : ZarrRecordingExtractor load # -- *read-only* ; see ZarrRecordingExtractor.__init__ # Code reading `._time_vector` must not assume it is writeable (see `shift_times`). -TimeVector: TypeAlias = "np.ndarray | zarr.Array" # np.memmap is an np.ndarray subclass +TimeVector: TypeAlias = np.ndarray | zarr.Array # np.memmap is an np.ndarray subclass class TimeSeries(ABC): From d452614452c98d3c3b8eea1cbd8fa81253028f1f Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Thu, 12 Nov 2026 11:32:23 +0100 Subject: [PATCH 2/4] Prepare 0.106.0 release --- doc/releases/0.106.0.rst | 167 +++++++++++++++++++++++++++++++++ doc/whatisnew.rst | 4 + pyproject.toml | 8 +- src/spikeinterface/__init__.py | 4 +- 4 files changed, 177 insertions(+), 6 deletions(-) create mode 100644 doc/releases/0.106.0.rst diff --git a/doc/releases/0.106.0.rst b/doc/releases/0.106.0.rst new file mode 100644 index 0000000000..b5825d92b7 --- /dev/null +++ b/doc/releases/0.106.0.rst @@ -0,0 +1,167 @@ +.. _release0.106.0: + +SpikeInterface 0.106.0 release notes +------------------------------------ + +Nov ** 2026 + +Main changes: + +* Added support for Zarr v3, with zarr shards computed one chunk at a time and waveforms extracted directly to Zarr datasets (#4260, #4907, #4708) +* Added session displacement generation to the generators and motion correction modules (#3231) +* Added the ``VanillaSort`` external sorter and the ``NeuroExplorerSortingExtractor`` (#4832, #4825) +* Added support for Python 3.14 (#4173) +* Removed the ``BaseSnippets`` class (#4839) +* Reduced peak memory usage in several preprocessors (``gaussian_filter``, filters) and in extensions through ``SpikeRetriever`` and ``UnitSelectionSorting`` optimizations (#4903, #4840, #4809, #4783) +* Significant speedups in template similarity (#4785), amplitude scalings (#4870), phase shift and ``gaussian_filter`` FFTs (#4802, #4853), and Wobble peak search (#4782) + +core: + +* Remove duplicated ``get_recording_property`` and ``get_sorting_property`` (#4933) +* Fix binary save when only some segments have a time vector (#4923) +* Fix saving a recording when only some segments have a ``t_start`` (#4922) +* Fix ``select_periods`` dropping metadata, recording, times and empty segments (#4921) +* Compute zarr shards one chunk at a time to reduce peak memory (#4907) +* Remove legacy location property when loading old recordings (#4896) +* Fix: do not include extra_metadata in zarr provenance dump (#4885) +* Store pickled extension data in zarr SortingAnalyzers as byte arrays instead of object arrays (#4882) +* Store JSON data in zarr SortingAnalyzers as byte arrays instead of object arrays (#4881) +* Make motion-corrected and silenced recordings JSON-serializable (#4877) +* Add a SortingAnalyzer fixture to the cross-version serialization tests (#4876) +* Read zarr v2 NWB files with zarr-python 3 (#4875) +* Allow for ``main_channel_indices`` to use rec attributes (#4867) +* Reintroduce ``set_times(..., with_warning)``, with deprecation (#4864) +* Fix: channel_slice should not check overlapping probes (#4862) +* Override search_cached_spikes_sorted for identity selections (#4845) +* Remove ``BaseSnippets`` class (#4839) +* Fix group (and other property) propagation in channel slice (#4838) +* Fix: remove ``set_times`` warning (#4834) +* Run the tests with ``forkserver`` on Linux (#4818) +* Rename the spike vector caches to state which order they hold (#4817) +* 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) +* Support zarr v3 (#4260) + +extractors: + +* Fix: unused but wrong function names (#4932) +* Use ast.literal_eval instead of eval in parse_sinaps_meta (#4918) +* Parse params.py with ast instead of exec in read_python (#4916) +* Fix: propagate fill_gaps_strategy to biocam kwargs (#4901) +* Fix: openephys - check sync_times only if not None (#4890) +* Fix: do not use ``set_times`` in OpenEphys timestamps loading (and load as memmap) (#4883) +* Fix(extractors): add gap_tolerance_ms to Neuralynx extractors (#4865) +* 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 ``signed=True`` saturation periods in ``detect_and_remove_artifacts`` (#4920) +* Filter subsets of channels at a time in ``gaussian_filter`` to reduce peak memory (#4903) +* Feat: expose periods property in silence_periods (#4897) +* Extract margin tapering and make chunk ownership explicit (#4887) +* Pad ``phase_shift`` and ``gaussian_filter`` FFTs to a fast length (#4853) +* Filter subsets of channels at a time to reduce peak memory (#4840) +* Fix: artifact detection crossing chunks (#4803) +* Speed up FFT phase shifts for Neuropixels recordings (#4802) +* Fix: frame slicing after resample/decimation (#4799) +* FIR phase-shift + extract ``apply_raised_cosine_taper`` from ``get_chunk_with_margin`` (#4563) + +sorters: + +* Add main_channel_id to Lupin (#4894) +* Add VanillaSort external sorter (#4832) +* Don't mount remote paths when running a sorter in a container (#4821) + +postprocessing: + +* Fix run_for_all_spikes units and segments after the first (#4925) +* Fit amplitude scalings with a numba kernel on the normal equations (#4870) +* Fix: grid convolution select_peaks (#4863) +* Fix: PCA computation in lazy mode (#4861) +* 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) + +metrics: + +* Add a seed to sd_ratio's noise draw (#4929) +* Return NaN for isolation distance when the unit's spikes outnumber the other units' combined spikes (#4926) +* Fix legacy Mahalanobis metric parameters on load (#4892) + +curation: + +* Fix: cast infinites to NaN is overflow error (#4830) + +widgets: + +* Fix raster plot handling of segment times where ``t_start`` is not zero. (#4790) + +generators: + +* Add session displacement generation (#3231) + +sortingcomponents: + +* Patch for Lupin to remove some warnings (#4934) +* Fix: grid convolution select_peaks (#4863) +* Speed up Wobble peak search with a linear maximum filter (#4782) + +motion correction: + +* dredge fixes (#4889) +* Update MEDiCINe amplitude_threshold_quantile docs and require medicine-neuro>=1.7 (#4872) +* Add session displacement generation (#3231) + +documentation: + +* Doc: update release notes for patch-releases (#4917) +* Fix manual split example in process_by_channel_group docs (#4846) +* Clarify PSD threshold units and recording scaling (#4808) +* Add 'How SpikeInterface handles time' documentation (#3072) + +continuous integration: + +* Drop the separate core test workflow (#4822) +* Support python 3.14 (#4173) + +packaging: + +* Support python 3.14 (#4173) + +testing: + +* Fix: benchmark tests need recoridng caching (#4902) +* Fix probe attachment in serialization fixture builders (#4858) +* Fix: kilosort tests should point to cached recording (#4849) +* Drop the separate core test workflow (#4822) +* Test empty postprocessing and metric extension outputs (#4807) + +Contributors: + +* @AtomicGlance +* @AxelNoun +* @JESUSROYETH +* @JoeZiminski +* @KohakuKirisame +* @alejoe91 +* @chrishalcrow +* @cwindolf +* @galenlynch +* @grahamfindlay +* @guptaishaan +* @h-mayorquin +* @nwatters01 +* @tritsystem +* @yger diff --git a/doc/whatisnew.rst b/doc/whatisnew.rst index a6524f7a43..b37180599b 100644 --- a/doc/whatisnew.rst +++ b/doc/whatisnew.rst @@ -8,6 +8,10 @@ Release notes .. toctree:: :maxdepth: 1 + releases/0.106.0.rst + releases/0.105.4.rst + releases/0.105.3.rst + releases/0.105.2.rst releases/0.105.1.rst releases/0.105.0.rst releases/0.104.9.rst diff --git a/pyproject.toml b/pyproject.toml index e81fba5912..58f5a9543d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,10 +26,10 @@ dependencies = [ "tqdm", "zarr>=3,<4", # 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", + # "neo @ git+https://github.com/NeuralEnsemble/python-neo.git", + # "probeinterface @ git+https://github.com/SpikeInterface/probeinterface.git", + "neo>=0.14.6", + "probeinterface>=0.4.2", "packaging", "pydantic", ] diff --git a/src/spikeinterface/__init__.py b/src/spikeinterface/__init__.py index a184e9f487..f7c43a845f 100644 --- a/src/spikeinterface/__init__.py +++ b/src/spikeinterface/__init__.py @@ -27,5 +27,5 @@ # This flag must be set to False for release # This avoids using versioning that contains ".dev0" (and this is a better choice) # This is mainly useful when using run_sorter in a container and spikeinterface install -DEV_MODE = True -# DEV_MODE = False +# DEV_MODE = True +DEV_MODE = False From 288be1c55ebb3d3336025fb335032f349f70f246 Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Fri, 13 Nov 2026 11:06:36 +0100 Subject: [PATCH 3/4] build: pin probeinterfac>=0.5.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index d617c097a2..27e99729e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,7 @@ dependencies = [ # "neo @ git+https://github.com/NeuralEnsemble/python-neo.git", # "probeinterface @ git+https://github.com/SpikeInterface/probeinterface.git", "neo>=0.14.6", - "probeinterface>=0.4.2", + "probeinterface>=0.5.0", "packaging", "pydantic", ] From 3d0d544e5c1fb79681ba6e02a7962751c9387967 Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Fri, 13 Nov 2026 12:32:00 +0100 Subject: [PATCH 4/4] Update doc/releases/0.106.0.rst Co-authored-by: Chris Halcrow <57948917+chrishalcrow@users.noreply.github.com> --- doc/releases/0.106.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/releases/0.106.0.rst b/doc/releases/0.106.0.rst index b5825d92b7..647384dbe4 100644 --- a/doc/releases/0.106.0.rst +++ b/doc/releases/0.106.0.rst @@ -3,7 +3,7 @@ SpikeInterface 0.106.0 release notes ------------------------------------ -Nov ** 2026 +Nov 13th 2026 Main changes: