spikeinterface 0.100.7__tar.gz → 0.100.8__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 (309) hide show
  1. {spikeinterface-0.100.7/src/spikeinterface.egg-info → spikeinterface-0.100.8}/PKG-INFO +2 -2
  2. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/pyproject.toml +2 -2
  3. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/baserecording.py +3 -0
  4. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/core_tools.py +6 -1
  5. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/frameslicerecording.py +0 -4
  6. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/generate.py +2 -6
  7. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/globals.py +8 -5
  8. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/job_tools.py +22 -10
  9. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/segmentutils.py +0 -5
  10. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/cbin_ibl.py +0 -4
  11. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/nwbextractors.py +0 -5
  12. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/average_across_direction.py +0 -5
  13. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/decimate.py +0 -7
  14. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/deepinterpolation/deepinterpolation.py +0 -6
  15. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/directional_derivative.py +0 -5
  16. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/phase_shift.py +0 -4
  17. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/remove_artifacts.py +0 -5
  18. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/resample.py +0 -5
  19. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/silence_periods.py +0 -5
  20. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/zero_channel_pad.py +0 -9
  21. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/qualitymetrics/misc_metrics.py +1 -1
  22. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/basesorter.py +5 -6
  23. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort2.py +4 -2
  24. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort2_5.py +3 -1
  25. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort3.py +4 -2
  26. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort4.py +22 -4
  27. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/mountainsort5.py +0 -1
  28. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/peak_localization.py +2 -2
  29. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/waveforms/waveform_thresholder.py +1 -1
  30. {spikeinterface-0.100.7 → spikeinterface-0.100.8/src/spikeinterface.egg-info}/PKG-INFO +2 -2
  31. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface.egg-info/requires.txt +1 -1
  32. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/LICENSE +0 -0
  33. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/README.md +0 -0
  34. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/setup.cfg +0 -0
  35. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/setup.py +0 -0
  36. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/__init__.py +0 -0
  37. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/comparison/__init__.py +0 -0
  38. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/comparison/basecomparison.py +0 -0
  39. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/comparison/collision.py +0 -0
  40. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/comparison/comparisontools.py +0 -0
  41. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/comparison/correlogram.py +0 -0
  42. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/comparison/groundtruthstudy.py +0 -0
  43. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/comparison/hybrid.py +0 -0
  44. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/comparison/multicomparisons.py +0 -0
  45. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/comparison/paircomparisons.py +0 -0
  46. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/__init__.py +0 -0
  47. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/base.py +0 -0
  48. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/baseevent.py +0 -0
  49. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/baserecordingsnippets.py +0 -0
  50. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/basesnippets.py +0 -0
  51. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/basesorting.py +0 -0
  52. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/binaryfolder.py +0 -0
  53. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/binaryrecordingextractor.py +0 -0
  54. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/channelsaggregationrecording.py +0 -0
  55. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/channelslice.py +0 -0
  56. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/datasets.py +0 -0
  57. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/frameslicesorting.py +0 -0
  58. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/node_pipeline.py +0 -0
  59. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/npyfoldersnippets.py +0 -0
  60. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/npysnippetsextractor.py +0 -0
  61. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/npzfolder.py +0 -0
  62. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/npzsortingextractor.py +0 -0
  63. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/numpyextractors.py +0 -0
  64. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/old_api_utils.py +0 -0
  65. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/recording_tools.py +0 -0
  66. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/snippets_tools.py +0 -0
  67. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/sorting_tools.py +0 -0
  68. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/sortingfolder.py +0 -0
  69. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/sparsity.py +0 -0
  70. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/template.py +0 -0
  71. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/template_tools.py +0 -0
  72. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/testing.py +0 -0
  73. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/testing_tools.py +0 -0
  74. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/unitsaggregationsorting.py +0 -0
  75. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/unitsselectionsorting.py +0 -0
  76. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/waveform_extractor.py +0 -0
  77. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/waveform_tools.py +0 -0
  78. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/zarrextractors.py +0 -0
  79. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/zarrrecordingextractor.py +0 -0
  80. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/__init__.py +0 -0
  81. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/auto_merge.py +0 -0
  82. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/curation_tools.py +0 -0
  83. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/curationsorting.py +0 -0
  84. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/mergeunitssorting.py +0 -0
  85. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/remove_duplicated_spikes.py +0 -0
  86. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/remove_excess_spikes.py +0 -0
  87. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/remove_redundant.py +0 -0
  88. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/sortingview_curation.py +0 -0
  89. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/splitunitsorting.py +0 -0
  90. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/exporters/__init__.py +0 -0
  91. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/exporters/report.py +0 -0
  92. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/exporters/to_phy.py +0 -0
  93. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/__init__.py +0 -0
  94. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/alfsortingextractor.py +0 -0
  95. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/bids.py +0 -0
  96. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/cellexplorersortingextractor.py +0 -0
  97. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/combinatoextractors.py +0 -0
  98. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/extractorlist.py +0 -0
  99. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/hdsortextractors.py +0 -0
  100. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/herdingspikesextractors.py +0 -0
  101. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/iblstreamingrecording.py +0 -0
  102. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/klustaextractors.py +0 -0
  103. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/matlabhelpers.py +0 -0
  104. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/mclustextractors.py +0 -0
  105. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/mcsh5extractors.py +0 -0
  106. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/mdaextractors.py +0 -0
  107. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/__init__.py +0 -0
  108. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/alphaomega.py +0 -0
  109. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/axona.py +0 -0
  110. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/biocam.py +0 -0
  111. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/blackrock.py +0 -0
  112. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/ced.py +0 -0
  113. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/edf.py +0 -0
  114. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/intan.py +0 -0
  115. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/maxwell.py +0 -0
  116. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/mcsraw.py +0 -0
  117. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/mearec.py +0 -0
  118. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/neo_utils.py +0 -0
  119. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/neobaseextractor.py +0 -0
  120. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/neuralynx.py +0 -0
  121. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/neuroexplorer.py +0 -0
  122. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/neuroscope.py +0 -0
  123. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/nix.py +0 -0
  124. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/openephys.py +0 -0
  125. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/plexon.py +0 -0
  126. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/plexon2.py +0 -0
  127. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/spike2.py +0 -0
  128. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/spikegadgets.py +0 -0
  129. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/spikeglx.py +0 -0
  130. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/tdt.py +0 -0
  131. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neuropixels_utils.py +0 -0
  132. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/phykilosortextractors.py +0 -0
  133. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/shybridextractors.py +0 -0
  134. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/spykingcircusextractors.py +0 -0
  135. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/toy_example.py +0 -0
  136. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/tridesclousextractors.py +0 -0
  137. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/waveclussnippetstextractors.py +0 -0
  138. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/waveclustextractors.py +0 -0
  139. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/yassextractors.py +0 -0
  140. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/full.py +0 -0
  141. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/generation/__init__.py +0 -0
  142. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/generation/drift_tools.py +0 -0
  143. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/__init__.py +0 -0
  144. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/alignsorting.py +0 -0
  145. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/amplitude_scalings.py +0 -0
  146. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/correlograms.py +0 -0
  147. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/isi.py +0 -0
  148. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/noise_level.py +0 -0
  149. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/principal_component.py +0 -0
  150. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/spike_amplitudes.py +0 -0
  151. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/spike_locations.py +0 -0
  152. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/template_metrics.py +0 -0
  153. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/template_similarity.py +0 -0
  154. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/unit_localization.py +0 -0
  155. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/__init__.py +0 -0
  156. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/align_snippets.py +0 -0
  157. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/astype.py +0 -0
  158. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/basepreprocessor.py +0 -0
  159. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/clip.py +0 -0
  160. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/common_reference.py +0 -0
  161. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/correct_lsb.py +0 -0
  162. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/deepinterpolation/__init__.py +0 -0
  163. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/deepinterpolation/generators.py +0 -0
  164. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/deepinterpolation/tf_utils.py +0 -0
  165. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/deepinterpolation/train.py +0 -0
  166. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/depth_order.py +0 -0
  167. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/detect_bad_channels.py +0 -0
  168. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/filter.py +0 -0
  169. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/filter_gaussian.py +0 -0
  170. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/filter_opencl.py +0 -0
  171. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/highpass_spatial_filter.py +0 -0
  172. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/interpolate_bad_channels.py +0 -0
  173. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/motion.py +0 -0
  174. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/normalize_scale.py +0 -0
  175. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/preprocessing_tools.py +0 -0
  176. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/preprocessinglist.py +0 -0
  177. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/rectify.py +0 -0
  178. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/unsigned_to_signed.py +0 -0
  179. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/whiten.py +0 -0
  180. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/qualitymetrics/__init__.py +0 -0
  181. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/qualitymetrics/pca_metrics.py +0 -0
  182. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/qualitymetrics/quality_metric_calculator.py +0 -0
  183. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/qualitymetrics/quality_metric_list.py +0 -0
  184. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/qualitymetrics/utils.py +0 -0
  185. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/__init__.py +0 -0
  186. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/container_tools.py +0 -0
  187. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/__init__.py +0 -0
  188. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/combinato.py +0 -0
  189. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/hdsort.py +0 -0
  190. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/hdsort_master.m +0 -0
  191. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/herdingspikes.py +0 -0
  192. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/ironclust.py +0 -0
  193. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort.py +0 -0
  194. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort2_5_master.m +0 -0
  195. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort2_master.m +0 -0
  196. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort3_master.m +0 -0
  197. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort_master.m +0 -0
  198. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosortbase.py +0 -0
  199. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/klusta.py +0 -0
  200. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/klusta_config_default.prm +0 -0
  201. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/mountainsort4.py +0 -0
  202. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/pykilosort.py +0 -0
  203. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/sc_config_default.params +0 -0
  204. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/spyking_circus.py +0 -0
  205. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/tridesclous.py +0 -0
  206. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/waveclus.py +0 -0
  207. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/waveclus_master.m +0 -0
  208. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/waveclus_snippets.py +0 -0
  209. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/waveclus_snippets_master.m +0 -0
  210. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/yass.py +0 -0
  211. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/yass_config_default.yaml +0 -0
  212. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/internal/__init__.py +0 -0
  213. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/internal/si_based.py +0 -0
  214. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/internal/spyking_circus2.py +0 -0
  215. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/internal/tridesclous2.py +0 -0
  216. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/launcher.py +0 -0
  217. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/runsorter.py +0 -0
  218. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/sorterlist.py +0 -0
  219. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/utils/__init__.py +0 -0
  220. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/utils/constructNPYheader.m +0 -0
  221. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/utils/misc.py +0 -0
  222. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/utils/shellscript.py +0 -0
  223. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/utils/writeNPY.m +0 -0
  224. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/__init__.py +0 -0
  225. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/benchmark/__init__.py +0 -0
  226. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/benchmark/benchmark_clustering.py +0 -0
  227. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/benchmark/benchmark_matching.py +0 -0
  228. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/benchmark/benchmark_motion_estimation.py +0 -0
  229. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/benchmark/benchmark_motion_interpolation.py +0 -0
  230. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/benchmark/benchmark_peak_localization.py +0 -0
  231. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/benchmark/benchmark_peak_selection.py +0 -0
  232. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/benchmark/benchmark_tools.py +0 -0
  233. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/__init__.py +0 -0
  234. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/circus.py +0 -0
  235. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/clean.py +0 -0
  236. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/clustering_tools.py +0 -0
  237. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/dummy.py +0 -0
  238. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/isocut5.py +0 -0
  239. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/main.py +0 -0
  240. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/merge.py +0 -0
  241. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/method_list.py +0 -0
  242. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/position.py +0 -0
  243. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/position_and_features.py +0 -0
  244. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/position_and_pca.py +0 -0
  245. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/position_ptp_scaled.py +0 -0
  246. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/random_projections.py +0 -0
  247. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/sliding_hdbscan.py +0 -0
  248. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/sliding_nn.py +0 -0
  249. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/split.py +0 -0
  250. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/tools.py +0 -0
  251. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/triage.py +0 -0
  252. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/features_from_peaks.py +0 -0
  253. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/matching/__init__.py +0 -0
  254. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/matching/circus.py +0 -0
  255. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/matching/main.py +0 -0
  256. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/matching/method_list.py +0 -0
  257. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/matching/naive.py +0 -0
  258. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/matching/tdc.py +0 -0
  259. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/matching/wobble.py +0 -0
  260. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/motion_estimation.py +0 -0
  261. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/motion_interpolation.py +0 -0
  262. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/peak_detection.py +0 -0
  263. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/peak_pipeline.py +0 -0
  264. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/peak_selection.py +0 -0
  265. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/tools.py +0 -0
  266. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/waveforms/__init__.py +0 -0
  267. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/waveforms/neural_network_denoiser.py +0 -0
  268. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/waveforms/savgol_denoiser.py +0 -0
  269. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/waveforms/temporal_pca.py +0 -0
  270. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/waveforms/waveform_utils.py +0 -0
  271. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/__init__.py +0 -0
  272. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/all_amplitudes_distributions.py +0 -0
  273. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/amplitudes.py +0 -0
  274. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/autocorrelograms.py +0 -0
  275. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/base.py +0 -0
  276. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/collision.py +0 -0
  277. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/comparison.py +0 -0
  278. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/crosscorrelograms.py +0 -0
  279. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/gtstudy.py +0 -0
  280. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/isi_distribution.py +0 -0
  281. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/metrics.py +0 -0
  282. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/motion.py +0 -0
  283. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/multicomparison.py +0 -0
  284. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/peak_activity.py +0 -0
  285. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/probe_map.py +0 -0
  286. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/quality_metrics.py +0 -0
  287. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/rasters.py +0 -0
  288. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/sorting_summary.py +0 -0
  289. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/spike_locations.py +0 -0
  290. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/spikes_on_traces.py +0 -0
  291. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/template_metrics.py +0 -0
  292. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/template_similarity.py +0 -0
  293. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/traces.py +0 -0
  294. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/unit_depths.py +0 -0
  295. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/unit_locations.py +0 -0
  296. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/unit_presence.py +0 -0
  297. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/unit_probe_map.py +0 -0
  298. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/unit_summary.py +0 -0
  299. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/unit_templates.py +0 -0
  300. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/unit_waveforms.py +0 -0
  301. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/unit_waveforms_density_map.py +0 -0
  302. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/utils.py +0 -0
  303. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/utils_ipywidgets.py +0 -0
  304. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/utils_matplotlib.py +0 -0
  305. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/utils_sortingview.py +0 -0
  306. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/widget_list.py +0 -0
  307. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface.egg-info/SOURCES.txt +0 -0
  308. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface.egg-info/dependency_links.txt +0 -0
  309. {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spikeinterface
3
- Version: 0.100.7
3
+ Version: 0.100.8
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
@@ -17,7 +17,7 @@ Classifier: Operating System :: OS Independent
17
17
  Requires-Python: <4.0,>=3.8
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
- Requires-Dist: numpy
20
+ Requires-Dist: numpy<2.0,>=1.20
21
21
  Requires-Dist: threadpoolctl>=3.0.0
22
22
  Requires-Dist: tqdm
23
23
  Requires-Dist: zarr<2.18,>=2.16
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "spikeinterface"
3
- version = "0.100.7"
3
+ version = "0.100.8"
4
4
  authors = [
5
5
  { name="Alessio Buccino", email="alessiop.buccino@gmail.com" },
6
6
  { name="Samuel Garcia", email="sam.garcia.die@gmail.com" },
@@ -20,7 +20,7 @@ classifiers = [
20
20
 
21
21
 
22
22
  dependencies = [
23
- "numpy",
23
+ "numpy>=1.20, <2.0", # 1.20 np.ptp, 1.26 might be necessary for avoiding pickling errors when numpy >2.0
24
24
  "threadpoolctl>=3.0.0",
25
25
  "tqdm",
26
26
  "zarr>=2.16,<2.18",
@@ -285,6 +285,9 @@ class BaseRecording(BaseRecordingSnippets):
285
285
  segment_index = self._check_segment_index(segment_index)
286
286
  channel_indices = self.ids_to_indices(channel_ids, prefer_slice=True)
287
287
  rs = self._recording_segments[segment_index]
288
+ start_frame = int(start_frame) if start_frame is not None else 0
289
+ num_samples = rs.get_num_samples()
290
+ end_frame = int(min(end_frame, num_samples)) if end_frame is not None else num_samples
288
291
  traces = rs.get_traces(start_frame=start_frame, end_frame=end_frame, channel_indices=channel_indices)
289
292
  if order is not None:
290
293
  assert order in ["C", "F"]
@@ -93,7 +93,12 @@ class SIJsonEncoder(json.JSONEncoder):
93
93
  if isinstance(obj, np.generic):
94
94
  return obj.item()
95
95
 
96
- if np.issctype(obj): # Cast numpy datatypes to their names
96
+ # Standard numpy dtypes like np.dtype('int32") are transformed this way
97
+ if isinstance(obj, np.dtype):
98
+ return np.dtype(obj).name
99
+
100
+ # This will transform to a string canonical representation of the dtype (e.g. np.int32 -> 'int32')
101
+ if isinstance(obj, type) and issubclass(obj, np.generic):
97
102
  return np.dtype(obj).name
98
103
 
99
104
  if isinstance(obj, np.ndarray):
@@ -85,10 +85,6 @@ class FrameSliceRecordingSegment(BaseRecordingSegment):
85
85
  return self.end_frame - self.start_frame
86
86
 
87
87
  def get_traces(self, start_frame, end_frame, channel_indices):
88
- if start_frame is None:
89
- start_frame = 0
90
- if end_frame is None:
91
- end_frame = self.get_num_samples()
92
88
  parent_start = self.start_frame + start_frame
93
89
  parent_end = self.start_frame + end_frame
94
90
  traces = self._parent_recording_segment.get_traces(
@@ -1092,9 +1092,6 @@ class NoiseGeneratorRecordingSegment(BaseRecordingSegment):
1092
1092
  end_frame: Union[int, None] = None,
1093
1093
  channel_indices: Union[List, None] = None,
1094
1094
  ) -> np.ndarray:
1095
- start_frame = 0 if start_frame is None else max(start_frame, 0)
1096
- end_frame = self.num_samples if end_frame is None else min(end_frame, self.num_samples)
1097
-
1098
1095
  start_frame_within_block = start_frame % self.noise_block_size
1099
1096
  end_frame_within_block = end_frame % self.noise_block_size
1100
1097
  num_samples = end_frame - start_frame
@@ -1650,9 +1647,6 @@ class InjectTemplatesRecordingSegment(BaseRecordingSegment):
1650
1647
  end_frame: Union[int, None] = None,
1651
1648
  channel_indices: Union[List, None] = None,
1652
1649
  ) -> np.ndarray:
1653
- start_frame = 0 if start_frame is None else start_frame
1654
- end_frame = self.num_samples if end_frame is None else end_frame
1655
-
1656
1650
  if channel_indices is None:
1657
1651
  n_channels = self.templates.shape[2]
1658
1652
  elif isinstance(channel_indices, slice):
@@ -1688,6 +1682,8 @@ class InjectTemplatesRecordingSegment(BaseRecordingSegment):
1688
1682
  end_traces = start_traces + template.shape[0]
1689
1683
  if start_traces >= end_frame - start_frame or end_traces <= 0:
1690
1684
  continue
1685
+ start_traces = int(start_traces)
1686
+ end_traces = int(end_traces)
1691
1687
 
1692
1688
  start_template = 0
1693
1689
  end_template = template.shape[0]
@@ -42,9 +42,9 @@ def set_global_tmp_folder(folder):
42
42
  temp_folder_set = True
43
43
 
44
44
 
45
- def is_set_global_tmp_folder():
45
+ def is_set_global_tmp_folder() -> bool:
46
46
  """
47
- Check is the global path temporary folder have been manually set.
47
+ Check if the global path temporary folder have been manually set.
48
48
  """
49
49
  global temp_folder_set
50
50
  return temp_folder_set
@@ -88,9 +88,9 @@ def set_global_dataset_folder(folder):
88
88
  dataset_folder_set = True
89
89
 
90
90
 
91
- def is_set_global_dataset_folder():
91
+ def is_set_global_dataset_folder() -> bool:
92
92
  """
93
- Check is the global path dataset folder have been manually set.
93
+ Check if the global path dataset folder has been manually set.
94
94
  """
95
95
  global dataset_folder_set
96
96
  return dataset_folder_set
@@ -138,7 +138,10 @@ def reset_global_job_kwargs():
138
138
  global_job_kwargs = dict(n_jobs=1, chunk_duration="1s", progress_bar=True)
139
139
 
140
140
 
141
- def is_set_global_job_kwargs_set():
141
+ def is_set_global_job_kwargs_set() -> bool:
142
+ """
143
+ Check if the global job kwargs have been manually set.
144
+ """
142
145
  global global_job_kwargs_set
143
146
  return global_job_kwargs_set
144
147
 
@@ -10,7 +10,6 @@ import os
10
10
  import warnings
11
11
 
12
12
  import sys
13
- import contextlib
14
13
  from tqdm.auto import tqdm
15
14
 
16
15
  from concurrent.futures import ProcessPoolExecutor
@@ -28,8 +27,9 @@ _shared_job_kwargs_doc = """**job_kwargs: keyword arguments for parallel process
28
27
  Total memory usage (e.g. "500M", "2G")
29
28
  - chunk_duration : str or float or None
30
29
  Chunk duration in s if float or with units if str (e.g. "1s", "500ms")
31
- * n_jobs: int
32
- Number of jobs to use. With -1 the number of jobs is the same as number of cores
30
+ * n_jobs: int | float
31
+ Number of jobs to use. With -1 the number of jobs is the same as number of cores.
32
+ Using a float between 0 and 1 will use that fraction of the total cores.
33
33
  * progress_bar: bool
34
34
  If True, a progress bar is printed
35
35
  * mp_context: "fork" | "spawn" | None, default: None
@@ -60,7 +60,7 @@ _mutually_exclusive = (
60
60
 
61
61
 
62
62
  def fix_job_kwargs(runtime_job_kwargs):
63
- from .globals import get_global_job_kwargs
63
+ from .globals import get_global_job_kwargs, is_set_global_job_kwargs_set
64
64
 
65
65
  job_kwargs = get_global_job_kwargs()
66
66
 
@@ -68,30 +68,42 @@ def fix_job_kwargs(runtime_job_kwargs):
68
68
  assert k in job_keys, (
69
69
  f"{k} is not a valid job keyword argument. " f"Available keyword arguments are: {list(job_keys)}"
70
70
  )
71
-
72
71
  # remove mutually exclusive from global job kwargs
73
72
  for k, v in runtime_job_kwargs.items():
74
73
  if k in _mutually_exclusive and v is not None:
75
74
  for key_to_remove in _mutually_exclusive:
76
75
  if key_to_remove in job_kwargs:
77
76
  job_kwargs.pop(key_to_remove)
78
-
79
77
  # remove None
80
78
  runtime_job_kwargs_exclude_none = runtime_job_kwargs.copy()
81
79
  for job_key, job_value in runtime_job_kwargs.items():
82
80
  if job_value is None:
83
81
  del runtime_job_kwargs_exclude_none[job_key]
84
82
  job_kwargs.update(runtime_job_kwargs_exclude_none)
85
-
86
83
  # if n_jobs is -1, set to os.cpu_count() (n_jobs is always in global job_kwargs)
87
84
  n_jobs = job_kwargs["n_jobs"]
88
- assert isinstance(n_jobs, (float, np.integer, int))
89
- if isinstance(n_jobs, float):
85
+ assert isinstance(n_jobs, (float, np.integer, int)) and n_jobs != 0, "n_jobs must be a non-zero int or float"
86
+ # for a fraction we do fraction of total cores
87
+ if isinstance(n_jobs, float) and 0 < n_jobs <= 1:
90
88
  n_jobs = int(n_jobs * os.cpu_count())
89
+ # for negative numbers we count down from total cores (with -1 being all)
91
90
  elif n_jobs < 0:
92
- n_jobs = os.cpu_count() + 1 + n_jobs
91
+ n_jobs = int(os.cpu_count() + 1 + n_jobs)
92
+ # otherwise we just take the value given
93
+ else:
94
+ n_jobs = int(n_jobs)
95
+
93
96
  job_kwargs["n_jobs"] = max(n_jobs, 1)
94
97
 
98
+ if "n_jobs" not in runtime_job_kwargs and job_kwargs["n_jobs"] == 1 and not is_set_global_job_kwargs_set():
99
+ warnings.warn(
100
+ "`n_jobs` is not set so parallel processing is disabled! "
101
+ "To speed up computations, it is recommended to set n_jobs either "
102
+ "globally (with the `spikeinterface.set_global_job_kwargs()` function) or "
103
+ "locally (with the `n_jobs` argument). Use `spikeinterface.set_global_job_kwargs?` "
104
+ "for more information about job_kwargs."
105
+ )
106
+
95
107
  return job_kwargs
96
108
 
97
109
 
@@ -163,11 +163,6 @@ class ProxyConcatenateRecordingSegment(BaseRecordingSegment):
163
163
  return self.total_length
164
164
 
165
165
  def get_traces(self, start_frame, end_frame, channel_indices):
166
- if start_frame is None:
167
- start_frame = 0
168
- if end_frame is None:
169
- end_frame = self.get_num_samples()
170
-
171
166
  # # Ensures that we won't request invalid segment indices
172
167
  if (start_frame >= self.get_num_samples()) or (end_frame <= start_frame):
173
168
  # Return (0 * num_channels) array of correct dtype
@@ -130,10 +130,6 @@ class CBinIblRecordingSegment(BaseRecordingSegment):
130
130
  return self._cbuffer.shape[0]
131
131
 
132
132
  def get_traces(self, start_frame, end_frame, channel_indices):
133
- if start_frame is None:
134
- start_frame = 0
135
- if end_frame is None:
136
- end_frame = self.get_num_samples()
137
133
  if channel_indices is None:
138
134
  channel_indices = slice(None)
139
135
 
@@ -873,11 +873,6 @@ class NwbRecordingSegment(BaseRecordingSegment):
873
873
  return self._num_samples
874
874
 
875
875
  def get_traces(self, start_frame, end_frame, channel_indices):
876
- if start_frame is None:
877
- start_frame = 0
878
- if end_frame is None:
879
- end_frame = self.get_num_samples()
880
-
881
876
  electrical_series_data = self.electrical_series_data
882
877
  if electrical_series_data.ndim == 1:
883
878
  traces = electrical_series_data[start_frame:end_frame][:, np.newaxis]
@@ -116,11 +116,6 @@ class AverageAcrossDirectionRecordingSegment(BasePreprocessorSegment):
116
116
  return self.parent_recording_segment.get_num_samples()
117
117
 
118
118
  def get_traces(self, start_frame, end_frame, channel_indices):
119
- if start_frame is None:
120
- start_frame = 0
121
- if end_frame is None:
122
- end_frame = self.get_num_samples()
123
-
124
119
  parent_traces = self.parent_recording_segment.get_traces(
125
120
  start_frame=start_frame,
126
121
  end_frame=end_frame,
@@ -123,13 +123,6 @@ class DecimateRecordingSegment(BaseRecordingSegment):
123
123
  return int(np.ceil((parent_n_samp - self._decimation_offset) / self._decimation_factor))
124
124
 
125
125
  def get_traces(self, start_frame, end_frame, channel_indices):
126
- if start_frame is None:
127
- start_frame = 0
128
- if end_frame is None:
129
- end_frame = self.get_num_samples()
130
- end_frame = min(end_frame, self.get_num_samples())
131
- start_frame = min(start_frame, self.get_num_samples())
132
-
133
126
  # Account for offset and end when querying parent traces
134
127
  parent_start_frame = self._decimation_offset + start_frame * self._decimation_factor
135
128
  parent_end_frame = parent_start_frame + (end_frame - start_frame) * self._decimation_factor
@@ -147,12 +147,6 @@ class DeepInterpolatedRecordingSegment(BasePreprocessorSegment):
147
147
 
148
148
  n_frames = self.parent_recording_segment.get_num_samples()
149
149
 
150
- if start_frame == None:
151
- start_frame = 0
152
-
153
- if end_frame == None:
154
- end_frame = n_frames
155
-
156
150
  # for frames that lack full training data (i.e. pre and post frames including omissinos),
157
151
  # just return uninterpolated
158
152
  if start_frame < self.pre_frame + self.pre_post_omission:
@@ -103,11 +103,6 @@ class DirectionalDerivativeRecordingSegment(BasePreprocessorSegment):
103
103
  self.unique_pos_other_dims, self.column_inds = np.unique(geom_other_dims, axis=0, return_inverse=True)
104
104
 
105
105
  def get_traces(self, start_frame, end_frame, channel_indices):
106
- if start_frame is None:
107
- start_frame = 0
108
- if end_frame is None:
109
- end_frame = self.get_num_samples()
110
-
111
106
  parent_traces = self.parent_recording_segment.get_traces(
112
107
  start_frame=start_frame,
113
108
  end_frame=end_frame,
@@ -81,10 +81,6 @@ class PhaseShiftRecordingSegment(BasePreprocessorSegment):
81
81
  self.tmp_dtype = tmp_dtype
82
82
 
83
83
  def get_traces(self, start_frame, end_frame, channel_indices):
84
- if start_frame is None:
85
- start_frame = 0
86
- if end_frame is None:
87
- end_frame = self.get_num_samples()
88
84
  if channel_indices is None:
89
85
  channel_indices = slice(None)
90
86
 
@@ -258,11 +258,6 @@ class RemoveArtifactsRecordingSegment(BasePreprocessorSegment):
258
258
  traces = self.parent_recording_segment.get_traces(start_frame, end_frame, channel_indices)
259
259
  traces = traces.copy()
260
260
 
261
- if start_frame is None:
262
- start_frame = 0
263
- if end_frame is None:
264
- end_frame = self.get_num_samples()
265
-
266
261
  mask = (self.triggers >= start_frame) & (self.triggers < end_frame)
267
262
  triggers = self.triggers[mask] - start_frame
268
263
  labels = self.labels[mask]
@@ -115,11 +115,6 @@ class ResampleRecordingSegment(BaseRecordingSegment):
115
115
  return int(self._parent_segment.get_num_samples() / self._parent_rate * self.sampling_frequency)
116
116
 
117
117
  def get_traces(self, start_frame, end_frame, channel_indices):
118
- if start_frame is None:
119
- start_frame = 0
120
- if end_frame is None:
121
- end_frame = self.get_num_samples()
122
-
123
118
  # get parent traces with margin
124
119
  parent_start_frame, parent_end_frame = [
125
120
  int((frame / self.sampling_frequency) * self._parent_rate) for frame in [start_frame, end_frame]
@@ -99,11 +99,6 @@ class SilencedPeriodsRecordingSegment(BasePreprocessorSegment):
99
99
  traces = traces.copy()
100
100
  num_channels = traces.shape[1]
101
101
 
102
- if start_frame is None:
103
- start_frame = 0
104
- if end_frame is None:
105
- end_frame = self.get_num_samples()
106
-
107
102
  if len(self.periods) > 0:
108
103
  new_interval = np.array([start_frame, end_frame])
109
104
  lower_index = np.searchsorted(self.periods[:, 1], new_interval[0])
@@ -77,11 +77,6 @@ class TracePaddedRecordingSegment(BasePreprocessorSegment):
77
77
  super().__init__(parent_recording_segment=parent_recording_segment)
78
78
 
79
79
  def get_traces(self, start_frame, end_frame, channel_indices):
80
- if start_frame is None:
81
- start_frame = 0
82
- if end_frame is None:
83
- end_frame = self.get_num_samples()
84
-
85
80
  # This contains the padded elements by default and we add the original traces if necessary
86
81
  trace_size = end_frame - start_frame
87
82
  if isinstance(channel_indices, (np.ndarray, list)):
@@ -208,10 +203,6 @@ class ZeroChannelPaddedRecordingSegment(BasePreprocessorSegment):
208
203
  self.channel_mapping = channel_mapping
209
204
 
210
205
  def get_traces(self, start_frame, end_frame, channel_indices):
211
- if start_frame is None:
212
- start_frame = 0
213
- if end_frame is None:
214
- end_frame = self.get_num_samples()
215
206
  traces = np.zeros((end_frame - start_frame, self.num_channels))
216
207
  traces[:, self.channel_mapping] = self.parent_recording_segment.get_traces(
217
208
  start_frame=start_frame, end_frame=end_frame, channel_indices=self.channel_mapping
@@ -1473,7 +1473,7 @@ def compute_sd_ratio(
1473
1473
  # Computing the variance of a trace that is all 0 and n_spikes non-overlapping template.
1474
1474
  # TODO: Take into account that templates for different segments might differ.
1475
1475
  p = wvf_extractor.nsamples * n_spikes[unit_id] / wvf_extractor.get_total_samples()
1476
- total_variance = p * np.mean(template**2) - p**2 * np.mean(template)
1476
+ total_variance = p * np.mean(template**2) - p**2 * np.mean(template) ** 2
1477
1477
 
1478
1478
  std_noise = np.sqrt(std_noise**2 - total_variance)
1479
1479
 
@@ -17,15 +17,14 @@ import warnings
17
17
 
18
18
  from spikeinterface.core import load_extractor, BaseRecordingSnippets
19
19
  from spikeinterface.core.core_tools import check_json
20
+ from spikeinterface.core.globals import get_global_job_kwargs
20
21
  from spikeinterface.core.job_tools import fix_job_kwargs, split_job_kwargs
21
22
  from .utils import SpikeSortingError, ShellScript
22
23
 
23
24
 
24
- default_job_kwargs = {"n_jobs": -1}
25
-
26
25
  default_job_kwargs_description = {
27
- "n_jobs": "Number of jobs (when saving ti binary) - default -1 (all cores)",
28
- "chunk_size": "Number of samples per chunk (when saving ti binary) - default global",
26
+ "n_jobs": "Number of jobs (when saving to binary) - default global",
27
+ "chunk_size": "Number of samples per chunk (when saving to binary) - default global",
29
28
  "chunk_memory": "Memory usage for each job (e.g. '100M', '1G') (when saving to binary) - default global",
30
29
  "total_memory": "Total memory usage (e.g. '500M', '2G') (when saving to binary) - default global",
31
30
  "chunk_duration": "Chunk duration in s if float or with units if str (e.g. '1s', '500ms') (when saving to binary)"
@@ -156,7 +155,7 @@ class BaseSorter:
156
155
  def default_params(cls):
157
156
  p = copy.deepcopy(cls._default_params)
158
157
  if cls.requires_binary_data:
159
- job_kwargs = fix_job_kwargs(default_job_kwargs)
158
+ job_kwargs = get_global_job_kwargs()
160
159
  p.update(job_kwargs)
161
160
  return p
162
161
 
@@ -184,7 +183,7 @@ class BaseSorter:
184
183
  # custom check params
185
184
  params = cls._check_params(recording, output_folder, params)
186
185
  # common check : filter warning
187
- if recording.is_filtered and cls._check_apply_filter_in_params(params) and verbose:
186
+ if recording.is_filtered() and cls._check_apply_filter_in_params(params) and verbose:
188
187
  print(f"Warning! The recording is already filtered, but {cls.sorter_name} filter is enabled")
189
188
 
190
189
  # dump parameters inside the folder with json
@@ -37,6 +37,7 @@ class Kilosort2Sorter(KilosortBase, BaseSorter):
37
37
  "detect_threshold": 6,
38
38
  "projection_threshold": [10, 4],
39
39
  "preclust_threshold": 8,
40
+ "whiteningRange": 32, # samples of the template to use for whitening "spatial" dimension
40
41
  "momentum": [20.0, 400.0],
41
42
  "car": True,
42
43
  "minFR": 0.1,
@@ -62,6 +63,7 @@ class Kilosort2Sorter(KilosortBase, BaseSorter):
62
63
  "detect_threshold": "Threshold for spike detection",
63
64
  "projection_threshold": "Threshold on projections",
64
65
  "preclust_threshold": "Threshold crossings for pre-clustering (in PCA projection space)",
66
+ "whiteningRange": "Number of channels to use for whitening each channel",
65
67
  "momentum": "Number of samples to average over (annealed from first to second value)",
66
68
  "car": "Enable or disable common reference",
67
69
  "minFR": "Minimum spike rate (Hz), if a cluster falls below this for too long it gets removed",
@@ -72,7 +74,7 @@ class Kilosort2Sorter(KilosortBase, BaseSorter):
72
74
  "nPCs": "Number of PCA dimensions",
73
75
  "ntbuff": "Samples of symmetrical buffer for whitening and spike detection",
74
76
  "nfilt_factor": "Max number of clusters per good channel (even temporary ones) 4",
75
- "NT": "Batch size (if None it is automatically computed)",
77
+ "NT": "Batch size (if None it is automatically computed--recommended Kilosort behavior if ntbuff also not changed)",
76
78
  "AUCsplit": "Threshold on the area under the curve (AUC) criterion for performing a split in the final step",
77
79
  "wave_length": "size of the waveform extracted around each detected peak, (Default 61, maximum 81)",
78
80
  "keep_good_only": "If True only 'good' units are returned",
@@ -199,7 +201,7 @@ class Kilosort2Sorter(KilosortBase, BaseSorter):
199
201
  ops["NT"] = params[
200
202
  "NT"
201
203
  ] # must be multiple of 32 + ntbuff. This is the batch size (try decreasing if out of memory).
202
- ops["whiteningRange"] = 32.0 # number of channels to use for whitening each channel
204
+ ops["whiteningRange"] = params["whiteningRange"] # number of channels to use for whitening each channel
203
205
  ops["nSkipCov"] = 25.0 # compute whitening matrix from every N-th batch
204
206
  ops["nPCs"] = params["nPCs"] # how many PCs to project the spikes into
205
207
  ops["useRAM"] = 0.0 # not yet available
@@ -41,6 +41,7 @@ class Kilosort2_5Sorter(KilosortBase, BaseSorter):
41
41
  "detect_threshold": 6,
42
42
  "projection_threshold": [10, 4],
43
43
  "preclust_threshold": 8,
44
+ "whiteningRange": 32.0,
44
45
  "momentum": [20.0, 400.0],
45
46
  "car": True,
46
47
  "minFR": 0.1,
@@ -69,6 +70,7 @@ class Kilosort2_5Sorter(KilosortBase, BaseSorter):
69
70
  "detect_threshold": "Threshold for spike detection",
70
71
  "projection_threshold": "Threshold on projections",
71
72
  "preclust_threshold": "Threshold crossings for pre-clustering (in PCA projection space)",
73
+ "whiteningRange": "Number of channels to use for whitening each channel",
72
74
  "momentum": "Number of samples to average over (annealed from first to second value)",
73
75
  "car": "Enable or disable common reference",
74
76
  "minFR": "Minimum spike rate (Hz), if a cluster falls below this for too long it gets removed",
@@ -220,7 +222,7 @@ class Kilosort2_5Sorter(KilosortBase, BaseSorter):
220
222
  ops["NT"] = params[
221
223
  "NT"
222
224
  ] # must be multiple of 32 + ntbuff. This is the batch size (try decreasing if out of memory).
223
- ops["whiteningRange"] = 32.0 # number of channels to use for whitening each channel
225
+ ops["whiteningRange"] = params["whiteningRange"] # number of channels to use for whitening each channel
224
226
  ops["nSkipCov"] = 25.0 # compute whitening matrix from every N-th batch
225
227
  ops["nPCs"] = params["nPCs"] # how many PCs to project the spikes into
226
228
  ops["useRAM"] = 0.0 # not yet available
@@ -38,6 +38,7 @@ class Kilosort3Sorter(KilosortBase, BaseSorter):
38
38
  "detect_threshold": 6,
39
39
  "projection_threshold": [9, 9],
40
40
  "preclust_threshold": 8,
41
+ "whiteningRange": 32,
41
42
  "car": True,
42
43
  "minFR": 0.2,
43
44
  "minfr_goodchannels": 0.2,
@@ -65,6 +66,7 @@ class Kilosort3Sorter(KilosortBase, BaseSorter):
65
66
  "detect_threshold": "Threshold for spike detection",
66
67
  "projection_threshold": "Threshold on projections",
67
68
  "preclust_threshold": "Threshold crossings for pre-clustering (in PCA projection space)",
69
+ "whiteningRange": "number of channels to use for whitening each channel",
68
70
  "car": "Enable or disable common reference",
69
71
  "minFR": "Minimum spike rate (Hz), if a cluster falls below this for too long it gets removed",
70
72
  "minfr_goodchannels": "Minimum firing rate on a 'good' channel",
@@ -77,7 +79,7 @@ class Kilosort3Sorter(KilosortBase, BaseSorter):
77
79
  "ntbuff": "Samples of symmetrical buffer for whitening and spike detection",
78
80
  "nfilt_factor": "Max number of clusters per good channel (even temporary ones) 4",
79
81
  "do_correction": "If True drift registration is applied",
80
- "NT": "Batch size (if None it is automatically computed)",
82
+ "NT": "Batch size (if None it is automatically computed--recommended Kilosort behavior if ntbuff also not changed)",
81
83
  "AUCsplit": "Threshold on the area under the curve (AUC) criterion for performing a split in the final step",
82
84
  "wave_length": "size of the waveform extracted around each detected peak, (Default 61, maximum 81)",
83
85
  "keep_good_only": "If True only 'good' units are returned",
@@ -212,7 +214,7 @@ class Kilosort3Sorter(KilosortBase, BaseSorter):
212
214
  ops["NT"] = params[
213
215
  "NT"
214
216
  ] # must be multiple of 32 + ntbuff. This is the batch size (try decreasing if out of memory).
215
- ops["whiteningRange"] = 32.0 # number of channels to use for whitening each channel
217
+ ops["whiteningRange"] = params["whiteningRange"] # number of channels to use for whitening each channel
216
218
  ops["nSkipCov"] = 25.0 # compute whitening matrix from every N-th batch
217
219
  ops["scaleproc"] = 200.0 # int16 scaling of whitened data
218
220
  ops["nPCs"] = params["nPCs"] # how many PCs to project the spikes into
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from pathlib import Path
4
4
  from typing import Union
5
+ from packaging import version
5
6
 
6
7
  from ..basesorter import BaseSorter
7
8
  from .kilosortbase import KilosortBase
@@ -24,11 +25,14 @@ class Kilosort4Sorter(BaseSorter):
24
25
  "do_CAR": True,
25
26
  "invert_sign": False,
26
27
  "nt": 61,
28
+ "shift": None,
29
+ "scale": None,
27
30
  "artifact_threshold": None,
28
31
  "nskip": 25,
29
32
  "whitening_range": 32,
30
33
  "binning_depth": 5,
31
34
  "sig_interp": 20,
35
+ "drift_smoothing": [0.5, 0.5, 0.5],
32
36
  "nt0min": None,
33
37
  "dmin": None,
34
38
  "dminx": 32,
@@ -63,11 +67,14 @@ class Kilosort4Sorter(BaseSorter):
63
67
  "do_CAR": "Whether to perform common average reference. Default value: True.",
64
68
  "invert_sign": "Invert the sign of the data. Default value: False.",
65
69
  "nt": "Number of samples per waveform. Also size of symmetric padding for filtering. Default value: 61.",
70
+ "shift": "Scalar shift to apply to data before all other operations. Default None.",
71
+ "scale": "Scaling factor to apply to data before all other operations. Default None.",
66
72
  "artifact_threshold": "If a batch contains absolute values above this number, it will be zeroed out under the assumption that a recording artifact is present. By default, the threshold is infinite (so that no zeroing occurs). Default value: None.",
67
73
  "nskip": "Batch stride for computing whitening matrix. Default value: 25.",
68
74
  "whitening_range": "Number of nearby channels used to estimate the whitening matrix. Default value: 32.",
69
75
  "binning_depth": "For drift correction, vertical bin size in microns used for 2D histogram. Default value: 5.",
70
76
  "sig_interp": "For drift correction, sigma for interpolation (spatial standard deviation). Approximate smoothness scale in units of microns. Default value: 20.",
77
+ "drift_smoothing": "Amount of gaussian smoothing to apply to the spatiotemporal drift estimation, for x,y,time axes in units of registration blocks (for x,y axes) and batch size (for time axis). The x,y smoothing has no effect for `nblocks = 1`.",
71
78
  "nt0min": "Sample index for aligning waveforms, so that their minimum or maximum value happens here. Default of 20. Default value: None.",
72
79
  "dmin": "Vertical spacing of template centers used for spike detection, in microns. Determined automatically by default. Default value: None.",
73
80
  "dminx": "Horizontal spacing of template centers used for spike detection, in microns. Default value: 32.",
@@ -153,6 +160,11 @@ class Kilosort4Sorter(BaseSorter):
153
160
  import torch
154
161
  import numpy as np
155
162
 
163
+ if verbose:
164
+ import logging
165
+
166
+ logging.basicConfig(level=logging.INFO)
167
+
156
168
  sorter_output_folder = sorter_output_folder.absolute()
157
169
 
158
170
  probe_filename = sorter_output_folder / "probe.prb"
@@ -194,11 +206,17 @@ class Kilosort4Sorter(BaseSorter):
194
206
  data_dir = ""
195
207
  results_dir = sorter_output_folder
196
208
  filename, data_dir, results_dir, probe = set_files(settings, filename, probe, probe_name, data_dir, results_dir)
197
- ops = initialize_ops(settings, probe, recording.get_dtype(), do_CAR, invert_sign, device)
209
+ if version.parse(cls.get_sorter_version()) >= version.parse("4.0.12"):
210
+ ops = initialize_ops(settings, probe, recording.get_dtype(), do_CAR, invert_sign, device, False)
211
+ n_chan_bin, fs, NT, nt, twav_min, chan_map, dtype, do_CAR, invert, _, _, tmin, tmax, artifact, _, _ = (
212
+ get_run_parameters(ops)
213
+ )
214
+ else:
215
+ ops = initialize_ops(settings, probe, recording.get_dtype(), do_CAR, invert_sign, device)
216
+ n_chan_bin, fs, NT, nt, twav_min, chan_map, dtype, do_CAR, invert, _, _, tmin, tmax, artifact = (
217
+ get_run_parameters(ops)
218
+ )
198
219
 
199
- n_chan_bin, fs, NT, nt, twav_min, chan_map, dtype, do_CAR, invert, _, _, tmin, tmax, artifact = (
200
- get_run_parameters(ops)
201
- )
202
220
  # Set preprocessing and drift correction parameters
203
221
  if not params["skip_kilosort_preprocessing"]:
204
222
  ops = compute_preprocessing(ops, device, tic0=tic0, file_object=file_object)
@@ -120,7 +120,6 @@ class Mountainsort5Sorter(BaseSorter):
120
120
  @classmethod
121
121
  def _run_from_folder(cls, sorter_output_folder, params, verbose):
122
122
  import mountainsort5 as ms5
123
- from mountainsort5.util import create_cached_recording
124
123
 
125
124
  recording = cls.load_recording_from_folder(sorter_output_folder.parent, with_warnings=False)
126
125
  if recording is None:
@@ -203,7 +203,7 @@ class LocalizeCenterOfMass(LocalizeBase):
203
203
  wf = waveforms[idx][:, :, chan_inds]
204
204
 
205
205
  if self.feature == "ptp":
206
- wf_data = wf.ptp(axis=1)
206
+ wf_data = np.ptp(wf, axis=1)
207
207
  elif self.feature == "mean":
208
208
  wf_data = wf.mean(axis=1)
209
209
  elif self.feature == "energy":
@@ -292,7 +292,7 @@ class LocalizeMonopolarTriangulation(PipelineNode):
292
292
 
293
293
  wf = waveforms[i, :][:, chan_inds]
294
294
  if self.feature == "ptp":
295
- wf_data = wf.ptp(axis=0)
295
+ wf_data = np.ptp(wf, axis=0)
296
296
  elif self.feature == "energy":
297
297
  wf_data = np.linalg.norm(wf, axis=0)
298
298
  elif self.feature == "peak_voltage":
@@ -81,7 +81,7 @@ class WaveformThresholder(WaveformsNode):
81
81
 
82
82
  def compute(self, traces, peaks, waveforms):
83
83
  if self.feature == "ptp":
84
- wf_data = waveforms.ptp(axis=1) / self.noise_levels
84
+ wf_data = np.ptp(waveforms, axis=1) / self.noise_levels
85
85
  elif self.feature == "mean":
86
86
  wf_data = waveforms.mean(axis=1) / self.noise_levels
87
87
  elif self.feature == "energy":