diff --git a/src/spikeinterface/core/tests/test_waveforms_extractor_backwards_compatibility.py b/src/spikeinterface/core/tests/test_waveforms_extractor_backwards_compatibility.py index e75f3be156..cb4dc5f8fe 100644 --- a/src/spikeinterface/core/tests/test_waveforms_extractor_backwards_compatibility.py +++ b/src/spikeinterface/core/tests/test_waveforms_extractor_backwards_compatibility.py @@ -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") @@ -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(): diff --git a/src/spikeinterface/metrics/quality/quality_metrics.py b/src/spikeinterface/metrics/quality/quality_metrics.py index 0e50a4eb79..222ba1932d 100644 --- a/src/spikeinterface/metrics/quality/quality_metrics.py +++ b/src/spikeinterface/metrics/quality/quality_metrics.py @@ -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"]: