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.
Files changed (392) hide show
  1. {spikeinterface-0.103.2/src/spikeinterface.egg-info → spikeinterface-0.104.0}/PKG-INFO +37 -30
  2. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/README.md +18 -14
  3. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/pyproject.toml +21 -15
  4. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_base.py +43 -46
  5. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_clustering.py +20 -85
  6. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_matching.py +8 -5
  7. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_merging.py +0 -2
  8. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_motion_estimation.py +0 -2
  9. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_motion_interpolation.py +0 -2
  10. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_peak_detection.py +1 -3
  11. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_peak_localization.py +6 -8
  12. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_peak_selection.py +0 -2
  13. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_plot_tools.py +124 -8
  14. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_sorter.py +20 -3
  15. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_sorter_without_gt.py +0 -1
  16. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/comparison/__init__.py +0 -8
  17. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/comparison/basecomparison.py +0 -2
  18. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/comparison/collision.py +0 -2
  19. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/comparison/comparisontools.py +1 -3
  20. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/comparison/correlogram.py +0 -2
  21. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/comparison/multicomparisons.py +0 -2
  22. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/comparison/paircomparisons.py +0 -2
  23. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/__init__.py +2 -1
  24. spikeinterface-0.104.0/src/spikeinterface/core/analyzer_extension_core.py +1697 -0
  25. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/base.py +58 -30
  26. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/baseevent.py +0 -2
  27. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/baserecording.py +19 -9
  28. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/baserecordingsnippets.py +48 -25
  29. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/basesnippets.py +20 -37
  30. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/basesorting.py +323 -138
  31. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/binaryfolder.py +0 -1
  32. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/binaryrecordingextractor.py +7 -2
  33. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/channelsaggregationrecording.py +0 -1
  34. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/channelslice.py +2 -5
  35. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/core_tools.py +3 -4
  36. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/datasets.py +0 -2
  37. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/frameslicerecording.py +0 -2
  38. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/frameslicesorting.py +0 -1
  39. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/generate.py +16 -17
  40. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/globals.py +0 -2
  41. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/job_tools.py +51 -32
  42. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/loading.py +0 -10
  43. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/node_pipeline.py +44 -37
  44. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/npyfoldersnippets.py +0 -1
  45. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/npysnippetsextractor.py +0 -1
  46. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/npzfolder.py +0 -3
  47. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/npzsortingextractor.py +0 -2
  48. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/numpyextractors.py +14 -36
  49. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/old_api_utils.py +2 -6
  50. spikeinterface-0.104.0/src/spikeinterface/core/operatorrecordings.py +82 -0
  51. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/recording_tools.py +7 -11
  52. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/segmentutils.py +0 -1
  53. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/snippets_tools.py +0 -2
  54. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/sorting_tools.py +211 -23
  55. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/sortinganalyzer.py +187 -70
  56. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/sortingfolder.py +0 -1
  57. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/sparsity.py +11 -10
  58. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/template.py +0 -1
  59. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/template_tools.py +36 -11
  60. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/testing.py +27 -26
  61. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/testing_tools.py +0 -2
  62. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/unitsaggregationsorting.py +0 -2
  63. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/unitsselectionsorting.py +14 -17
  64. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/waveform_tools.py +34 -26
  65. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/waveforms_extractor_backwards_compatibility.py +4 -7
  66. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/zarrextractors.py +5 -4
  67. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/zarrrecordingextractor.py +0 -2
  68. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/__init__.py +9 -2
  69. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/auto_merge.py +274 -4
  70. spikeinterface-0.104.0/src/spikeinterface/curation/bombcell_curation.py +364 -0
  71. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/curation_format.py +39 -23
  72. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/curation_model.py +124 -28
  73. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/curation_tools.py +47 -5
  74. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/curationsorting.py +0 -2
  75. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/mergeunitssorting.py +2 -4
  76. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/model_based_curation.py +66 -16
  77. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/remove_duplicated_spikes.py +2 -6
  78. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/remove_excess_spikes.py +11 -10
  79. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/remove_redundant.py +20 -33
  80. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/sortingview_curation.py +2 -4
  81. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/splitunitsorting.py +2 -5
  82. spikeinterface-0.104.0/src/spikeinterface/curation/threshold_metrics_curation.py +140 -0
  83. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/curation/train_manual_curation.py +15 -32
  84. spikeinterface-0.104.0/src/spikeinterface/curation/unitrefine_curation.py +124 -0
  85. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/exporters/report.py +0 -2
  86. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/exporters/to_ibl.py +0 -2
  87. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/exporters/to_phy.py +0 -1
  88. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/exporters/to_pynapple.py +15 -5
  89. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/__init__.py +1 -3
  90. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/alfsortingextractor.py +0 -2
  91. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/bids.py +0 -2
  92. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/cbin_ibl.py +3 -15
  93. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/cellexplorersortingextractor.py +0 -2
  94. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/combinatoextractors.py +0 -2
  95. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/extractor_classes.py +2 -5
  96. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/hdsortextractors.py +0 -2
  97. spikeinterface-0.104.0/src/spikeinterface/extractors/herdingspikesextractors.py +78 -0
  98. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/iblextractors.py +3 -7
  99. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/klustaextractors.py +0 -3
  100. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/matlabhelpers.py +0 -2
  101. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/mclustextractors.py +0 -2
  102. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/mcsh5extractors.py +0 -2
  103. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/mdaextractors.py +15 -18
  104. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/alphaomega.py +0 -2
  105. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/axon.py +0 -2
  106. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/axona.py +0 -2
  107. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/biocam.py +0 -2
  108. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/blackrock.py +22 -8
  109. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/ced.py +0 -2
  110. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/edf.py +0 -2
  111. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/intan.py +0 -1
  112. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/maxwell.py +0 -2
  113. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/mcsraw.py +0 -2
  114. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/mearec.py +3 -6
  115. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/neo_utils.py +0 -2
  116. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/neobaseextractor.py +16 -18
  117. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/neuralynx.py +3 -6
  118. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/neuroexplorer.py +0 -2
  119. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/neuronexus.py +0 -2
  120. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/neuroscope.py +7 -14
  121. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/nix.py +0 -2
  122. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/openephys.py +9 -31
  123. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/plexon.py +0 -2
  124. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/plexon2.py +0 -2
  125. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/spike2.py +0 -2
  126. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/spikegadgets.py +0 -1
  127. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/spikeglx.py +1 -10
  128. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/tdt.py +0 -2
  129. spikeinterface-0.104.0/src/spikeinterface/extractors/neuropixels_utils.py +85 -0
  130. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/nwbextractors.py +5 -2
  131. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/phykilosortextractors.py +220 -6
  132. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/shybridextractors.py +0 -2
  133. spikeinterface-0.104.0/src/spikeinterface/extractors/sinapsrecordingextractors.py +402 -0
  134. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/spykingcircusextractors.py +0 -2
  135. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/toy_example.py +0 -2
  136. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/tridesclousextractors.py +0 -2
  137. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/waveclussnippetstextractors.py +5 -8
  138. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/waveclustextractors.py +0 -2
  139. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/whitematterrecordingextractor.py +4 -5
  140. spikeinterface-0.104.0/src/spikeinterface/extractors/xclustextractors.py +168 -0
  141. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/yassextractors.py +0 -2
  142. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/full.py +1 -1
  143. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/generation/drift_tools.py +13 -16
  144. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/generation/drifting_generator.py +95 -42
  145. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/generation/hybrid_tools.py +0 -2
  146. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/generation/noise_tools.py +1 -1
  147. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/generation/splitting_tools.py +5 -2
  148. spikeinterface-0.104.0/src/spikeinterface/metrics/__init__.py +3 -0
  149. spikeinterface-0.104.0/src/spikeinterface/metrics/conftest.py +85 -0
  150. spikeinterface-0.104.0/src/spikeinterface/metrics/quality/__init__.py +24 -0
  151. {spikeinterface-0.103.2/src/spikeinterface/qualitymetrics → spikeinterface-0.104.0/src/spikeinterface/metrics/quality}/misc_metrics.py +1066 -764
  152. {spikeinterface-0.103.2/src/spikeinterface/qualitymetrics → spikeinterface-0.104.0/src/spikeinterface/metrics/quality}/pca_metrics.py +308 -277
  153. spikeinterface-0.104.0/src/spikeinterface/metrics/quality/quality_metrics.py +235 -0
  154. spikeinterface-0.104.0/src/spikeinterface/metrics/spiketrain/__init__.py +8 -0
  155. spikeinterface-0.104.0/src/spikeinterface/metrics/spiketrain/metrics.py +90 -0
  156. spikeinterface-0.104.0/src/spikeinterface/metrics/spiketrain/spiketrain_metrics.py +60 -0
  157. spikeinterface-0.104.0/src/spikeinterface/metrics/template/__init__.py +11 -0
  158. spikeinterface-0.104.0/src/spikeinterface/metrics/template/metrics.py +1400 -0
  159. spikeinterface-0.104.0/src/spikeinterface/metrics/template/template_metrics.py +369 -0
  160. spikeinterface-0.104.0/src/spikeinterface/metrics/utils.py +210 -0
  161. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/__init__.py +13 -6
  162. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/alignsorting.py +0 -2
  163. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/amplitude_scalings.py +26 -90
  164. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/correlograms.py +553 -30
  165. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/isi.py +2 -10
  166. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/localization_tools.py +12 -12
  167. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/principal_component.py +0 -7
  168. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/spike_amplitudes.py +5 -98
  169. spikeinterface-0.104.0/src/spikeinterface/postprocessing/spike_locations.py +92 -0
  170. spikeinterface-0.104.0/src/spikeinterface/postprocessing/template_metrics.py +26 -0
  171. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/template_similarity.py +90 -88
  172. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/unit_locations.py +0 -8
  173. spikeinterface-0.104.0/src/spikeinterface/postprocessing/valid_unit_periods.py +803 -0
  174. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/__init__.py +2 -0
  175. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/align_snippets.py +3 -7
  176. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/astype.py +0 -2
  177. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/average_across_direction.py +0 -2
  178. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/basepreprocessor.py +0 -2
  179. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/clip.py +0 -2
  180. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/common_reference.py +52 -23
  181. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/correct_lsb.py +0 -2
  182. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/decimate.py +0 -2
  183. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/deepinterpolation/deepinterpolation.py +1 -4
  184. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/deepinterpolation/generators.py +2 -4
  185. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/deepinterpolation/tf_utils.py +0 -2
  186. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/deepinterpolation/train.py +0 -2
  187. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/depth_order.py +0 -2
  188. spikeinterface-0.104.0/src/spikeinterface/preprocessing/detect_artifacts.py +604 -0
  189. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/detect_bad_channels.py +89 -59
  190. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/directional_derivative.py +0 -2
  191. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/filter.py +142 -29
  192. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/filter_gaussian.py +22 -15
  193. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/filter_opencl.py +0 -2
  194. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/highpass_spatial_filter.py +76 -21
  195. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/interpolate_bad_channels.py +2 -4
  196. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/motion.py +3 -6
  197. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/normalize_scale.py +0 -2
  198. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/phase_shift.py +0 -2
  199. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/pipeline.py +0 -2
  200. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/preprocessing_classes.py +3 -2
  201. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/preprocessing_tools.py +3 -5
  202. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/rectify.py +0 -2
  203. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/remove_artifacts.py +5 -5
  204. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/resample.py +31 -15
  205. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/scale.py +0 -2
  206. spikeinterface-0.104.0/src/spikeinterface/preprocessing/silence_periods.py +238 -0
  207. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/unsigned_to_signed.py +1 -2
  208. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/whiten.py +0 -2
  209. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/zero_channel_pad.py +2 -6
  210. spikeinterface-0.104.0/src/spikeinterface/qualitymetrics/__init__.py +10 -0
  211. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/basesorter.py +0 -4
  212. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/container_tools.py +14 -5
  213. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/combinato.py +4 -10
  214. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/hdsort.py +5 -11
  215. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/herdingspikes.py +1 -5
  216. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/ironclust.py +12 -23
  217. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosort.py +2 -5
  218. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosort2.py +3 -8
  219. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosort2_5.py +3 -9
  220. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosort3.py +3 -8
  221. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosort4.py +24 -16
  222. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosortbase.py +0 -2
  223. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/klusta.py +2 -8
  224. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/mountainsort4.py +0 -2
  225. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/mountainsort5.py +0 -2
  226. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/pykilosort.py +0 -2
  227. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/spyking_circus.py +2 -8
  228. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/tridesclous.py +0 -3
  229. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/waveclus.py +5 -10
  230. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/waveclus_snippets.py +6 -12
  231. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/yass.py +0 -2
  232. spikeinterface-0.104.0/src/spikeinterface/sorters/internal/lupin.py +428 -0
  233. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/internal/si_based.py +0 -2
  234. spikeinterface-0.104.0/src/spikeinterface/sorters/internal/simplesorter.py +175 -0
  235. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/internal/spyking_circus2.py +63 -36
  236. spikeinterface-0.104.0/src/spikeinterface/sorters/internal/tridesclous2.py +390 -0
  237. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/launcher.py +0 -2
  238. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/runsorter.py +5 -9
  239. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/sorterlist.py +2 -2
  240. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/utils/misc.py +0 -2
  241. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/utils/shellscript.py +16 -20
  242. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/cleaning_tools.py +1 -4
  243. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/dummy.py +0 -2
  244. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/isosplit_isocut.py +12 -13
  245. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/iterative_hdbscan.py +61 -11
  246. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/iterative_isosplit.py +102 -206
  247. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/itersplit_tools.py +2 -6
  248. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/main.py +0 -2
  249. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/merging_tools.py +15 -11
  250. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/method_list.py +0 -2
  251. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/positions.py +0 -2
  252. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/random_projections.py +13 -11
  253. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/tools.py +48 -56
  254. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/matching/circus.py +1 -5
  255. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/matching/main.py +0 -2
  256. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/matching/method_list.py +0 -2
  257. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/matching/nearest.py +94 -42
  258. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/matching/tdc_peeler.py +6 -8
  259. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/matching/wobble.py +0 -2
  260. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/motion/iterative_template.py +1 -1
  261. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/motion/motion_estimation.py +0 -2
  262. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/motion/motion_interpolation.py +3 -5
  263. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_detection/by_channel.py +8 -8
  264. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_detection/iterative.py +1 -3
  265. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_detection/locally_exclusive.py +82 -91
  266. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_detection/main.py +2 -3
  267. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_detection/matched_filtering.py +100 -85
  268. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_detection/method_list.py +0 -2
  269. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_localization/center_of_mass.py +0 -1
  270. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_localization/grid.py +0 -3
  271. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_localization/main.py +0 -2
  272. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_localization/monopolar.py +0 -1
  273. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_selection.py +0 -3
  274. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/tools.py +194 -38
  275. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/waveforms/features_from_peaks.py +0 -3
  276. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/waveforms/hanning_filter.py +0 -3
  277. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/waveforms/neural_network_denoiser.py +0 -2
  278. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/waveforms/savgol_denoiser.py +0 -3
  279. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/waveforms/temporal_pca.py +2 -4
  280. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/waveforms/waveform_thresholder.py +0 -2
  281. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/waveforms/waveform_utils.py +0 -3
  282. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/all_amplitudes_distributions.py +0 -2
  283. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/amplitudes.py +22 -29
  284. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/autocorrelograms.py +14 -6
  285. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/base.py +13 -5
  286. spikeinterface-0.104.0/src/spikeinterface/widgets/bombcell_curation.py +271 -0
  287. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/collision.py +0 -2
  288. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/comparison.py +0 -2
  289. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/crosscorrelograms.py +17 -12
  290. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/drift_templates.py +0 -2
  291. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/gtstudy.py +0 -2
  292. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/isi_distribution.py +0 -2
  293. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/metrics.py +156 -12
  294. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/motion.py +4 -21
  295. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/multicomparison.py +0 -2
  296. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/peak_activity.py +0 -2
  297. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/peaks_on_probe.py +2 -4
  298. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/potential_merges.py +0 -2
  299. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/probe_map.py +0 -2
  300. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/quality_metrics.py +1 -3
  301. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/rasters.py +1 -25
  302. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/sorting_summary.py +41 -39
  303. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/spike_locations.py +17 -10
  304. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/spike_locations_by_time.py +0 -2
  305. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/spikes_on_traces.py +0 -2
  306. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/template_metrics.py +0 -2
  307. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/template_similarity.py +15 -6
  308. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/traces.py +41 -20
  309. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/unit_depths.py +0 -2
  310. spikeinterface-0.104.0/src/spikeinterface/widgets/unit_labels.py +126 -0
  311. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/unit_locations.py +19 -9
  312. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/unit_presence.py +0 -2
  313. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/unit_probe_map.py +0 -2
  314. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/unit_summary.py +1 -1
  315. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/unit_templates.py +24 -15
  316. spikeinterface-0.104.0/src/spikeinterface/widgets/unit_valid_periods.py +234 -0
  317. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/unit_waveforms.py +6 -2
  318. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/unit_waveforms_density_map.py +26 -40
  319. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/utils.py +6 -3
  320. spikeinterface-0.103.2/src/spikeinterface/widgets/utils_sortingview.py → spikeinterface-0.104.0/src/spikeinterface/widgets/utils_figpack.py +52 -17
  321. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/utils_ipywidgets.py +4 -7
  322. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/utils_matplotlib.py +0 -2
  323. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/widget_list.py +12 -2
  324. {spikeinterface-0.103.2 → spikeinterface-0.104.0/src/spikeinterface.egg-info}/PKG-INFO +37 -30
  325. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface.egg-info/SOURCES.txt +25 -7
  326. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface.egg-info/requires.txt +17 -14
  327. spikeinterface-0.103.2/src/spikeinterface/comparison/hybrid.py +0 -239
  328. spikeinterface-0.103.2/src/spikeinterface/core/analyzer_extension_core.py +0 -816
  329. spikeinterface-0.103.2/src/spikeinterface/extractors/herdingspikesextractors.py +0 -142
  330. spikeinterface-0.103.2/src/spikeinterface/extractors/neuropixels_utils.py +0 -213
  331. spikeinterface-0.103.2/src/spikeinterface/extractors/sinapsrecordingextractors.py +0 -253
  332. spikeinterface-0.103.2/src/spikeinterface/postprocessing/spike_locations.py +0 -181
  333. spikeinterface-0.103.2/src/spikeinterface/postprocessing/template_metrics.py +0 -1089
  334. spikeinterface-0.103.2/src/spikeinterface/preprocessing/silence_periods.py +0 -142
  335. spikeinterface-0.103.2/src/spikeinterface/qualitymetrics/__init__.py +0 -9
  336. spikeinterface-0.103.2/src/spikeinterface/qualitymetrics/quality_metric_calculator.py +0 -362
  337. spikeinterface-0.103.2/src/spikeinterface/qualitymetrics/quality_metric_list.py +0 -136
  338. spikeinterface-0.103.2/src/spikeinterface/qualitymetrics/utils.py +0 -70
  339. spikeinterface-0.103.2/src/spikeinterface/sorters/internal/simplesorter.py +0 -242
  340. spikeinterface-0.103.2/src/spikeinterface/sorters/internal/tridesclous2.py +0 -343
  341. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/LICENSE +0 -0
  342. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/setup.cfg +0 -0
  343. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/__init__.py +0 -0
  344. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/__init__.py +0 -0
  345. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/benchmark_tools.py +0 -0
  346. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/benchmark/residual_analysis.py +0 -0
  347. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/comparison/groundtruthstudy.py +0 -0
  348. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/core/motion.py +0 -0
  349. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/exporters/__init__.py +0 -0
  350. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/extractors/neoextractors/__init__.py +0 -0
  351. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/generation/__init__.py +0 -0
  352. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/generation/template_database.py +0 -0
  353. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/postprocessing/noise_level.py +0 -0
  354. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/preprocessing/deepinterpolation/__init__.py +0 -0
  355. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/__init__.py +0 -0
  356. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/__init__.py +0 -0
  357. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/hdsort_master.m +0 -0
  358. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosort2_5_master.m +0 -0
  359. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosort2_master.m +0 -0
  360. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosort3_master.m +0 -0
  361. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/kilosort_master.m +0 -0
  362. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/klusta_config_default.prm +0 -0
  363. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/rt_sort.py +0 -0
  364. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/sc_config_default.params +0 -0
  365. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/waveclus_master.m +0 -0
  366. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/waveclus_snippets_master.m +0 -0
  367. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/external/yass_config_default.yaml +0 -0
  368. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/internal/__init__.py +0 -0
  369. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/utils/__init__.py +0 -0
  370. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/utils/constructNPYheader.m +0 -0
  371. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sorters/utils/writeNPY.m +0 -0
  372. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/__init__.py +0 -0
  373. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/__init__.py +0 -0
  374. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/graph_clustering.py +0 -0
  375. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/clustering/graph_tools.py +0 -0
  376. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/matching/__init__.py +0 -0
  377. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/matching/base.py +0 -0
  378. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/motion/__init__.py +0 -0
  379. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/motion/decentralized.py +0 -0
  380. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/motion/dredge.py +0 -0
  381. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/motion/medicine.py +0 -0
  382. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/motion/motion_cleaner.py +0 -0
  383. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/motion/motion_utils.py +0 -0
  384. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_detection/__init__.py +0 -0
  385. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_localization/__init__.py +0 -0
  386. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_localization/base.py +0 -0
  387. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/peak_localization/method_list.py +0 -0
  388. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/waveforms/__init__.py +0 -0
  389. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/sortingcomponents/waveforms/peak_svd.py +0 -0
  390. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface/widgets/__init__.py +0 -0
  391. {spikeinterface-0.103.2 → spikeinterface-0.104.0}/src/spikeinterface.egg-info/dependency_links.txt +0 -0
  392. {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.103.2
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.9
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.3
26
- Requires-Dist: probeinterface>=0.3.1
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: sortingview>=0.12.0; extra == "widgets"
69
- Provides-Extra: qualitymetrics
70
- Requires-Dist: scikit-learn; extra == "qualitymetrics"
71
- Requires-Dist: scipy; extra == "qualitymetrics"
72
- Requires-Dist: pandas; extra == "qualitymetrics"
73
- Requires-Dist: numba; extra == "qualitymetrics"
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
- [![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)
172
-
173
174
 
174
- > :rocket::rocket::rocket:
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
+ [![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)
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 framework designed to unify preexisting spike sorting technologies into a single code base.
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
- 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!
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 (also in Docker/Singularity containers).
193
- - post-process sorted datasets.
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
- - offer a powerful Qt-based viewer in a separate package [spikeinterface-gui](https://github.com/SpikeInterface/spikeinterface-gui)
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
- [![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)
47
-
48
46
 
49
- > :rocket::rocket::rocket:
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
+ [![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)
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 framework designed to unify preexisting spike sorting technologies into a single code base.
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
- 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!
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 (also in Docker/Singularity containers).
68
- - post-process sorted datasets.
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
- - offer a powerful Qt-based viewer in a separate package [spikeinterface-gui](https://github.com/SpikeInterface/spikeinterface-gui)
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.103.2"
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.9"
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.3",
29
- "probeinterface>=0.3.1",
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
- "sortingview>=0.12.0",
113
+ "figpack",
114
+ "figpack-spike-sorting"
114
115
  ]
115
116
 
116
- qualitymetrics = [
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
- "qualitymetrics",
241
+ "mertrics",
236
242
  "sorters",
237
243
  "sorters_external",
238
244
  "sorters_internal",
@@ -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
- # check that cases keys are homogeneous
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, self.peaks, method=self.method, method_kwargs=self.method_kwargs, job_kwargs=job_kwargs
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 pylab as plt
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 pylab as plt
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 pylab as plt
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
@@ -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.basesorting import minimum_spike_dtype
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, self.templates, method=self.method, method_kwargs=self.method_kwargs, job_kwargs=job_kwargs
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)
@@ -1,5 +1,3 @@
1
- from __future__ import annotations
2
-
3
1
  from spikeinterface.curation.auto_merge import auto_merge_units
4
2
  from spikeinterface.comparison import compare_sorter_to_ground_truth
5
3
  from spikeinterface.core.sortinganalyzer import create_sorting_analyzer
@@ -1,5 +1,3 @@
1
- from __future__ import annotations
2
-
3
1
  import json
4
2
  from pathlib import Path
5
3
  import pickle
@@ -1,5 +1,3 @@
1
- from __future__ import annotations
2
-
3
1
  import numpy as np
4
2
 
5
3