diff --git a/.github/import_test.py b/.github/import_test.py index 52bdde42f9..9e9fb7666b 100644 --- a/.github/import_test.py +++ b/.github/import_test.py @@ -45,7 +45,7 @@ time_taken_list.append(time_taken) for time in time_taken_list: - import_time_threshold = 2.0 # Most of the times is sub-second but there outliers + import_time_threshold = 3.0 # Most of the times is sub-second but there outliers if time >= import_time_threshold: exceptions.append( f"Importing {import_statement} took: {time:.2f} s. Should be <: {import_time_threshold} s." @@ -59,7 +59,7 @@ times_list_str = ", ".join(f"{time:.2f}" for time in time_taken_list) markdown_output += f"| `{import_statement}` | {avg_time:.2f} | {std_time:.2f} | {times_list_str} |\n" - import_time_threshold = 1.0 + import_time_threshold = 2.0 if avg_time > import_time_threshold: exceptions.append( f"Importing {import_statement} took: {avg_time:.2f} s in average. Should be <: {import_time_threshold} s." diff --git a/README.md b/README.md index 60f37a047f..4ad2d67ce8 100644 --- a/README.md +++ b/README.md @@ -46,11 +46,13 @@ [![Twitter](https://img.shields.io/badge/@spikeinterface-%231DA1F2.svg?style=for-the-badge&logo=Twitter&logoColor=white)](https://twitter.com/spikeinterface) [![Mastodon](https://img.shields.io/badge/-@spikeinterface-%232B90D9?style=for-the-badge&logo=mastodon&logoColor=white)](https://fosstodon.org/@spikeinterface) -> :warning::warning::warning: -> **New features under construction!** 🚧🚧🚧: after the 0.100.0 release (and related bug fixes), the next release will contain -> a major API improvement: the `SortingAnalyzer`. To read more about this, checkout the -> [enhancement proposal](https://github.com/SpikeInterface/spikeinterface/issues/2282). -> Please refer to the stable documentation [here](https://spikeinterface.readthedocs.io/en/0.100.4) +> :rocket::rocket::rocket: +> **New features!**: after months of development and testing, we are happy to announce that +> the latest release (0.101.0) includes a major API improvement: the `SortingAnalyzer`! +> To read more about why we did this, checkout the +> [SpikeInterface Enhancement Proposal](https://github.com/SpikeInterface/spikeinterface/issues/2282). +> Please follow this guide to transition from the old API to the new one: +> [Updating from legacy](https://spikeinterface.readthedocs.io/en/0.101.0/tutorials/waveform_extractor_to_sorting_analyzer.html). SpikeInterface is a Python framework designed to unify preexisting spike sorting technologies into a single code base. @@ -74,12 +76,14 @@ With SpikeInterface, users can: ## Documentation -Detailed documentation of the latest PyPI release of SpikeInterface can be found [here](https://spikeinterface.readthedocs.io/en/0.100.1). +Detailed documentation of the latest PyPI release of SpikeInterface can be found [here](https://spikeinterface.readthedocs.io/en/stable). Detailed documentation of the development version of SpikeInterface can be found [here](https://spikeinterface.readthedocs.io/en/latest). Several tutorials to get started can be found in [spiketutorials](https://github.com/SpikeInterface/spiketutorials). +Checkout our YouTube channel for video tutorials: [SpikeInterface YouTube Channel](https://www.youtube.com/@Spikeinterface). + There are also some useful notebooks [on our blog](https://spikeinterface.github.io) that cover advanced benchmarking and sorting components. @@ -128,3 +132,6 @@ If you find SpikeInterface useful in your research, please cite: publisher={eLife Sciences Publications Limited} } ``` + +Please also cite other relevant papers for the specific components you use. +For a ful list of references, please check the [references](https://spikeinterface.readthedocs.io/en/latest/references.html) page. diff --git a/doc/images/overview.png b/doc/images/overview.png index bb0cfbe8aa..ea5ba49d08 100644 Binary files a/doc/images/overview.png and b/doc/images/overview.png differ diff --git a/doc/index.rst b/doc/index.rst index 6a13b12607..c416764d38 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -14,11 +14,13 @@ state-of-the-art spike sorters, post-process and curate the output, compute qual .. warning:: - a major API improvement: the :code:`SortingAnalyzer`. To read more about this, checkout the + Version 0.101.0 introduces a major API improvement: the :code:`SortingAnalyzer`.` + To read more about the motivations, checkout the `enhancement proposal `_. - Please refer to the `stable documentation `_. - Learn how to :ref:`update your code here ` and read more about the - :ref:`SortingAnalyzer here `. + Learn how to :ref:`update your code here ` + and read more about the :code:`SortingAnalyzer`, please refer to the + :ref:`core ` and :ref:`postprocessing ` module + documentation. diff --git a/doc/modules/core.rst b/doc/modules/core.rst index 81787e7f7b..8aa1815a55 100644 --- a/doc/modules/core.rst +++ b/doc/modules/core.rst @@ -388,7 +388,7 @@ and merging unit groups. sorting_analyzer_merge = sorting_analyzer.merge_units([0, 1], [2, 3]) All computed extensions will be automatically propagated or merged when curating. Please refer to the -:ref:`modules/curation` documentation for more information. +:ref:`modules/curation:Curation module` documentation for more information. Event diff --git a/doc/modules/curation.rst b/doc/modules/curation.rst index 3cdf5c170b..8e5418b66e 100644 --- a/doc/modules/curation.rst +++ b/doc/modules/curation.rst @@ -1,4 +1,5 @@ .. _curation: + Curation module =============== diff --git a/doc/modules/preprocessing.rst b/doc/modules/preprocessing.rst index 4fbadd3ab1..23919cab23 100644 --- a/doc/modules/preprocessing.rst +++ b/doc/modules/preprocessing.rst @@ -32,7 +32,7 @@ These two preprocessors will not compute anything at instantiation, but the comp traces = recording_cmr.get_traces(start_frame=100_000, end_frame=200_000) -Some internal sorters (see :ref:`modules/sorters:Intertnal Sorters`) can work directly on these preprocessed objects so there is no need to +Some internal sorters (see :ref:`modules/sorters:Internal Sorters`) can work directly on these preprocessed objects so there is no need to save the object: .. code-block:: python diff --git a/doc/modules/sorters.rst b/doc/modules/sorters.rst index 2a440f9c0a..a58fba1c98 100644 --- a/doc/modules/sorters.rst +++ b/doc/modules/sorters.rst @@ -473,8 +473,8 @@ Here is the list of external sorters accessible using the run_sorter wrapper: * **HDSort** :code:`run_sorter(sorter_name='hdsort')` * **YASS** :code:`run_sorter(sorter_name='yass')` -Intertnal Sorters ------------------ +Internal Sorters +---------------- Here a list of internal sorter based on `spikeinterface.sortingcomponents`; they are totally experimental for now: diff --git a/doc/modules/widgets.rst b/doc/modules/widgets.rst index 5bf0658e99..cc6aa63d80 100644 --- a/doc/modules/widgets.rst +++ b/doc/modules/widgets.rst @@ -198,7 +198,7 @@ The functions have the following additional arguments: # sortingview backend w_ts = sw.plot_traces(recording=recording, backend="sortingview") - w_ss = sw.plot_sorting_summary(waveform_extractor=we, curation=True, backend="sortingview") + w_ss = sw.plot_sorting_summary(sorting_analyzer=sorting_analyzer, curation=True, backend="sortingview") **Output:** diff --git a/doc/releases/0.100.8.rst b/doc/releases/0.100.8.rst new file mode 100644 index 0000000000..9171884eca --- /dev/null +++ b/doc/releases/0.100.8.rst @@ -0,0 +1,16 @@ +.. _release0.100.8: + +SpikeInterface 0.100.8 release notes +------------------------------------ + +24th June 2024 + +Minor release with bug fixes + +* Remove separate default job_kwarg n_jobs for sorters (#2712) +* Fix math error in sd_ratio (#2964) +* Add `whiteningRange` added as Kilosort 2/2.5/3 parameter (#2997) +* Make sure we check `is_filtered()`` rather than bound method during run basesorter (#3037) +* Numpy 2.0 cap Fix most egregorious deprecated behavior and cap version (#3032, #3056) +* Add support for kilosort>=4.0.12 (#3055) +* Check start_frame/end_frame in BaseRecording.get_traces() (#3059) diff --git a/doc/releases/0.101.0.rst b/doc/releases/0.101.0.rst new file mode 100644 index 0000000000..93519be71b --- /dev/null +++ b/doc/releases/0.101.0.rst @@ -0,0 +1,406 @@ +.. _release0.101.0: + +SpikeInterface 0.101.0 release notes +------------------------------------ + +Estimated: 19th July 2024 + +Main changes: + +* Implementation of `SortingAnalyzer` (#2398) +* Improved auto-merging functions and enable `SortingAnalyzer` to merge units and extensions (#3043, #3154, #3203) +* Added framework for hybrid recording generation (#2436, #2769, #2857) +* Refactored motion correction with the `Motion` class and the DREDGE AP and LFP methods (#2915, #3062) +* Extendeded benchmarking of `sortingcomponents` (#2501, #2518, #2586, #2811, #2959) +* Added a powerful drift generator module (#2683) + +core: + +* Units aggregation preserve unit ids of aggregated sorters (#3180) +* Better error message for `BaseExtractor.load()` (#3170) +* Saving provenance with paths relative to folder (#3165) +* Fix segment start/end frame None in `concatenate_recordings` (#3161) +* Implement `apply_merges_to_sorting()` (#3154) +* More explicit consistency checks for Channel aggregation (#3151) +* Fix serializability in `save` function and `InjectDriftingTemplatesRecording` (#3130) +* Fix t_starts not propagated to `save_to_memory` (#3120) +* Round instead of int for `time_to_sample_index` (#3119) +* Add time vector case to `get_durations` (#3118) +* Reordering recording, sorting args (#3094) +* extractor_dict_iterator for solving path detection in object `kwargs` (#3089) +* Check start_frame/end_frame in `BaseRecording.get_traces()` (#3059) +* Relax numpy (#3056) +* Add `scale_to_uV` preprocessing (#3053) +* Add more helpful error when a non-existent id is passed to extractors (#3052) +* Propagate `FrameSlice` default behavior to `frame_slice` and `time_slice` (#3051) +* fix spike_vector_to_indices() (#3048) +* Skip loading `info.json` into `ext.data` (#3047) +* Proposal to implement a `sorting_analyzer.merge_units()` syntax (#3043) +* add recording.time_slice like recording.frame_slice (#3034) +* Numpy 2.0 cap Fix most egregorious deprecated behavior and cap version (#3032) +* Avoid redirection to not implemented method in `BaseRecording.select_channels` (#3002) +* Add documentation to `frame_slice` in recording and drop redundant inheritance (#3001) +* Add select chanel and select unit method for template objects (#2989) +* Missed `has_scaled` (#2979) +* Fixed `select_channels` (#2977) +* Make `_set_probes` private (#2949) +* Add limit for `n_jobs` with a max of `os.cpu_count()` (#2940) +* API: switch `has_scaled` -> `has_scaleable_traces` (#2924) +* Making `chunk_size=None` behavior for n_jobs=1 explicit (#2902) +* Fix remaining verbose clashing (#2901) +* Remove `verbose` from `job_kwargs` (#2898) +* Put get_extension (to trigger auto-import) before `get_children_dependencies` for deleting Analyzer extensions to prevent KeyError (#2888) +* Add peak_to_peak mode to get_templates_amplitude (#2885) +* Protect zarr properties of type object (#2884) +* Avoid returning std when asking for only mean/average with templates extension (#2868) +* Add binary suffixes to job tools memory specification (e.g. 1GiB vs 1GB) (#2858) +* Possible fix for #2837 (#2854) +* Load `is_scaled` in from zarr Template representation (#2852) +* Use the `is_scaled` attribute inside of `template_tools` functions (#2848) +* Add extra check in fix_job_kwargs (#2829) +* Zarr: extract time vector once and for all! (#2828) +* Add html representation for recording objects (#2803) +* Remove SharedMemory from SortingAnalyzer and use NumpySorting instead. (#2801) +* Channel aggregation preserves names (#2797) +* Only assign memmap within boundaries for `write_binary` (#2796) +* Improve verbose of `ChunkRecordingExecutor` (#2795) +* Add `select_channels` method to base recording (#2786) +* Analyzer set recording (#2785) +* Add name as an extractor attribute for `__repr__` purposes (#2784) +* Compute quality metrics after pipeline nodes (#2773) +* Check for SortingAnalyzer `return_scaled` in template_tools (#2752) +* Template amplitude should not be returned as absolute value (#2750) +* Fix performance issue for `aggregate_channels` (#2736) +* Multiple verbose arguments fix (#2728) +* Fix pipelining of extensions (#2715) +* Seepd up random_spikes_selection() and put "all" method in it (#2700) +* Extend compute for extension kwargs and pipeline nodes (#2693) +* Add 'all' method for random_spikes (#2691) +* Move "return_scaled" options global to SortingAnalyzer. (#2684) +* Extend zarr compression options (#2643) +* Fast templates: compute `std` with and extend to widgets (#2623) +* SortingAnalyzer: `get_extension_default_params` (#2616) +* Load pca from waveform extractor and waveform from Zarr (#2613) +* Seeding silence periods (#2611) +* Implement `get_parent()` function (#2610) +* Fix analyzer sampling frequency check (#2606) +* Proposal to inject anisotropy while creating fake templates (#2600) +* Fix for sorting from_peaks with lexsort (handling multi segments) (#2594) +* Save extension class info. (#2585) +* Fix to impose sorting of the peaks in from_peaks() (#2584) +* Extension delete on recompute (#2579) +* Proposal for auto import extensions module. (#2571) +* Add `check_json` to `zarr` for `SortingAnalyzer` for sorting_provenance file writing (#2559) +* Add more backwards compatibly for MockWaveformExtractor (#2546) +* Make binary recording memmap efficient III (Avoiding spikes by only reserving memory equal to the trace) (#1781) +* Implementation of SortingAnalyzer (#2398) + + +preprocessing: + +* Remove name class attribute in preprocessing module (#3200) +* Add option to use ref_channel_ids in global common reference (#3139) +* Adding option to overwrite while doing correct_motion and saving to a folder (#3088) +* Docstrings preprocessing update, fix PR01 and PR02 (#3016) +* Fix deepinterpolation tests (#2971) +* Improve phase shift memory efficiency (#2946) +* Fix highpass-spatial-filter return dtype (#2864) +* Update detect_bad_channels docs (#2783) +* Regularize whitening (#2744) +* Seeding silence periods (#2611) +* Added `round` option to `recording.astype` (#2513) +* Small bug fix in zscore : gain / offset must be reset (#2510) + + + +extractors: + +* Fix naming when all_annotations=True in neo base extractors (#3198) +* Propagate option for using neo channel names as ids in all neo extractors without changing the deafult behavior (#3195) +* Update `nwbextractors` docstring (#3179) +* Build extractor dicts automatically (#3169) +* Remove unused legacy class name/mode from extractors (#3153) +* Improved conditions for closing nwb when using hdf5 backend (#3150) +* Use names as channel ids in plexon2 (#3065) +* Fix intan kwargs (#3054) +* Remove scipy upper bound for streaming extractors (#3023) +* Fix timestamps access in NWB extractor (#2993) +* Mcsh5 offsets and proper scaling in uV for return_scaled (#2988) +* Fix bug with nan values (#2970) +* Add argument to `IntanRecordingExtractor` for opening files with discontinous timestamps (#2969) +* Add extractors for SiNAPS Research Platform (#2952) +* Add `zarr.open` kwargs to `fetch_available_electrical_series_paths` in `NWBRecordingExtractor` (#2909) +* Undefined variable IBL extractor (#2906) +* Remove unused argument in nwb extractors `read_file_from_backend` (#2904) +* Add static method to `NWBRecordingExtractor` to fetch the available electrical series (#2903) +* Remove unused extractor attribute `extractor_name` (#2874) +* Avoid duplicating channel names as property in neo base extractor when `all_annotations=True` (#2845) +* Fix EID in IBL (#2714) +* Deprecate ros3 as a streaming method (#2662) +* Fix channel gains in `NwbRecordingExtractor` with backend (#2661) +* Open Ephys: Use discovered recording ids to load sync timestamps (#2655) +* ADD: Neuropixels ProbeGroup to SpikeGadgetsRecordingExtractor. (#2641) +* Add extra_requirements for nwb extractors (#2637) +* Remove lazy typing in nwb (#2635) +* Add supportfor `IntanRecordingExtractor` "one-file-per-signal" and "one-file-per-channel" formats (#2630) +* IBL extractors revived (#2617) +* Add strict_gap_mode in read_neuralynx to reflect neo. (#2550) +* Use `has_channel_location` instead of `get_property("contact_vector")` (#2475) +* Implementing read_spikeglx_event() (#2442) + +sorters: + +* Improve error log to json in run_sorter (#3057) +* Add support for kilosort>=4.0.12 (#3055) +* Make sure we check `is_filtered()` rather than bound method during run basesorter (#3037) +* Add more container dependency checks in `run_sorter` (#3024) +* whiteningRange added as Kilosort 2.5 parameter (#2997) +* Patch for regularizing folder arguments (#2968) +* Regularize folder argument for user in run_sorter options (#2917) +* Update tridesclous2 (#2860) +* Benchmark sorting components + Tridesclous2 improvement (#2811) +* Update KS4 parameters (#2810) +* Add parameter for irc1 (#2809) +* Fix KS4 for v>=4.0.5 and simplify skip correction (#2774) +* Improvements for circus 2 (#2768) +* Remove separate default job_kwarg `n_jobs` for sorters (#2712) +* Update ks4 wrapper for v4.0.3 (#2701) +* Improve caching of MS5 sorter (#2690) +* Add whitening before peeler TDC2 SC2 (#2679) +* add option to kilosort4 to force cpu even if cuda is available when small gpu (#2647) +* Add batch size to KS4 wrapper (#2592) +* Fix for template matching in circus (#2583) +* Use GPU in `Kilosort4Sorter` (#2577) +* Circus2 improvements (#2574) +* Simple sorter better params (#2547) +* Kilosort4 Wrapper (#2529) +* Fix singularity issue in deleting py_user_folder (#2493) +* Tridesclous2 update (#2267) + +postprocessing: + +* Fix pca transform error (#3178) +* Fix `spike_vector_to_indices()` (#3048) +* Remove un-used argument (#3021) +* Optimize numba cross-correlation and extend `correlograms.py` docstrings and tests (#3017) +* Moving unit_localization into unit_locations for consistency (#2992) +* Template similarity lags (#2941) +* Fix isi_histograms when using numba (#2632) +* Revert change in `set_params` for unit locations (#2624) + +qualitymetrics: + +* Fix nn pca_metric computation and update tests (#3138) +* Add `peak_to_peak` mode to SNR (#3009) +* Add test to check unit structure in quality metric calculator output (#2973) +* Fix math error in `sd_ratio` (#2964) +* Remove "waveforms" dependency for `compute_quality_metrics()` (#2707) +* `compute_synchrony_metrics` update (#2605) + +curation: + +* Port auto-merge changes and refactor (#3203) +* Implement `apply_merges_to_sorting()` (#3154) +* Proposal of format to hold the manual curation information (#2933) +* Provide useful message if sorting used instead of analyzer for `remove_duplicate_units` (#2790) +* Fix split in more than 2 units and extend curation docs and tests (#2775) +* Enhancing curation : `get_potential_auto_merge()` (#2753) +* Make sure `has_exceeding_spikes` also checks for negative spikes. (#2727) +* Allow for `remove_excess_spikes` to remove negative spike times (#2716) +* Add function in addition to class option for `MergeUnitsSorting`, `SplitUnitSorting`, and `CurationSorting` (#2659) +* Allow `auto_merge` to work with `fast_templates` (#2551) + +widgets: + +* Channel ids sortingview (#3205) +* Since the gui now has curation we should allow users to set curation when making sorting summary (#3104) +* Add `plot_drift_raster_map` widget (#3068) +* Fix bug in `plot_potential_merges` (#3044) +* Add `peaks_on_probe` widget. (#3022) +* Plot potential merges (#3003) +* Fix the new way of handling cmap in matpltolib. This fix the matplotib 3.9 problem related to this. (#2891) +* Extend plot waveforms/templates to Templates object (#2856) +* Fix bug in plot templates (#2850) +* Add errors to `ensure` functions in `Base` of widgets (#2791) +* Add `color_channels` option in in plot_probe_map (#2740) +* Extend capabilities of plot_traces and spikes_on_traces (#2737) +* Enable waveform-less plot templates (#2692) +* Fix depth location in spikes on traces map (#2676) +* Improve spikes on traces (#2646) + +generation: + +* Remove unit_params_range from generate.py (#3121) +* Out-of-place multiply needed when using amplitude scaling in the drifty hybrid recording (#3115) +* Update tests against template library (#3000) +* Add select channel and select unit method for template objects (#2989) +* Template fetching methods (#2857) +* Load `is_scaled` in from zarr Template representation (#2852) +* Add `is_scaled` to `Templates` object (#2842) +* Add template `generate_recording_from_template_database` (#2769) +* Add a missing seed in generator (#2706) +* Generate drift (#2683) +* Changing the generation of fake template with a decaying exponential and fix torch locally exclusive (#2674) +* Proposal to inject anisotropy while creating fake templates (#2600) +* Fix scaling of inject templates with copy (#2521) +* Tools for Generation of Hybrid recordings (#2436) +* Remove default values used as expressions in `generate.py`. (#2345) + + +sortingcomponents: + +* Fix select peaks (#3132) +* Dredge lfp and dredge ap (#3062) +* Use "available" for memory caching (#3008) +* get_spike_prototype can have NaN sometimes (#2980) +* Benchmarks components: plotting utils (#2959) +* Internal motion API, aka `Motion` object (#2915) +* Components of SC2 (#2870) +* Benchmark sorting components + Tridesclous2 improvement (#2811) +* Change "idw" to "kriging" in spatial_interpolation_kernel parameters (#2708) +* Benchmarks for sorting components (#2586) +* Fix for template matching in circus (#2583) +* Circus2 improvements (#2574) +* Matched filtering to enhance peak detection (#2259) +* Benchmark matching (#2518) +* Initial benchmark components refactor (#2502) +* Remove WaveformExtractor from Templates matching (#2485) + + +documentation: + +* Eradicate sphinx warnings (#3188) +* Convert doc references from `wf_extractor` -> `sorting_analyzer` (#3185) +* Add explainer of compute always computing in the analyzer (vs WaveformExtractor behavior) documentation (#3173) +* Extend docs and API for generation module (#3167) +* analyse -> analyze in Neuropixels docs (#3143) +* Add pooch to docs extra (#3124) +* Docstrings extractors update, fix PR01 and PR02 #3016 (#3076) +* Unify compute_isi_violation docs and add UltraMegaSort2000 citation (#3070) +* Correct docs and docstrings for compute_template_metric units (#3066) +* Add `bool` type hint to functions in core module (#3064) +* Fix the probe handling tutorial (#3063) +* Add more helpful error when a non-existent id is passed to extractors (#3052) +* Docstrings preprocessing update, fix PR01 and PR02 (#3016) +* Add documentation to `frame_slice` in recording and drop redundant inheritance (#3001) +* Add a jQuery extension to enable search (#2962) +* Standardize colon spacing in docstrings (#2950) +* Make a how to loading data into a Sorting manually (#2944) +* Add references to documentation page (#2938) +* Standardise qualitymetrics docstrings to numpydocs standard (#2935) +* Add `_params_descriptions` for simple sorter (#2894) +* Extend docstrings for amplitude scaling and collisions (#2893) +* Improve `save_to_folder` docstring (#2873) +* Unpin sphinx and add networkx dependency. (#2861) +* Switch `Visualise` to `Visualize` (#2830) +* Add typing to `write_binary_recording` (#2794) +* Update detect_bad_channels docs (#2783) +* Reorganising documentation into Getting Started, Tutorial and How To (#2778) +* Switch exporters docs to `SortingAnalyzer` (#2762) +* Update amplitude cutoff documentation (#2756) +* Update SortingAnalyzer docs (see #2711) (#2719) +* Add basic repr to `Templates` object (#2718) +* Fix example broken by #2684 (#2717) +* Add a "how to" for combining recordings (#2713) +* Fix SortingAnalyzer tutorial (#2648) +* Sync documentation with bug fixes (#2645) +* WaveformExtractor -> SortingAnalyzer doc page (#2633) +* Update get_started.rst with info for reloading saved binaries (#2622) +* Analyzer core extension: improve docstrings (#2608) +* Improve documentation for excess spikes error in `FrameSliceSorting`. (#2604) +* Put SortingAnalyzer in get started (#2582) +* Clarify status of main and Sortinganalyzer (#2580) +* Add note about recommendation not to change batch size in Kilosort1-3 (#2564) +* `SortingAnalyzer` core documentation (#2563) +* Cleanup of modules gallery docs (post SorterAnalyzer) (#2552) +* Add note to explain that Command Prompt is currently the only officially supported shell for Windows (#2494) +* Add documentation of preprocessing and sorting split by channel group. (#2316) +* `SortingAnalyzer` in "how to" analyze neuropixels (#2520) + +continuous integration: + +* Add test_extractors to full test with codecov (#3141) +* Add plexon2 tests action for install wine and drop full (linux only) tests (#3101) +* Add machinery to run test only on changed files (#3084) +* Remove cached dependencies (#3080) +* Add macos and windows to cache cron jobs (#3075) +* Update cron job for `installation_tips` (#3038) +* Improve profile imports test (#2955) +* Modify CI for new dev version criteria (#2636) +* update all CI actions (#2460) + +packaging: + +* Add ibllib to test requirements (#3090) +* Relax numpy (#3056) +* Set DEV=True until release (#3036) +* Remove neo top level imports (#2991) +* Improve import times with full (#2983) +* Remove upper bound in scipy dependency for full install (#2956) +* Improve profile imports test (#2955) +* Fix marker collection to work on windows (#2947) +* Remove numba type signature to prevent compilation of numba functions at import (#2932) +* Switch `calculate_pc_metrics` to `compute_pc_metrics` for api consistency (#2925) +* Regularised the API from parent_recording to recording in zero_channel_pad (#2923) +* Update curation module to use `sorting` argument rather than `parent_sorting` (#2922) +* Fix the new way of handling cmap in matpltolib. This fix the matplotib 3.9 problem related to this. (#2891) +* Protect hdbscan import in `TdCClustering` (#2876) +* Pin matplotlib dependency (#2866) +* Unpin sphinx and add networkx dependency. (#2861) +* Add safeguard for probeinterface use of `read_spikegadgets` (#2833) +* Update codecov badge (#2481) + +testing: + +* Add a couple of seeds in tests (#3189) +* Add test_extractors to full test with codecov (#3141) +* Add streaming extractor tests to main test script (#3129) +* Add plexon2 tests action for install wine and drop full (linux only) tests (#3101) +* Mark failing sorter test on Windows*Python3.12 as xfail (#3091) +* Add macos and windows to cache cron jobs (#3075) +* Remove duplicate function from common test suite. (#3058) +* Numpy 2.0 cap Fix most egregorious deprecated behavior and cap version (#3032) +* Remove unittest from postprocessing (#2984) +* Fix deepinterpolation tests (#2971) +* Make easier env vars for local testing (#2951) +* Fix marker collection to work on windows (#2947) +* Remove unused imports in ibl test (#2939) +* Add tests for windows and mac (#2937) +* Add Mac skip for plexon2 Neo test (#2931) +* Remove mearec from testing functions (#2930) +* Remove cache folder (#2927) +* Remove toy_example from test codebase (2) (#2920) +* Remove toy example from test codebase (1) (#2916) +* Fix codecov testing (#2777) +* Speed up test_sorting_s3_nwb_zarr (#2767) +* Fix full tests (#2665) +* Fix typo in fast templates test (#2651) +* update all CI actions (#2460) + +Contributors: + +* @AnujVader +* @Ashkees +* @Djoels +* @DradeAW +* @HDClark94 +* @JoeZiminski +* @NinelK +* @RobertoDF +* @alejoe91 +* @bagibence +* @chrishalcrow +* @cwindolf +* @gkBCCN +* @h-mayorquin +* @jakeswann1 +* @jsiegle +* @khl02007 +* @manimoh +* @naterenegar +* @nikhilchandra +* @paulrignanese +* @remi-pr +* @samuelgarcia +* @yger +* @zm711 diff --git a/doc/scripts/auto-release-notes.sh b/doc/scripts/auto-release-notes.sh new file mode 100644 index 0000000000..14bee3dad0 --- /dev/null +++ b/doc/scripts/auto-release-notes.sh @@ -0,0 +1,43 @@ +#!/bin/bash +if [ $# -eq 0 ]; then + echo "Usage: $0 START_DATE END_DATE [LABEL] [BRANCH1,BRANCH2] [LIMIT]" + exit 1 +fi + +START_DATE="$1" +END_DATE="$2" + +if [ -z "$3" ] || [ "$3" = "all" ]; then + LABELS=("core" "extractors" "preprocessing" "sorters" "postprocessing" "qualitymetrics" "curation" "widgets" "generators" "hybrid" "sortingcomponents" "motion correction" "documentation" "continuous integration" "packaging" "testing") +else + LABELS=("$3") +fi + +if [ -n "$4" ]; then + IFS=',' read -ra BRANCHES <<< "$4" +else + BRANCHES=("main") +fi + +if [ -n "$5" ]; then + LIMIT=$5 +else + LIMIT=300 +fi + +for LABEL in "${LABELS[@]}"; do + echo "$LABEL:" + echo "" + for BRANCH in "${BRANCHES[@]}"; do + gh pr list --repo SpikeInterface/spikeinterface --limit $LIMIT --label "$LABEL" --base "$BRANCH" --state merged --json number,title,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) | "* \(.title) (#\(.number))"' + done + echo "" +done + +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 | .[] | "* @" + .' diff --git a/doc/whatisnew.rst b/doc/whatisnew.rst index becd91790e..94da5d15fb 100644 --- a/doc/whatisnew.rst +++ b/doc/whatisnew.rst @@ -8,6 +8,8 @@ Release notes .. toctree:: :maxdepth: 1 + releases/0.101.0.rst + releases/0.100.8.rst releases/0.100.7.rst releases/0.100.6.rst releases/0.100.5.rst @@ -41,10 +43,30 @@ Release notes releases/0.9.1.rst -(PRE-RELEASE) Version 0.101.0rc0 -================================ +Version 0.101.0 +=============== + +* Implementation of `SortingAnalyzer` (#2398) +* Improved auto-merging functions and enable `SortingAnalyzer` to merge units and extensions (#3043, #3154, #3203) +* Added framework for hybrid recording generation (#2436, #2769, #2857) +* Refactored motion correction with the `Motion` class and the DREDGE AP and LFP methods (#2915, #3062) +* Extendeded benchmarking of `sortingcomponents` (#2501, #2518, #2586, #2811, #2959) +* Added a powerful drift generator module (#2683) + +Version 0.101.0rc1 +================== + +* Release candidate for version 0.101.0 (15th July 2024) + +Version 0.101.0rc0 +================== -* Major release with `SortingAnalyzer` +* Release candidate for version 0.101.0 (8th June 2024) + +Version 0.100.8 +=============== + +* Minor release with bug fixes Version 0.100.7 =============== diff --git a/pyproject.toml b/pyproject.toml index 2ba53328e7..d4a83bb7fe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "spikeinterface" -version = "0.101.0rc0" +version = "0.101.0rc1" authors = [ { name="Alessio Buccino", email="alessiop.buccino@gmail.com" }, { name="Samuel Garcia", email="sam.garcia.die@gmail.com" }, @@ -25,7 +25,7 @@ dependencies = [ "tqdm", "zarr>=2.16,<2.18", "neo>=0.13.0", - "probeinterface>=0.2.21", + "probeinterface>=0.2.22", "packaging", ] @@ -125,16 +125,16 @@ 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", ] test_extractors = [ # Functions to download data in neo test suite "pooch>=1.8.2", "datalad>=1.0.2", - "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 = [ diff --git a/src/spikeinterface/__init__.py b/src/spikeinterface/__init__.py index 306c12d516..97fb95b623 100644 --- a/src/spikeinterface/__init__.py +++ b/src/spikeinterface/__init__.py @@ -30,5 +30,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