spikeinterface 0.103.2__tar.gz → 0.104.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {spikeinterface-0.103.2/src/spikeinterface.egg-info → spikeinterface-0.104.0}/PKG-INFO +37 -30
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/README.md +18 -14
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/pyproject.toml +21 -15
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_base.py +43 -46
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_clustering.py +20 -85
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_matching.py +8 -5
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_merging.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_motion_estimation.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_motion_interpolation.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_peak_detection.py +1 -3
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_peak_localization.py +6 -8
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_peak_selection.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_plot_tools.py +124 -8
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_sorter.py +20 -3
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_sorter_without_gt.py +0 -1
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/comparison/__init__.py +0 -8
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/comparison/basecomparison.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/comparison/collision.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/comparison/comparisontools.py +1 -3
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/comparison/correlogram.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/comparison/multicomparisons.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/comparison/paircomparisons.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/__init__.py +2 -1
- spikeinterface-0.104.0/src/spikeinterface/core/analyzer_extension_core.py +1697 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/base.py +58 -30
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/baseevent.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/baserecording.py +19 -9
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/baserecordingsnippets.py +48 -25
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/basesnippets.py +20 -37
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/basesorting.py +323 -138
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/binaryfolder.py +0 -1
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/binaryrecordingextractor.py +7 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/channelsaggregationrecording.py +0 -1
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/channelslice.py +2 -5
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/core_tools.py +3 -4
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/datasets.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/frameslicerecording.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/frameslicesorting.py +0 -1
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/generate.py +16 -17
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/globals.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/job_tools.py +51 -32
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/loading.py +0 -10
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/node_pipeline.py +44 -37
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/npyfoldersnippets.py +0 -1
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/npysnippetsextractor.py +0 -1
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/npzfolder.py +0 -3
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/npzsortingextractor.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/numpyextractors.py +14 -36
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/old_api_utils.py +2 -6
- spikeinterface-0.104.0/src/spikeinterface/core/operatorrecordings.py +82 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/recording_tools.py +7 -11
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/segmentutils.py +0 -1
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/snippets_tools.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/sorting_tools.py +211 -23
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/sortinganalyzer.py +187 -70
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/sortingfolder.py +0 -1
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/sparsity.py +11 -10
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/template.py +0 -1
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/template_tools.py +36 -11
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/testing.py +27 -26
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/testing_tools.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/unitsaggregationsorting.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/unitsselectionsorting.py +14 -17
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/waveform_tools.py +34 -26
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/waveforms_extractor_backwards_compatibility.py +4 -7
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/zarrextractors.py +5 -4
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/zarrrecordingextractor.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/__init__.py +9 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/auto_merge.py +274 -4
- spikeinterface-0.104.0/src/spikeinterface/curation/bombcell_curation.py +364 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/curation_format.py +39 -23
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/curation_model.py +124 -28
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/curation_tools.py +47 -5
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/curationsorting.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/mergeunitssorting.py +2 -4
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/model_based_curation.py +66 -16
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/remove_duplicated_spikes.py +2 -6
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/remove_excess_spikes.py +11 -10
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/remove_redundant.py +20 -33
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/sortingview_curation.py +2 -4
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/splitunitsorting.py +2 -5
- spikeinterface-0.104.0/src/spikeinterface/curation/threshold_metrics_curation.py +140 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/train_manual_curation.py +15 -32
- spikeinterface-0.104.0/src/spikeinterface/curation/unitrefine_curation.py +124 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/exporters/report.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/exporters/to_ibl.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/exporters/to_phy.py +0 -1
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/exporters/to_pynapple.py +15 -5
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/__init__.py +1 -3
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/alfsortingextractor.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/bids.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/cbin_ibl.py +3 -15
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/cellexplorersortingextractor.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/combinatoextractors.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/extractor_classes.py +2 -5
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/hdsortextractors.py +0 -2
- spikeinterface-0.104.0/src/spikeinterface/extractors/herdingspikesextractors.py +78 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/iblextractors.py +3 -7
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/klustaextractors.py +0 -3
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/matlabhelpers.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/mclustextractors.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/mcsh5extractors.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/mdaextractors.py +15 -18
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/alphaomega.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/axon.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/axona.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/biocam.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/blackrock.py +22 -8
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/ced.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/edf.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/intan.py +0 -1
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/maxwell.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/mcsraw.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/mearec.py +3 -6
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/neo_utils.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/neobaseextractor.py +16 -18
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/neuralynx.py +3 -6
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/neuroexplorer.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/neuronexus.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/neuroscope.py +7 -14
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/nix.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/openephys.py +9 -31
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/plexon.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/plexon2.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/spike2.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/spikegadgets.py +0 -1
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/spikeglx.py +1 -10
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/tdt.py +0 -2
- spikeinterface-0.104.0/src/spikeinterface/extractors/neuropixels_utils.py +85 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/nwbextractors.py +5 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/phykilosortextractors.py +220 -6
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/shybridextractors.py +0 -2
- spikeinterface-0.104.0/src/spikeinterface/extractors/sinapsrecordingextractors.py +402 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/spykingcircusextractors.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/toy_example.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/tridesclousextractors.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/waveclussnippetstextractors.py +5 -8
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/waveclustextractors.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/whitematterrecordingextractor.py +4 -5
- spikeinterface-0.104.0/src/spikeinterface/extractors/xclustextractors.py +168 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/yassextractors.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/full.py +1 -1
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/generation/drift_tools.py +13 -16
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/generation/drifting_generator.py +95 -42
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/generation/hybrid_tools.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/generation/noise_tools.py +1 -1
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/generation/splitting_tools.py +5 -2
- spikeinterface-0.104.0/src/spikeinterface/metrics/__init__.py +3 -0
- spikeinterface-0.104.0/src/spikeinterface/metrics/conftest.py +85 -0
- spikeinterface-0.104.0/src/spikeinterface/metrics/quality/__init__.py +24 -0
- {spikeinterface-0.103.2/src/spikeinterface/qualitymetrics → spikeinterface-0.104.0/src/spikeinterface/metrics/quality}/misc_metrics.py +1066 -764
- {spikeinterface-0.103.2/src/spikeinterface/qualitymetrics → spikeinterface-0.104.0/src/spikeinterface/metrics/quality}/pca_metrics.py +308 -277
- spikeinterface-0.104.0/src/spikeinterface/metrics/quality/quality_metrics.py +235 -0
- spikeinterface-0.104.0/src/spikeinterface/metrics/spiketrain/__init__.py +8 -0
- spikeinterface-0.104.0/src/spikeinterface/metrics/spiketrain/metrics.py +90 -0
- spikeinterface-0.104.0/src/spikeinterface/metrics/spiketrain/spiketrain_metrics.py +60 -0
- spikeinterface-0.104.0/src/spikeinterface/metrics/template/__init__.py +11 -0
- spikeinterface-0.104.0/src/spikeinterface/metrics/template/metrics.py +1400 -0
- spikeinterface-0.104.0/src/spikeinterface/metrics/template/template_metrics.py +369 -0
- spikeinterface-0.104.0/src/spikeinterface/metrics/utils.py +210 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/__init__.py +13 -6
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/alignsorting.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/amplitude_scalings.py +26 -90
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/correlograms.py +553 -30
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/isi.py +2 -10
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/localization_tools.py +12 -12
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/principal_component.py +0 -7
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/spike_amplitudes.py +5 -98
- spikeinterface-0.104.0/src/spikeinterface/postprocessing/spike_locations.py +92 -0
- spikeinterface-0.104.0/src/spikeinterface/postprocessing/template_metrics.py +26 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/template_similarity.py +90 -88
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/unit_locations.py +0 -8
- spikeinterface-0.104.0/src/spikeinterface/postprocessing/valid_unit_periods.py +803 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/__init__.py +2 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/align_snippets.py +3 -7
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/astype.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/average_across_direction.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/basepreprocessor.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/clip.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/common_reference.py +52 -23
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/correct_lsb.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/decimate.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/deepinterpolation/deepinterpolation.py +1 -4
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/deepinterpolation/generators.py +2 -4
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/deepinterpolation/tf_utils.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/deepinterpolation/train.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/depth_order.py +0 -2
- spikeinterface-0.104.0/src/spikeinterface/preprocessing/detect_artifacts.py +604 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/detect_bad_channels.py +89 -59
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/directional_derivative.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/filter.py +142 -29
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/filter_gaussian.py +22 -15
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/filter_opencl.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/highpass_spatial_filter.py +76 -21
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/interpolate_bad_channels.py +2 -4
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/motion.py +3 -6
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/normalize_scale.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/phase_shift.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/pipeline.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/preprocessing_classes.py +3 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/preprocessing_tools.py +3 -5
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/rectify.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/remove_artifacts.py +5 -5
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/resample.py +31 -15
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/scale.py +0 -2
- spikeinterface-0.104.0/src/spikeinterface/preprocessing/silence_periods.py +238 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/unsigned_to_signed.py +1 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/whiten.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/zero_channel_pad.py +2 -6
- spikeinterface-0.104.0/src/spikeinterface/qualitymetrics/__init__.py +10 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/basesorter.py +0 -4
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/container_tools.py +14 -5
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/combinato.py +4 -10
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/hdsort.py +5 -11
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/herdingspikes.py +1 -5
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/ironclust.py +12 -23
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosort.py +2 -5
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosort2.py +3 -8
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosort2_5.py +3 -9
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosort3.py +3 -8
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosort4.py +24 -16
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosortbase.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/klusta.py +2 -8
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/mountainsort4.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/mountainsort5.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/pykilosort.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/spyking_circus.py +2 -8
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/tridesclous.py +0 -3
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/waveclus.py +5 -10
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/waveclus_snippets.py +6 -12
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/yass.py +0 -2
- spikeinterface-0.104.0/src/spikeinterface/sorters/internal/lupin.py +428 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/internal/si_based.py +0 -2
- spikeinterface-0.104.0/src/spikeinterface/sorters/internal/simplesorter.py +175 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/internal/spyking_circus2.py +63 -36
- spikeinterface-0.104.0/src/spikeinterface/sorters/internal/tridesclous2.py +390 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/launcher.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/runsorter.py +5 -9
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/sorterlist.py +2 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/utils/misc.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/utils/shellscript.py +16 -20
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/cleaning_tools.py +1 -4
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/dummy.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/isosplit_isocut.py +12 -13
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/iterative_hdbscan.py +61 -11
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/iterative_isosplit.py +102 -206
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/itersplit_tools.py +2 -6
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/main.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/merging_tools.py +15 -11
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/method_list.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/positions.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/random_projections.py +13 -11
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/tools.py +48 -56
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/matching/circus.py +1 -5
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/matching/main.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/matching/method_list.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/matching/nearest.py +94 -42
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/matching/tdc_peeler.py +6 -8
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/matching/wobble.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/motion/iterative_template.py +1 -1
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/motion/motion_estimation.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/motion/motion_interpolation.py +3 -5
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_detection/by_channel.py +8 -8
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_detection/iterative.py +1 -3
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_detection/locally_exclusive.py +82 -91
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_detection/main.py +2 -3
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_detection/matched_filtering.py +100 -85
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_detection/method_list.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_localization/center_of_mass.py +0 -1
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_localization/grid.py +0 -3
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_localization/main.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_localization/monopolar.py +0 -1
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_selection.py +0 -3
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/tools.py +194 -38
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/waveforms/features_from_peaks.py +0 -3
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/waveforms/hanning_filter.py +0 -3
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/waveforms/neural_network_denoiser.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/waveforms/savgol_denoiser.py +0 -3
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/waveforms/temporal_pca.py +2 -4
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/waveforms/waveform_thresholder.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/waveforms/waveform_utils.py +0 -3
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/all_amplitudes_distributions.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/amplitudes.py +22 -29
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/autocorrelograms.py +14 -6
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/base.py +13 -5
- spikeinterface-0.104.0/src/spikeinterface/widgets/bombcell_curation.py +271 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/collision.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/comparison.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/crosscorrelograms.py +17 -12
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/drift_templates.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/gtstudy.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/isi_distribution.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/metrics.py +156 -12
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/motion.py +4 -21
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/multicomparison.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/peak_activity.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/peaks_on_probe.py +2 -4
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/potential_merges.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/probe_map.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/quality_metrics.py +1 -3
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/rasters.py +1 -25
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/sorting_summary.py +41 -39
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/spike_locations.py +17 -10
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/spike_locations_by_time.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/spikes_on_traces.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/template_metrics.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/template_similarity.py +15 -6
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/traces.py +41 -20
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/unit_depths.py +0 -2
- spikeinterface-0.104.0/src/spikeinterface/widgets/unit_labels.py +126 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/unit_locations.py +19 -9
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/unit_presence.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/unit_probe_map.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/unit_summary.py +1 -1
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/unit_templates.py +24 -15
- spikeinterface-0.104.0/src/spikeinterface/widgets/unit_valid_periods.py +234 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/unit_waveforms.py +6 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/unit_waveforms_density_map.py +26 -40
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/utils.py +6 -3
- spikeinterface-0.103.2/src/spikeinterface/widgets/utils_sortingview.py → spikeinterface-0.104.0/src/spikeinterface/widgets/utils_figpack.py +52 -17
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/utils_ipywidgets.py +4 -7
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/utils_matplotlib.py +0 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/widget_list.py +12 -2
- {spikeinterface-0.103.2 → spikeinterface-0.104.0/src/spikeinterface.egg-info}/PKG-INFO +37 -30
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface.egg-info/SOURCES.txt +25 -7
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface.egg-info/requires.txt +17 -14
- spikeinterface-0.103.2/src/spikeinterface/comparison/hybrid.py +0 -239
- spikeinterface-0.103.2/src/spikeinterface/core/analyzer_extension_core.py +0 -816
- spikeinterface-0.103.2/src/spikeinterface/extractors/herdingspikesextractors.py +0 -142
- spikeinterface-0.103.2/src/spikeinterface/extractors/neuropixels_utils.py +0 -213
- spikeinterface-0.103.2/src/spikeinterface/extractors/sinapsrecordingextractors.py +0 -253
- spikeinterface-0.103.2/src/spikeinterface/postprocessing/spike_locations.py +0 -181
- spikeinterface-0.103.2/src/spikeinterface/postprocessing/template_metrics.py +0 -1089
- spikeinterface-0.103.2/src/spikeinterface/preprocessing/silence_periods.py +0 -142
- spikeinterface-0.103.2/src/spikeinterface/qualitymetrics/__init__.py +0 -9
- spikeinterface-0.103.2/src/spikeinterface/qualitymetrics/quality_metric_calculator.py +0 -362
- spikeinterface-0.103.2/src/spikeinterface/qualitymetrics/quality_metric_list.py +0 -136
- spikeinterface-0.103.2/src/spikeinterface/qualitymetrics/utils.py +0 -70
- spikeinterface-0.103.2/src/spikeinterface/sorters/internal/simplesorter.py +0 -242
- spikeinterface-0.103.2/src/spikeinterface/sorters/internal/tridesclous2.py +0 -343
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/LICENSE +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/setup.cfg +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/__init__.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/__init__.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_tools.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/residual_analysis.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/comparison/groundtruthstudy.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/motion.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/exporters/__init__.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/__init__.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/generation/__init__.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/generation/template_database.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/noise_level.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/deepinterpolation/__init__.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/__init__.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/__init__.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/hdsort_master.m +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosort2_5_master.m +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosort2_master.m +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosort3_master.m +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosort_master.m +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/klusta_config_default.prm +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/rt_sort.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/sc_config_default.params +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/waveclus_master.m +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/waveclus_snippets_master.m +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/yass_config_default.yaml +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/internal/__init__.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/utils/__init__.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/utils/constructNPYheader.m +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/utils/writeNPY.m +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/__init__.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/__init__.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/graph_clustering.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/graph_tools.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/matching/__init__.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/matching/base.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/motion/__init__.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/motion/decentralized.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/motion/dredge.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/motion/medicine.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/motion/motion_cleaner.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/motion/motion_utils.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_detection/__init__.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_localization/__init__.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_localization/base.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_localization/method_list.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/waveforms/__init__.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/waveforms/peak_svd.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/__init__.py +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface.egg-info/dependency_links.txt +0 -0
- {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: spikeinterface
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.104.0
|
|
4
4
|
Summary: Python toolkit for analysis, visualization, and comparison of spike sorting output
|
|
5
5
|
Author-email: Alessio Buccino <alessiop.buccino@gmail.com>, Samuel Garcia <sam.garcia.die@gmail.com>
|
|
6
6
|
Project-URL: homepage, https://github.com/SpikeInterface/spikeinterface
|
|
@@ -14,7 +14,7 @@ Classifier: Operating System :: POSIX :: Linux
|
|
|
14
14
|
Classifier: Operating System :: Microsoft :: Windows
|
|
15
15
|
Classifier: Operating System :: MacOS
|
|
16
16
|
Classifier: Operating System :: OS Independent
|
|
17
|
-
Requires-Python: >=3.
|
|
17
|
+
Requires-Python: >=3.10
|
|
18
18
|
Description-Content-Type: text/markdown
|
|
19
19
|
License-File: LICENSE
|
|
20
20
|
Requires-Dist: numpy>=1.20; python_version < "3.13"
|
|
@@ -22,8 +22,8 @@ Requires-Dist: numpy>=2.0.0; python_version >= "3.13"
|
|
|
22
22
|
Requires-Dist: threadpoolctl>=3.0.0
|
|
23
23
|
Requires-Dist: tqdm
|
|
24
24
|
Requires-Dist: zarr<3,>=2.18
|
|
25
|
-
Requires-Dist: neo>=0.14.
|
|
26
|
-
Requires-Dist: probeinterface>=0.3.
|
|
25
|
+
Requires-Dist: neo>=0.14.4
|
|
26
|
+
Requires-Dist: probeinterface>=0.3.2
|
|
27
27
|
Requires-Dist: packaging
|
|
28
28
|
Requires-Dist: pydantic
|
|
29
29
|
Requires-Dist: numcodecs<0.16.0
|
|
@@ -51,9 +51,9 @@ Provides-Extra: preprocessing
|
|
|
51
51
|
Requires-Dist: scipy; extra == "preprocessing"
|
|
52
52
|
Provides-Extra: full
|
|
53
53
|
Requires-Dist: h5py; extra == "full"
|
|
54
|
-
Requires-Dist: pandas; extra == "full"
|
|
54
|
+
Requires-Dist: pandas<3; extra == "full"
|
|
55
55
|
Requires-Dist: scipy; extra == "full"
|
|
56
|
-
Requires-Dist: scikit-learn; extra == "full"
|
|
56
|
+
Requires-Dist: scikit-learn<1.8; extra == "full"
|
|
57
57
|
Requires-Dist: networkx; extra == "full"
|
|
58
58
|
Requires-Dist: distinctipy; extra == "full"
|
|
59
59
|
Requires-Dist: matplotlib>=3.6; extra == "full"
|
|
@@ -65,15 +65,15 @@ Provides-Extra: widgets
|
|
|
65
65
|
Requires-Dist: matplotlib; extra == "widgets"
|
|
66
66
|
Requires-Dist: ipympl; extra == "widgets"
|
|
67
67
|
Requires-Dist: ipywidgets; extra == "widgets"
|
|
68
|
-
Requires-Dist:
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
Requires-Dist:
|
|
72
|
-
Requires-Dist:
|
|
73
|
-
Requires-Dist:
|
|
68
|
+
Requires-Dist: figpack; extra == "widgets"
|
|
69
|
+
Requires-Dist: figpack-spike-sorting; extra == "widgets"
|
|
70
|
+
Provides-Extra: metrics
|
|
71
|
+
Requires-Dist: scikit-learn<1.8; extra == "metrics"
|
|
72
|
+
Requires-Dist: scipy; extra == "metrics"
|
|
73
|
+
Requires-Dist: pandas<3; extra == "metrics"
|
|
74
|
+
Requires-Dist: numba; extra == "metrics"
|
|
74
75
|
Provides-Extra: test-core
|
|
75
76
|
Requires-Dist: pytest<8.4.0; extra == "test-core"
|
|
76
|
-
Requires-Dist: pytest-dependency; extra == "test-core"
|
|
77
77
|
Requires-Dist: psutil; extra == "test-core"
|
|
78
78
|
Requires-Dist: pytest-mock; extra == "test-core"
|
|
79
79
|
Provides-Extra: test-extractors
|
|
@@ -82,9 +82,10 @@ Requires-Dist: datalad>=1.0.2; extra == "test-extractors"
|
|
|
82
82
|
Provides-Extra: test-preprocessing
|
|
83
83
|
Requires-Dist: ibllib>=3.4.1; python_version >= "3.10" and extra == "test-preprocessing"
|
|
84
84
|
Requires-Dist: torch; extra == "test-preprocessing"
|
|
85
|
+
Requires-Dist: pooch; extra == "test-preprocessing"
|
|
86
|
+
Requires-Dist: datalad; extra == "test-preprocessing"
|
|
85
87
|
Provides-Extra: test
|
|
86
88
|
Requires-Dist: pytest<8.4.0; extra == "test"
|
|
87
|
-
Requires-Dist: pytest-dependency; extra == "test"
|
|
88
89
|
Requires-Dist: pytest-cov; extra == "test"
|
|
89
90
|
Requires-Dist: psutil; extra == "test"
|
|
90
91
|
Requires-Dist: ibllib>=3.4.1; python_version >= "3.10" and extra == "test"
|
|
@@ -97,6 +98,7 @@ Requires-Dist: sortingview>=0.12.0; extra == "test"
|
|
|
97
98
|
Requires-Dist: torch; extra == "test"
|
|
98
99
|
Requires-Dist: skops; extra == "test"
|
|
99
100
|
Requires-Dist: huggingface_hub; extra == "test"
|
|
101
|
+
Requires-Dist: sortingview; extra == "test"
|
|
100
102
|
Requires-Dist: pytest-mock; extra == "test"
|
|
101
103
|
Provides-Extra: docs
|
|
102
104
|
Requires-Dist: Sphinx; extra == "docs"
|
|
@@ -108,12 +110,13 @@ Requires-Dist: numpydoc; extra == "docs"
|
|
|
108
110
|
Requires-Dist: sphinxcontrib-jquery; extra == "docs"
|
|
109
111
|
Requires-Dist: autodoc_pydantic; extra == "docs"
|
|
110
112
|
Requires-Dist: MEArec; extra == "docs"
|
|
111
|
-
Requires-Dist: pandas; extra == "docs"
|
|
113
|
+
Requires-Dist: pandas<3; extra == "docs"
|
|
112
114
|
Requires-Dist: hdbscan>=0.8.33; extra == "docs"
|
|
113
115
|
Requires-Dist: numba; extra == "docs"
|
|
114
116
|
Requires-Dist: networkx; extra == "docs"
|
|
117
|
+
Requires-Dist: seaborn; extra == "docs"
|
|
115
118
|
Requires-Dist: skops; extra == "docs"
|
|
116
|
-
Requires-Dist: scikit-learn; extra == "docs"
|
|
119
|
+
Requires-Dist: scikit-learn<1.8; extra == "docs"
|
|
117
120
|
Requires-Dist: huggingface_hub; extra == "docs"
|
|
118
121
|
Provides-Extra: dev
|
|
119
122
|
Requires-Dist: spikeinterface[test]; extra == "dev"
|
|
@@ -168,35 +171,39 @@ Dynamic: license-file
|
|
|
168
171
|
</tr>
|
|
169
172
|
</table>
|
|
170
173
|
|
|
171
|
-
[](https://twitter.com/spikeinterface) [](https://fosstodon.org/@spikeinterface)
|
|
172
|
-
|
|
173
174
|
|
|
174
|
-
|
|
175
|
-
> **New features!**: after months of development and testing, we are happy to announce that
|
|
176
|
-
> the latest release (0.101.0) includes a major API improvement: the `SortingAnalyzer`!
|
|
177
|
-
> To read more about why we did this, checkout the
|
|
178
|
-
> [SpikeInterface Enhancement Proposal](https://github.com/SpikeInterface/spikeinterface/issues/2282).
|
|
179
|
-
> Please follow this guide to transition from the old API to the new one:
|
|
180
|
-
> [Updating from legacy](https://spikeinterface.readthedocs.io/en/0.101.0/tutorials/waveform_extractor_to_sorting_analyzer.html).
|
|
175
|
+
[](https://twitter.com/spikeinterface) [](https://fosstodon.org/@spikeinterface)
|
|
181
176
|
|
|
177
|
+
Please [Star](https://github.com/SpikeInterface/spikeinterface/stargazers) the project to support us and [Watch](https://github.com/SpikeInterface/spikeinterface/subscription) to always stay up-to-date!
|
|
182
178
|
|
|
183
|
-
SpikeInterface is a Python
|
|
179
|
+
SpikeInterface is a Python package designed to unify preexisting spike sorting technologies into a single code base. If you use SpikeInterface, you are also using code and ideas from many other projects. Our codebase would be tiny without the amazing algorithms and formats that we interface with. See them all, and how to cite them, on our [references page](https://spikeinterface.readthedocs.io/en/latest/references.html). In the past year, we have added support for the following tools:
|
|
184
180
|
|
|
185
|
-
|
|
181
|
+
- Bombcell [Bombcell: automated curation and cell classification of spike-sorted electrophysiology data](https://doi.org/10.5281/zenodo.8172822>) ([docs](https://spikeinterface.readthedocs.io/en/latest/how_to/auto_label_units.html#bombcell))
|
|
182
|
+
- SLAy. [SLAy-ing oversplitting errors in high-density electrophysiology spike sorting](https://www.biorxiv.org/content/10.1101/2025.06.20.660590v2) ([docs](https://spikeinterface.readthedocs.io/en/latest/modules/curation.html#auto-merging-units))
|
|
183
|
+
- Lupin, Spykingcicus2 and Tridesclous2. [Opening the black box: a modular approach to spike sorting](https://www.biorxiv.org/content/10.64898/2026.01.23.701239v1) ([docs](https://spikeinterface.readthedocs.io/en/stable/modules/sorters.html#supported-spike-sorters))
|
|
184
|
+
- rtsort. [RT-Sort: An action potential propagation-based algorithm for real time spike detection and sorting with millisecond latencies](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0312438) ([docs](https://spikeinterface.readthedocs.io/en/stable/modules/sorters.html#supported-spike-sorters))
|
|
185
|
+
- MEDiCINe. [MEDiCINe: Motion Correction for Neural Electrophysiology Recordings](https://www.eneuro.org/content/12/3/ENEURO.0529-24.2025) ([docs](https://spikeinterface.readthedocs.io/en/latest/how_to/handle_drift.html))
|
|
186
|
+
- UnitRefine. [UnitRefine: A Community Toolbox for Automated Spike Sorting Curation](https://www.biorxiv.org/content/10.1101/2025.03.30.645770v2) ([docs](https://spikeinterface.readthedocs.io/en/latest/tutorials_custom_index.html#automated-curation-tutorials))
|
|
186
187
|
|
|
188
|
+
If you would like us to add another tool, or you would like to integrate your project with our package, please [open an issue](https://github.com/SpikeInterface/spikeinterface/issues).
|
|
187
189
|
|
|
188
190
|
With SpikeInterface, users can:
|
|
189
191
|
|
|
190
192
|
- read/write many extracellular file formats.
|
|
191
193
|
- pre-process extracellular recordings.
|
|
192
|
-
- run many popular, semi-automatic spike sorters (
|
|
193
|
-
|
|
194
|
+
- run many popular, semi-automatic spike sorters (kilosort1-4, mountainsort4-5, spykingcircus,
|
|
195
|
+
tridesclous, ironclust, herdingspikes, yass, waveclus)
|
|
196
|
+
- run sorters developed in house (lupin, spkykingcicus2, tridesclous2, simple) that compete with kilosort4
|
|
197
|
+
- run theses polar sorters without installation using containers (Docker/Singularity).
|
|
198
|
+
- post-process sorted datasets using th SortingAnalyzer
|
|
194
199
|
- compare and benchmark spike sorting outputs.
|
|
195
200
|
- compute quality metrics to validate and curate spike sorting outputs.
|
|
196
201
|
- visualize recordings and spike sorting outputs in several ways (matplotlib, sortingview, jupyter, ephyviewer)
|
|
197
202
|
- export a report and/or export to phy
|
|
198
|
-
-
|
|
203
|
+
- curate your sorting with several strategies (ml-based, metrics based, manual, ...)
|
|
204
|
+
- offer a powerful Qt-based or we-based viewer in a separate package [spikeinterface-gui](https://github.com/SpikeInterface/spikeinterface-gui) for manual curation that replace phy.
|
|
199
205
|
- have powerful sorting components to build your own sorter.
|
|
206
|
+
- have a full motion/drift correction framework
|
|
200
207
|
|
|
201
208
|
|
|
202
209
|
## Documentation
|
|
@@ -43,35 +43,39 @@
|
|
|
43
43
|
</tr>
|
|
44
44
|
</table>
|
|
45
45
|
|
|
46
|
-
[](https://twitter.com/spikeinterface) [](https://fosstodon.org/@spikeinterface)
|
|
47
|
-
|
|
48
46
|
|
|
49
|
-
|
|
50
|
-
> **New features!**: after months of development and testing, we are happy to announce that
|
|
51
|
-
> the latest release (0.101.0) includes a major API improvement: the `SortingAnalyzer`!
|
|
52
|
-
> To read more about why we did this, checkout the
|
|
53
|
-
> [SpikeInterface Enhancement Proposal](https://github.com/SpikeInterface/spikeinterface/issues/2282).
|
|
54
|
-
> Please follow this guide to transition from the old API to the new one:
|
|
55
|
-
> [Updating from legacy](https://spikeinterface.readthedocs.io/en/0.101.0/tutorials/waveform_extractor_to_sorting_analyzer.html).
|
|
47
|
+
[](https://twitter.com/spikeinterface) [](https://fosstodon.org/@spikeinterface)
|
|
56
48
|
|
|
49
|
+
Please [Star](https://github.com/SpikeInterface/spikeinterface/stargazers) the project to support us and [Watch](https://github.com/SpikeInterface/spikeinterface/subscription) to always stay up-to-date!
|
|
57
50
|
|
|
58
|
-
SpikeInterface is a Python
|
|
51
|
+
SpikeInterface is a Python package designed to unify preexisting spike sorting technologies into a single code base. If you use SpikeInterface, you are also using code and ideas from many other projects. Our codebase would be tiny without the amazing algorithms and formats that we interface with. See them all, and how to cite them, on our [references page](https://spikeinterface.readthedocs.io/en/latest/references.html). In the past year, we have added support for the following tools:
|
|
59
52
|
|
|
60
|
-
|
|
53
|
+
- Bombcell [Bombcell: automated curation and cell classification of spike-sorted electrophysiology data](https://doi.org/10.5281/zenodo.8172822>) ([docs](https://spikeinterface.readthedocs.io/en/latest/how_to/auto_label_units.html#bombcell))
|
|
54
|
+
- SLAy. [SLAy-ing oversplitting errors in high-density electrophysiology spike sorting](https://www.biorxiv.org/content/10.1101/2025.06.20.660590v2) ([docs](https://spikeinterface.readthedocs.io/en/latest/modules/curation.html#auto-merging-units))
|
|
55
|
+
- Lupin, Spykingcicus2 and Tridesclous2. [Opening the black box: a modular approach to spike sorting](https://www.biorxiv.org/content/10.64898/2026.01.23.701239v1) ([docs](https://spikeinterface.readthedocs.io/en/stable/modules/sorters.html#supported-spike-sorters))
|
|
56
|
+
- rtsort. [RT-Sort: An action potential propagation-based algorithm for real time spike detection and sorting with millisecond latencies](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0312438) ([docs](https://spikeinterface.readthedocs.io/en/stable/modules/sorters.html#supported-spike-sorters))
|
|
57
|
+
- MEDiCINe. [MEDiCINe: Motion Correction for Neural Electrophysiology Recordings](https://www.eneuro.org/content/12/3/ENEURO.0529-24.2025) ([docs](https://spikeinterface.readthedocs.io/en/latest/how_to/handle_drift.html))
|
|
58
|
+
- UnitRefine. [UnitRefine: A Community Toolbox for Automated Spike Sorting Curation](https://www.biorxiv.org/content/10.1101/2025.03.30.645770v2) ([docs](https://spikeinterface.readthedocs.io/en/latest/tutorials_custom_index.html#automated-curation-tutorials))
|
|
61
59
|
|
|
60
|
+
If you would like us to add another tool, or you would like to integrate your project with our package, please [open an issue](https://github.com/SpikeInterface/spikeinterface/issues).
|
|
62
61
|
|
|
63
62
|
With SpikeInterface, users can:
|
|
64
63
|
|
|
65
64
|
- read/write many extracellular file formats.
|
|
66
65
|
- pre-process extracellular recordings.
|
|
67
|
-
- run many popular, semi-automatic spike sorters (
|
|
68
|
-
|
|
66
|
+
- run many popular, semi-automatic spike sorters (kilosort1-4, mountainsort4-5, spykingcircus,
|
|
67
|
+
tridesclous, ironclust, herdingspikes, yass, waveclus)
|
|
68
|
+
- run sorters developed in house (lupin, spkykingcicus2, tridesclous2, simple) that compete with kilosort4
|
|
69
|
+
- run theses polar sorters without installation using containers (Docker/Singularity).
|
|
70
|
+
- post-process sorted datasets using th SortingAnalyzer
|
|
69
71
|
- compare and benchmark spike sorting outputs.
|
|
70
72
|
- compute quality metrics to validate and curate spike sorting outputs.
|
|
71
73
|
- visualize recordings and spike sorting outputs in several ways (matplotlib, sortingview, jupyter, ephyviewer)
|
|
72
74
|
- export a report and/or export to phy
|
|
73
|
-
-
|
|
75
|
+
- curate your sorting with several strategies (ml-based, metrics based, manual, ...)
|
|
76
|
+
- offer a powerful Qt-based or we-based viewer in a separate package [spikeinterface-gui](https://github.com/SpikeInterface/spikeinterface-gui) for manual curation that replace phy.
|
|
74
77
|
- have powerful sorting components to build your own sorter.
|
|
78
|
+
- have a full motion/drift correction framework
|
|
75
79
|
|
|
76
80
|
|
|
77
81
|
## Documentation
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "spikeinterface"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.104.0"
|
|
4
4
|
authors = [
|
|
5
5
|
{ name="Alessio Buccino", email="alessiop.buccino@gmail.com" },
|
|
6
6
|
{ name="Samuel Garcia", email="sam.garcia.die@gmail.com" },
|
|
7
7
|
]
|
|
8
8
|
description = "Python toolkit for analysis, visualization, and comparison of spike sorting output"
|
|
9
9
|
readme = "README.md"
|
|
10
|
-
requires-python = ">=3.
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
11
|
classifiers = [
|
|
12
12
|
"Programming Language :: Python :: 3 :: Only",
|
|
13
13
|
"License :: OSI Approved :: MIT License",
|
|
@@ -25,8 +25,8 @@ dependencies = [
|
|
|
25
25
|
"threadpoolctl>=3.0.0",
|
|
26
26
|
"tqdm",
|
|
27
27
|
"zarr>=2.18,<3",
|
|
28
|
-
"neo>=0.14.
|
|
29
|
-
"probeinterface>=0.3.
|
|
28
|
+
"neo>=0.14.4",
|
|
29
|
+
"probeinterface>=0.3.2",
|
|
30
30
|
"packaging",
|
|
31
31
|
"pydantic",
|
|
32
32
|
"numcodecs<0.16.0", # For supporting zarr < 3
|
|
@@ -94,9 +94,9 @@ preprocessing = [
|
|
|
94
94
|
|
|
95
95
|
full = [
|
|
96
96
|
"h5py",
|
|
97
|
-
"pandas",
|
|
97
|
+
"pandas<3",
|
|
98
98
|
"scipy",
|
|
99
|
-
"scikit-learn",
|
|
99
|
+
"scikit-learn<1.8",
|
|
100
100
|
"networkx",
|
|
101
101
|
"distinctipy",
|
|
102
102
|
"matplotlib>=3.6", # matplotlib.colormaps
|
|
@@ -110,19 +110,19 @@ widgets = [
|
|
|
110
110
|
"matplotlib",
|
|
111
111
|
"ipympl",
|
|
112
112
|
"ipywidgets",
|
|
113
|
-
"
|
|
113
|
+
"figpack",
|
|
114
|
+
"figpack-spike-sorting"
|
|
114
115
|
]
|
|
115
116
|
|
|
116
|
-
|
|
117
|
-
"scikit-learn",
|
|
117
|
+
metrics = [
|
|
118
|
+
"scikit-learn<1.8",
|
|
118
119
|
"scipy",
|
|
119
|
-
"pandas",
|
|
120
|
+
"pandas<3",
|
|
120
121
|
"numba",
|
|
121
122
|
]
|
|
122
123
|
|
|
123
124
|
test_core = [
|
|
124
125
|
"pytest<8.4.0",
|
|
125
|
-
"pytest-dependency",
|
|
126
126
|
"psutil",
|
|
127
127
|
|
|
128
128
|
# for github test : probeinterface and neo from master
|
|
@@ -146,12 +146,14 @@ test_extractors = [
|
|
|
146
146
|
test_preprocessing = [
|
|
147
147
|
"ibllib>=3.4.1;python_version>='3.10'", # streaming IBL
|
|
148
148
|
"torch",
|
|
149
|
+
# for IBL data fetching
|
|
150
|
+
"pooch",
|
|
151
|
+
"datalad"
|
|
149
152
|
]
|
|
150
153
|
|
|
151
154
|
|
|
152
155
|
test = [
|
|
153
156
|
"pytest<8.4.0",
|
|
154
|
-
"pytest-dependency",
|
|
155
157
|
"pytest-cov",
|
|
156
158
|
"psutil",
|
|
157
159
|
|
|
@@ -183,6 +185,9 @@ test = [
|
|
|
183
185
|
"skops",
|
|
184
186
|
"huggingface_hub",
|
|
185
187
|
|
|
188
|
+
# widgets
|
|
189
|
+
"sortingview",
|
|
190
|
+
|
|
186
191
|
# for github test : probeinterface and neo from master
|
|
187
192
|
# for release we need pypi, so this need to be commented
|
|
188
193
|
# "probeinterface @ git+https://github.com/SpikeInterface/probeinterface.git",
|
|
@@ -204,12 +209,13 @@ docs = [
|
|
|
204
209
|
|
|
205
210
|
# for notebooks in the gallery
|
|
206
211
|
"MEArec", # Use as an example
|
|
207
|
-
"pandas", # in the modules gallery comparison tutorial
|
|
212
|
+
"pandas<3", # in the modules gallery comparison tutorial
|
|
208
213
|
"hdbscan>=0.8.33", # For sorters spykingcircus2 + tridesclous
|
|
209
214
|
"numba", # For many postprocessing functions
|
|
210
215
|
"networkx",
|
|
216
|
+
"seaborn",
|
|
211
217
|
"skops", # For automated curation
|
|
212
|
-
"scikit-learn", # For automated curation
|
|
218
|
+
"scikit-learn<1.8", # For automated curation
|
|
213
219
|
"huggingface_hub", # For automated curation
|
|
214
220
|
|
|
215
221
|
# for release we need pypi, so this needs to be commented
|
|
@@ -232,7 +238,7 @@ markers = [
|
|
|
232
238
|
"extractors",
|
|
233
239
|
"preprocessing",
|
|
234
240
|
"postprocessing",
|
|
235
|
-
"
|
|
241
|
+
"mertrics",
|
|
236
242
|
"sorters",
|
|
237
243
|
"sorters_external",
|
|
238
244
|
"sorters_internal",
|
{spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_base.py
RENAMED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
from pathlib import Path
|
|
4
2
|
import shutil
|
|
5
3
|
import json
|
|
@@ -50,6 +48,29 @@ class BenchmarkStudy:
|
|
|
50
48
|
self.labels_by_levels = {}
|
|
51
49
|
self.scan_folder()
|
|
52
50
|
|
|
51
|
+
@classmethod
|
|
52
|
+
def _check_cases(cls, cases, levels=None, reference=None):
|
|
53
|
+
if reference is None:
|
|
54
|
+
reference = list(cases.keys())[0]
|
|
55
|
+
for key in cases.keys():
|
|
56
|
+
if isinstance(reference, str):
|
|
57
|
+
assert isinstance(key, str), f"Case key {key} for cases is not homogeneous"
|
|
58
|
+
if levels is None:
|
|
59
|
+
levels = "level0"
|
|
60
|
+
else:
|
|
61
|
+
assert isinstance(levels, str)
|
|
62
|
+
elif isinstance(reference, tuple):
|
|
63
|
+
assert isinstance(key, tuple), f"Case key {key} for cases is not homogeneous"
|
|
64
|
+
num_levels = len(reference)
|
|
65
|
+
assert len(key) == num_levels, f"Case key {key} for cases is not homogeneous, tuple negth differ"
|
|
66
|
+
if levels is None:
|
|
67
|
+
levels = [f"level{i}" for i in range(num_levels)]
|
|
68
|
+
else:
|
|
69
|
+
levels = list(levels)
|
|
70
|
+
else:
|
|
71
|
+
raise ValueError("Keys for cases must str or tuple")
|
|
72
|
+
return levels
|
|
73
|
+
|
|
53
74
|
@classmethod
|
|
54
75
|
def create(cls, study_folder, datasets={}, cases={}, levels=None):
|
|
55
76
|
"""
|
|
@@ -76,27 +97,7 @@ class BenchmarkStudy:
|
|
|
76
97
|
study : BenchmarkStudy
|
|
77
98
|
The created study.
|
|
78
99
|
"""
|
|
79
|
-
|
|
80
|
-
key0 = list(cases.keys())[0]
|
|
81
|
-
if isinstance(key0, str):
|
|
82
|
-
assert all(isinstance(key, str) for key in cases.keys()), "Keys for cases are not homogeneous"
|
|
83
|
-
if levels is None:
|
|
84
|
-
levels = "level0"
|
|
85
|
-
else:
|
|
86
|
-
assert isinstance(levels, str)
|
|
87
|
-
elif isinstance(key0, tuple):
|
|
88
|
-
assert all(isinstance(key, tuple) for key in cases.keys()), "Keys for cases are not homogeneous"
|
|
89
|
-
num_levels = len(key0)
|
|
90
|
-
assert all(
|
|
91
|
-
len(key) == num_levels for key in cases.keys()
|
|
92
|
-
), "Keys for cases are not homogeneous, tuple negth differ"
|
|
93
|
-
if levels is None:
|
|
94
|
-
levels = [f"level{i}" for i in range(num_levels)]
|
|
95
|
-
else:
|
|
96
|
-
levels = list(levels)
|
|
97
|
-
assert len(levels) == num_levels
|
|
98
|
-
else:
|
|
99
|
-
raise ValueError("Keys for cases must str or tuple")
|
|
100
|
+
levels = cls._check_cases(cases, levels)
|
|
100
101
|
|
|
101
102
|
study_folder = Path(study_folder)
|
|
102
103
|
study_folder.mkdir(exist_ok=False, parents=True)
|
|
@@ -272,6 +273,25 @@ class BenchmarkStudy:
|
|
|
272
273
|
f.unlink()
|
|
273
274
|
self.benchmarks[key] = None
|
|
274
275
|
|
|
276
|
+
def add_cases(self, cases):
|
|
277
|
+
|
|
278
|
+
_ = self._check_cases(cases, reference=list(self.cases.keys())[0])
|
|
279
|
+
for case in cases.values():
|
|
280
|
+
dataset = case["dataset"]
|
|
281
|
+
assert dataset in list(self.datasets.keys()), f"Unknown dataset {dataset} for the Study"
|
|
282
|
+
self.cases.update(cases)
|
|
283
|
+
for key in cases.keys():
|
|
284
|
+
benchmark = self.create_benchmark(key=key)
|
|
285
|
+
self.benchmarks[key] = benchmark
|
|
286
|
+
(self.folder / "cases.pickle").write_bytes(pickle.dumps(self.cases))
|
|
287
|
+
|
|
288
|
+
def remove_cases(self, case_keys):
|
|
289
|
+
for key in case_keys:
|
|
290
|
+
assert key in list(self.cases.keys()), f"Case {key} is not in the cases of the Study"
|
|
291
|
+
self.cases.pop(key)
|
|
292
|
+
self.remove_benchmark(key)
|
|
293
|
+
(self.folder / "cases.pickle").write_bytes(pickle.dumps(self.cases))
|
|
294
|
+
|
|
275
295
|
def run(self, case_keys=None, keep=True, verbose=False, **job_kwargs):
|
|
276
296
|
if case_keys is None:
|
|
277
297
|
case_keys = list(self.cases.keys())
|
|
@@ -435,27 +455,6 @@ class BenchmarkStudy:
|
|
|
435
455
|
benchmark.compute_result(**result_params)
|
|
436
456
|
benchmark.save_result(self.folder / "results" / self.key_to_str(key))
|
|
437
457
|
|
|
438
|
-
def create_sorting_analyzer_gt(self, case_keys=None, return_in_uV=True, random_params={}, **job_kwargs):
|
|
439
|
-
print("###### Study.create_sorting_analyzer_gt() is not used anymore!!!!!!")
|
|
440
|
-
# if case_keys is None:
|
|
441
|
-
# case_keys = self.cases.keys()
|
|
442
|
-
|
|
443
|
-
# base_folder = self.folder / "sorting_analyzer"
|
|
444
|
-
# base_folder.mkdir(exist_ok=True)
|
|
445
|
-
|
|
446
|
-
# dataset_keys = [self.cases[key]["dataset"] for key in case_keys]
|
|
447
|
-
# dataset_keys = set(dataset_keys)
|
|
448
|
-
# for dataset_key in dataset_keys:
|
|
449
|
-
# # the waveforms depend on the dataset key
|
|
450
|
-
# folder = base_folder / self.key_to_str(dataset_key)
|
|
451
|
-
# recording, gt_sorting = self.datasets[dataset_key]
|
|
452
|
-
# sorting_analyzer = create_sorting_analyzer(
|
|
453
|
-
# gt_sorting, recording, format="binary_folder", folder=folder, return_in_uV=return_in_uV
|
|
454
|
-
# )
|
|
455
|
-
# sorting_analyzer.compute("random_spikes", **random_params)
|
|
456
|
-
# sorting_analyzer.compute("templates", **job_kwargs)
|
|
457
|
-
# sorting_analyzer.compute("noise_levels")
|
|
458
|
-
|
|
459
458
|
def get_sorting_analyzer(self, case_key=None, dataset_key=None):
|
|
460
459
|
if case_key is not None:
|
|
461
460
|
dataset_key = self.cases[case_key]["dataset"]
|
|
@@ -655,8 +654,6 @@ class Benchmark:
|
|
|
655
654
|
with open(file, mode="rb") as f:
|
|
656
655
|
result[k] = pickle.load(f)
|
|
657
656
|
elif format == "sorting":
|
|
658
|
-
from spikeinterface.core import load_extractor
|
|
659
|
-
|
|
660
657
|
sorting_folder = folder / k
|
|
661
658
|
if sorting_folder.exists():
|
|
662
659
|
result[k] = load(sorting_folder)
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
from spikeinterface.sortingcomponents.clustering import find_clusters_from_peaks
|
|
4
2
|
from spikeinterface.core import NumpySorting
|
|
5
3
|
from spikeinterface.comparison import GroundTruthComparison
|
|
@@ -29,9 +27,14 @@ class ClusteringBenchmark(Benchmark):
|
|
|
29
27
|
self.method_kwargs = params["method_kwargs"]
|
|
30
28
|
self.result = {}
|
|
31
29
|
|
|
32
|
-
def run(self, **job_kwargs):
|
|
30
|
+
def run(self, verbose=True, **job_kwargs):
|
|
33
31
|
labels, peak_labels = find_clusters_from_peaks(
|
|
34
|
-
self.recording,
|
|
32
|
+
self.recording,
|
|
33
|
+
self.peaks,
|
|
34
|
+
method=self.method,
|
|
35
|
+
method_kwargs=self.method_kwargs,
|
|
36
|
+
verbose=verbose,
|
|
37
|
+
job_kwargs=job_kwargs,
|
|
35
38
|
)
|
|
36
39
|
self.result["peak_labels"] = peak_labels
|
|
37
40
|
|
|
@@ -217,11 +220,21 @@ class ClusteringStudy(BenchmarkStudy, MixinStudyUnitCount):
|
|
|
217
220
|
|
|
218
221
|
return plot_performances_ordered(self, *args, **kwargs)
|
|
219
222
|
|
|
223
|
+
def plot_some_over_merged(self, *args, **kwargs):
|
|
224
|
+
from .benchmark_plot_tools import plot_some_over_merged
|
|
225
|
+
|
|
226
|
+
return plot_some_over_merged(self, *args, **kwargs)
|
|
227
|
+
|
|
228
|
+
def plot_some_over_splited(self, *args, **kwargs):
|
|
229
|
+
from .benchmark_plot_tools import plot_some_over_splited
|
|
230
|
+
|
|
231
|
+
return plot_some_over_splited(self, *args, **kwargs)
|
|
232
|
+
|
|
220
233
|
def plot_error_metrics(self, metric="cosine", case_keys=None, figsize=(15, 5)):
|
|
221
234
|
|
|
222
235
|
if case_keys is None:
|
|
223
236
|
case_keys = list(self.cases.keys())
|
|
224
|
-
import
|
|
237
|
+
import matplotlib.pyplot as plt
|
|
225
238
|
|
|
226
239
|
fig, axes = plt.subplots(ncols=len(case_keys), nrows=1, figsize=figsize, squeeze=False)
|
|
227
240
|
|
|
@@ -258,7 +271,7 @@ class ClusteringStudy(BenchmarkStudy, MixinStudyUnitCount):
|
|
|
258
271
|
|
|
259
272
|
if case_keys is None:
|
|
260
273
|
case_keys = list(self.cases.keys())
|
|
261
|
-
import
|
|
274
|
+
import matplotlib.pyplot as plt
|
|
262
275
|
|
|
263
276
|
if axes is None:
|
|
264
277
|
fig, axes = plt.subplots(ncols=len(case_keys), nrows=1, figsize=figsize, squeeze=False)
|
|
@@ -317,7 +330,7 @@ class ClusteringStudy(BenchmarkStudy, MixinStudyUnitCount):
|
|
|
317
330
|
|
|
318
331
|
if case_keys is None:
|
|
319
332
|
case_keys = list(self.cases.keys())
|
|
320
|
-
import
|
|
333
|
+
import matplotlib.pyplot as plt
|
|
321
334
|
|
|
322
335
|
fig, axes = plt.subplots(ncols=len(case_keys), nrows=1, figsize=figsize, squeeze=False)
|
|
323
336
|
|
|
@@ -386,81 +399,3 @@ class ClusteringStudy(BenchmarkStudy, MixinStudyUnitCount):
|
|
|
386
399
|
fig.colorbar(im, cax=cbar_ax, label=metric)
|
|
387
400
|
|
|
388
401
|
return fig
|
|
389
|
-
|
|
390
|
-
def plot_some_over_merged(self, case_keys=None, overmerged_score=0.05, max_units=5, figsize=None):
|
|
391
|
-
if case_keys is None:
|
|
392
|
-
case_keys = list(self.cases.keys())
|
|
393
|
-
import pylab as plt
|
|
394
|
-
|
|
395
|
-
figs = []
|
|
396
|
-
for count, key in enumerate(case_keys):
|
|
397
|
-
label = self.cases[key]["label"]
|
|
398
|
-
comp = self.get_result(key)["gt_comparison"]
|
|
399
|
-
|
|
400
|
-
unit_index = np.flatnonzero(np.sum(comp.agreement_scores.values > overmerged_score, axis=0) > 1)
|
|
401
|
-
overmerged_ids = comp.sorting2.unit_ids[unit_index]
|
|
402
|
-
|
|
403
|
-
n = min(len(overmerged_ids), max_units)
|
|
404
|
-
if n > 0:
|
|
405
|
-
fig, axs = plt.subplots(nrows=n, figsize=figsize)
|
|
406
|
-
for i, unit_id in enumerate(overmerged_ids[:n]):
|
|
407
|
-
gt_unit_indices = np.flatnonzero(comp.agreement_scores.loc[:, unit_id].values > overmerged_score)
|
|
408
|
-
gt_unit_ids = comp.sorting1.unit_ids[gt_unit_indices]
|
|
409
|
-
ax = axs[i]
|
|
410
|
-
ax.set_title(f"unit {unit_id} - GTids {gt_unit_ids}")
|
|
411
|
-
|
|
412
|
-
analyzer = self.get_sorting_analyzer(key)
|
|
413
|
-
|
|
414
|
-
wf_template = analyzer.get_extension("templates")
|
|
415
|
-
templates = wf_template.get_templates(unit_ids=gt_unit_ids)
|
|
416
|
-
if analyzer.sparsity is not None:
|
|
417
|
-
chan_mask = np.any(analyzer.sparsity.mask[gt_unit_indices, :], axis=0)
|
|
418
|
-
templates = templates[:, :, chan_mask]
|
|
419
|
-
ax.plot(templates.swapaxes(1, 2).reshape(templates.shape[0], -1).T)
|
|
420
|
-
ax.set_xticks([])
|
|
421
|
-
|
|
422
|
-
fig.suptitle(label)
|
|
423
|
-
figs.append(fig)
|
|
424
|
-
else:
|
|
425
|
-
print(key, "no overmerged")
|
|
426
|
-
|
|
427
|
-
return figs
|
|
428
|
-
|
|
429
|
-
def plot_some_over_splited(self, case_keys=None, oversplit_score=0.05, max_units=5, figsize=None):
|
|
430
|
-
if case_keys is None:
|
|
431
|
-
case_keys = list(self.cases.keys())
|
|
432
|
-
import pylab as plt
|
|
433
|
-
|
|
434
|
-
figs = []
|
|
435
|
-
for count, key in enumerate(case_keys):
|
|
436
|
-
label = self.cases[key]["label"]
|
|
437
|
-
comp = self.get_result(key)["gt_comparison"]
|
|
438
|
-
|
|
439
|
-
gt_unit_indices = np.flatnonzero(np.sum(comp.agreement_scores.values > oversplit_score, axis=1) > 1)
|
|
440
|
-
oversplit_ids = comp.sorting1.unit_ids[gt_unit_indices]
|
|
441
|
-
|
|
442
|
-
n = min(len(oversplit_ids), max_units)
|
|
443
|
-
if n > 0:
|
|
444
|
-
fig, axs = plt.subplots(nrows=n, figsize=figsize)
|
|
445
|
-
for i, unit_id in enumerate(oversplit_ids[:n]):
|
|
446
|
-
unit_indices = np.flatnonzero(comp.agreement_scores.loc[unit_id, :].values > oversplit_score)
|
|
447
|
-
unit_ids = comp.sorting2.unit_ids[unit_indices]
|
|
448
|
-
ax = axs[i]
|
|
449
|
-
ax.set_title(f"Gt unit {unit_id} - unit_ids: {unit_ids}")
|
|
450
|
-
|
|
451
|
-
templates = self.get_result(key)["clustering_templates"]
|
|
452
|
-
|
|
453
|
-
template_arrays = templates.get_dense_templates()[unit_indices, :, :]
|
|
454
|
-
if templates.sparsity is not None:
|
|
455
|
-
chan_mask = np.any(templates.sparsity.mask[gt_unit_indices, :], axis=0)
|
|
456
|
-
template_arrays = template_arrays[:, :, chan_mask]
|
|
457
|
-
|
|
458
|
-
ax.plot(template_arrays.swapaxes(1, 2).reshape(template_arrays.shape[0], -1).T)
|
|
459
|
-
ax.set_xticks([])
|
|
460
|
-
|
|
461
|
-
fig.suptitle(label)
|
|
462
|
-
figs.append(fig)
|
|
463
|
-
else:
|
|
464
|
-
print(key, "no over splited")
|
|
465
|
-
|
|
466
|
-
return figs
|
{spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_matching.py
RENAMED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
import warnings
|
|
4
2
|
|
|
5
3
|
from spikeinterface.sortingcomponents.matching import find_spikes_from_templates
|
|
@@ -12,7 +10,7 @@ from spikeinterface.widgets import (
|
|
|
12
10
|
|
|
13
11
|
import numpy as np
|
|
14
12
|
from .benchmark_base import Benchmark, BenchmarkStudy, MixinStudyUnitCount
|
|
15
|
-
from spikeinterface.core.
|
|
13
|
+
from spikeinterface.core.base import minimum_spike_dtype
|
|
16
14
|
|
|
17
15
|
|
|
18
16
|
class MatchingBenchmark(Benchmark):
|
|
@@ -26,9 +24,14 @@ class MatchingBenchmark(Benchmark):
|
|
|
26
24
|
self.method_kwargs = params["method_kwargs"]
|
|
27
25
|
self.result = {}
|
|
28
26
|
|
|
29
|
-
def run(self, **job_kwargs):
|
|
27
|
+
def run(self, verbose=True, **job_kwargs):
|
|
30
28
|
spikes = find_spikes_from_templates(
|
|
31
|
-
self.recording,
|
|
29
|
+
self.recording,
|
|
30
|
+
self.templates,
|
|
31
|
+
method=self.method,
|
|
32
|
+
method_kwargs=self.method_kwargs,
|
|
33
|
+
verbose=verbose,
|
|
34
|
+
job_kwargs=job_kwargs,
|
|
32
35
|
)
|
|
33
36
|
unit_ids = self.templates.unit_ids
|
|
34
37
|
sorting = np.zeros(spikes.size, dtype=minimum_spike_dtype)
|