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
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,9 @@ def test_load_legacy_we_with_deprecated_metrics(create_cache_folder, tmp_path):
# qm_params should have been renamed to metric_params
assert "qm_params" not in qm.params
assert "metric_params" in qm.params
assert qm.params["metric_params"]["mahalanobis"] == {}
assert "isolation_distance" not in qm.params["metric_params"]
assert "l_ratio" not in qm.params["metric_params"]

# template_metrics: deprecated names should be migrated
tm = sorting_analyzer.get_extension("template_metrics")
Expand All @@ -249,6 +252,17 @@ def test_load_legacy_we_with_deprecated_metrics(create_cache_folder, tmp_path):
assert "metrics_kwargs" not in tm.params
assert "metric_params" in tm.params

# Conflicting legacy parameters must not prevent loading the analyzer.
params_path = we_folder / "quality_metrics" / "params.json"
with open(params_path) as f:
legacy_params = json.load(f)
legacy_params["qm_params"]["l_ratio"] = {"legacy_parameter": 1}
with open(params_path, "w") as f:
json.dump(legacy_params, f)
with pytest.warns(UserWarning, match="Using isolation_distance parameters for mahalanobis"):
reloaded = load_waveforms_backwards(we_folder, sorting=sorting, output="SortingAnalyzer")
assert reloaded.get_extension("quality_metrics").params["metric_params"]["mahalanobis"] == {}


# @pytest.mark.skip("This test is run locally")
# def test_read_old_waveforms_extractor_zarr():
Expand Down
15 changes: 14 additions & 1 deletion src/spikeinterface/metrics/quality/quality_metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,20 @@ def _handle_backward_compatibility_on_load(self):
self.params["metric_params"] = qm_params
del self.params["qm_params"]

# handle metric names change: isolation_distance/l_ratio merged into mahalanobis
# handle metric names and parameters change: isolation_distance/l_ratio merged into mahalanobis
legacy_mahalanobis_params = []
for legacy_name in ("isolation_distance", "l_ratio"):
if legacy_name in self.params["metric_params"]:
legacy_mahalanobis_params.append(self.params["metric_params"].pop(legacy_name))
if legacy_mahalanobis_params and "mahalanobis" not in self.params["metric_params"]:
if any(params != legacy_mahalanobis_params[0] for params in legacy_mahalanobis_params[1:]):
warnings.warn(
"Legacy isolation_distance and l_ratio parameters do not match. "
"Using isolation_distance parameters for mahalanobis and discarding l_ratio parameters.",
stacklevel=2,
)
self.params["metric_params"]["mahalanobis"] = legacy_mahalanobis_params[0]

if "isolation_distance" in self.params["metric_names"]:
self.params["metric_names"].remove("isolation_distance")
if "mahalanobis" not in self.params["metric_names"]:
Expand Down
Loading