Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ authors = [
]
description = "Python toolkit for analysis, visualization, and comparison of spike sorting output"
readme = "README.md"
requires-python = ">=3.9"
requires-python = ">=3.10"
classifiers = [
"Programming Language :: Python :: 3 :: Only",
"License :: OSI Approved :: MIT License",
Expand Down
2 changes: 0 additions & 2 deletions src/spikeinterface/benchmark/benchmark_base.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import annotations

from pathlib import Path
import shutil
import json
Expand Down
2 changes: 0 additions & 2 deletions src/spikeinterface/benchmark/benchmark_clustering.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import annotations

from spikeinterface.sortingcomponents.clustering import find_clusters_from_peaks
from spikeinterface.core import NumpySorting
from spikeinterface.comparison import GroundTruthComparison
Expand Down
2 changes: 0 additions & 2 deletions src/spikeinterface/benchmark/benchmark_matching.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import annotations

import warnings

from spikeinterface.sortingcomponents.matching import find_spikes_from_templates
Expand Down
2 changes: 0 additions & 2 deletions src/spikeinterface/benchmark/benchmark_merging.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import annotations

from spikeinterface.curation.auto_merge import auto_merge_units
from spikeinterface.comparison import compare_sorter_to_ground_truth
from spikeinterface.core.sortinganalyzer import create_sorting_analyzer
Expand Down
2 changes: 0 additions & 2 deletions src/spikeinterface/benchmark/benchmark_motion_estimation.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import annotations

import json
from pathlib import Path
import pickle
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import annotations

import numpy as np


Expand Down
2 changes: 0 additions & 2 deletions src/spikeinterface/benchmark/benchmark_peak_detection.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import annotations

from spikeinterface.sortingcomponents.peak_detection import detect_peaks
from spikeinterface.core import NumpySorting
from spikeinterface.comparison import GroundTruthComparison
Expand Down
2 changes: 0 additions & 2 deletions src/spikeinterface/benchmark/benchmark_peak_localization.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import annotations

from spikeinterface.postprocessing.localization_tools import (
compute_center_of_mass,
compute_monopolar_triangulation,
Expand Down
2 changes: 0 additions & 2 deletions src/spikeinterface/benchmark/benchmark_peak_selection.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import annotations

from spikeinterface.sortingcomponents.clustering import find_clusters_from_peaks
from spikeinterface.core import NumpySorting
from spikeinterface.comparison import GroundTruthComparison
Expand Down
2 changes: 0 additions & 2 deletions src/spikeinterface/comparison/basecomparison.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import annotations

from copy import deepcopy
from typing import OrderedDict
from concurrent.futures import ProcessPoolExecutor
Expand Down
2 changes: 0 additions & 2 deletions src/spikeinterface/comparison/collision.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import annotations

import importlib

from .paircomparisons import GroundTruthComparison
Expand Down
2 changes: 0 additions & 2 deletions src/spikeinterface/comparison/comparisontools.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
Some functions internally use by SortingComparison.
"""

from __future__ import annotations

from spikeinterface.core.basesorting import BaseSorting

import numpy as np
Expand Down
2 changes: 0 additions & 2 deletions src/spikeinterface/comparison/correlogram.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import annotations

from .paircomparisons import GroundTruthComparison

# this import was previously used. Leave for now.
Expand Down
17 changes: 7 additions & 10 deletions src/spikeinterface/comparison/hybrid.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
from __future__ import annotations

import warnings

from pathlib import Path
from typing import List, Union
import numpy as np
from spikeinterface.core import (
BaseRecording,
Expand Down Expand Up @@ -65,13 +62,13 @@ def __init__(
self,
parent_recording: BaseRecording,
templates: np.ndarray,
injected_sorting: Union[BaseSorting, None] = None,
nbefore: Union[List[int], int, None] = None,
injected_sorting: BaseSorting | None = None,
nbefore: list[int] | int | None = None,
firing_rate: float = 10,
amplitude_factor: Union[np.ndarray, None] = None,
amplitude_factor: np.ndarray | None = None,
amplitude_std: float = 0.0,
refractory_period_ms: float = 2.0,
injected_sorting_folder: Union[str, Path, None] = None,
injected_sorting_folder: str | Path | None = None,
seed=None,
):

Expand Down Expand Up @@ -172,12 +169,12 @@ class HybridSpikesRecording(InjectTemplatesRecording):
def __init__(
self,
wvf_extractor,
injected_sorting: Union[BaseSorting, None] = None,
unit_ids: Union[List[int], None] = None,
injected_sorting: BaseSorting | None = None,
unit_ids: list[int] | None = None,
max_injected_per_unit: int = 1000,
injected_rate: float = 0.05,
refractory_period_ms: float = 1.5,
injected_sorting_folder: Union[str, Path, None] = None,
injected_sorting_folder: str | Path | None = None,
) -> None:

warnings.warn(
Expand Down
2 changes: 0 additions & 2 deletions src/spikeinterface/comparison/multicomparisons.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import annotations

from pathlib import Path
import json
import pickle
Expand Down
2 changes: 0 additions & 2 deletions src/spikeinterface/comparison/paircomparisons.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import annotations

import numpy as np

from spikeinterface.core import BaseSorting
Expand Down
2 changes: 1 addition & 1 deletion src/spikeinterface/core/analyzer_extension_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -677,7 +677,7 @@ def get_templates(self, unit_ids=None, operator="average", percentile=None, save

Returns
-------
templates : np.array | Templates
templates :np.ndarray | Templates
The returned templates (num_units, num_samples, num_channels)
"""
if operator != "percentile":
Expand Down
58 changes: 29 additions & 29 deletions src/spikeinterface/core/base.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from __future__ import annotations

from pathlib import Path
import shutil
from typing import Any, Iterable, List, Optional, Sequence, Union
from typing import Any
from collections.abc import Iterable, Sequence
import importlib
import warnings
import weakref
Expand Down Expand Up @@ -144,11 +146,11 @@ def get_num_segments(self) -> int:
# This is implemented in BaseRecording or BaseSorting
raise NotImplementedError

def get_parent(self) -> Optional[BaseExtractor]:
def get_parent(self) -> BaseExtractor | None:
"""Returns parent object if it exists, otherwise None"""
return getattr(self, "_parent", None)

def _check_segment_index(self, segment_index: Optional[int] = None) -> int:
def _check_segment_index(self, segment_index: int | None = None) -> int:
if segment_index is None:
if self.get_num_segments() == 1:
return 0
Expand Down Expand Up @@ -251,7 +253,7 @@ def get_annotation(self, key: str, copy: bool = True) -> Any:
v = deepcopy(v)
return v

def get_annotation_keys(self) -> List:
def get_annotation_keys(self) -> list:
return list(self._annotations.keys())

def set_property(
Expand Down Expand Up @@ -361,14 +363,14 @@ def set_property(
self._properties[key] = np.zeros_like(values, dtype=values.dtype)
self._properties[key][indices] = values

def get_property(self, key: str, ids: Optional[Iterable] = None) -> np.ndarray:
def get_property(self, key: str, ids: Iterable | None = None) -> np.ndarray:
values = self._properties.get(key, None)
if ids is not None and values is not None:
inds = self.ids_to_indices(ids)
values = values[inds]
return values

def get_property_keys(self) -> List:
def get_property_keys(self) -> list:
return list(self._properties.keys())

def delete_property(self, key) -> None:
Expand All @@ -379,10 +381,10 @@ def delete_property(self, key) -> None:

def copy_metadata(
self,
other: "BaseExtractor",
other: BaseExtractor,
only_main: bool = False,
ids: Union[Iterable, slice, None] = None,
skip_properties: Optional[Iterable[str]] = None,
ids: Iterable | slice | None = None,
skip_properties: Iterable[str] | None = None,
) -> None:
"""
Copy metadata (annotations/properties) to another extractor (`other`).
Expand Down Expand Up @@ -436,7 +438,7 @@ def to_dict(
self,
include_annotations: bool = False,
include_properties: bool = False,
relative_to: Union[str, Path, None] = None,
relative_to: str | Path | None = None,
folder_metadata=None,
recursive: bool = False,
) -> dict:
Expand All @@ -461,11 +463,11 @@ def to_dict(
Whether to include all annotations in the dictionary
include_properties : bool, default: False
Whether to include all properties in the dictionary, by default False.
relative_to : Union[str, Path, None], default: None
relative_to : str | Path | None, default: None
If provided, file and folder paths will be made relative to this path,
enabling portability in folder formats such as the waveform extractor,
by default None.
folder_metadata : Union[str, Path, None], default: None
folder_metadata : str | Path | None, default: None
Path to a folder containing additional metadata files (e.g., probe information in BaseRecording)
in numpy `npy` format, by default None.
recursive : bool, default: False
Expand Down Expand Up @@ -568,7 +570,7 @@ def to_dict(
return dump_dict

@staticmethod
def from_dict(dictionary: dict, base_folder: Optional[Union[Path, str]] = None) -> "BaseExtractor":
def from_dict(dictionary: dict, base_folder: Path | str | None = None) -> BaseExtractor:
"""
Instantiate extractor from dictionary

Expand Down Expand Up @@ -622,7 +624,7 @@ def save_metadata_to_folder(self, folder_metadata):
values = self.get_property(key)
np.save(prop_folder / (key + ".npy"), values)

def clone(self) -> "BaseExtractor":
def clone(self) -> BaseExtractor:
"""
Clones an existing extractor into a new instance.
"""
Expand Down Expand Up @@ -677,7 +679,7 @@ def check_if_pickle_serializable(self) -> bool:
return self.check_serializability("pickle")

@staticmethod
def _get_file_path(file_path: Union[str, Path], extensions: Sequence) -> Path:
def _get_file_path(file_path: str | Path, extensions: Sequence) -> Path:
"""
Helper function to be used by various dump_to_file utilities.

Expand Down Expand Up @@ -708,7 +710,7 @@ def _get_file_path(file_path: Union[str, Path], extensions: Sequence) -> Path:
)
return file_path

def dump(self, file_path: Union[str, Path], relative_to=None, folder_metadata=None) -> None:
def dump(self, file_path: str | Path, relative_to=None, folder_metadata=None) -> None:
"""
Dumps extractor to json or pickle

Expand All @@ -729,9 +731,9 @@ def dump(self, file_path: Union[str, Path], relative_to=None, folder_metadata=No

def dump_to_json(
self,
file_path: Union[str, Path, None] = None,
relative_to: Union[str, Path, bool, None] = None,
folder_metadata: Union[str, Path, None] = None,
file_path: str | Path | None = None,
relative_to: str | Path | bool | None = None,
folder_metadata: str | Path | None = None,
) -> None:
"""
Dump recording extractor to json file.
Expand Down Expand Up @@ -770,10 +772,10 @@ def dump_to_json(

def dump_to_pickle(
self,
file_path: Union[str, Path, None] = None,
relative_to: Union[str, Path, bool, None] = None,
file_path: str | Path | None = None,
relative_to: str | Path | bool | None = None,
include_properties: bool = True,
folder_metadata: Union[str, Path, None] = None,
folder_metadata: str | Path | None = None,
):
"""
Dump recording extractor to a pickle file.
Expand Down Expand Up @@ -814,9 +816,7 @@ def dump_to_pickle(
file_path.write_bytes(pickle.dumps(dump_dict))

@staticmethod
def load(
file_or_folder_path: Union[str, Path], base_folder: Optional[Union[Path, str, bool]] = None
) -> "BaseExtractor":
def load(file_or_folder_path: str | Path, base_folder: Path | str | bool | None = None) -> BaseExtractor:
"""
Load extractor from file path (.json or .pkl)

Expand All @@ -839,7 +839,7 @@ def __reduce__(self):
return (instance_constructor, intialization_args)

@staticmethod
def load_from_folder(folder) -> "BaseExtractor":
def load_from_folder(folder) -> BaseExtractor:
return BaseExtractor.load(folder)

def _save(self, folder, **save_kwargs):
Expand All @@ -855,7 +855,7 @@ def _extra_metadata_to_folder(self, folder):
# This implemented in BaseRecording for probe
pass

def save(self, **kwargs) -> "BaseExtractor":
def save(self, **kwargs) -> BaseExtractor:
"""
Save a SpikeInterface object.

Expand Down Expand Up @@ -891,7 +891,7 @@ def save(self, **kwargs) -> "BaseExtractor":

save.__doc__ = save.__doc__.format(_shared_job_kwargs_doc)

def save_to_memory(self, sharedmem=True, **save_kwargs) -> "BaseExtractor":
def save_to_memory(self, sharedmem=True, **save_kwargs) -> BaseExtractor:
save_kwargs.pop("format", None)

cached = self._save(format="memory", sharedmem=sharedmem, **save_kwargs)
Expand Down Expand Up @@ -1188,7 +1188,7 @@ def __init__(self):
self._parent_extractor = None

@property
def parent_extractor(self) -> Union[BaseExtractor, None]:
def parent_extractor(self) -> BaseExtractor | None:
return self._parent_extractor()

def set_parent_extractor(self, parent_extractor: BaseExtractor) -> None:
Expand Down
2 changes: 0 additions & 2 deletions src/spikeinterface/core/baseevent.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import annotations

import numpy as np

from .base import BaseExtractor, BaseSegment
Expand Down
Loading
Loading