From acb5935b327fb2678bf5bfa5cc1eab31f251dccd Mon Sep 17 00:00:00 2001 From: zm711 <92116279+zm711@users.noreply.github.com> Date: Sun, 9 Mar 2025 16:29:09 -0400 Subject: [PATCH 01/30] test a ruff action --- .github/workflows/ruff.yml | 19 +++++++++++++++++++ pyproject.toml | 5 +++++ 2 files changed, 24 insertions(+) create mode 100644 .github/workflows/ruff.yml diff --git a/.github/workflows/ruff.yml b/.github/workflows/ruff.yml new file mode 100644 index 0000000000..23e3567fed --- /dev/null +++ b/.github/workflows/ruff.yml @@ -0,0 +1,19 @@ +name: Ruff Linting + +on: + pull_request: + types: [synchronize, opened, reopened] + branches: + - main + +concurrency: # Cancel previous workflows on the same pull request + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + ruff-linting: + name: Ruff Linting + strategy: + fail-fast: false + steps: + - uses: astral-sh/ruff-action@v3 diff --git a/pyproject.toml b/pyproject.toml index 97ba77299e..808403b113 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,6 +50,11 @@ exclude = ["spikeinterface.*.tests"] [tool.black] line-length = 120 +[tool.ruff] +line-length = 120 +[tool.ruff.lint] +select = ['F401'] + [project.urls] homepage = "https://github.com/SpikeInterface/spikeinterface" repository = "https://github.com/SpikeInterface/spikeinterface" From f5154cb91390552c026f5a9f6bffed7297ca4e7c Mon Sep 17 00:00:00 2001 From: zm711 <92116279+zm711@users.noreply.github.com> Date: Sun, 9 Mar 2025 16:33:18 -0400 Subject: [PATCH 02/30] oops --- .github/workflows/ruff.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ruff.yml b/.github/workflows/ruff.yml index 23e3567fed..d02e24ef29 100644 --- a/.github/workflows/ruff.yml +++ b/.github/workflows/ruff.yml @@ -11,7 +11,7 @@ concurrency: # Cancel previous workflows on the same pull request cancel-in-progress: true jobs: - ruff-linting: + run: name: Ruff Linting strategy: fail-fast: false From 5ed3ddc17ddb6163621270d0391031b627216014 Mon Sep 17 00:00:00 2001 From: zm711 <92116279+zm711@users.noreply.github.com> Date: Sun, 9 Mar 2025 16:37:24 -0400 Subject: [PATCH 03/30] add ruff check --- .github/workflows/ruff.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ruff.yml b/.github/workflows/ruff.yml index d02e24ef29..2dad88e493 100644 --- a/.github/workflows/ruff.yml +++ b/.github/workflows/ruff.yml @@ -17,3 +17,4 @@ jobs: fail-fast: false steps: - uses: astral-sh/ruff-action@v3 + - run: ruff check From 0e61521779f10871fbf66f2fe31bb8eae8fcadc9 Mon Sep 17 00:00:00 2001 From: zm711 <92116279+zm711@users.noreply.github.com> Date: Sun, 9 Mar 2025 16:43:19 -0400 Subject: [PATCH 04/30] another try --- .github/workflows/ruff.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ruff.yml b/.github/workflows/ruff.yml index 2dad88e493..0860cd8fc9 100644 --- a/.github/workflows/ruff.yml +++ b/.github/workflows/ruff.yml @@ -13,8 +13,11 @@ concurrency: # Cancel previous workflows on the same pull request jobs: run: name: Ruff Linting + runs-on: ubuntu-latest strategy: fail-fast: false steps: + - uses: actions/checkout@v4 - uses: astral-sh/ruff-action@v3 - - run: ruff check + with: + args: check From b8dde0550a382c4995a43e6099e9a672cd46afa8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 5 Sep 2025 14:11:16 +0000 Subject: [PATCH 05/30] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/spikeinterface/extractors/phykilosortextractors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spikeinterface/extractors/phykilosortextractors.py b/src/spikeinterface/extractors/phykilosortextractors.py index 8209d93543..46a8e4cecb 100644 --- a/src/spikeinterface/extractors/phykilosortextractors.py +++ b/src/spikeinterface/extractors/phykilosortextractors.py @@ -40,7 +40,7 @@ class BasePhyKilosortSortingExtractor(BaseSorting): The cluster_id column is used as the merge key to combine properties from multiple files. All loaded properties are added to the sorting extractor as unit properties, with some renamed for SpikeInterface conventions: 'group' becomes 'quality', 'cluster_id' - becomes 'original_cluster_id'. These properties can be accessed via ``sorting.get_property()`` + becomes 'original_cluster_id'. These properties can be accessed via ``sorting.get_property()`` function. """ From e8e9b0c6e617de07664a96be4cf20efeb5f3ba88 Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Mon, 9 Nov 2026 14:50:41 +0100 Subject: [PATCH 06/30] fix: core ruff checks --- .github/scripts/serialization/objects.py | 1 - .pre-commit-config.yaml | 9 +- conftest.py | 2 +- doc/images/make_comparison_figures.py | 1 - examples/forhowto/plot_extract_lfps.py | 2 - examples/get_started/quickstart.py | 3 - examples/how_to/auto_label_units.py | 1 - .../benchmark_with_hybrid_recordings.py | 1 - examples/how_to/customize_a_plot.py | 1 - .../plot_5_comparison_sorter_weaknesses.py | 2 - .../core/plot_1_recording_extractor.py | 1 - .../plot_5_append_concatenate_segments.py | 3 +- .../curation/plot_1_automated_curation.py | 2 +- .../widgets/plot_3_waveforms_gallery.py | 1 - installation_tips/check_your_install.py | 4 +- pyproject.toml | 14 ++- .../benchmark/benchmark_base.py | 11 +- .../benchmark/benchmark_clustering.py | 10 +- .../benchmark/benchmark_matching.py | 2 - .../benchmark/benchmark_merging.py | 3 - .../benchmark/benchmark_motion_estimation.py | 6 - .../benchmark/benchmark_peak_localization.py | 5 - .../benchmark/benchmark_peak_selection.py | 10 -- .../benchmark/benchmark_plot_tools.py | 25 ++-- .../benchmark/benchmark_sorter.py | 1 - .../benchmark/benchmark_sorter_without_gt.py | 3 +- .../tests/common_benchmark_testing.py | 3 - .../benchmark/tests/test_benchmark_merging.py | 1 - .../tests/test_benchmark_sorter_without_gt.py | 1 - .../benchmark/tests/test_residual_analysis.py | 2 - .../comparison/basecomparison.py | 1 - src/spikeinterface/comparison/collision.py | 3 - .../comparison/comparisontools.py | 20 ++-- .../comparison/multicomparisons.py | 7 +- .../comparison/paircomparisons.py | 4 +- .../tests/test_groundtruthcomparison.py | 1 - .../tests/test_multisortingcomparison.py | 2 +- .../tests/test_templatecomparison.py | 2 - .../core/analyzer_extension_core.py | 21 +--- src/spikeinterface/core/base.py | 33 ++---- src/spikeinterface/core/baserecording.py | 17 ++- src/spikeinterface/core/basesorting.py | 26 ++--- src/spikeinterface/core/binaryfolder.py | 3 +- .../core/binaryrecordingextractor.py | 2 +- .../core/channelsaggregationrecording.py | 13 +-- src/spikeinterface/core/core_tools.py | 8 +- src/spikeinterface/core/generate.py | 41 +++---- src/spikeinterface/core/loading.py | 12 +- src/spikeinterface/core/motion.py | 4 +- src/spikeinterface/core/node_pipeline.py | 10 +- src/spikeinterface/core/npzfolder.py | 2 - src/spikeinterface/core/old_api_utils.py | 2 +- src/spikeinterface/core/sorting_tools.py | 30 +++-- src/spikeinterface/core/sortinganalyzer.py | 110 ++++++++---------- src/spikeinterface/core/sortingfolder.py | 4 +- src/spikeinterface/core/sparsity.py | 56 +++++---- src/spikeinterface/core/testing.py | 2 - .../tests/test_analyzer_extension_core.py | 2 +- src/spikeinterface/core/tests/test_base.py | 2 +- .../core/tests/test_baserecording.py | 3 +- .../core/tests/test_basesorting.py | 2 - .../core/tests/test_binaryfolder.py | 4 - .../tests/test_binaryrecordingextractor.py | 1 - .../core/tests/test_core_tools.py | 1 - .../core/tests/test_frameslicerecording.py | 3 +- .../core/tests/test_jsonification.py | 2 - src/spikeinterface/core/tests/test_loading.py | 7 +- .../core/tests/test_motion_core.py | 1 - .../core/tests/test_node_pipeline.py | 1 - .../tests/test_noise_levels_propagation.py | 8 +- .../core/tests/test_npzsortingextractor.py | 3 - .../core/tests/test_read_python_safe.py | 5 +- .../core/tests/test_recording_tools.py | 2 - .../core/tests/test_segmentutils.py | 3 - .../core/tests/test_sorting_folder.py | 3 +- .../core/tests/test_sorting_tools.py | 1 - .../core/tests/test_sortinganalyzer.py | 4 +- .../core/tests/test_waveform_tools.py | 2 +- src/spikeinterface/core/time_series_tools.py | 7 +- .../core/unitsaggregationsorting.py | 6 +- src/spikeinterface/core/waveform_tools.py | 8 +- ...forms_extractor_backwards_compatibility.py | 25 ++-- src/spikeinterface/core/zarrextractors.py | 9 +- src/spikeinterface/curation/auto_merge.py | 6 +- src/spikeinterface/curation/curation_model.py | 6 +- .../curation/curationsorting.py | 2 +- .../curation/model_based_curation.py | 6 +- .../curation/sortingview_curation.py | 2 +- .../curation/tests/test_auto_merge.py | 3 - .../curation/tests/test_bombcell_curation.py | 3 - .../curation/tests/test_curation_model.py | 1 - .../tests/test_model_based_curation.py | 1 - .../curation/tests/test_remove_redundant.py | 2 +- .../tests/test_sortingview_curation.py | 8 -- .../tests/test_train_manual_curation.py | 3 +- .../tests/test_unitrefine_curation.py | 1 - .../curation/threshold_metrics_curation.py | 1 - .../curation/train_manual_curation.py | 16 +-- src/spikeinterface/exporters/tests/common.py | 2 - .../exporters/tests/test_export_to_ibl.py | 1 - .../exporters/tests/test_export_to_phy.py | 3 - .../exporters/tests/test_report.py | 3 - src/spikeinterface/exporters/to_phy.py | 10 +- src/spikeinterface/extractors/cbin_ibl.py | 9 +- .../extractors/extractor_classes.py | 6 - .../extractors/klustaextractors.py | 8 +- .../extractors/mdaextractors.py | 9 +- .../extractors/neoextractors/neo_utils.py | 5 +- .../extractors/neoextractors/spike2.py | 2 +- .../extractors/nwbextractors.py | 8 +- .../extractors/phykilosortextractors.py | 4 +- .../extractors/sinapsrecordingextractors.py | 8 +- .../tests/test_cbin_ibl_extractors.py | 4 +- .../extractors/tests/test_iblextractors.py | 7 +- .../extractors/tests/test_neoextractors.py | 2 - .../extractors/tests/test_nwbextractors.py | 4 +- .../tests/test_nwbextractors_streaming.py | 2 +- .../extractors/yassextractors.py | 2 +- .../generation/drifting_generator.py | 11 +- .../metrics/quality/pca_metrics.py | 14 +-- .../quality/tests/test_metrics_functions.py | 3 +- .../template/tests/test_template_metrics.py | 3 +- .../postprocessing/amplitude_scalings.py | 27 +++-- .../postprocessing/localization_tools.py | 2 - .../postprocessing/noise_level.py | 1 - .../postprocessing/principal_component.py | 8 +- .../postprocessing/template_similarity.py | 15 +-- .../tests/test_multi_extensions.py | 1 - .../postprocessing/unit_locations.py | 2 +- .../postprocessing/valid_unit_periods.py | 12 +- src/spikeinterface/preprocessing/decimate.py | 10 +- .../tests/test_deepinterpolation.py | 1 - .../preprocessing/interpolate_bad_channels.py | 1 - src/spikeinterface/preprocessing/motion.py | 6 +- src/spikeinterface/preprocessing/pipeline.py | 12 +- src/spikeinterface/preprocessing/resample.py | 1 - .../preprocessing/tests/test_astype.py | 7 +- .../tests/test_common_reference.py | 2 - .../tests/test_detect_artifacts.py | 16 ++- .../preprocessing/tests/test_filter.py | 1 - .../preprocessing/tests/test_pipeline.py | 3 - .../tests/test_preprocessing_tools.py | 3 - .../tests/test_remove_artifacts.py | 2 - .../preprocessing/tests/test_resample.py | 2 +- .../tests/test_silence_periods.py | 2 - .../preprocessing/tests/testing_tools.py | 6 - src/spikeinterface/sorters/basesorter.py | 4 +- .../sorters/external/dartsort.py | 10 +- src/spikeinterface/sorters/external/hdsort.py | 4 +- .../sorters/external/rt_sort.py | 3 +- .../sorters/external/tests/test_combinato.py | 2 +- .../sorters/external/tests/test_hdsort.py | 2 +- .../sorters/external/tests/test_ironclust.py | 3 +- .../external/tests/test_kilosort2_5.py | 2 +- .../tests/test_singularity_containers_gpu.py | 1 - .../external/tests/test_tridesclous.py | 1 - .../sorters/external/tests/test_waveclus.py | 3 +- .../sorters/external/waveclus.py | 2 +- src/spikeinterface/sorters/internal/lupin.py | 3 +- .../sorters/internal/si_based.py | 2 +- .../sorters/internal/simplesorter.py | 5 +- .../sorters/internal/spyking_circus2.py | 11 +- .../sorters/internal/tests/test_lupin.py | 3 +- .../internal/tests/test_tridesclous2.py | 1 - .../sorters/internal/tridesclous2.py | 7 +- src/spikeinterface/sorters/runsorter.py | 14 +-- src/spikeinterface/sorters/sorterlist.py | 2 +- .../tests/test_runsorter_dependency_checks.py | 20 ++-- src/spikeinterface/sorters/utils/misc.py | 2 +- .../sorters/utils/shellscript.py | 10 +- .../clustering/cleaning_tools.py | 8 -- .../clustering/graph_clustering.py | 2 - .../clustering/itersplit_tools.py | 4 +- .../sortingcomponents/clustering/main.py | 8 +- .../sortingcomponents/clustering/positions.py | 1 - .../clustering/tests/test_itersplit_tool.py | 5 - .../clustering/tests/test_merging_tools.py | 8 -- .../sortingcomponents/clustering/tools.py | 1 - .../sortingcomponents/matching/circus.py | 10 +- .../sortingcomponents/matching/main.py | 1 - .../sortingcomponents/matching/nearest.py | 11 +- .../matching/tests/test_template_matching.py | 4 - .../matching/tests/test_wobble.py | 2 - .../sortingcomponents/motion/decentralized.py | 5 +- .../sortingcomponents/motion/medicine.py | 4 - .../motion/motion_estimation.py | 1 - .../sortingcomponents/motion/motion_utils.py | 3 - .../motion/tests/test_drege.py | 3 - .../motion/tests/test_motion_estimation.py | 2 +- .../sortingcomponents/peak_detection/main.py | 2 +- .../tests/test_peak_detection.py | 2 +- .../peak_localization/grid.py | 1 - .../peak_localization/main.py | 14 +-- .../tests/test_peak_localization.py | 3 - .../tests/test_peak_selection.py | 43 ++++--- .../waveforms/features_from_peaks.py | 7 +- .../waveforms/neural_network_denoiser.py | 18 +-- .../tests/test_features_from_peaks.py | 2 - .../waveforms/tests/test_hanning_filter.py | 3 - .../tests/test_neural_network_denoiser.py | 4 +- .../waveforms/tests/test_savgol_denoiser.py | 3 - .../waveforms/tests/test_temporal_pca.py | 3 - .../widgets/all_amplitudes_distributions.py | 1 - src/spikeinterface/widgets/amplitudes.py | 1 - .../widgets/autocorrelograms.py | 2 - .../widgets/bombcell_curation.py | 4 +- src/spikeinterface/widgets/collision.py | 5 - src/spikeinterface/widgets/comparison.py | 2 - .../widgets/crosscorrelograms.py | 2 - src/spikeinterface/widgets/drift_templates.py | 2 +- .../widgets/isi_distribution.py | 2 - src/spikeinterface/widgets/metrics.py | 7 +- src/spikeinterface/widgets/multicomparison.py | 3 - src/spikeinterface/widgets/peak_activity.py | 2 +- src/spikeinterface/widgets/peaks_on_probe.py | 7 +- .../widgets/potential_merges.py | 1 - src/spikeinterface/widgets/probe_map.py | 1 - src/spikeinterface/widgets/rasters.py | 9 +- src/spikeinterface/widgets/spike_locations.py | 1 - .../widgets/spike_locations_by_time.py | 3 +- .../widgets/spikes_on_traces.py | 7 -- .../widgets/template_similarity.py | 1 - .../widgets/tests/test_widgets.py | 2 - .../widgets/tests/test_widgets_utils.py | 13 +-- src/spikeinterface/widgets/traces.py | 25 ++-- src/spikeinterface/widgets/unit_depths.py | 1 - src/spikeinterface/widgets/unit_labels.py | 7 +- src/spikeinterface/widgets/unit_locations.py | 1 - src/spikeinterface/widgets/unit_presence.py | 2 - src/spikeinterface/widgets/unit_probe_map.py | 1 - src/spikeinterface/widgets/unit_summary.py | 1 - .../widgets/unit_valid_periods.py | 1 - src/spikeinterface/widgets/unit_waveforms.py | 14 +-- src/spikeinterface/widgets/utils.py | 4 +- .../widgets/utils_ipywidgets.py | 10 +- src/spikeinterface/widgets/widget_list.py | 2 +- 236 files changed, 517 insertions(+), 951 deletions(-) diff --git a/.github/scripts/serialization/objects.py b/.github/scripts/serialization/objects.py index f2f3469076..9544e4a8d9 100644 --- a/.github/scripts/serialization/objects.py +++ b/.github/scripts/serialization/objects.py @@ -140,7 +140,6 @@ def _check_recording_with_probe(rec, check_extra_data=None): def _build_recording_with_interleaved_probes(): - import numpy as np from probeinterface import ProbeGroup, generate_linear_probe from spikeinterface.core import generate_recording diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6d35bc8cd3..315c4cff72 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,8 +5,11 @@ repos: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace -- repo: https://github.com/psf/black-pre-commit-mirror - rev: 26.10.1 +- repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.15.0 hooks: - - id: black + - id: ruff-check + args: [--fix] + files: ^src/ + - id: ruff-format files: ^src/ diff --git a/conftest.py b/conftest.py index 6c4bfbef3a..24a74fe1ec 100644 --- a/conftest.py +++ b/conftest.py @@ -56,7 +56,7 @@ def pytest_collection_modifyitems(config, items): try: rel_path = Path(item.fspath).relative_to(modules_location) - except: + except Exception: continue module = rel_path.parts[0] diff --git a/doc/images/make_comparison_figures.py b/doc/images/make_comparison_figures.py index cdf0c03f9f..be88e474b4 100644 --- a/doc/images/make_comparison_figures.py +++ b/doc/images/make_comparison_figures.py @@ -11,7 +11,6 @@ sys.path.append('../../examples/modules/comparison/') from generate_erroneous_sorting import generate_erroneous_sorting -import spikeinterface.extractors as se import spikeinterface.comparison as sc import spikeinterface.widgets as sw diff --git a/examples/forhowto/plot_extract_lfps.py b/examples/forhowto/plot_extract_lfps.py index 53c4c256c2..404af6edb6 100644 --- a/examples/forhowto/plot_extract_lfps.py +++ b/examples/forhowto/plot_extract_lfps.py @@ -44,12 +44,10 @@ import time import numpy as np import matplotlib.pyplot as plt -from pathlib import Path import pandas as pd import seaborn as sns import spikeinterface as si -import spikeinterface.extractors as se import spikeinterface.preprocessing as spre import spikeinterface.widgets as sw from spikeinterface.core import generate_ground_truth_recording diff --git a/examples/get_started/quickstart.py b/examples/get_started/quickstart.py index 75d5c8d63a..d53bb1d9ea 100644 --- a/examples/get_started/quickstart.py +++ b/examples/get_started/quickstart.py @@ -34,7 +34,6 @@ # The spikeinterface module by itself imports only the spikeinterface.core submodule # which is not useful for the end user -import spikeinterface # We need to import one by one different submodules separately (preferred). # There are several modules: @@ -50,9 +49,7 @@ import spikeinterface as si # import core only import spikeinterface.extractors as se -import spikeinterface.preprocessing as spre import spikeinterface.sorters as ss -import spikeinterface.postprocessing as spost import spikeinterface.metrics as sm import spikeinterface.comparison as sc import spikeinterface.exporters as sexp diff --git a/examples/how_to/auto_label_units.py b/examples/how_to/auto_label_units.py index b70d5e66b2..ac4fbf13dc 100644 --- a/examples/how_to/auto_label_units.py +++ b/examples/how_to/auto_label_units.py @@ -24,7 +24,6 @@ # 3. UnitRefine: pre-trained classifiers to label units as noise or SUA/MUA [Jain]_ # %% -import numpy as np import spikeinterface as si import spikeinterface.curation as sc diff --git a/examples/how_to/benchmark_with_hybrid_recordings.py b/examples/how_to/benchmark_with_hybrid_recordings.py index d983578797..ebac618421 100644 --- a/examples/how_to/benchmark_with_hybrid_recordings.py +++ b/examples/how_to/benchmark_with_hybrid_recordings.py @@ -32,7 +32,6 @@ import spikeinterface.generation as sgen import spikeinterface.widgets as sw -from spikeinterface.sortingcomponents.motion import estimate_motion import numpy as np import matplotlib.pyplot as plt diff --git a/examples/how_to/customize_a_plot.py b/examples/how_to/customize_a_plot.py index 5568534b52..23bff39d72 100644 --- a/examples/how_to/customize_a_plot.py +++ b/examples/how_to/customize_a_plot.py @@ -81,7 +81,6 @@ # Here's an example of making a unit summary plot. # + -import matplotlib.pyplot as plt fig, axs = plt.subplots(ncols=2, nrows=1) unit_id=8 diff --git a/examples/tutorials/comparison/plot_5_comparison_sorter_weaknesses.py b/examples/tutorials/comparison/plot_5_comparison_sorter_weaknesses.py index c588ee82cb..68480c6dc7 100644 --- a/examples/tutorials/comparison/plot_5_comparison_sorter_weaknesses.py +++ b/examples/tutorials/comparison/plot_5_comparison_sorter_weaknesses.py @@ -34,8 +34,6 @@ ############################################################################## # Import -import numpy as np -import pandas as pd import matplotlib.pyplot as plt from spikeinterface.comparison import compare_sorter_to_ground_truth diff --git a/examples/tutorials/core/plot_1_recording_extractor.py b/examples/tutorials/core/plot_1_recording_extractor.py index a3143161b2..a73ffa2716 100644 --- a/examples/tutorials/core/plot_1_recording_extractor.py +++ b/examples/tutorials/core/plot_1_recording_extractor.py @@ -14,7 +14,6 @@ """ -import matplotlib.pyplot as plt import numpy as np import spikeinterface.extractors as se diff --git a/examples/tutorials/core/plot_5_append_concatenate_segments.py b/examples/tutorials/core/plot_5_append_concatenate_segments.py index 5cb1cccb6f..29fb9147ca 100644 --- a/examples/tutorials/core/plot_5_append_concatenate_segments.py +++ b/examples/tutorials/core/plot_5_append_concatenate_segments.py @@ -22,11 +22,10 @@ Here is a short example. """ -import matplotlib.pyplot as plt import numpy as np -from spikeinterface import NumpyRecording, NumpySorting +from spikeinterface import NumpyRecording from spikeinterface import append_recordings, concatenate_recordings ############################################################################## diff --git a/examples/tutorials/curation/plot_1_automated_curation.py b/examples/tutorials/curation/plot_1_automated_curation.py index 97fc05bc6e..8826852cdc 100644 --- a/examples/tutorials/curation/plot_1_automated_curation.py +++ b/examples/tutorials/curation/plot_1_automated_curation.py @@ -193,7 +193,7 @@ def calculate_moving_avg(label_df, confidence_label, window_size): plt.figure(figsize=(6, 6)) plt.plot(p_agreement_sorted, p_agreement_moving_avg, label = 'Moving Average') plt.axhline(y=1/len(np.unique(predictions)), color='black', linestyle='--', label='Chance') -plt.xlabel('Confidence'); #plt.xlim(0.5, 1) +plt.xlabel('Confidence') #plt.xlim(0.5, 1) plt.ylabel('Proportion Agreement with Human Label'); plt.ylim(0, 1) plt.title('Agreement vs Confidence (Moving Average)') plt.legend(); plt.grid(True); plt.show() diff --git a/examples/tutorials/widgets/plot_3_waveforms_gallery.py b/examples/tutorials/widgets/plot_3_waveforms_gallery.py index 76041aab1a..94276a72e0 100644 --- a/examples/tutorials/widgets/plot_3_waveforms_gallery.py +++ b/examples/tutorials/widgets/plot_3_waveforms_gallery.py @@ -8,7 +8,6 @@ import matplotlib.pyplot as plt import spikeinterface as si -import spikeinterface.extractors as se import spikeinterface.widgets as sw ############################################################################## diff --git a/installation_tips/check_your_install.py b/installation_tips/check_your_install.py index caafe09e24..cdaa702e8d 100644 --- a/installation_tips/check_your_install.py +++ b/installation_tips/check_your_install.py @@ -11,11 +11,11 @@ def check_import_si(): - import spikeinterface as si + pass def check_import_si_full(): - import spikeinterface.full as si + pass def _create_recording(short=False): diff --git a/pyproject.toml b/pyproject.toml index 4990bfba0d..aa741e9373 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,13 +51,15 @@ include = ["spikeinterface*"] namespaces = false exclude = ["spikeinterface.*.tests"] -[tool.black] -line-length = 120 - [tool.ruff] line-length = 120 [tool.ruff.lint] -select = ['F401'] +select = ['E4', 'E7', 'E9', 'F'] +exclude = ["**/tests/**", "**/test_*.py", "**/conftest.py"] +ignore = ['E741', 'E731', 'F821'] +[tool.ruff.lint.per-file-ignores] +"**/__init__.py" = ["F401"] +"src/spikeinterface/core/testing_tools.py" = ["E402","F403"] [project.urls] homepage = "https://github.com/SpikeInterface/spikeinterface" @@ -237,7 +239,7 @@ docs = [ dev = [ "spikeinterface[docs]", - "black", + "ruff", "pre-commit", ] @@ -347,7 +349,7 @@ test-all = [ # Tools for the pre-commit hooks. uv installs this group by default. dev = [ - "black", + "ruff", "pre-commit", ] diff --git a/src/spikeinterface/benchmark/benchmark_base.py b/src/spikeinterface/benchmark/benchmark_base.py index 47ec6a70cd..ebf4b0dde5 100644 --- a/src/spikeinterface/benchmark/benchmark_base.py +++ b/src/spikeinterface/benchmark/benchmark_base.py @@ -8,8 +8,6 @@ from spikeinterface.core import SortingAnalyzer, ChannelSparsity, NumpySorting -from spikeinterface.core import SortingAnalyzer, NumpySorting -from spikeinterface.core.job_tools import fix_job_kwargs, split_job_kwargs from spikeinterface import load, create_sorting_analyzer, load_sorting_analyzer from spikeinterface.widgets import get_some_colors @@ -332,7 +330,6 @@ def run(self, case_keys=None, keep=True, verbose=False, **job_kwargs): job_keys = [] for key in case_keys: - result_folder = self.folder / "results" / self.key_to_str(key) sorter_folder = self.folder / "sorters" / self.key_to_str(key) @@ -443,9 +440,9 @@ def get_grouped_keys_mapping(self, levels_to_group_by=None, case_keys=None): keys_mapping = {key: [key] for key in case_keys} else: study_levels = self.levels - assert np.all( - [l in study_levels for l in levels_to_group_by] - ), f"levels_to_group_by must be in {study_levels}, got {levels_to_group_by}" + assert np.all([l in study_levels for l in levels_to_group_by]), ( + f"levels_to_group_by must be in {study_levels}, got {levels_to_group_by}" + ) keys_mapping = {} for key in case_keys: new_key = tuple(key[list(study_levels).index(level)] for level in levels_to_group_by) @@ -609,7 +606,6 @@ def get_pairs_by_level(self, level): pairs = [] for key in self.cases.keys(): - case0 = list(key) case1 = list(key) case0[level_index] = possible_values[0] @@ -702,7 +698,6 @@ def load_folder(cls, folder): zarr_folder = folder / k if zarr_folder.exists(): - result[k] = Templates.from_zarr(zarr_folder) elif format == "sorting_analyzer": analyzer_folder = folder / k diff --git a/src/spikeinterface/benchmark/benchmark_clustering.py b/src/spikeinterface/benchmark/benchmark_clustering.py index 8b5b6de3b8..0af908ff20 100644 --- a/src/spikeinterface/benchmark/benchmark_clustering.py +++ b/src/spikeinterface/benchmark/benchmark_clustering.py @@ -1,20 +1,15 @@ from spikeinterface.sortingcomponents.clustering import find_clusters_from_peaks from spikeinterface.core import NumpySorting from spikeinterface.comparison import GroundTruthComparison -from spikeinterface.widgets import ( - plot_probe_map, - plot_agreement_matrix, -) import numpy as np -from spikeinterface.core.job_tools import fix_job_kwargs, split_job_kwargs +from spikeinterface.core.job_tools import fix_job_kwargs from .benchmark_base import Benchmark, BenchmarkStudy, MixinStudyUnitCount from spikeinterface.core.sortinganalyzer import create_sorting_analyzer class ClusteringBenchmark(Benchmark): - def __init__(self, recording, gt_sorting, params, indices, peaks, exhaustive_gt=True): self.recording = recording self.gt_sorting = gt_sorting @@ -238,7 +233,6 @@ def plot_error_metrics(self, metric="cosine", case_keys=None, figsize=(15, 5)): fig, axes = plt.subplots(ncols=len(case_keys), nrows=1, figsize=figsize, squeeze=False) for count, key in enumerate(case_keys): - result = self.get_result(key) scores = result["gt_comparison"].get_ordered_agreement_scores() @@ -279,7 +273,6 @@ def plot_metrics_vs_snr(self, metric="agreement", case_keys=None, figsize=(15, 5 fig = None for count, key in enumerate(case_keys): - result = self.get_result(key) scores = result["gt_comparison"].agreement_scores @@ -334,7 +327,6 @@ def plot_metrics_vs_depth_and_snr(self, metric="agreement", case_keys=None, figs fig, axes = plt.subplots(ncols=len(case_keys), nrows=1, figsize=figsize, squeeze=False) for count, key in enumerate(case_keys): - result = self.get_result(key) scores = result["gt_comparison"].agreement_scores diff --git a/src/spikeinterface/benchmark/benchmark_matching.py b/src/spikeinterface/benchmark/benchmark_matching.py index 8f28f18a73..c6d4ec4fa5 100644 --- a/src/spikeinterface/benchmark/benchmark_matching.py +++ b/src/spikeinterface/benchmark/benchmark_matching.py @@ -4,7 +4,6 @@ from spikeinterface.core import NumpySorting from spikeinterface.comparison import CollisionGTComparison, compare_sorter_to_ground_truth from spikeinterface.widgets import ( - plot_agreement_matrix, plot_comparison_collision_by_similarity, ) @@ -14,7 +13,6 @@ class MatchingBenchmark(Benchmark): - def __init__(self, recording, gt_sorting, params): self.recording = recording self.gt_sorting = gt_sorting diff --git a/src/spikeinterface/benchmark/benchmark_merging.py b/src/spikeinterface/benchmark/benchmark_merging.py index 5f16ce3cab..0b25d851fa 100644 --- a/src/spikeinterface/benchmark/benchmark_merging.py +++ b/src/spikeinterface/benchmark/benchmark_merging.py @@ -7,12 +7,10 @@ plot_crosscorrelograms, ) -import numpy as np from .benchmark_base import Benchmark, BenchmarkStudy class MergingBenchmark(Benchmark): - def __init__(self, recording, splitted_sorting, params, gt_sorting, splitted_cells=None): self.recording = recording self.splitted_sorting = splitted_sorting @@ -45,7 +43,6 @@ def compute_result(self, match_score=0.5, exhaustive_gt=True): class MergingStudy(BenchmarkStudy): - benchmark_class = MergingBenchmark def create_benchmark(self, key): diff --git a/src/spikeinterface/benchmark/benchmark_motion_estimation.py b/src/spikeinterface/benchmark/benchmark_motion_estimation.py index fabca60b2d..b864b34bba 100644 --- a/src/spikeinterface/benchmark/benchmark_motion_estimation.py +++ b/src/spikeinterface/benchmark/benchmark_motion_estimation.py @@ -1,6 +1,3 @@ -import json -from pathlib import Path -import pickle import time import numpy as np @@ -183,7 +180,6 @@ def plot_drift( case_keys = list(self.cases.keys()) for key in case_keys: - bench = self.benchmarks[key] fig = plt.figure(figsize=figsize) @@ -258,7 +254,6 @@ def plot_errors(self, case_keys=None, figsize=None, lim=None): case_keys = list(self.cases.keys()) for key in case_keys: - bench = self.benchmarks[key] label = self.cases[key]["label"] @@ -329,7 +324,6 @@ def plot_summary_errors(self, case_keys=None, show_legend=True, figsize=(15, 5)) colors = self.get_colors() for count, key in enumerate(case_keys): - bench = self.benchmarks[key] label = self.cases[key]["label"] diff --git a/src/spikeinterface/benchmark/benchmark_peak_localization.py b/src/spikeinterface/benchmark/benchmark_peak_localization.py index f38e1de916..054ef3f38d 100644 --- a/src/spikeinterface/benchmark/benchmark_peak_localization.py +++ b/src/spikeinterface/benchmark/benchmark_peak_localization.py @@ -9,7 +9,6 @@ class PeakLocalizationBenchmark(Benchmark): - def __init__(self, recording, gt_sorting, params, gt_positions, channel_from_template=False): self.recording = recording self.gt_sorting = gt_sorting @@ -69,7 +68,6 @@ def compute_result(self, **result_params): class PeakLocalizationStudy(BenchmarkStudy): - benchmark_class = PeakLocalizationBenchmark def create_benchmark(self, key): @@ -152,7 +150,6 @@ def plot_comparison_positions(self, case_keys=None): class UnitLocalizationBenchmark(Benchmark): - def __init__(self, recording, gt_sorting, params, gt_positions): self.recording = recording self.gt_sorting = gt_sorting @@ -264,8 +261,6 @@ def plot_comparison_positions(self, case_keys=None): zdx = np.argsort(distances_to_center) idx = np.argsort(norms) - from scipy.signal import savgol_filter - wdx = np.argsort(snrs) data = result["errors"] diff --git a/src/spikeinterface/benchmark/benchmark_peak_selection.py b/src/spikeinterface/benchmark/benchmark_peak_selection.py index a18743f81b..a0b0c72c3d 100644 --- a/src/spikeinterface/benchmark/benchmark_peak_selection.py +++ b/src/spikeinterface/benchmark/benchmark_peak_selection.py @@ -1,16 +1,7 @@ -from spikeinterface.sortingcomponents.clustering import find_clusters_from_peaks -from spikeinterface.core import NumpySorting -from spikeinterface.comparison import GroundTruthComparison -from spikeinterface.comparison.comparisontools import make_matching_events -from spikeinterface.core import get_noise_levels - -import numpy as np - from .benchmark_base import Benchmark, BenchmarkStudy class PeakSelectionBenchmark(Benchmark): - def __init__(self, recording, gt_sorting, params, indices, exhaustive_gt=True): pass @@ -34,7 +25,6 @@ def compute_result(self, **result_params): class PeakSelectionStudy(BenchmarkStudy): - benchmark_class = PeakSelectionBenchmark def create_benchmark(self, key): diff --git a/src/spikeinterface/benchmark/benchmark_plot_tools.py b/src/spikeinterface/benchmark/benchmark_plot_tools.py index 7f0fc64cb4..530678da5b 100644 --- a/src/spikeinterface/benchmark/benchmark_plot_tools.py +++ b/src/spikeinterface/benchmark/benchmark_plot_tools.py @@ -1,7 +1,4 @@ -import warnings - import numpy as np -from spikeinterface.widgets import get_some_colors from .benchmark_tools import sigmoid, fit_sigmoid @@ -308,7 +305,7 @@ def plot_unit_counts( else: yerr = None - if not "well_detected" in col and revert_bad: + if "well_detected" not in col and revert_bad: y = -y if i == 0: @@ -455,7 +452,6 @@ def _plot_performances_vs_metric( fig = axs[0].get_figure() for count, performance_name in enumerate(performance_names): - ax = axs[count] if levels_to_group_by is not None: case_group_keys, labels = study.get_grouped_keys_mapping( @@ -467,9 +463,9 @@ def _plot_performances_vs_metric( colors = study.get_colors(levels_to_group_by=levels_to_group_by) - assert all( - [key in colors for key in case_group_keys] - ), f"colors must have a color for each case key: {case_group_keys}" + assert all([key in colors for key in case_group_keys]), ( + f"colors must have a color for each case key: {case_group_keys}" + ) for key, key_list in case_group_keys.items(): color = colors[key] @@ -827,9 +823,9 @@ def plot_performances_swarm( perfs = study.get_performance_by_unit(case_keys=case_keys) perfs, case_keys, _, _ = aggregate_dataframe_by_levels(perfs, study, case_keys, levels_to_group_by) - assert all( - [key in performance_colors for key in performance_names] - ), f"performance_colors must have a color for each performance name: {performance_names}" + assert all([key in performance_colors for key in performance_names]), ( + f"performance_colors must have a color for each performance name: {performance_names}" + ) if ax is None: fig, ax = plt.subplots(figsize=figsize) @@ -897,9 +893,9 @@ def plot_performances_comparison( num_methods = len(case_keys) assert num_methods >= 2, "plot_performances_comparison need at least 2 cases!" - assert all( - [key in performance_colors for key in performance_names] - ), f"performance_colors must have a color for each performance name: {performance_names}" + assert all([key in performance_colors for key in performance_names]), ( + f"performance_colors must have a color for each performance name: {performance_names}" + ) if axs is None: fig, axs = plt.subplots(ncols=num_methods - 1, nrows=num_methods - 1, figsize=figsize, squeeze=False) @@ -1081,7 +1077,6 @@ def plot_performance_losses( fig = axs[0].get_figure() for count, perf_name in enumerate(performance_names): - ax = axs[count] positions = study.get_gt_unit_locations(case0) diff --git a/src/spikeinterface/benchmark/benchmark_sorter.py b/src/spikeinterface/benchmark/benchmark_sorter.py index 932334f209..e22aafae28 100644 --- a/src/spikeinterface/benchmark/benchmark_sorter.py +++ b/src/spikeinterface/benchmark/benchmark_sorter.py @@ -2,7 +2,6 @@ This replace the previous `GroundTruthStudy` """ -import numpy as np from spikeinterface.core import NumpySorting, create_sorting_analyzer from .benchmark_base import Benchmark, BenchmarkStudy, MixinStudyUnitCount from spikeinterface.sorters import run_sorter diff --git a/src/spikeinterface/benchmark/benchmark_sorter_without_gt.py b/src/spikeinterface/benchmark/benchmark_sorter_without_gt.py index 818ed3f009..c9c26b0d29 100644 --- a/src/spikeinterface/benchmark/benchmark_sorter_without_gt.py +++ b/src/spikeinterface/benchmark/benchmark_sorter_without_gt.py @@ -4,7 +4,7 @@ import numpy as np from spikeinterface.core import NumpySorting, create_sorting_analyzer -from .benchmark_base import Benchmark, BenchmarkStudy, MixinStudyUnitCount +from .benchmark_base import Benchmark, BenchmarkStudy from spikeinterface.sorters import run_sorter from spikeinterface.comparison import compare_multiple_sorters @@ -107,7 +107,6 @@ def compute_results( groups = self._get_comparison_groups() for data_key, group in groups.items(): - sorting_list = [self.get_result(key)["sorting"] for key in group] name_list = [key for key in group] multi_comp = compare_multiple_sorters( diff --git a/src/spikeinterface/benchmark/tests/common_benchmark_testing.py b/src/spikeinterface/benchmark/tests/common_benchmark_testing.py index 49f9e9350a..7a77b40342 100644 --- a/src/spikeinterface/benchmark/tests/common_benchmark_testing.py +++ b/src/spikeinterface/benchmark/tests/common_benchmark_testing.py @@ -4,12 +4,9 @@ This only a local testing. """ -import pytest -from pathlib import Path import os from spikeinterface.core.job_tools import fix_job_kwargs -import numpy as np from spikeinterface.core import ( generate_ground_truth_recording, diff --git a/src/spikeinterface/benchmark/tests/test_benchmark_merging.py b/src/spikeinterface/benchmark/tests/test_benchmark_merging.py index 022ba18ebd..e09faa10af 100644 --- a/src/spikeinterface/benchmark/tests/test_benchmark_merging.py +++ b/src/spikeinterface/benchmark/tests/test_benchmark_merging.py @@ -1,6 +1,5 @@ import pytest from pathlib import Path -import numpy as np import shutil diff --git a/src/spikeinterface/benchmark/tests/test_benchmark_sorter_without_gt.py b/src/spikeinterface/benchmark/tests/test_benchmark_sorter_without_gt.py index 62492cbdbe..15131e0f28 100644 --- a/src/spikeinterface/benchmark/tests/test_benchmark_sorter_without_gt.py +++ b/src/spikeinterface/benchmark/tests/test_benchmark_sorter_without_gt.py @@ -3,7 +3,6 @@ from pathlib import Path from spikeinterface import generate_ground_truth_recording -from spikeinterface.preprocessing import bandpass_filter from spikeinterface.benchmark import SorterStudyWithoutGroundTruth diff --git a/src/spikeinterface/benchmark/tests/test_residual_analysis.py b/src/spikeinterface/benchmark/tests/test_residual_analysis.py index 738e4ac3fe..4d01590681 100644 --- a/src/spikeinterface/benchmark/tests/test_residual_analysis.py +++ b/src/spikeinterface/benchmark/tests/test_residual_analysis.py @@ -1,6 +1,4 @@ -import shutil import pytest -from pathlib import Path from spikeinterface.benchmark.tests.common_benchmark_testing import make_dataset diff --git a/src/spikeinterface/comparison/basecomparison.py b/src/spikeinterface/comparison/basecomparison.py index 3b6dd47c5a..d532f59a2d 100644 --- a/src/spikeinterface/comparison/basecomparison.py +++ b/src/spikeinterface/comparison/basecomparison.py @@ -28,7 +28,6 @@ class BaseMultiComparison(BaseComparison): """ def __init__(self, object_list, name_list, match_score=0.5, chance_score=0.1, verbose=False, n_jobs=1): - import networkx as nx BaseComparison.__init__( self, diff --git a/src/spikeinterface/comparison/collision.py b/src/spikeinterface/comparison/collision.py index f6dfcc2e95..ce803b988e 100644 --- a/src/spikeinterface/comparison/collision.py +++ b/src/spikeinterface/comparison/collision.py @@ -1,5 +1,3 @@ -import importlib - from .paircomparisons import GroundTruthComparison from .comparisontools import make_collision_events @@ -161,7 +159,6 @@ def compute_all_pair_collision_bins(self): loop = tqdm(loop, desc="collision by bin") for c in loop: - score1 = labels_st1[unit_ids1[c]][seg_index][spike_indices1[c]] score2 = labels_st1[unit_ids2[c]][seg_index][spike_indices2[c]] diff --git a/src/spikeinterface/comparison/comparisontools.py b/src/spikeinterface/comparison/comparisontools.py index 4892014575..90e807f45d 100644 --- a/src/spikeinterface/comparison/comparisontools.py +++ b/src/spikeinterface/comparison/comparisontools.py @@ -275,9 +275,9 @@ def make_match_count_matrix( num_segments_sorting1 = sorting1.get_num_segments() num_segments_sorting2 = sorting2.get_num_segments() - assert ( - num_segments_sorting1 == num_segments_sorting2 - ), "make_match_count_matrix : sorting1 and sorting2 must have the same segment number" + assert num_segments_sorting1 == num_segments_sorting2, ( + "make_match_count_matrix : sorting1 and sorting2 must have the same segment number" + ) # Segments should be matched one by one for segment_index in range(num_segments_sorting1): @@ -495,7 +495,6 @@ def make_best_match(agreement_scores, min_score) -> "tuple[pd.Series, pd.Series] best_match_21 : pd.Series """ - import pandas as pd unit1_ids = np.array(agreement_scores.index) unit2_ids = np.array(agreement_scores.columns) @@ -539,7 +538,6 @@ def make_hungarian_match(agreement_scores, min_score): hungarian_match_21 : pd.Series """ - import pandas as pd unit1_ids = np.array(agreement_scores.index) unit2_ids = np.array(agreement_scores.columns) @@ -1328,9 +1326,9 @@ def compute_distance_matrix( num_segments_sorting1 = sorting1.get_num_segments() num_segments_sorting2 = sorting2.get_num_segments() - assert ( - num_segments_sorting1 == num_segments_sorting2 - ), "make_match_count_matrix : sorting1 and sorting2 must have the same number of segments" + assert num_segments_sorting1 == num_segments_sorting2, ( + "make_match_count_matrix : sorting1 and sorting2 must have the same number of segments" + ) squared_norm_1_vector = _compute_spike_vector_squared_norm(spike_vector_per_segment1, num_units1, delta_frames) squared_norm_2_vector = _compute_spike_vector_squared_norm(spike_vector_per_segment2, num_units2, delta_frames) @@ -1401,9 +1399,9 @@ def calculate_generalized_comparison_metrics( num_segments_sorting1 = sorting1.get_num_segments() num_segments_sorting2 = sorting2.get_num_segments() - assert ( - num_segments_sorting1 == num_segments_sorting2 - ), "make_match_count_matrix : sorting1 and sorting2 must have the same number of segments" + assert num_segments_sorting1 == num_segments_sorting2, ( + "make_match_count_matrix : sorting1 and sorting2 must have the same number of segments" + ) squared_norm1 = _compute_spike_vector_squared_norm(spike_vector1_segments, num_units2, delta_frames) squared_norm2 = _compute_spike_vector_squared_norm(spike_vector2_segments, num_units2, delta_frames) diff --git a/src/spikeinterface/comparison/multicomparisons.py b/src/spikeinterface/comparison/multicomparisons.py index a0feda4a52..e3740c7e36 100644 --- a/src/spikeinterface/comparison/multicomparisons.py +++ b/src/spikeinterface/comparison/multicomparisons.py @@ -1,11 +1,6 @@ -from pathlib import Path -import json -import pickle -import warnings - import numpy as np -from spikeinterface.core import load, BaseSorting, BaseSortingSegment +from spikeinterface.core import BaseSorting, BaseSortingSegment from spikeinterface.core.core_tools import define_function_from_class from .basecomparison import BaseMultiComparison, MixinSpikeTrainComparison, MixinTemplateComparison from .paircomparisons import SymmetricSortingComparison, TemplateComparison diff --git a/src/spikeinterface/comparison/paircomparisons.py b/src/spikeinterface/comparison/paircomparisons.py index 47e85a03de..be05ca5d8a 100644 --- a/src/spikeinterface/comparison/paircomparisons.py +++ b/src/spikeinterface/comparison/paircomparisons.py @@ -39,7 +39,7 @@ def __init__( if sorting2_name is None: sorting2_name = "sorting2" assert sorting1.get_num_segments() == sorting2.get_num_segments(), ( - "The two sortings must have the same " "number of segments! " + "The two sortings must have the same number of segments! " ) BasePairComparison.__init__( @@ -100,7 +100,6 @@ def _do_agreement(self): self.match_event_count, self.event_counts1, self.event_counts2 ) elif self.agreement_method == "distance": - self.agreement_scores = calculate_agreement_scores_with_distance( self.sorting1, self.sorting2, @@ -294,7 +293,6 @@ def __init__( compute_misclassifications: bool = False, verbose: bool = False, ): - import pandas as pd if gt_name is None: gt_name = "ground truth" diff --git a/src/spikeinterface/comparison/tests/test_groundtruthcomparison.py b/src/spikeinterface/comparison/tests/test_groundtruthcomparison.py index 27b8f73077..48b91c6877 100644 --- a/src/spikeinterface/comparison/tests/test_groundtruthcomparison.py +++ b/src/spikeinterface/comparison/tests/test_groundtruthcomparison.py @@ -1,4 +1,3 @@ -import numpy as np from numpy.testing import assert_array_equal diff --git a/src/spikeinterface/comparison/tests/test_multisortingcomparison.py b/src/spikeinterface/comparison/tests/test_multisortingcomparison.py index 72f39f74ea..64f4efdc1d 100644 --- a/src/spikeinterface/comparison/tests/test_multisortingcomparison.py +++ b/src/spikeinterface/comparison/tests/test_multisortingcomparison.py @@ -8,7 +8,7 @@ from spikeinterface.core import generate_sorting from spikeinterface.core.job_tools import get_usable_cpu_count from spikeinterface.extractors import NumpySorting -from spikeinterface.comparison import compare_multiple_sorters, MultiSortingComparison +from spikeinterface.comparison import compare_multiple_sorters ON_GITHUB = bool(os.getenv("GITHUB_ACTIONS")) diff --git a/src/spikeinterface/comparison/tests/test_templatecomparison.py b/src/spikeinterface/comparison/tests/test_templatecomparison.py index 001f80f4f6..6879629e6d 100644 --- a/src/spikeinterface/comparison/tests/test_templatecomparison.py +++ b/src/spikeinterface/comparison/tests/test_templatecomparison.py @@ -1,5 +1,3 @@ -import shutil -import pytest import numpy as np from spikeinterface.core import create_sorting_analyzer, generate_ground_truth_recording diff --git a/src/spikeinterface/core/analyzer_extension_core.py b/src/spikeinterface/core/analyzer_extension_core.py index 070176244f..8159c18160 100644 --- a/src/spikeinterface/core/analyzer_extension_core.py +++ b/src/spikeinterface/core/analyzer_extension_core.py @@ -181,7 +181,6 @@ def _run(self, verbose=False, **job_kwargs): self.data.clear() recording = self.sorting_analyzer.recording - sorting = self.sorting_analyzer.sorting # retrieve spike vector and the sampling some_spikes = self.sorting_analyzer.get_extension("random_spikes").get_random_spikes() @@ -252,8 +251,6 @@ def _select_units_extension_data(self, unit_ids): some_spikes = self.sorting_analyzer.get_extension("random_spikes").get_random_spikes() keep_unit_indices = self.sorting_analyzer.sorting.ids_to_indices(unit_ids) - spikes = self.sorting_analyzer.sorting.to_spike_vector() - # some_spikes = spikes[random_spikes_indices] keep_spike_mask = np.isin(some_spikes["unit_index"], keep_unit_indices) new_data = dict() @@ -529,9 +526,9 @@ def _compute_and_append_from_waveforms(self, operators): # spikes = self.sorting_analyzer.sorting.to_spike_vector() # some_spikes = spikes[self.sorting_analyzer.random_spikes_indices] - assert self.sorting_analyzer.has_extension( - "random_spikes" - ), "compute 'templates' requires the random_spikes extension. You can run sorting_analyzer.compute('random_spikes')" + assert self.sorting_analyzer.has_extension("random_spikes"), ( + "compute 'templates' requires the random_spikes extension. You can run sorting_analyzer.compute('random_spikes')" + ) some_spikes = self.sorting_analyzer.get_extension("random_spikes").get_random_spikes() for unit_index, unit_id in enumerate(unit_ids): spike_mask = some_spikes["unit_index"] == unit_index @@ -1359,7 +1356,6 @@ def _run(self, **job_kwargs): # Check if we need to propagate any old metrics. If so, we'll do that. # Otherwise, we'll avoid attempting to load an empty metrics. if set(self.params["metrics_to_compute"]) != set(self.params["metric_names"]): - extension = self.sorting_analyzer.get_extension(self.extension_name) if delete_existing_metrics is False and extension is not None and extension.data.get("metrics") is not None: existing_metrics = extension.params["metric_names"] @@ -1451,7 +1447,6 @@ def _merge_extension_data( dict Dictionary containing the merged metrics DataFrame. """ - import pandas as pd available_metric_names = self.get_available_metric_names() metric_names = [m for m in self.params["metric_names"] if m in available_metric_names] @@ -1497,7 +1492,6 @@ def _split_extension_data( verbose : bool, default: False Whether to print verbose output. """ - import pandas as pd from itertools import chain available_metric_names = [m.metric_name for m in self.metric_list] @@ -1524,7 +1518,6 @@ def _split_extension_data( return new_data def set_data(self, ext_data_name, data): - import pandas as pd if ext_data_name == "metrics": metrics = self._cast_metrics(data) @@ -1629,9 +1622,9 @@ def _get_data(self, outputs="numpy", concatenated=False, return_data_name=None, if return_data_name is None: return_data_name = self.nodepipeline_variables[0] else: - assert ( - return_data_name in self.nodepipeline_variables - ), f"return_data_name {return_data_name} not in nodepipeline_variables {self.nodepipeline_variables}" + assert return_data_name in self.nodepipeline_variables, ( + f"return_data_name {return_data_name} not in nodepipeline_variables {self.nodepipeline_variables}" + ) all_data = self.data[return_data_name] # data gathered directly into a zarr store (e.g. by the node pipeline) is kept as a @@ -1799,12 +1792,10 @@ def _select_channels_sparse_data(old_sorting_analyzer, old_data, new_channel_ids new_data = np.zeros_like(old_data) max_num_active_channels = 0 for data_index, (one_old_data, unit_index) in enumerate(zip(old_data, random_spikes["unit_index"])): - unit_id = unit_ids[unit_index] channel_slice = unit_sparsity_slices[unit_id] if len(channel_slice) > 0: - size_of_new_mask = len(channel_slice) new_data[data_index, :, :size_of_new_mask] = one_old_data[:, channel_slice] diff --git a/src/spikeinterface/core/base.py b/src/spikeinterface/core/base.py index dbecd82bbe..eae31791a3 100644 --- a/src/spikeinterface/core/base.py +++ b/src/spikeinterface/core/base.py @@ -1,5 +1,4 @@ from pathlib import Path -import shutil from typing import Any from collections.abc import Iterable, Sequence import importlib @@ -7,26 +6,19 @@ import weakref import json import pickle -import random -import string from packaging.version import parse from copy import deepcopy import numpy as np -from .globals import get_global_tmp_folder, is_set_global_tmp_folder from .core_tools import ( - clean_zarr_folder_name, is_dict_extractor, SIJsonEncoder, - is_path_remote, make_paths_relative, make_paths_absolute, check_paths_relative, retrieve_importing_provenance, - load_properties_from_folder, ) -from .job_tools import _shared_job_kwargs_doc # base dtypes used throughout spikeinterface base_peak_dtype = [ @@ -87,9 +79,9 @@ def __init__(self, main_ids: Sequence) -> None: # string column. Store it as fixed-width unicode like every other source. self._main_ids = np.array(self._main_ids.tolist()) if len(self._main_ids) > 0: - assert ( - self._main_ids.dtype.kind in "uiSU" - ), f"Main IDs can only be integers (signed/unsigned) or strings, not {self._main_ids.dtype}" + assert self._main_ids.dtype.kind in "uiSU", ( + f"Main IDs can only be integers (signed/unsigned) or strings, not {self._main_ids.dtype}" + ) self._segments: "list[BaseSegment]" = [] @@ -117,7 +109,7 @@ def _get_common_repr_html(self, common_style): html_annotations = f"
Annotations
" + html_annotations += "" html_properties = f"
Properties