spikeinterface 0.102.0__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.0/src/spikeinterface.egg-info → spikeinterface-0.102.2}/PKG-INFO +14 -15
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/pyproject.toml +15 -20
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/benchmark/benchmark_base.py +202 -30
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/benchmark/benchmark_clustering.py +28 -106
- {spikeinterface-0.102.0 → 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.0 → spikeinterface-0.102.2}/src/spikeinterface/benchmark/benchmark_motion_estimation.py +28 -28
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/benchmark/benchmark_peak_detection.py +41 -18
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/benchmark/benchmark_peak_localization.py +10 -8
- {spikeinterface-0.102.0 → 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.0 → 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.0 → spikeinterface-0.102.2}/src/spikeinterface/comparison/basecomparison.py +22 -8
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/comparison/collision.py +3 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/comparison/correlogram.py +3 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/comparison/multicomparisons.py +8 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/comparison/paircomparisons.py +4 -13
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/__init__.py +2 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/base.py +48 -6
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/baserecording.py +20 -26
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/baserecordingsnippets.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/basesorting.py +52 -18
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/binaryrecordingextractor.py +1 -11
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/channelsaggregationrecording.py +62 -10
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/channelslice.py +8 -6
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/core_tools.py +44 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/frameslicerecording.py +0 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/frameslicesorting.py +0 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/generate.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/loading.py +3 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/motion.py +8 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/node_pipeline.py +25 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/npyfoldersnippets.py +0 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/numpyextractors.py +56 -11
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/recording_tools.py +3 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/segmentutils.py +2 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/snippets_tools.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/sorting_tools.py +8 -13
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/sortinganalyzer.py +175 -38
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/sparsity.py +47 -4
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/template_tools.py +4 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/testing.py +0 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/unitsaggregationsorting.py +35 -33
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/waveform_tools.py +0 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/waveforms_extractor_backwards_compatibility.py +3 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/zarrextractors.py +9 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/curation/__init__.py +5 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/curation/auto_merge.py +279 -12
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/curation/remove_excess_spikes.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/curation/remove_redundant.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/curation/sortingview_curation.py +23 -16
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/curation/train_manual_curation.py +22 -20
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/exporters/report.py +4 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/cellexplorersortingextractor.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/iblextractors.py +11 -10
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/mdaextractors.py +22 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/intan.py +35 -15
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/neo_utils.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/neobaseextractor.py +44 -28
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/openephys.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/phykilosortextractors.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/sinapsrecordingextractors.py +3 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/toy_example.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/generation/__init__.py +3 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/generation/drift_tools.py +4 -1
- {spikeinterface-0.102.0 → 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.0 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/alignsorting.py +0 -4
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/amplitude_scalings.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/correlograms.py +9 -7
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/isi.py +6 -4
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/localization_tools.py +10 -8
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/noise_level.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/spike_amplitudes.py +0 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/spike_locations.py +0 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/template_metrics.py +6 -6
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/template_similarity.py +7 -5
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/unit_locations.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/astype.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/average_across_direction.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/basepreprocessor.py +0 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/clip.py +6 -4
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/common_reference.py +5 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/correct_lsb.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/decimate.py +3 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/deepinterpolation/deepinterpolation.py +5 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/deepinterpolation/generators.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/deepinterpolation/train.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/depth_order.py +3 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/detect_bad_channels.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/directional_derivative.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/filter.py +6 -6
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/filter_gaussian.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/filter_opencl.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/highpass_spatial_filter.py +3 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/interpolate_bad_channels.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/motion.py +19 -4
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/normalize_scale.py +6 -6
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/phase_shift.py +3 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/preprocessinglist.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/rectify.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/remove_artifacts.py +7 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/resample.py +3 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/silence_periods.py +6 -4
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/unsigned_to_signed.py +4 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/whiten.py +5 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/zero_channel_pad.py +5 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/qualitymetrics/misc_metrics.py +18 -14
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/qualitymetrics/pca_metrics.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/qualitymetrics/quality_metric_calculator.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/basesorter.py +10 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/container_tools.py +3 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/combinato.py +2 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/hdsort.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/herdingspikes.py +6 -5
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/ironclust.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosort.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosort2.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosort2_5.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosort3.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosort4.py +74 -92
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosortbase.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/klusta.py +11 -12
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/mountainsort4.py +5 -8
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/mountainsort5.py +12 -13
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/pykilosort.py +10 -9
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/spyking_circus.py +11 -10
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/tridesclous.py +8 -18
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/waveclus.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/waveclus_snippets.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/yass.py +8 -10
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/internal/simplesorter.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/internal/spyking_circus2.py +56 -65
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/internal/tridesclous2.py +10 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/runsorter.py +3 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/clustering_tools.py +1 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/merge.py +5 -1
- {spikeinterface-0.102.0 → 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.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/position_and_features.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/split.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/tdc.py +55 -35
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/matching/tdc.py +255 -49
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/motion/__init__.py +1 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/motion/decentralized.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/motion/dredge.py +1 -1
- {spikeinterface-0.102.0 → 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.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/motion/motion_estimation.py +9 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/motion/motion_interpolation.py +45 -11
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/peak_detection.py +51 -23
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/peak_localization.py +2 -5
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/tools.py +27 -11
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/waveforms/temporal_pca.py +170 -24
- {spikeinterface-0.102.0 → 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.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/base.py +2 -2
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/crosscorrelograms.py +10 -5
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/metrics.py +4 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/motion.py +27 -58
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/peak_activity.py +84 -14
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/potential_merges.py +1 -1
- {spikeinterface-0.102.0 → 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.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/sorting_summary.py +9 -5
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/spike_locations.py +4 -3
- spikeinterface-0.102.0/src/spikeinterface/widgets/amplitudes.py → spikeinterface-0.102.2/src/spikeinterface/widgets/spike_locations_by_time.py +25 -50
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/spikes_on_traces.py +9 -9
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/template_metrics.py +4 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/template_similarity.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/traces.py +6 -6
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/unit_depths.py +4 -4
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/unit_locations.py +4 -6
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/unit_probe_map.py +2 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/unit_summary.py +10 -7
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/unit_templates.py +1 -1
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/unit_waveforms.py +32 -18
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/unit_waveforms_density_map.py +4 -4
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/utils.py +20 -4
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/utils_sortingview.py +6 -3
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/widget_list.py +13 -12
- {spikeinterface-0.102.0 → spikeinterface-0.102.2/src/spikeinterface.egg-info}/PKG-INFO +14 -15
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface.egg-info/SOURCES.txt +5 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface.egg-info/requires.txt +18 -12
- spikeinterface-0.102.0/src/spikeinterface/benchmark/benchmark_plot_tools.py +0 -305
- spikeinterface-0.102.0/src/spikeinterface/benchmark/benchmark_tools.py +0 -0
- spikeinterface-0.102.0/src/spikeinterface/widgets/rasters.py +0 -88
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/LICENSE +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/README.md +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/setup.cfg +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/setup.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/benchmark/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/benchmark/benchmark_motion_interpolation.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/comparison/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/comparison/comparisontools.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/comparison/groundtruthstudy.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/comparison/hybrid.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/analyzer_extension_core.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/baseevent.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/basesnippets.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/binaryfolder.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/datasets.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/globals.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/job_tools.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/npysnippetsextractor.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/npzfolder.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/npzsortingextractor.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/old_api_utils.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/sortingfolder.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/template.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/testing_tools.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/unitsselectionsorting.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/core/zarrrecordingextractor.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/curation/curation_format.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/curation/curation_tools.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/curation/curationsorting.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/curation/mergeunitssorting.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/curation/model_based_curation.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/curation/remove_duplicated_spikes.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/curation/splitunitsorting.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/exporters/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/exporters/to_phy.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/alfsortingextractor.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/bids.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/cbin_ibl.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/combinatoextractors.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/extractorlist.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/hdsortextractors.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/herdingspikesextractors.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/klustaextractors.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/matlabhelpers.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/mclustextractors.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/mcsh5extractors.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/alphaomega.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/axona.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/biocam.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/blackrock.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/ced.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/edf.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/maxwell.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/mcsraw.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/mearec.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/neuralynx.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/neuroexplorer.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/neuronexus.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/neuroscope.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/nix.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/plexon.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/plexon2.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/spike2.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/spikegadgets.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/spikeglx.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neoextractors/tdt.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/neuropixels_utils.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/nwbextractors.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/shybridextractors.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/spykingcircusextractors.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/tridesclousextractors.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/waveclussnippetstextractors.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/waveclustextractors.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/extractors/yassextractors.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/full.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/generation/hybrid_tools.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/generation/noise_tools.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/generation/template_database.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/postprocessing/principal_component.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/align_snippets.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/deepinterpolation/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/deepinterpolation/tf_utils.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/preprocessing_tools.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/preprocessing/scale.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/qualitymetrics/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/qualitymetrics/quality_metric_list.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/qualitymetrics/utils.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/hdsort_master.m +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosort2_5_master.m +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosort2_master.m +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosort3_master.m +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/kilosort_master.m +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/klusta_config_default.prm +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/sc_config_default.params +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/waveclus_master.m +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/waveclus_snippets_master.m +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/external/yass_config_default.yaml +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/internal/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/internal/si_based.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/launcher.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/sorterlist.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/utils/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/utils/constructNPYheader.m +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/utils/misc.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/utils/shellscript.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sorters/utils/writeNPY.m +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/circus.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/clean.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/dummy.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/isocut5.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/main.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/position.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/position_and_pca.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/position_ptp_scaled.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/random_projections.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/sliding_hdbscan.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/sliding_nn.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/tools.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/clustering/triage.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/features_from_peaks.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/matching/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/matching/base.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/matching/circus.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/matching/main.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/matching/method_list.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/matching/naive.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/matching/wobble.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/motion/motion_cleaner.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/motion/motion_utils.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/peak_pipeline.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/peak_selection.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/waveforms/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/waveforms/hanning_filter.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/waveforms/neural_network_denoiser.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/waveforms/savgol_denoiser.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/waveforms/waveform_thresholder.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/sortingcomponents/waveforms/waveform_utils.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/__init__.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/autocorrelograms.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/collision.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/comparison.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/gtstudy.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/isi_distribution.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/multicomparison.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/peaks_on_probe.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/probe_map.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/unit_presence.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/utils_ipywidgets.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface/widgets/utils_matplotlib.py +0 -0
- {spikeinterface-0.102.0 → spikeinterface-0.102.2}/src/spikeinterface.egg-info/dependency_links.txt +0 -0
- {spikeinterface-0.102.0 → 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
|
|
@@ -14,10 +14,11 @@ Classifier: Operating System :: POSIX :: Linux
|
|
|
14
14
|
Classifier: Operating System :: Microsoft :: Windows
|
|
15
15
|
Classifier: Operating System :: MacOS
|
|
16
16
|
Classifier: Operating System :: OS Independent
|
|
17
|
-
Requires-Python: <3.
|
|
17
|
+
Requires-Python: <3.14,>=3.9
|
|
18
18
|
Description-Content-Type: text/markdown
|
|
19
19
|
License-File: LICENSE
|
|
20
|
-
Requires-Dist: numpy>=1.20
|
|
20
|
+
Requires-Dist: numpy>=1.20; python_version < "3.13"
|
|
21
|
+
Requires-Dist: numpy>=2.0.0; python_version >= "3.13"
|
|
21
22
|
Requires-Dist: threadpoolctl>=3.0.0
|
|
22
23
|
Requires-Dist: tqdm
|
|
23
24
|
Requires-Dist: zarr<3,>=2.18
|
|
@@ -32,13 +33,11 @@ Requires-Dist: pyedflib<0.1.39,>=0.1.30; extra == "extractors"
|
|
|
32
33
|
Requires-Dist: sonpy; python_version < "3.10" and extra == "extractors"
|
|
33
34
|
Requires-Dist: lxml; extra == "extractors"
|
|
34
35
|
Requires-Dist: scipy; extra == "extractors"
|
|
35
|
-
Requires-Dist:
|
|
36
|
-
Requires-Dist: ibllib>=2.36.0; extra == "extractors"
|
|
36
|
+
Requires-Dist: ibllib; extra == "extractors"
|
|
37
37
|
Requires-Dist: pymatreader>=0.0.32; extra == "extractors"
|
|
38
38
|
Requires-Dist: zugbruecke>=0.2; sys_platform != "win32" and extra == "extractors"
|
|
39
39
|
Provides-Extra: streaming-extractors
|
|
40
|
-
Requires-Dist:
|
|
41
|
-
Requires-Dist: ibllib>=2.36.0; extra == "streaming-extractors"
|
|
40
|
+
Requires-Dist: ibllib; extra == "streaming-extractors"
|
|
42
41
|
Requires-Dist: pynwb>=2.6.0; extra == "streaming-extractors"
|
|
43
42
|
Requires-Dist: fsspec; extra == "streaming-extractors"
|
|
44
43
|
Requires-Dist: aiohttp; extra == "streaming-extractors"
|
|
@@ -78,22 +77,21 @@ Provides-Extra: test-extractors
|
|
|
78
77
|
Requires-Dist: pooch>=1.8.2; extra == "test-extractors"
|
|
79
78
|
Requires-Dist: datalad>=1.0.2; extra == "test-extractors"
|
|
80
79
|
Provides-Extra: test-preprocessing
|
|
81
|
-
Requires-Dist: ibllib
|
|
80
|
+
Requires-Dist: ibllib; extra == "test-preprocessing"
|
|
82
81
|
Requires-Dist: torch; extra == "test-preprocessing"
|
|
83
82
|
Provides-Extra: test
|
|
84
83
|
Requires-Dist: pytest; extra == "test"
|
|
85
84
|
Requires-Dist: pytest-dependency; extra == "test"
|
|
86
85
|
Requires-Dist: pytest-cov; extra == "test"
|
|
86
|
+
Requires-Dist: psutil; extra == "test"
|
|
87
87
|
Requires-Dist: huggingface_hub; extra == "test"
|
|
88
|
-
Requires-Dist: ibllib
|
|
88
|
+
Requires-Dist: ibllib; extra == "test"
|
|
89
89
|
Requires-Dist: s3fs; extra == "test"
|
|
90
|
-
Requires-Dist: numba; extra == "test"
|
|
90
|
+
Requires-Dist: numba<0.61.0; python_version < "3.13" and extra == "test"
|
|
91
|
+
Requires-Dist: numba>=0.61.0; python_version >= "3.13" and extra == "test"
|
|
91
92
|
Requires-Dist: hdbscan>=0.8.33; extra == "test"
|
|
92
|
-
Requires-Dist: sortingview; extra == "test"
|
|
93
|
-
Requires-Dist: tridesclous>=1.6.8; extra == "test"
|
|
94
|
-
Requires-Dist: pymde; extra == "test"
|
|
93
|
+
Requires-Dist: sortingview>=0.12.0; extra == "test"
|
|
95
94
|
Requires-Dist: torch; extra == "test"
|
|
96
|
-
Requires-Dist: pynndescent; extra == "test"
|
|
97
95
|
Requires-Dist: skops; extra == "test"
|
|
98
96
|
Requires-Dist: huggingface_hub; extra == "test"
|
|
99
97
|
Provides-Extra: docs
|
|
@@ -119,6 +117,7 @@ Requires-Dist: spikeinterface[test_core]; extra == "dev"
|
|
|
119
117
|
Requires-Dist: spikeinterface[docs]; extra == "dev"
|
|
120
118
|
Requires-Dist: black; extra == "dev"
|
|
121
119
|
Requires-Dist: pre-commit; extra == "dev"
|
|
120
|
+
Dynamic: license-file
|
|
122
121
|
|
|
123
122
|
# SpikeInterface: a unified framework for spike sorting
|
|
124
123
|
|
|
@@ -1,13 +1,13 @@
|
|
|
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" },
|
|
7
7
|
]
|
|
8
8
|
description = "Python toolkit for analysis, visualization, and comparison of spike sorting output"
|
|
9
9
|
readme = "README.md"
|
|
10
|
-
requires-python = ">=3.9,<3.
|
|
10
|
+
requires-python = ">=3.9,<3.14"
|
|
11
11
|
classifiers = [
|
|
12
12
|
"Programming Language :: Python :: 3 :: Only",
|
|
13
13
|
"License :: OSI Approved :: MIT License",
|
|
@@ -20,7 +20,8 @@ classifiers = [
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
dependencies = [
|
|
23
|
-
"numpy>=1.20",
|
|
23
|
+
"numpy>=1.20;python_version<'3.13'",
|
|
24
|
+
"numpy>=2.0.0;python_version>='3.13'",
|
|
24
25
|
"threadpoolctl>=3.0.0",
|
|
25
26
|
"tqdm",
|
|
26
27
|
"zarr>=2.18,<3",
|
|
@@ -30,7 +31,7 @@ dependencies = [
|
|
|
30
31
|
]
|
|
31
32
|
|
|
32
33
|
[build-system]
|
|
33
|
-
requires = ["setuptools>=
|
|
34
|
+
requires = ["setuptools>=78.0.2"]
|
|
34
35
|
build-backend = "setuptools.build_meta"
|
|
35
36
|
|
|
36
37
|
[tool.setuptools]
|
|
@@ -66,15 +67,13 @@ extractors = [
|
|
|
66
67
|
"sonpy;python_version<'3.10'",
|
|
67
68
|
"lxml", # lxml for neuroscope
|
|
68
69
|
"scipy",
|
|
69
|
-
"
|
|
70
|
-
"ibllib>=2.36.0", # streaming IBL
|
|
70
|
+
"ibllib", # streaming IBL
|
|
71
71
|
"pymatreader>=0.0.32", # For cell explorer matlab files
|
|
72
72
|
"zugbruecke>=0.2; sys_platform!='win32'", # For plexon2
|
|
73
73
|
]
|
|
74
74
|
|
|
75
75
|
streaming_extractors = [
|
|
76
|
-
"
|
|
77
|
-
"ibllib>=2.36.0", # streaming IBL
|
|
76
|
+
"ibllib", # streaming IBL
|
|
78
77
|
# Following dependencies are for streaming with nwb files
|
|
79
78
|
"pynwb>=2.6.0",
|
|
80
79
|
"fsspec",
|
|
@@ -134,12 +133,13 @@ test_extractors = [
|
|
|
134
133
|
# Functions to download data in neo test suite
|
|
135
134
|
"pooch>=1.8.2",
|
|
136
135
|
"datalad>=1.0.2",
|
|
136
|
+
# Commenting out for release
|
|
137
137
|
# "probeinterface @ git+https://github.com/SpikeInterface/probeinterface.git",
|
|
138
138
|
# "neo @ git+https://github.com/NeuralEnsemble/python-neo.git",
|
|
139
139
|
]
|
|
140
140
|
|
|
141
141
|
test_preprocessing = [
|
|
142
|
-
"ibllib
|
|
142
|
+
"ibllib", # for IBL
|
|
143
143
|
"torch",
|
|
144
144
|
]
|
|
145
145
|
|
|
@@ -148,30 +148,26 @@ test = [
|
|
|
148
148
|
"pytest",
|
|
149
149
|
"pytest-dependency",
|
|
150
150
|
"pytest-cov",
|
|
151
|
+
"psutil",
|
|
151
152
|
|
|
152
153
|
"huggingface_hub",
|
|
153
154
|
|
|
154
155
|
# preprocessing
|
|
155
|
-
"ibllib
|
|
156
|
+
"ibllib", # for IBL
|
|
156
157
|
|
|
157
158
|
# streaming templates
|
|
158
159
|
"s3fs",
|
|
159
160
|
|
|
160
161
|
# tridesclous
|
|
161
|
-
"numba",
|
|
162
|
+
"numba<0.61.0;python_version<'3.13'",
|
|
163
|
+
"numba>=0.61.0;python_version>='3.13'",
|
|
162
164
|
"hdbscan>=0.8.33", # Previous version had a broken wheel
|
|
163
165
|
|
|
164
166
|
# for sortingview backend
|
|
165
|
-
"sortingview",
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
## install tridesclous for testing ##
|
|
169
|
-
"tridesclous>=1.6.8",
|
|
167
|
+
"sortingview>=0.12.0",
|
|
170
168
|
|
|
171
|
-
|
|
172
|
-
"pymde",
|
|
169
|
+
# for motion and sortingcomponents
|
|
173
170
|
"torch",
|
|
174
|
-
"pynndescent",
|
|
175
171
|
|
|
176
172
|
# curation
|
|
177
173
|
"skops",
|
|
@@ -207,7 +203,6 @@ docs = [
|
|
|
207
203
|
# for release we need pypi, so this needs to be commented
|
|
208
204
|
# "probeinterface @ git+https://github.com/SpikeInterface/probeinterface.git", # We always build from the latest version
|
|
209
205
|
# "neo @ git+https://github.com/NeuralEnsemble/python-neo.git", # We always build from the latest version
|
|
210
|
-
|
|
211
206
|
]
|
|
212
207
|
|
|
213
208
|
dev = [
|
{spikeinterface-0.102.0 → 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
|
"""
|