diff --git a/ratapi/utils/convert.py b/ratapi/utils/convert.py index b957789c..7b3a44f7 100644 --- a/ratapi/utils/convert.py +++ b/ratapi/utils/convert.py @@ -5,7 +5,7 @@ from os import PathLike from pathlib import Path -from numpy import array, empty +from numpy import array, empty, ndarray from scipy.io.matlab import MatlabOpaque, loadmat from ratapi import Project, wrappers @@ -227,6 +227,12 @@ def fix_invalid_constraints(name: str, constrs: tuple[float, float], value: floa if isinstance(mat_project["resolNames"], str): mat_project["resolNames"] = [mat_project["resolNames"]] + if isinstance(mat_project["contrastNames"], (ndarray, list)) and len( + dict.fromkeys(mat_project["contrastNames"]) + ) != len(mat_project["contrastNames"]): + # contrast names are not unique so create unique ones + mat_project["contrastNames"] = [f"Contrast {i + 1}" for i in range(len(mat_project["contrastNames"]))] + contrasts = ClassList( [ Contrast( diff --git a/tests/test_convert.py b/tests/test_convert.py index fc6f4400..0cbd621b 100644 --- a/tests/test_convert.py +++ b/tests/test_convert.py @@ -69,6 +69,13 @@ def test_r1_to_project(file, project, path_type, request): assert getattr(output_project, class_list) == getattr(expected_project, class_list) +def test_r1_with_non_unique_contrast_names(): + """Test that R1 to Project class conversion returns the expected Project.""" + output_project = r1_to_project(pathlib.Path(TEST_DIR_PATH, "nonUniqueContrast.mat")) + assert output_project.contrasts[0].name == "Contrast 1" + assert output_project.contrasts[1].name == "Contrast 2" + + @pytest.mark.parametrize( "project", [ diff --git a/tests/test_data/nonUniqueContrast.mat b/tests/test_data/nonUniqueContrast.mat new file mode 100644 index 00000000..41375134 Binary files /dev/null and b/tests/test_data/nonUniqueContrast.mat differ