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.
- {spikeinterface-0.100.7/src/spikeinterface.egg-info → spikeinterface-0.100.8}/PKG-INFO +2 -2
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/pyproject.toml +2 -2
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/baserecording.py +3 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/core_tools.py +6 -1
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/frameslicerecording.py +0 -4
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/generate.py +2 -6
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/globals.py +8 -5
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/job_tools.py +22 -10
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/segmentutils.py +0 -5
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/cbin_ibl.py +0 -4
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/nwbextractors.py +0 -5
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/average_across_direction.py +0 -5
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/decimate.py +0 -7
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/deepinterpolation/deepinterpolation.py +0 -6
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/directional_derivative.py +0 -5
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/phase_shift.py +0 -4
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/remove_artifacts.py +0 -5
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/resample.py +0 -5
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/silence_periods.py +0 -5
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/zero_channel_pad.py +0 -9
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/qualitymetrics/misc_metrics.py +1 -1
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/basesorter.py +5 -6
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort2.py +4 -2
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort2_5.py +3 -1
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort3.py +4 -2
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort4.py +22 -4
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/mountainsort5.py +0 -1
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/peak_localization.py +2 -2
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/waveforms/waveform_thresholder.py +1 -1
- {spikeinterface-0.100.7 → spikeinterface-0.100.8/src/spikeinterface.egg-info}/PKG-INFO +2 -2
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface.egg-info/requires.txt +1 -1
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/LICENSE +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/README.md +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/setup.cfg +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/setup.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/comparison/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/comparison/basecomparison.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/comparison/collision.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/comparison/comparisontools.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/comparison/correlogram.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/comparison/groundtruthstudy.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/comparison/hybrid.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/comparison/multicomparisons.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/comparison/paircomparisons.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/base.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/baseevent.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/baserecordingsnippets.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/basesnippets.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/basesorting.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/binaryfolder.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/binaryrecordingextractor.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/channelsaggregationrecording.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/channelslice.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/datasets.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/frameslicesorting.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/node_pipeline.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/npyfoldersnippets.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/npysnippetsextractor.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/npzfolder.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/npzsortingextractor.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/numpyextractors.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/old_api_utils.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/recording_tools.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/snippets_tools.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/sorting_tools.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/sortingfolder.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/sparsity.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/template.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/template_tools.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/testing.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/testing_tools.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/unitsaggregationsorting.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/unitsselectionsorting.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/waveform_extractor.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/waveform_tools.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/zarrextractors.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/zarrrecordingextractor.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/auto_merge.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/curation_tools.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/curationsorting.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/mergeunitssorting.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/remove_duplicated_spikes.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/remove_excess_spikes.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/remove_redundant.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/sortingview_curation.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/curation/splitunitsorting.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/exporters/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/exporters/report.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/exporters/to_phy.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/alfsortingextractor.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/bids.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/cellexplorersortingextractor.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/combinatoextractors.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/extractorlist.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/hdsortextractors.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/herdingspikesextractors.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/iblstreamingrecording.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/klustaextractors.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/matlabhelpers.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/mclustextractors.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/mcsh5extractors.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/mdaextractors.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/alphaomega.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/axona.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/biocam.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/blackrock.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/ced.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/edf.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/intan.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/maxwell.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/mcsraw.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/mearec.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/neo_utils.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/neobaseextractor.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/neuralynx.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/neuroexplorer.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/neuroscope.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/nix.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/openephys.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/plexon.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/plexon2.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/spike2.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/spikegadgets.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/spikeglx.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neoextractors/tdt.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/neuropixels_utils.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/phykilosortextractors.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/shybridextractors.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/spykingcircusextractors.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/toy_example.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/tridesclousextractors.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/waveclussnippetstextractors.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/waveclustextractors.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/yassextractors.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/full.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/generation/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/generation/drift_tools.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/alignsorting.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/amplitude_scalings.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/correlograms.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/isi.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/noise_level.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/principal_component.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/spike_amplitudes.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/spike_locations.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/template_metrics.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/template_similarity.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/postprocessing/unit_localization.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/align_snippets.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/astype.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/basepreprocessor.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/clip.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/common_reference.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/correct_lsb.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/deepinterpolation/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/deepinterpolation/generators.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/deepinterpolation/tf_utils.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/deepinterpolation/train.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/depth_order.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/detect_bad_channels.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/filter.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/filter_gaussian.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/filter_opencl.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/highpass_spatial_filter.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/interpolate_bad_channels.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/motion.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/normalize_scale.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/preprocessing_tools.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/preprocessinglist.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/rectify.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/unsigned_to_signed.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/whiten.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/qualitymetrics/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/qualitymetrics/pca_metrics.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/qualitymetrics/quality_metric_calculator.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/qualitymetrics/quality_metric_list.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/qualitymetrics/utils.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/container_tools.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/combinato.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/hdsort.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/hdsort_master.m +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/herdingspikes.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/ironclust.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort2_5_master.m +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort2_master.m +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort3_master.m +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort_master.m +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosortbase.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/klusta.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/klusta_config_default.prm +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/mountainsort4.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/pykilosort.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/sc_config_default.params +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/spyking_circus.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/tridesclous.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/waveclus.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/waveclus_master.m +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/waveclus_snippets.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/waveclus_snippets_master.m +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/yass.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/yass_config_default.yaml +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/internal/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/internal/si_based.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/internal/spyking_circus2.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/internal/tridesclous2.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/launcher.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/runsorter.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/sorterlist.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/utils/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/utils/constructNPYheader.m +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/utils/misc.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/utils/shellscript.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/utils/writeNPY.m +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/benchmark/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/benchmark/benchmark_clustering.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/benchmark/benchmark_matching.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/benchmark/benchmark_motion_estimation.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/benchmark/benchmark_motion_interpolation.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/benchmark/benchmark_peak_localization.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/benchmark/benchmark_peak_selection.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/benchmark/benchmark_tools.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/circus.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/clean.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/clustering_tools.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/dummy.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/isocut5.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/main.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/merge.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/method_list.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/position.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/position_and_features.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/position_and_pca.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/position_ptp_scaled.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/random_projections.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/sliding_hdbscan.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/sliding_nn.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/split.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/tools.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/clustering/triage.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/features_from_peaks.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/matching/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/matching/circus.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/matching/main.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/matching/method_list.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/matching/naive.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/matching/tdc.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/matching/wobble.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/motion_estimation.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/motion_interpolation.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/peak_detection.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/peak_pipeline.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/peak_selection.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/tools.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/waveforms/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/waveforms/neural_network_denoiser.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/waveforms/savgol_denoiser.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/waveforms/temporal_pca.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sortingcomponents/waveforms/waveform_utils.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/__init__.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/all_amplitudes_distributions.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/amplitudes.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/autocorrelograms.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/base.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/collision.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/comparison.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/crosscorrelograms.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/gtstudy.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/isi_distribution.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/metrics.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/motion.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/multicomparison.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/peak_activity.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/probe_map.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/quality_metrics.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/rasters.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/sorting_summary.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/spike_locations.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/spikes_on_traces.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/template_metrics.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/template_similarity.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/traces.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/unit_depths.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/unit_locations.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/unit_presence.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/unit_probe_map.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/unit_summary.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/unit_templates.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/unit_waveforms.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/unit_waveforms_density_map.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/utils.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/utils_ipywidgets.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/utils_matplotlib.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/utils_sortingview.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/widgets/widget_list.py +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface.egg-info/SOURCES.txt +0 -0
- {spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface.egg-info/dependency_links.txt +0 -0
- {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.
|
|
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.
|
|
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
|
-
|
|
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):
|
{spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/core/frameslicerecording.py
RENAMED
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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
|
|
{spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/extractors/nwbextractors.py
RENAMED
|
@@ -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,
|
{spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/decimate.py
RENAMED
|
@@ -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,
|
{spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/phase_shift.py
RENAMED
|
@@ -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]
|
{spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/preprocessing/resample.py
RENAMED
|
@@ -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
|
{spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/qualitymetrics/misc_metrics.py
RENAMED
|
@@ -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
|
|
28
|
-
"chunk_size": "Number of samples per chunk (when saving
|
|
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 =
|
|
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
|
{spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort2.py
RENAMED
|
@@ -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"] =
|
|
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
|
{spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort2_5.py
RENAMED
|
@@ -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"] =
|
|
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
|
{spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort3.py
RENAMED
|
@@ -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"] =
|
|
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
|
{spikeinterface-0.100.7 → spikeinterface-0.100.8}/src/spikeinterface/sorters/external/kilosort4.py
RENAMED
|
@@ -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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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":
|