diff --git a/doc/authors.rst b/doc/authors.rst index bbd928ba47..13b2ca4a98 100644 --- a/doc/authors.rst +++ b/doc/authors.rst @@ -12,26 +12,40 @@ Current core team * `Alessio Paolo Buccino `_ [1] * `Samuel Garcia `_ [2] +* `Chris Halcrow `_ [3] -For any inquiries, please contact Alessio Buccino (alessiop.buccino@gmail.com) or Samuel Garcia -(samuel.garcie.die@gmail.com), or just write an issue (preferred)! +For any inquiries, please contact Alessio Buccino (alessiop.buccino@gmail.com), Samuel Garcia +(samuel.garcie.die@gmail.com) or Chris Halcrow (chalcrow@ed.ac.uk), or just write an issue (preferred)! +Core maintainers +---------------- + +The following people have made significant ongoing contributions towards SpikeInterface: + +* `Zach McKenzie `_ [4] +* `Heberto Mayorquin `_ [5] +* `Pierre Yger `_ [6] +* `Joe Ziminski `_ [7] Founding core team ------------------ * `Alessio Paolo Buccino `_ [1] -* `Cole Hurwitz `_ [3] -* `Jeremy Magland `_ [4] -* `Matthias Hennig `_ [3] +* `Cole Hurwitz `_ [8] +* `Jeremy Magland `_ [9] +* `Matthias Hennig `_ [8] * `Samuel Garcia `_ [2] 1. Allen Institute for Neural Dynamics (AIND), Seattle, USA. 2. Centre de Recherche en Neuroscience de Lyon (CRNL), Lyon, France. -3. The Institute for Adaptive and Neural Computation (ANC), University of Edinburgh, Edinburgh, Scotland. -4. Center for Computational Biology (CCB), Flatiron Institute, New York, United States. - +3. Centre for Discovery Brain Sciences, University of Edinburgh, Edinburgh, UK. +4. Harvard Medical School, Harvard University, USA. +5. CatalystNeuro, Wyoming, USA. +6. Lille Neurosciences and Cognition, Université de Lille, Lille, France. +7. Sainsbury Wellcome Centre, London, UK. +8. The Institute for Adaptive and Neural Computation (ANC), University of Edinburgh, Edinburgh, UK. +9. Center for Computational Biology (CCB), Flatiron Institute, New York, USA. Contributors to current API (>0.90) ----------------------------------- diff --git a/doc/releases/0.104.0.rst b/doc/releases/0.104.0.rst new file mode 100644 index 0000000000..b209e972a1 --- /dev/null +++ b/doc/releases/0.104.0.rst @@ -0,0 +1,233 @@ +.. _release0.104.0: + +SpikeInterface 0.104.0 release notes +------------------------------------ + +Mar 23rd 2026 + +Main changes: + +* Added support for ``Bombcell`` [Fabre]_, for unit curation, including new and updated template metrics (#4306) +* Added ``LUPIN`` [Garcia2024]_ as an internal sorter (#4192) +* Added support for ``SLAy`` [Koukuntla]_, for automated unit merges (#4190) +* Added ``valid_unit_periods`` postprocessing extension, based on NeuroPyxles [npyx]_ (#4299, #4302) +* Added ``AutoCorrelograms`` postprocessing extension (#4307) +* Added support for double-sided probes (#4272) +* Added ``SequentialCuration``, allowing for chains of curations to be applied to analyzers (#4298) +* Added support for FigPack, to eventually superseed SortingView (#4364) +* Major refactor and debugging of the ``Metrics`` postprocessing module (#4183, #4362, #4355, #4353, #4342, #4292) (see: :doc:`/modules/metrics`) +* Significant speedups in ``Metrics`` (#4308, #4363) and ``SortingComponents`` (#4402, #4341) modules, and in correlograms (#4305) and template similarity (#4343) computations. + +* API and breaking changes: + + * Specific metrics functions now imported from different sub module (see: :doc:`/modules/metrics/`) + * ``snr`` quality metric calculation now uses median rather than mean (see: :doc:`/modules/metrics/quality_metrics`) + * Metric name "peak_to_valley" has been renamed to "peak_to_trough_duration" for clarity. This name change will be applied automatically on load of older analzyers. (see: :doc:`/modules/metrics/template_metrics`) + * The function to do UnitRefine curation has been renamed from ``auto_label_units`` to ``unitrefine_label_units`` (see :py:func:`~spikeinterface.curation.unitrefine_label_units`) + * Remove support for Python 3.9 + +core: + +* Fix closest_channels sparsity estimation when n_units > n_channels (#4443) +* Copy the recording from original sorting during NumpySorting.from_sorting() (#4417) +* Don't raise when extension is unknown (#4406) +* Make NumpySorting.from_unit_dict docs and code consistent (#4382) +* Improve extension dependency management in SortingAnalyzer (#4321) +* Implement `select_sorting_periods` in core (#4316) +* Implement the cached_lexsorted_spike_vector. (#4315) +* Move structured dtypes to base (#4314) +* Implement `select_sorting_periods` in metrics (#4302) +* Fix `get_probe` `set_probe` annotations propagation (#4300) +* using `spike_vector` on `core/check_sortings_equal` test (#4282) +* Random spike selection new methods (#4276) +* Implement the by_side grouping with probes (#4272) +* Fix gaussian filter with time vector (#4268) +* Delete some unused references to channel_slice (deprecated in v0.103.0) (#4246) +* Fix probable sharedmem (#4239) +* Implement Add/SubtractRecording classes and +- operators (#4238) +* Warn about non-mergeable units instead of raising an error (#4219) +* Implementing sparsity for ComputeTemplates (#4212) + +extractors: + +* Add XClustSortingExtractor (#4433) +* Add gain and offset for `read_kilosort_as_analyzer` (#4428) +* Fix openephys tests (#4426) +* Fix Open Ephys probe channel order (#4396) +* Improve NWB Extractor `__del__` method to avoid import errors (#4369) +* Fix IBL test with probe representation (#4335) +* Remove check of `len(inter_sample_shifts)` matching `num_readout_channels` (#4317) +* Update to SiNAPS extractor (#4263) +* Support for using event names as IDs in PL2 files (#4049) +* Get unit locations from HerdingspikesSortingExtractor (#3525) + +preprocessing: + +* Slice epsilons with dead channels to match gains during agc. (#4430) +* Support time_vector in resample() (#4429) +* Implementing KNN referencing and a backup referencing mechanism for common_reference (#4412) +* Use a truncated median filter near edges when detecting bad channels (#4391) +* Make anyone happy about warnings and margin in filtering. (#4384) +* Fix bug spatial filter #4175 (#4286) +* Fix gaussian filter with time vector (#4268) +* Fixes Issue4180 (#4247) +* Fix artifact removal padding logic (#4245) +* Auto-estimate margins based on freq_min/f0+Q for filters (#4227) +* Fix silence period and job_kwargs (#4071) +* Remove artefacts based of an envelope (#3715) + +sorters: + +* Add the option for clustering methods to return temporal shifts for peaks while clustering (#4401) +* Add plotting functions for drift and diagnostics to KS4 (#4387) +* lupin and tdc2 : improvements (#4349) +* Improve multithreading and multi processing : lock + nogil + mp_context (#4333) +* Fix typo in lupin/tdc2 (#4284) +* Make "simple" sorters params simpler. (#4281) +* Improvements for internal sorters (#4279) +* kilosort4 may fail due to the undesirable instantiation of `logger` (#4277) +* Flatten params for tridesclous2 sorter (#4254) +* Add isosplit in simple sorter (#4249) +* Final cleaning of mixtures for lupin/tdc/sc (#4244) +* Cosmetic logging messages for SC2 (#4242) +* A new sorter : Lupin sorter (#4192) + +postprocessing: + +* Set amplitude scalings equal zero for zero template units (#4455) +* Add gain and offset for `read_kilosort_as_analyzer` (#4428) +* Don't raise when extension is unknown (#4406) +* Fix valid period amplitudes (#4361) +* Patch lag similarities (#4345) +* Speed up template similarity computing using numba (#4343) +* Change ComputeSpikeLocations to use only peak_sign (#4330) +* Ensure compute unit locations respects order of unit ids (#4329) +* Auto correlograms (#4307) +* Option to turn on parallel computation for CCG in numba (#4305) +* Valid unit periods extension (#4299) +* Add `BaseSpikeVectorExtension` (#4189) + +metrics: + +* Set num_histogram_bins in amplitude_cutoff (back) to 100 (#4415) +* Fix metrics test for numba correlograms fast_mode (#4377) +* Remove multiprocessing from NearestNeigbhor metric (#4363) +* Add peak_sign to sd_ratio (#4362) +* Improve error message for deprecated metric names (#4358) +* Correct formula for mad (and std) in drift quality metrics (#4355) +* Compute missing spikes on the right tail of amplitude distributions (#4353) +* Improve stability of velocity fits in template metrics (#4342) +* Timing the computations of quality metrics and some optimizations (#4308) +* Bombcell integration and template metrics refactoring (#4306) +* Fix rp violations bug (#4292) +* Refactor metrics into its own module (#4183) + +curation: + +* Improve robustness of model classifier tests (#4447) +* Rename `CurationModel` to `Curation` (#4421) +* Change 'min'/'max' to 'greater'/'less' when defining thresholds for `threshold_metrics_label_units` (#4416) +* Send peak_sign to `get_template_extremum_channel_peak_shift` in remove_redundant_units (#4408) +* Use `sorting._recording` (if available) in `remove_excess_spikes` (#4407) +* Add `threshold_metrics` curation (#4365) +* Ensure default supported_versions is a tuple, as in type (#4348) +* Refactor API for `auto_label_units` (#4338) +* Bombcell integration and template metrics refactoring (#4306) +* Sequential curation (#4298) +* Fix failing tests due to scikit-learn versions (#4253) +* Warn about non-mergeable units instead of raising an error (#4219) +* Add SLAy auto-merge preset (#4190) + +widgets: + +* Enlarge channel textbox in plot_traces (#4400) +* Send a float (rather than 1-element array) to BoundedFloatText (#4399) +* Figpack integration (replacement of sortingview) (#4364) +* Remove layer selector from `plot_traces` ipywidgets backend if single layer (#4325) +* Fix edges of 2d-histogram in UnitWaveformDensityMapWidget (#4283) +* Protect unit summary and unit locations plots against NaNs (#4128) + +generators: + +* More possibilities for gt generation (#4289) +* Update generate.py (#4163) + +sortingcomponents: + +* Optimizations: faster waveforms/templates and seeding iterative_isosplit properly (#4402) +* Add the option for clustering methods to return temporal shifts for peaks while clustering (#4401) +* Make peak detection (locally_exclussive, matched_filtering) faster and more accurate. (#4341) +* Needed by Olivier to create an analyzer with precomputed data (#4303) +* Final cleaning of mixtures for lupin/tdc/sc (#4244) +* Cosmetic logging messages for SC2 (#4242) +* Update nearest peeler (#4223) + +documentation: + +* Add missing API doc entries for `save*`, `dump*`, `remove_channels`, and `scale_to_uV` (#4451) +* Extend unsigned to signed docs (#4448) +* Fix link to LFP docs in error message (#4424) +* Fix some typos in documentation (#4419) +* Add a why integrate your software with spikeinterface section (#4393) +* Add `compute_valid_unit_periods` to api and add credit in postprocessing module (#4390) +* Add metric_descriptions and BaseMetricExtension.get_metric_colum_descriptions (#4278) +* Doc sorters (#4275) +* Clean auto-release script: use metrics + only print changed modules (#4265) + +continuous integration: + +* Update setuptools version for legacy kilosort (#4386) +* Get rid of pytest-dependency and use fixtures (#4381) +* Free up space in codecov CI (#4252) + +packaging: + +* Update lower bound python support to 3.10 (#4383) + +testing: + +* Further Improve robustness of model classifier tests (#4450) +* Remove `n_jobs=-1` from curation tests (#4449) +* Improve robustness of model classifier tests (#4447) +* Fix openephys tests (#4426) +* Rename `neurodsp` to `ibldsp` to ensure IBL tests run (#4392) +* Update setuptools version for legacy kilosort (#4386) +* Get rid of pytest-dependency and use fixtures (#4381) +* Test IBL extractors tests failing for PI update (#4285) +* using `spike_vector` on `core/check_sortings_equal` test (#4282) +* fix tdc2 failing tests (#4271) +* Fix failing tests due to scikit-learn versions (#4253) + +deprecations: + +* Remove deprecations for 0.104.0 (#4425) +* Make anyone happy about warnings and margin in filtering. (#4384) +* Improve error message for deprecated metric names (#4358) +* Binary recording bacward-compatibility (#4357) + +Contributors: + +* @CodyCBakerPhD +* @JoeZiminski +* @Julie-Fabre +* @MGAMZ +* @OleBialas +* @ShijiMi-Soup +* @ablot +* @alejoe91 +* @b-grimaud +* @chrishalcrow +* @ecobost +* @esutlie +* @grahamfindlay +* @h-mayorquin +* @m-beau +* @mhhennig +* @oliche +* @pas-calc +* @raffaele222 +* @samuelgarcia +* @tayheau +* @ueeseer +* @yger +* @zzhmark diff --git a/doc/scripts/auto-release-notes.sh b/doc/scripts/auto-release-notes.sh index 0482f943a6..b20a731ade 100644 --- a/doc/scripts/auto-release-notes.sh +++ b/doc/scripts/auto-release-notes.sh @@ -8,7 +8,7 @@ START_DATE="$1" END_DATE="$2" if [ -z "$3" ] || [ "$3" = "all" ]; then - LABELS=("core" "extractors" "preprocessing" "sorters" "postprocessing" "metrics" "curation" "widgets" "generators" "hybrid" "sortingcomponents" "motion correction" "documentation" "continuous integration" "packaging" "testing" "deprecations") + LABELS=("core" "extractors" "preprocessing" "sorters" "postprocessing" "metrics" "curation" "widgets" "generators" "hybrid" "sortingcomponents" "motion correction" "documentation" "continuous integration" "packaging" "testing" "deprecations" "qualitymetrics") else LABELS=("$3") fi @@ -44,4 +44,4 @@ echo "Contributors:" echo "" gh pr list --repo SpikeInterface/spikeinterface --limit 1000 --base main --state merged --json number,title,author,mergedAt \ | jq -r --arg start_date "${START_DATE}T00:00:00Z" --arg end_date "${END_DATE}T00:00:00Z" \ - '[.[] | select(.mergedAt >= $start_date and .mergedAt <= $end_date) | .author.login] | unique | .[] | "* @" + .' + '[.[] | select(.mergedAt >= $start_date and .mergedAt <= $end_date and .author.login != "app/pre-commit-ci") | .author.login] | unique | .[] | "* @" + .' diff --git a/doc/whatisnew.rst b/doc/whatisnew.rst index 2f6181b725..9608f0a9c8 100644 --- a/doc/whatisnew.rst +++ b/doc/whatisnew.rst @@ -8,6 +8,7 @@ Release notes .. toctree:: :maxdepth: 1 + releases/0.104.0.rst releases/0.103.2.rst releases/0.103.1.rst releases/0.103.0.rst diff --git a/pyproject.toml b/pyproject.toml index 6312ee16e4..0541dceb57 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "spikeinterface" -version = "0.103.3" +version = "0.104.0" authors = [ { name="Alessio Buccino", email="alessiop.buccino@gmail.com" }, { name="Samuel Garcia", email="sam.garcia.die@gmail.com" }, @@ -26,7 +26,7 @@ dependencies = [ "tqdm", "zarr>=2.18,<3", "neo>=0.14.3", - "probeinterface>=0.3.1", + "probeinterface>=0.3.2", "packaging", "pydantic", "numcodecs<0.16.0", # For supporting zarr < 3 @@ -127,8 +127,8 @@ test_core = [ # for github test : probeinterface and neo from master # for release we need pypi, so this need to be commented - "probeinterface @ git+https://github.com/SpikeInterface/probeinterface.git", - "neo @ git+https://github.com/NeuralEnsemble/python-neo.git", + # "probeinterface @ git+https://github.com/SpikeInterface/probeinterface.git", + # "neo @ git+https://github.com/NeuralEnsemble/python-neo.git", # for slurm jobs, "pytest-mock" @@ -139,8 +139,8 @@ test_extractors = [ "pooch>=1.8.2", "datalad>=1.0.2", # Commenting out for release - "probeinterface @ git+https://github.com/SpikeInterface/probeinterface.git", - "neo @ git+https://github.com/NeuralEnsemble/python-neo.git", + # "probeinterface @ git+https://github.com/SpikeInterface/probeinterface.git", + # "neo @ git+https://github.com/NeuralEnsemble/python-neo.git", ] test_preprocessing = [ @@ -190,8 +190,8 @@ test = [ # for github test : probeinterface and neo from master # for release we need pypi, so this need to be commented - "probeinterface @ git+https://github.com/SpikeInterface/probeinterface.git", - "neo @ git+https://github.com/NeuralEnsemble/python-neo.git", + # "probeinterface @ git+https://github.com/SpikeInterface/probeinterface.git", + # "neo @ git+https://github.com/NeuralEnsemble/python-neo.git", # for slurm jobs "pytest-mock", @@ -219,8 +219,8 @@ docs = [ "huggingface_hub", # For automated curation # for release we need pypi, so this needs to be commented - "probeinterface @ git+https://github.com/SpikeInterface/probeinterface.git", # We always build from the latest version - "neo @ git+https://github.com/NeuralEnsemble/python-neo.git", # We always build from the latest version + # "probeinterface @ git+https://github.com/SpikeInterface/probeinterface.git", # We always build from the latest version + # "neo @ git+https://github.com/NeuralEnsemble/python-neo.git", # We always build from the latest version ] dev = [ 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