mne-nirs
mne-nirs copied to clipboard
read_snirf_aux_data() / _decode_name() fails when name of aux channel is string scalar
Describe the bug
According to the snirf spec strings should be stored as as scalars, not as 1x1 arrays.
The example aux dataset used in the aux tutorial has strings in 1x1 array.
The read_snirf_aux_data() function works fine with this dataset that has strings in 1x1 array, but when the name of aux channel is scalar the _decode_name() function fails.
https://github.com/mne-tools/mne-nirs/blob/2fdddfe9962ad000ebe60d71d0f9794d1800acbd/mne_nirs/io/snirf/_aux.py#L62-L63
To properly retrieve the scalar string,
Steps to reproduce
Can use this file (ignore other possible issues with the file): 04_single.zip
import mne
import mne_nirs
snirf_file = r"04_single.snirf"
raw = mne.io.read_raw_snirf(snirf_file)
raw_od = mne.preprocessing.nirs.optical_density(raw)
raw_haemo = mne.preprocessing.nirs.beer_lambert_law(raw_od, ppf=0.1)
aux_df = mne_nirs.io.snirf.read_snirf_aux_data(snirf_file,raw_haemo)
Expected results
Should work since strings are stored as scalar, in accordance with snirf spec.
Actual results
Fail since _decode_name() only works on arrays
Additional information
Could add conditional to check if it's a scalar, and in that case handle it as such, e.g.:
def _decode_name(key): if key.shape == (): return key[()].decode() else: return np.array(key)[0].decode()