diff --git a/doc/changes/dev/13628.bugfix.rst b/doc/changes/dev/13628.bugfix.rst new file mode 100644 index 00000000000..883ac03c2da --- /dev/null +++ b/doc/changes/dev/13628.bugfix.rst @@ -0,0 +1 @@ +Fix :func:`mne.io.read_raw_snirf` raising ``TypeError`` when ``landmarkLabels`` is empty or scalar, by `Bruno Aristimunha`_. diff --git a/mne/io/snirf/_snirf.py b/mne/io/snirf/_snirf.py index cfb9c8f71e2..020e55f4d91 100644 --- a/mne/io/snirf/_snirf.py +++ b/mne/io/snirf/_snirf.py @@ -388,6 +388,11 @@ def natural_keys(text): diglocs = np.array(dat.get("/nirs/probe/landmarkPos3D")) diglocs /= length_scaling digname = np.array(dat.get("/nirs/probe/landmarkLabels")) + # Handle empty or scalar landmarkLabels (see gh-13627) + if digname.ndim == 0 or digname.size == 0: + digname = [] + else: + digname = _correct_shape(digname) nasion, lpa, rpa, hpi = None, None, None, None extra_ps = dict() for idx, dign in enumerate(digname): diff --git a/mne/io/snirf/tests/test_snirf.py b/mne/io/snirf/tests/test_snirf.py index 24f6f1174c7..aaec3ea20cf 100644 --- a/mne/io/snirf/tests/test_snirf.py +++ b/mne/io/snirf/tests/test_snirf.py @@ -284,6 +284,33 @@ def test_snirf_nonstandard(tmp_path): f.create_dataset("nirs/metaDataTags/MNE_coordFrame", data=[1]) +@requires_testing_data +def test_snirf_empty_landmark_labels(tmp_path): + """Test reading SNIRF files with empty landmarkLabels (gh-13627).""" + shutil.copy(sfnirs_homer_103_wShort, tmp_path / "empty_labels.snirf") + fname = tmp_path / "empty_labels.snirf" + + # Modify file to have landmarkPos3D but empty/scalar landmarkLabels + with h5py.File(fname, "r+") as f: + # Remove existing landmark data if present + if "landmarkPos3D" in f["nirs/probe"]: + del f["nirs/probe/landmarkPos3D"] + if "landmarkLabels" in f["nirs/probe"]: + del f["nirs/probe/landmarkLabels"] + + # Add non-empty landmarkPos3D + f.create_dataset( + "nirs/probe/landmarkPos3D", + data=np.array([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0]]), + ) + # Add empty scalar landmarkLabels (this triggers the bug in gh-13627) + f.create_dataset("nirs/probe/landmarkLabels", data=b"") + + # This should not raise "TypeError: iteration over a 0-d array" + raw = read_raw_snirf(fname, preload=True) + assert raw.info["dig"] is not None + + @requires_testing_data def test_snirf_nirsport2(): """Test reading SNIRF files."""