spikeinterface 0.102.1__tar.gz → 0.102.2__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.102.1/src/spikeinterface.egg-info → spikeinterface-0.102.2}/PKG-INFO +9 -9
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/pyproject.toml +9 -10
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/benchmark/benchmark_base.py +202 -30
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/benchmark/benchmark_clustering.py +28 -106
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/benchmark/benchmark_matching.py +17 -36
- spikeinterface-0.102.2/src/spikeinterface/benchmark/benchmark_merging.py +173 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/benchmark/benchmark_motion_estimation.py +28 -28
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/benchmark/benchmark_peak_detection.py +41 -18
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/benchmark/benchmark_peak_localization.py +10 -8
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/benchmark/benchmark_peak_selection.py +1 -1
- spikeinterface-0.102.2/src/spikeinterface/benchmark/benchmark_plot_tools.py +786 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/benchmark/benchmark_sorter.py +24 -4
- spikeinterface-0.102.2/src/spikeinterface/benchmark/benchmark_tools.py +17 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/comparison/basecomparison.py +22 -8
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/comparison/collision.py +3 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/comparison/correlogram.py +3 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/comparison/multicomparisons.py +8 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/comparison/paircomparisons.py +4 -13
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/__init__.py +2 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/base.py +14 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/baserecording.py +8 -8
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/baserecordingsnippets.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/binaryrecordingextractor.py +1 -11
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/channelsaggregationrecording.py +62 -10
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/channelslice.py +6 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/core_tools.py +44 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/frameslicerecording.py +0 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/frameslicesorting.py +0 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/generate.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/motion.py +8 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/node_pipeline.py +25 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/npyfoldersnippets.py +0 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/numpyextractors.py +56 -11
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/snippets_tools.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/sorting_tools.py +8 -13
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/sortinganalyzer.py +85 -26
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/sparsity.py +47 -4
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/template_tools.py +4 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/testing.py +0 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/unitsaggregationsorting.py +35 -33
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/waveform_tools.py +0 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/waveforms_extractor_backwards_compatibility.py +3 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/zarrextractors.py +6 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/curation/__init__.py +5 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/curation/auto_merge.py +279 -12
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/curation/remove_excess_spikes.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/curation/remove_redundant.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/curation/sortingview_curation.py +23 -16
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/curation/train_manual_curation.py +22 -20
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/exporters/report.py +4 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/cellexplorersortingextractor.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/iblextractors.py +11 -10
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/mdaextractors.py +22 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/intan.py +35 -15
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/neo_utils.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/neobaseextractor.py +44 -28
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/openephys.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/sinapsrecordingextractors.py +3 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/toy_example.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/generation/__init__.py +3 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/generation/drift_tools.py +4 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/generation/drifting_generator.py +1 -0
- spikeinterface-0.102.2/src/spikeinterface/generation/splitting_tools.py +147 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/alignsorting.py +0 -4
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/amplitude_scalings.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/correlograms.py +9 -7
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/isi.py +6 -4
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/localization_tools.py +10 -8
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/noise_level.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/spike_amplitudes.py +0 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/spike_locations.py +0 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/template_metrics.py +6 -6
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/template_similarity.py +7 -5
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/unit_locations.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/astype.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/average_across_direction.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/clip.py +6 -4
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/common_reference.py +5 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/correct_lsb.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/decimate.py +3 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/deepinterpolation/deepinterpolation.py +5 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/deepinterpolation/generators.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/deepinterpolation/train.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/depth_order.py +3 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/detect_bad_channels.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/directional_derivative.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/filter.py +6 -6
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/filter_gaussian.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/filter_opencl.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/highpass_spatial_filter.py +3 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/interpolate_bad_channels.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/motion.py +19 -4
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/normalize_scale.py +6 -6
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/phase_shift.py +3 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/preprocessinglist.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/rectify.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/remove_artifacts.py +7 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/resample.py +3 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/silence_periods.py +6 -4
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/unsigned_to_signed.py +4 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/whiten.py +5 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/zero_channel_pad.py +5 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/qualitymetrics/misc_metrics.py +18 -14
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/qualitymetrics/pca_metrics.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/qualitymetrics/quality_metric_calculator.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/container_tools.py +3 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/combinato.py +2 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/hdsort.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/herdingspikes.py +6 -5
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/ironclust.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosort.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosort2.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosort2_5.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosort3.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosort4.py +32 -15
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosortbase.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/klusta.py +11 -12
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/mountainsort4.py +5 -8
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/mountainsort5.py +12 -13
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/pykilosort.py +10 -9
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/spyking_circus.py +11 -10
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/tridesclous.py +8 -18
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/waveclus.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/waveclus_snippets.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/yass.py +8 -10
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/internal/simplesorter.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/internal/spyking_circus2.py +56 -65
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/internal/tridesclous2.py +10 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/runsorter.py +3 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/clustering_tools.py +1 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/merge.py +5 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/method_list.py +8 -0
- spikeinterface-0.102.2/src/spikeinterface/sortingcomponents/clustering/peak_svd.py +137 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/position_and_features.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/split.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/tdc.py +55 -35
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/matching/tdc.py +255 -49
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/motion/__init__.py +1 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/motion/decentralized.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/motion/dredge.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/motion/iterative_template.py +1 -1
- spikeinterface-0.102.2/src/spikeinterface/sortingcomponents/motion/medicine.py +102 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/motion/motion_estimation.py +9 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/motion/motion_interpolation.py +45 -11
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/peak_detection.py +51 -23
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/peak_localization.py +2 -5
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/tools.py +27 -11
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/waveforms/temporal_pca.py +170 -24
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/all_amplitudes_distributions.py +4 -3
- spikeinterface-0.102.2/src/spikeinterface/widgets/amplitudes.py +149 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/base.py +2 -2
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/crosscorrelograms.py +10 -5
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/metrics.py +4 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/motion.py +27 -58
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/peak_activity.py +84 -14
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/potential_merges.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/quality_metrics.py +4 -3
- spikeinterface-0.102.2/src/spikeinterface/widgets/rasters.py +359 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/sorting_summary.py +9 -5
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/spike_locations.py +4 -3
- spikeinterface-0.102.1/src/spikeinterface/widgets/amplitudes.py → spikeinterface-0.102.2/src/spikeinterface/widgets/spike_locations_by_time.py +25 -50
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/spikes_on_traces.py +9 -9
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/template_metrics.py +4 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/template_similarity.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/traces.py +6 -6
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/unit_depths.py +4 -4
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/unit_locations.py +4 -6
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/unit_probe_map.py +2 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/unit_summary.py +10 -7
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/unit_templates.py +1 -1
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/unit_waveforms.py +32 -18
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/unit_waveforms_density_map.py +4 -4
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/utils.py +20 -4
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/utils_sortingview.py +6 -3
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/widget_list.py +13 -12
- {spikeinterface-0.102.1 → spikeinterface-0.102.2/src/spikeinterface.egg-info}/PKG-INFO +9 -9
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface.egg-info/SOURCES.txt +5 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface.egg-info/requires.txt +6 -7
- spikeinterface-0.102.1/src/spikeinterface/benchmark/benchmark_plot_tools.py +0 -305
- spikeinterface-0.102.1/src/spikeinterface/benchmark/benchmark_tools.py +0 -0
- spikeinterface-0.102.1/src/spikeinterface/widgets/rasters.py +0 -88
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/LICENSE +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/README.md +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/setup.cfg +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/setup.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/benchmark/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/benchmark/benchmark_motion_interpolation.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/comparison/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/comparison/comparisontools.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/comparison/groundtruthstudy.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/comparison/hybrid.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/analyzer_extension_core.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/baseevent.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/basesnippets.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/basesorting.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/binaryfolder.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/datasets.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/globals.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/job_tools.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/loading.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/npysnippetsextractor.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/npzfolder.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/npzsortingextractor.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/old_api_utils.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/recording_tools.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/segmentutils.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/sortingfolder.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/template.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/testing_tools.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/unitsselectionsorting.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/core/zarrrecordingextractor.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/curation/curation_format.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/curation/curation_tools.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/curation/curationsorting.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/curation/mergeunitssorting.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/curation/model_based_curation.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/curation/remove_duplicated_spikes.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/curation/splitunitsorting.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/exporters/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/exporters/to_phy.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/alfsortingextractor.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/bids.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/cbin_ibl.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/combinatoextractors.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/extractorlist.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/hdsortextractors.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/herdingspikesextractors.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/klustaextractors.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/matlabhelpers.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/mclustextractors.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/mcsh5extractors.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/alphaomega.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/axona.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/biocam.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/blackrock.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/ced.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/edf.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/maxwell.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/mcsraw.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/mearec.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/neuralynx.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/neuroexplorer.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/neuronexus.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/neuroscope.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/nix.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/plexon.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/plexon2.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/spike2.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/spikegadgets.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/spikeglx.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/tdt.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neuropixels_utils.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/nwbextractors.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/phykilosortextractors.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/shybridextractors.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/spykingcircusextractors.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/tridesclousextractors.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/waveclussnippetstextractors.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/waveclustextractors.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/extractors/yassextractors.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/full.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/generation/hybrid_tools.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/generation/noise_tools.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/generation/template_database.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/principal_component.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/align_snippets.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/basepreprocessor.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/deepinterpolation/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/deepinterpolation/tf_utils.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/preprocessing_tools.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/scale.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/qualitymetrics/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/qualitymetrics/quality_metric_list.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/qualitymetrics/utils.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/basesorter.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/hdsort_master.m +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosort2_5_master.m +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosort2_master.m +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosort3_master.m +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosort_master.m +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/klusta_config_default.prm +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/sc_config_default.params +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/waveclus_master.m +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/waveclus_snippets_master.m +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/yass_config_default.yaml +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/internal/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/internal/si_based.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/launcher.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/sorterlist.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/utils/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/utils/constructNPYheader.m +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/utils/misc.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/utils/shellscript.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sorters/utils/writeNPY.m +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/circus.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/clean.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/dummy.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/isocut5.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/main.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/position.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/position_and_pca.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/position_ptp_scaled.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/random_projections.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/sliding_hdbscan.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/sliding_nn.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/tools.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/triage.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/features_from_peaks.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/matching/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/matching/base.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/matching/circus.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/matching/main.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/matching/method_list.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/matching/naive.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/matching/wobble.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/motion/motion_cleaner.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/motion/motion_utils.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/peak_pipeline.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/peak_selection.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/waveforms/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/waveforms/hanning_filter.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/waveforms/neural_network_denoiser.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/waveforms/savgol_denoiser.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/waveforms/waveform_thresholder.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/waveforms/waveform_utils.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/__init__.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/autocorrelograms.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/collision.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/comparison.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/gtstudy.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/isi_distribution.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/multicomparison.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/peaks_on_probe.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/probe_map.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/unit_presence.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/utils_ipywidgets.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/widgets/utils_matplotlib.py +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface.egg-info/dependency_links.txt +0 -0
- {spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: spikeinterface
|
|
3
|
-
Version: 0.102.
|
|
3
|
+
Version: 0.102.2
|
|
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
|
|
@@ -33,13 +33,11 @@ Requires-Dist: pyedflib<0.1.39,>=0.1.30; extra == "extractors"
|
|
|
33
33
|
Requires-Dist: sonpy; python_version < "3.10" and extra == "extractors"
|
|
34
34
|
Requires-Dist: lxml; extra == "extractors"
|
|
35
35
|
Requires-Dist: scipy; extra == "extractors"
|
|
36
|
-
Requires-Dist:
|
|
37
|
-
Requires-Dist: ibllib>=2.36.0; extra == "extractors"
|
|
36
|
+
Requires-Dist: ibllib; extra == "extractors"
|
|
38
37
|
Requires-Dist: pymatreader>=0.0.32; extra == "extractors"
|
|
39
38
|
Requires-Dist: zugbruecke>=0.2; sys_platform != "win32" and extra == "extractors"
|
|
40
39
|
Provides-Extra: streaming-extractors
|
|
41
|
-
Requires-Dist:
|
|
42
|
-
Requires-Dist: ibllib>=2.36.0; extra == "streaming-extractors"
|
|
40
|
+
Requires-Dist: ibllib; extra == "streaming-extractors"
|
|
43
41
|
Requires-Dist: pynwb>=2.6.0; extra == "streaming-extractors"
|
|
44
42
|
Requires-Dist: fsspec; extra == "streaming-extractors"
|
|
45
43
|
Requires-Dist: aiohttp; extra == "streaming-extractors"
|
|
@@ -79,19 +77,20 @@ Provides-Extra: test-extractors
|
|
|
79
77
|
Requires-Dist: pooch>=1.8.2; extra == "test-extractors"
|
|
80
78
|
Requires-Dist: datalad>=1.0.2; extra == "test-extractors"
|
|
81
79
|
Provides-Extra: test-preprocessing
|
|
82
|
-
Requires-Dist: ibllib
|
|
80
|
+
Requires-Dist: ibllib; extra == "test-preprocessing"
|
|
83
81
|
Requires-Dist: torch; extra == "test-preprocessing"
|
|
84
82
|
Provides-Extra: test
|
|
85
83
|
Requires-Dist: pytest; extra == "test"
|
|
86
84
|
Requires-Dist: pytest-dependency; extra == "test"
|
|
87
85
|
Requires-Dist: pytest-cov; extra == "test"
|
|
86
|
+
Requires-Dist: psutil; extra == "test"
|
|
88
87
|
Requires-Dist: huggingface_hub; extra == "test"
|
|
89
|
-
Requires-Dist: ibllib
|
|
88
|
+
Requires-Dist: ibllib; extra == "test"
|
|
90
89
|
Requires-Dist: s3fs; extra == "test"
|
|
91
90
|
Requires-Dist: numba<0.61.0; python_version < "3.13" and extra == "test"
|
|
92
91
|
Requires-Dist: numba>=0.61.0; python_version >= "3.13" and extra == "test"
|
|
93
92
|
Requires-Dist: hdbscan>=0.8.33; extra == "test"
|
|
94
|
-
Requires-Dist: sortingview; extra == "test"
|
|
93
|
+
Requires-Dist: sortingview>=0.12.0; extra == "test"
|
|
95
94
|
Requires-Dist: torch; extra == "test"
|
|
96
95
|
Requires-Dist: skops; extra == "test"
|
|
97
96
|
Requires-Dist: huggingface_hub; extra == "test"
|
|
@@ -118,6 +117,7 @@ Requires-Dist: spikeinterface[test_core]; extra == "dev"
|
|
|
118
117
|
Requires-Dist: spikeinterface[docs]; extra == "dev"
|
|
119
118
|
Requires-Dist: black; extra == "dev"
|
|
120
119
|
Requires-Dist: pre-commit; extra == "dev"
|
|
120
|
+
Dynamic: license-file
|
|
121
121
|
|
|
122
122
|
# SpikeInterface: a unified framework for spike sorting
|
|
123
123
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "spikeinterface"
|
|
3
|
-
version = "0.102.
|
|
3
|
+
version = "0.102.2"
|
|
4
4
|
authors = [
|
|
5
5
|
{ name="Alessio Buccino", email="alessiop.buccino@gmail.com" },
|
|
6
6
|
{ name="Samuel Garcia", email="sam.garcia.die@gmail.com" },
|
|
@@ -31,7 +31,7 @@ dependencies = [
|
|
|
31
31
|
]
|
|
32
32
|
|
|
33
33
|
[build-system]
|
|
34
|
-
requires = ["setuptools>=
|
|
34
|
+
requires = ["setuptools>=78.0.2"]
|
|
35
35
|
build-backend = "setuptools.build_meta"
|
|
36
36
|
|
|
37
37
|
[tool.setuptools]
|
|
@@ -67,15 +67,13 @@ extractors = [
|
|
|
67
67
|
"sonpy;python_version<'3.10'",
|
|
68
68
|
"lxml", # lxml for neuroscope
|
|
69
69
|
"scipy",
|
|
70
|
-
"
|
|
71
|
-
"ibllib>=2.36.0", # streaming IBL
|
|
70
|
+
"ibllib", # streaming IBL
|
|
72
71
|
"pymatreader>=0.0.32", # For cell explorer matlab files
|
|
73
72
|
"zugbruecke>=0.2; sys_platform!='win32'", # For plexon2
|
|
74
73
|
]
|
|
75
74
|
|
|
76
75
|
streaming_extractors = [
|
|
77
|
-
"
|
|
78
|
-
"ibllib>=2.36.0", # streaming IBL
|
|
76
|
+
"ibllib", # streaming IBL
|
|
79
77
|
# Following dependencies are for streaming with nwb files
|
|
80
78
|
"pynwb>=2.6.0",
|
|
81
79
|
"fsspec",
|
|
@@ -135,12 +133,13 @@ test_extractors = [
|
|
|
135
133
|
# Functions to download data in neo test suite
|
|
136
134
|
"pooch>=1.8.2",
|
|
137
135
|
"datalad>=1.0.2",
|
|
136
|
+
# Commenting out for release
|
|
138
137
|
# "probeinterface @ git+https://github.com/SpikeInterface/probeinterface.git",
|
|
139
138
|
# "neo @ git+https://github.com/NeuralEnsemble/python-neo.git",
|
|
140
139
|
]
|
|
141
140
|
|
|
142
141
|
test_preprocessing = [
|
|
143
|
-
"ibllib
|
|
142
|
+
"ibllib", # for IBL
|
|
144
143
|
"torch",
|
|
145
144
|
]
|
|
146
145
|
|
|
@@ -149,11 +148,12 @@ test = [
|
|
|
149
148
|
"pytest",
|
|
150
149
|
"pytest-dependency",
|
|
151
150
|
"pytest-cov",
|
|
151
|
+
"psutil",
|
|
152
152
|
|
|
153
153
|
"huggingface_hub",
|
|
154
154
|
|
|
155
155
|
# preprocessing
|
|
156
|
-
"ibllib
|
|
156
|
+
"ibllib", # for IBL
|
|
157
157
|
|
|
158
158
|
# streaming templates
|
|
159
159
|
"s3fs",
|
|
@@ -164,7 +164,7 @@ test = [
|
|
|
164
164
|
"hdbscan>=0.8.33", # Previous version had a broken wheel
|
|
165
165
|
|
|
166
166
|
# for sortingview backend
|
|
167
|
-
"sortingview",
|
|
167
|
+
"sortingview>=0.12.0",
|
|
168
168
|
|
|
169
169
|
# for motion and sortingcomponents
|
|
170
170
|
"torch",
|
|
@@ -203,7 +203,6 @@ docs = [
|
|
|
203
203
|
# for release we need pypi, so this needs to be commented
|
|
204
204
|
# "probeinterface @ git+https://github.com/SpikeInterface/probeinterface.git", # We always build from the latest version
|
|
205
205
|
# "neo @ git+https://github.com/NeuralEnsemble/python-neo.git", # We always build from the latest version
|
|
206
|
-
|
|
207
206
|
]
|
|
208
207
|
|
|
209
208
|
dev = [
|
{spikeinterface-0.102.1 → spikeinterface-0.102.2}/src/spikeinterface/benchmark/benchmark_base.py
RENAMED
|
@@ -10,7 +10,7 @@ import time
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
from spikeinterface.core import SortingAnalyzer
|
|
13
|
-
|
|
13
|
+
from spikeinterface.core.job_tools import fix_job_kwargs, split_job_kwargs
|
|
14
14
|
from spikeinterface import load, create_sorting_analyzer, load_sorting_analyzer
|
|
15
15
|
from spikeinterface.widgets import get_some_colors
|
|
16
16
|
|
|
@@ -43,11 +43,37 @@ class BenchmarkStudy:
|
|
|
43
43
|
self.analyzers = {}
|
|
44
44
|
self.cases = {}
|
|
45
45
|
self.benchmarks = {}
|
|
46
|
+
self.levels = None
|
|
47
|
+
self.colors_by_case = None
|
|
48
|
+
self.colors_by_levels = {}
|
|
46
49
|
self.scan_folder()
|
|
47
|
-
self.colors = None
|
|
48
50
|
|
|
49
51
|
@classmethod
|
|
50
52
|
def create(cls, study_folder, datasets={}, cases={}, levels=None):
|
|
53
|
+
"""
|
|
54
|
+
Create a BenchmarkStudy from a dict of datasets and cases.
|
|
55
|
+
|
|
56
|
+
Parameters
|
|
57
|
+
----------
|
|
58
|
+
study_folder : str | Path
|
|
59
|
+
The folder where the study will be saved.
|
|
60
|
+
datasets : dict
|
|
61
|
+
A dict of datasets. The keys are the dataset names and the values are `SortingAnalyzer` objects.
|
|
62
|
+
Values can also be tuples with (recording, gt_sorting), but this is deprecated.
|
|
63
|
+
cases : dict
|
|
64
|
+
A dict of cases. The keys are the cases (str, or tuples) and the values are dictionaries containing:
|
|
65
|
+
|
|
66
|
+
* dataset
|
|
67
|
+
* label
|
|
68
|
+
* params
|
|
69
|
+
levels : list | None
|
|
70
|
+
If the keys of the cases are tuples, this is the list of levels names.
|
|
71
|
+
|
|
72
|
+
Returns
|
|
73
|
+
-------
|
|
74
|
+
study : BenchmarkStudy
|
|
75
|
+
The created study.
|
|
76
|
+
"""
|
|
51
77
|
# check that cases keys are homogeneous
|
|
52
78
|
key0 = list(cases.keys())[0]
|
|
53
79
|
if isinstance(key0, str):
|
|
@@ -132,6 +158,9 @@ class BenchmarkStudy:
|
|
|
132
158
|
return cls(study_folder)
|
|
133
159
|
|
|
134
160
|
def create_benchmark(self, key):
|
|
161
|
+
"""
|
|
162
|
+
Create a benchmark for a given key.
|
|
163
|
+
"""
|
|
135
164
|
raise NotImplementedError
|
|
136
165
|
|
|
137
166
|
def scan_folder(self):
|
|
@@ -167,7 +196,7 @@ class BenchmarkStudy:
|
|
|
167
196
|
result_folder = self.folder / "results" / self.key_to_str(key)
|
|
168
197
|
if result_folder.exists():
|
|
169
198
|
result = self.benchmark_class.load_folder(result_folder)
|
|
170
|
-
benchmark = self.create_benchmark(key)
|
|
199
|
+
benchmark = self.create_benchmark(key=key)
|
|
171
200
|
benchmark.result.update(result)
|
|
172
201
|
self.benchmarks[key] = benchmark
|
|
173
202
|
else:
|
|
@@ -219,7 +248,7 @@ class BenchmarkStudy:
|
|
|
219
248
|
for key in job_keys:
|
|
220
249
|
benchmark = self.create_benchmark(key)
|
|
221
250
|
t0 = time.perf_counter()
|
|
222
|
-
benchmark.run()
|
|
251
|
+
benchmark.run(**job_kwargs)
|
|
223
252
|
t1 = time.perf_counter()
|
|
224
253
|
self.benchmarks[key] = benchmark
|
|
225
254
|
bench_folder = self.folder / "results" / self.key_to_str(key)
|
|
@@ -228,19 +257,49 @@ class BenchmarkStudy:
|
|
|
228
257
|
benchmark.result["run_time"] = float(t1 - t0)
|
|
229
258
|
benchmark.save_main(bench_folder)
|
|
230
259
|
|
|
231
|
-
def set_colors(self, colors=None, map_name="
|
|
260
|
+
def set_colors(self, colors=None, map_name="tab10", levels_to_group_by=None):
|
|
261
|
+
"""
|
|
262
|
+
Set colors for the study cases or for a given levels_to_group_by.
|
|
263
|
+
|
|
264
|
+
Parmeters
|
|
265
|
+
---------
|
|
266
|
+
colors : dict | None, default: None
|
|
267
|
+
A user-defined dictionary with the case keys as keys and the colors as values.
|
|
268
|
+
Note that the case keys depend on the levels_to_group_by.
|
|
269
|
+
map_name : str, default: 'tab10'
|
|
270
|
+
The name of the colormap to use.
|
|
271
|
+
levels_to_group_by : list | None, default: None
|
|
272
|
+
The levels to group by. If None, the colors are set for the cases.
|
|
273
|
+
"""
|
|
274
|
+
case_keys, _ = self.get_grouped_keys_mapping(levels_to_group_by)
|
|
275
|
+
|
|
232
276
|
if colors is None:
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
case_keys, map_name=map_name, color_engine="matplotlib", shuffle=False, margin=0
|
|
277
|
+
colors = get_some_colors(
|
|
278
|
+
case_keys, map_name=map_name, color_engine="matplotlib", shuffle=False, margin=0, resample=False
|
|
236
279
|
)
|
|
280
|
+
if levels_to_group_by is None:
|
|
281
|
+
self.colors_by_case = colors
|
|
282
|
+
else:
|
|
283
|
+
level_key = tuple(levels_to_group_by) if len(levels_to_group_by) > 1 else levels_to_group_by[0]
|
|
284
|
+
self.colors_by_levels[level_key] = colors
|
|
237
285
|
else:
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
286
|
+
assert all([key in colors for key in case_keys]), f"You must provide colors for all cases keys: {case_keys}"
|
|
287
|
+
if levels_to_group_by is None:
|
|
288
|
+
self.colors_by_case = colors
|
|
289
|
+
else:
|
|
290
|
+
level_key = tuple(levels_to_group_by) if len(levels_to_group_by) > 1 else levels_to_group_by[0]
|
|
291
|
+
self.colors_by_levels[level_key] = colors
|
|
292
|
+
|
|
293
|
+
def get_colors(self, levels_to_group_by=None):
|
|
294
|
+
if levels_to_group_by is None:
|
|
295
|
+
if self.colors_by_case is None:
|
|
296
|
+
self.set_colors()
|
|
297
|
+
return self.colors_by_case
|
|
298
|
+
else:
|
|
299
|
+
level_key = tuple(levels_to_group_by) if len(levels_to_group_by) > 1 else levels_to_group_by[0]
|
|
300
|
+
if level_key not in self.colors_by_levels:
|
|
301
|
+
self.set_colors(levels_to_group_by=levels_to_group_by)
|
|
302
|
+
return self.colors_by_levels[level_key]
|
|
244
303
|
|
|
245
304
|
def get_run_times(self, case_keys=None):
|
|
246
305
|
if case_keys is None:
|
|
@@ -258,12 +317,60 @@ class BenchmarkStudy:
|
|
|
258
317
|
df.index.names = self.levels
|
|
259
318
|
return df
|
|
260
319
|
|
|
261
|
-
def
|
|
320
|
+
def get_grouped_keys_mapping(self, levels_to_group_by=None):
|
|
321
|
+
"""
|
|
322
|
+
Return a dictionary of grouped keys.
|
|
323
|
+
|
|
324
|
+
Parameters
|
|
325
|
+
----------
|
|
326
|
+
levels_to_group_by : list
|
|
327
|
+
A list of levels to group by.
|
|
328
|
+
|
|
329
|
+
Returns
|
|
330
|
+
-------
|
|
331
|
+
grouped_keys : dict
|
|
332
|
+
A dictionary of grouped keys, with the new keys as keys and the list of cases
|
|
333
|
+
associated to new keys as values.
|
|
334
|
+
labels : dict
|
|
335
|
+
A dictionary of labels, with the new keys as keys and the labels as values.
|
|
336
|
+
"""
|
|
337
|
+
cases = list(self.cases.keys())
|
|
338
|
+
if levels_to_group_by is None or self.levels is None:
|
|
339
|
+
keys_mapping = {key: [key] for key in cases}
|
|
340
|
+
elif len(self.levels) == 1:
|
|
341
|
+
keys_mapping = {key: [key] for key in cases}
|
|
342
|
+
else:
|
|
343
|
+
study_levels = self.levels
|
|
344
|
+
assert np.all(
|
|
345
|
+
[l in study_levels for l in levels_to_group_by]
|
|
346
|
+
), f"levels_to_group_by must be in {study_levels}, got {levels_to_group_by}"
|
|
347
|
+
keys_mapping = {}
|
|
348
|
+
for key in cases:
|
|
349
|
+
new_key = tuple(key[list(study_levels).index(level)] for level in levels_to_group_by)
|
|
350
|
+
if len(new_key) == 1:
|
|
351
|
+
new_key = new_key[0]
|
|
352
|
+
if new_key not in keys_mapping:
|
|
353
|
+
keys_mapping[new_key] = []
|
|
354
|
+
keys_mapping[new_key].append(key)
|
|
355
|
+
|
|
356
|
+
if levels_to_group_by is None:
|
|
357
|
+
labels = {key: self.cases[key]["label"] for key in cases}
|
|
358
|
+
else:
|
|
359
|
+
key0 = list(keys_mapping.keys())[0]
|
|
360
|
+
if isinstance(key0, tuple):
|
|
361
|
+
labels = {key: "-".join(key) for key in keys_mapping}
|
|
362
|
+
else:
|
|
363
|
+
labels = {key: key for key in keys_mapping}
|
|
364
|
+
|
|
365
|
+
return keys_mapping, labels
|
|
366
|
+
|
|
367
|
+
def plot_run_times(self, case_keys=None, **kwargs):
|
|
262
368
|
from .benchmark_plot_tools import plot_run_times
|
|
263
369
|
|
|
264
|
-
return plot_run_times(self, case_keys=case_keys)
|
|
370
|
+
return plot_run_times(self, case_keys=case_keys, **kwargs)
|
|
265
371
|
|
|
266
372
|
def compute_results(self, case_keys=None, verbose=False, **result_params):
|
|
373
|
+
|
|
267
374
|
if case_keys is None:
|
|
268
375
|
case_keys = list(self.cases.keys())
|
|
269
376
|
|
|
@@ -304,12 +411,32 @@ class BenchmarkStudy:
|
|
|
304
411
|
# sorting_analyzer = load_sorting_analyzer(folder)
|
|
305
412
|
# return sorting_analyzer
|
|
306
413
|
|
|
414
|
+
def compute_analyzer_extension(self, extensions, dataset_keys=None, **extension_kwargs):
|
|
415
|
+
if dataset_keys is None:
|
|
416
|
+
dataset_keys = list(self.datasets.keys())
|
|
417
|
+
if not isinstance(dataset_keys, list):
|
|
418
|
+
dataset_keys = [dataset_keys]
|
|
419
|
+
for dataset_key in dataset_keys:
|
|
420
|
+
sorting_analyzer = self.get_sorting_analyzer(dataset_key=dataset_key)
|
|
421
|
+
sorting_analyzer.compute(extensions, **extension_kwargs)
|
|
422
|
+
|
|
423
|
+
def get_gt_unit_locations(self, case_key):
|
|
424
|
+
dataset_key = self.cases[case_key]["dataset"]
|
|
425
|
+
sorting_analyzer = self.get_sorting_analyzer(dataset_key=dataset_key)
|
|
426
|
+
if "gt_unit_locations" in sorting_analyzer.sorting.get_property_keys():
|
|
427
|
+
return sorting_analyzer.get_sorting_property("gt_unit_locations")
|
|
428
|
+
else:
|
|
429
|
+
if not sorting_analyzer.has_extension("unit_locations"):
|
|
430
|
+
self.compute_analyzer_extension(["unit_locations"], dataset_keys=dataset_key)
|
|
431
|
+
unit_locations_ext = sorting_analyzer.get_extension("unit_locations")
|
|
432
|
+
return unit_locations_ext.get_data()
|
|
433
|
+
|
|
307
434
|
def get_templates(self, key, operator="average"):
|
|
308
435
|
sorting_analyzer = self.get_sorting_analyzer(case_key=key)
|
|
309
436
|
templates = sorting_analyzer.get_extenson("templates").get_data(operator=operator)
|
|
310
437
|
return templates
|
|
311
438
|
|
|
312
|
-
def compute_metrics(self, case_keys=None, metric_names=["snr", "firing_rate"], force=False):
|
|
439
|
+
def compute_metrics(self, case_keys=None, metric_names=["snr", "firing_rate"], force=False, **job_kwargs):
|
|
313
440
|
if case_keys is None:
|
|
314
441
|
case_keys = self.cases.keys()
|
|
315
442
|
|
|
@@ -329,17 +456,13 @@ class BenchmarkStudy:
|
|
|
329
456
|
sorting_analyzer = self.get_sorting_analyzer(key)
|
|
330
457
|
qm_ext = sorting_analyzer.get_extension("quality_metrics")
|
|
331
458
|
if qm_ext is None or force:
|
|
332
|
-
qm_ext = sorting_analyzer.compute("quality_metrics", metric_names=metric_names)
|
|
459
|
+
qm_ext = sorting_analyzer.compute("quality_metrics", metric_names=metric_names, **job_kwargs)
|
|
333
460
|
|
|
334
461
|
# TODO remove this metics CSV file!!!!
|
|
335
462
|
metrics = qm_ext.get_data()
|
|
336
463
|
# metrics.to_csv(filename, sep="\t", index=True)
|
|
337
464
|
|
|
338
465
|
def get_metrics(self, key):
|
|
339
|
-
import pandas as pd
|
|
340
|
-
|
|
341
|
-
dataset_key = self.cases[key]["dataset"]
|
|
342
|
-
|
|
343
466
|
analyzer = self.get_sorting_analyzer(key)
|
|
344
467
|
ext = analyzer.get_extension("quality_metrics")
|
|
345
468
|
if ext is None:
|
|
@@ -347,16 +470,32 @@ class BenchmarkStudy:
|
|
|
347
470
|
return None
|
|
348
471
|
|
|
349
472
|
metrics = ext.get_data()
|
|
473
|
+
# add GT unit id column
|
|
474
|
+
gt_unit_ids = analyzer.sorting.unit_ids
|
|
475
|
+
metrics.loc[:, "gt_unit_id"] = gt_unit_ids
|
|
350
476
|
return metrics
|
|
351
477
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
478
|
+
def get_all_metrics(self, case_keys=None):
|
|
479
|
+
"""
|
|
480
|
+
Return a DataFrame with concatented metrics for multiple cases.
|
|
481
|
+
"""
|
|
482
|
+
import pandas as pd
|
|
483
|
+
|
|
484
|
+
if case_keys is None:
|
|
485
|
+
case_keys = list(self.cases.keys())
|
|
486
|
+
assert all(key in self.cases for key in case_keys), "Some case keys are not in cases"
|
|
487
|
+
metrics = []
|
|
488
|
+
indices = []
|
|
489
|
+
for key in case_keys:
|
|
490
|
+
metrics.append(self.get_metrics(key))
|
|
491
|
+
indices.extend([key] * len(metrics[-1]))
|
|
492
|
+
if isinstance(case_keys[0], str):
|
|
493
|
+
index = pd.Index(indices, name=self.levels)
|
|
494
|
+
else:
|
|
495
|
+
index = pd.MultiIndex.from_tuples(indices, names=self.levels)
|
|
496
|
+
metrics = pd.concat(metrics)
|
|
497
|
+
metrics.index = index
|
|
498
|
+
return metrics
|
|
360
499
|
|
|
361
500
|
def get_units_snr(self, key):
|
|
362
501
|
""" """
|
|
@@ -365,6 +504,39 @@ class BenchmarkStudy:
|
|
|
365
504
|
def get_result(self, key):
|
|
366
505
|
return self.benchmarks[key].result
|
|
367
506
|
|
|
507
|
+
def get_pairs_by_level(self, level):
|
|
508
|
+
"""
|
|
509
|
+
usefull for function like plot_performance_losses() where you need to plot one pair of results
|
|
510
|
+
This generate list of pairs for a given level.
|
|
511
|
+
"""
|
|
512
|
+
|
|
513
|
+
level_index = self.levels.index(level)
|
|
514
|
+
|
|
515
|
+
possible_values = []
|
|
516
|
+
for key in self.cases.keys():
|
|
517
|
+
assert isinstance(key, tuple), "get_pairs_by_level need tuple keys"
|
|
518
|
+
level_value = key[level_index]
|
|
519
|
+
if level_value not in possible_values:
|
|
520
|
+
possible_values.append(level_value)
|
|
521
|
+
assert len(possible_values) == 2, "get_pairs_by_level() : you need exactly 2 value for this levels"
|
|
522
|
+
|
|
523
|
+
pairs = []
|
|
524
|
+
for key in self.cases.keys():
|
|
525
|
+
|
|
526
|
+
case0 = list(key)
|
|
527
|
+
case1 = list(key)
|
|
528
|
+
case0[level_index] = possible_values[0]
|
|
529
|
+
case1[level_index] = possible_values[1]
|
|
530
|
+
case0 = tuple(case0)
|
|
531
|
+
case1 = tuple(case1)
|
|
532
|
+
|
|
533
|
+
pair = (case0, case1)
|
|
534
|
+
|
|
535
|
+
if pair not in pairs:
|
|
536
|
+
pairs.append(pair)
|
|
537
|
+
|
|
538
|
+
return pairs
|
|
539
|
+
|
|
368
540
|
|
|
369
541
|
class Benchmark:
|
|
370
542
|
"""
|
|
@@ -10,7 +10,7 @@ from spikeinterface.widgets import (
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
import numpy as np
|
|
13
|
-
|
|
13
|
+
from spikeinterface.core.job_tools import fix_job_kwargs, split_job_kwargs
|
|
14
14
|
from .benchmark_base import Benchmark, BenchmarkStudy
|
|
15
15
|
from spikeinterface.core.sortinganalyzer import create_sorting_analyzer
|
|
16
16
|
from spikeinterface.core.template_tools import get_template_extremum_channel
|
|
@@ -36,6 +36,8 @@ class ClusteringBenchmark(Benchmark):
|
|
|
36
36
|
self.result["peak_labels"] = peak_labels
|
|
37
37
|
|
|
38
38
|
def compute_result(self, **result_params):
|
|
39
|
+
result_params, job_kwargs = split_job_kwargs(result_params)
|
|
40
|
+
job_kwargs = fix_job_kwargs(job_kwargs)
|
|
39
41
|
self.noise = self.result["peak_labels"] < 0
|
|
40
42
|
spikes = self.gt_sorting.to_spike_vector()
|
|
41
43
|
self.result["sliced_gt_sorting"] = NumpySorting(
|
|
@@ -47,15 +49,18 @@ class ClusteringBenchmark(Benchmark):
|
|
|
47
49
|
gt_unit_locations = self.gt_sorting.get_property("gt_unit_locations")
|
|
48
50
|
if gt_unit_locations is None:
|
|
49
51
|
print("'gt_unit_locations' is not a property of the sorting so compute it")
|
|
50
|
-
gt_analyzer = create_sorting_analyzer(
|
|
51
|
-
|
|
52
|
+
gt_analyzer = create_sorting_analyzer(
|
|
53
|
+
self.gt_sorting, self.recording, format="memory", sparse=True, **job_kwargs
|
|
54
|
+
)
|
|
55
|
+
gt_analyzer.compute("random_spikes")
|
|
56
|
+
gt_analyzer.compute("templates", **job_kwargs)
|
|
52
57
|
ext = gt_analyzer.compute("unit_locations", method="monopolar_triangulation")
|
|
53
58
|
gt_unit_locations = ext.get_data()
|
|
54
59
|
self.gt_sorting.set_property("gt_unit_locations", gt_unit_locations)
|
|
55
60
|
|
|
56
61
|
self.result["sliced_gt_sorting"].set_property("gt_unit_locations", gt_unit_locations)
|
|
57
62
|
|
|
58
|
-
self.result["clustering"] = NumpySorting.
|
|
63
|
+
self.result["clustering"] = NumpySorting.from_samples_and_labels(
|
|
59
64
|
data["sample_index"], self.result["peak_labels"][~self.noise], self.recording.sampling_frequency
|
|
60
65
|
)
|
|
61
66
|
|
|
@@ -64,17 +69,17 @@ class ClusteringBenchmark(Benchmark):
|
|
|
64
69
|
)
|
|
65
70
|
|
|
66
71
|
sorting_analyzer = create_sorting_analyzer(
|
|
67
|
-
self.result["sliced_gt_sorting"], self.recording, format="memory", sparse=False
|
|
72
|
+
self.result["sliced_gt_sorting"], self.recording, format="memory", sparse=False, **job_kwargs
|
|
68
73
|
)
|
|
69
74
|
sorting_analyzer.compute("random_spikes")
|
|
70
|
-
ext = sorting_analyzer.compute("templates")
|
|
75
|
+
ext = sorting_analyzer.compute("templates", **job_kwargs)
|
|
71
76
|
self.result["sliced_gt_templates"] = ext.get_data(outputs="Templates")
|
|
72
77
|
|
|
73
78
|
sorting_analyzer = create_sorting_analyzer(
|
|
74
|
-
self.result["clustering"], self.recording, format="memory", sparse=False
|
|
79
|
+
self.result["clustering"], self.recording, format="memory", sparse=False, **job_kwargs
|
|
75
80
|
)
|
|
76
81
|
sorting_analyzer.compute("random_spikes")
|
|
77
|
-
ext = sorting_analyzer.compute("templates")
|
|
82
|
+
ext = sorting_analyzer.compute("templates", **job_kwargs)
|
|
78
83
|
self.result["clustering_templates"] = ext.get_data(outputs="Templates")
|
|
79
84
|
|
|
80
85
|
_run_key_saved = [("peak_labels", "npy")]
|
|
@@ -176,6 +181,21 @@ class ClusteringStudy(BenchmarkStudy):
|
|
|
176
181
|
|
|
177
182
|
return plot_performances_vs_snr(self, **kwargs)
|
|
178
183
|
|
|
184
|
+
def plot_performances_comparison(self, *args, **kwargs):
|
|
185
|
+
from .benchmark_plot_tools import plot_performances_comparison
|
|
186
|
+
|
|
187
|
+
return plot_performances_comparison(self, *args, **kwargs)
|
|
188
|
+
|
|
189
|
+
def plot_performance_losses(self, *args, **kwargs):
|
|
190
|
+
from .benchmark_plot_tools import plot_performance_losses
|
|
191
|
+
|
|
192
|
+
return plot_performance_losses(self, *args, **kwargs)
|
|
193
|
+
|
|
194
|
+
def plot_performances_vs_depth_and_snr(self, *args, **kwargs):
|
|
195
|
+
from .benchmark_plot_tools import plot_performances_vs_depth_and_snr
|
|
196
|
+
|
|
197
|
+
return plot_performances_vs_depth_and_snr(self, *args, **kwargs)
|
|
198
|
+
|
|
179
199
|
def plot_error_metrics(self, metric="cosine", case_keys=None, figsize=(15, 5)):
|
|
180
200
|
|
|
181
201
|
if case_keys is None:
|
|
@@ -346,104 +366,6 @@ class ClusteringStudy(BenchmarkStudy):
|
|
|
346
366
|
|
|
347
367
|
return fig
|
|
348
368
|
|
|
349
|
-
def plot_unit_losses(self, cases_before, cases_after, metric="agreement", figsize=None):
|
|
350
|
-
|
|
351
|
-
fig, axs = plt.subplots(ncols=len(cases_before), nrows=1, figsize=figsize)
|
|
352
|
-
|
|
353
|
-
for count, (case_before, case_after) in enumerate(zip(cases_before, cases_after)):
|
|
354
|
-
|
|
355
|
-
ax = axs[count]
|
|
356
|
-
dataset_key = self.cases[case_before]["dataset"]
|
|
357
|
-
_, gt_sorting1 = self.datasets[dataset_key]
|
|
358
|
-
positions = gt_sorting1.get_property("gt_unit_locations")
|
|
359
|
-
|
|
360
|
-
analyzer = self.get_sorting_analyzer(case_before)
|
|
361
|
-
metrics_before = analyzer.get_extension("quality_metrics").get_data()
|
|
362
|
-
x = metrics_before["snr"].values
|
|
363
|
-
|
|
364
|
-
y_before = self.get_result(case_before)["gt_comparison"].get_performance()[metric].values
|
|
365
|
-
y_after = self.get_result(case_after)["gt_comparison"].get_performance()[metric].values
|
|
366
|
-
ax.set_ylabel("depth (um)")
|
|
367
|
-
ax.set_ylabel("snr")
|
|
368
|
-
if count > 0:
|
|
369
|
-
ax.set_ylabel("")
|
|
370
|
-
ax.set_yticks([], [])
|
|
371
|
-
im = ax.scatter(positions[:, 1], x, c=(y_after - y_before), cmap="coolwarm")
|
|
372
|
-
im.set_clim(-1, 1)
|
|
373
|
-
# fig.colorbar(im, ax=ax)
|
|
374
|
-
# ax.set_title(k)
|
|
375
|
-
|
|
376
|
-
fig.subplots_adjust(right=0.85)
|
|
377
|
-
cbar_ax = fig.add_axes([0.9, 0.1, 0.025, 0.75])
|
|
378
|
-
cbar = fig.colorbar(im, cax=cbar_ax, label=metric)
|
|
379
|
-
# cbar.set_clim(-1, 1)
|
|
380
|
-
|
|
381
|
-
return fig
|
|
382
|
-
|
|
383
|
-
def plot_comparison_clustering(
|
|
384
|
-
self,
|
|
385
|
-
case_keys=None,
|
|
386
|
-
performance_names=["accuracy", "recall", "precision"],
|
|
387
|
-
colors=["g", "b", "r"],
|
|
388
|
-
ylim=(-0.1, 1.1),
|
|
389
|
-
figsize=None,
|
|
390
|
-
):
|
|
391
|
-
|
|
392
|
-
if case_keys is None:
|
|
393
|
-
case_keys = list(self.cases.keys())
|
|
394
|
-
import pylab as plt
|
|
395
|
-
|
|
396
|
-
num_methods = len(case_keys)
|
|
397
|
-
fig, axs = plt.subplots(ncols=num_methods, nrows=num_methods, figsize=(10, 10))
|
|
398
|
-
for i, key1 in enumerate(case_keys):
|
|
399
|
-
for j, key2 in enumerate(case_keys):
|
|
400
|
-
if len(axs.shape) > 1:
|
|
401
|
-
ax = axs[i, j]
|
|
402
|
-
else:
|
|
403
|
-
ax = axs[j]
|
|
404
|
-
comp1 = self.get_result(key1)["gt_comparison"]
|
|
405
|
-
comp2 = self.get_result(key2)["gt_comparison"]
|
|
406
|
-
if i <= j:
|
|
407
|
-
for performance, color in zip(performance_names, colors):
|
|
408
|
-
perf1 = comp1.get_performance()[performance]
|
|
409
|
-
perf2 = comp2.get_performance()[performance]
|
|
410
|
-
ax.plot(perf2, perf1, ".", label=performance, color=color)
|
|
411
|
-
|
|
412
|
-
ax.plot([0, 1], [0, 1], "k--", alpha=0.5)
|
|
413
|
-
ax.set_ylim(ylim)
|
|
414
|
-
ax.set_xlim(ylim)
|
|
415
|
-
ax.spines[["right", "top"]].set_visible(False)
|
|
416
|
-
ax.set_aspect("equal")
|
|
417
|
-
|
|
418
|
-
label1 = self.cases[key1]["label"]
|
|
419
|
-
label2 = self.cases[key2]["label"]
|
|
420
|
-
if j == i:
|
|
421
|
-
ax.set_ylabel(f"{label1}")
|
|
422
|
-
else:
|
|
423
|
-
ax.set_yticks([])
|
|
424
|
-
if i == j:
|
|
425
|
-
ax.set_xlabel(f"{label2}")
|
|
426
|
-
else:
|
|
427
|
-
ax.set_xticks([])
|
|
428
|
-
if i == num_methods - 1 and j == num_methods - 1:
|
|
429
|
-
patches = []
|
|
430
|
-
import matplotlib.patches as mpatches
|
|
431
|
-
|
|
432
|
-
for color, name in zip(colors, performance_names):
|
|
433
|
-
patches.append(mpatches.Patch(color=color, label=name))
|
|
434
|
-
ax.legend(handles=patches, bbox_to_anchor=(1.05, 1), loc="upper left", borderaxespad=0.0)
|
|
435
|
-
else:
|
|
436
|
-
ax.spines["bottom"].set_visible(False)
|
|
437
|
-
ax.spines["left"].set_visible(False)
|
|
438
|
-
ax.spines["top"].set_visible(False)
|
|
439
|
-
ax.spines["right"].set_visible(False)
|
|
440
|
-
ax.set_xticks([])
|
|
441
|
-
ax.set_yticks([])
|
|
442
|
-
|
|
443
|
-
plt.tight_layout(h_pad=0, w_pad=0)
|
|
444
|
-
|
|
445
|
-
return fig
|
|
446
|
-
|
|
447
369
|
def plot_some_over_merged(self, case_keys=None, overmerged_score=0.05, max_units=5, figsize=None):
|
|
448
370
|
if case_keys is None:
|
|
449
371
|
case_keys = list(self.cases.keys())
|