Source code for mne_nirs.io.snirf._aux
# Author: Robert Luke <code@robertluke.net>
#
# License: BSD (3-clause)
import logging
import h5py
import numpy as np
from mne.io import Raw
from pandas import DataFrame
from scipy import interpolate
[docs]
def read_snirf_aux_data(fname: str, raw: Raw):
"""Read auxiliary data from SNIRF file.
Reads the auxiliary channel data (e.g. heart rate data,
accelerometer, etc). The auxiliary data will be resampled
to match the raw data.
Parameters
----------
fname : str
Path to the SNIRF data file.
raw : Raw
Instance of raw snirf data as created by read_raw_snirf.
Returns
-------
fname : str
Path to the SNIRF data file.
"""
with h5py.File(fname, "r") as dat:
if "nirs" in dat:
basename = "nirs"
elif "nirs1" in dat:
basename = "nirs1"
else:
raise RuntimeError("Data does not contain nirs field")
all_keys = list(dat.get(basename).keys())
aux_keys = [i for i in all_keys if i.startswith("aux")]
aux_names = [_decode_name(dat.get(f"{basename}/{k}/name")) for k in aux_keys]
logging.debug(f"Found auxiliary channels {aux_names}")
d = {"times": raw.times}
for idx, aux in enumerate(aux_keys):
aux_data = np.array(dat.get(f"{basename}/{aux}/dataTimeSeries"))
aux_time = np.array(dat.get(f"{basename}/{aux}/time"))
aux_data_interp = interpolate.interp1d(
aux_time, aux_data, axis=0, bounds_error=False, fill_value="extrapolate"
)
aux_data_matched_to_raw = aux_data_interp(raw.times)
d[aux_names[idx]] = aux_data_matched_to_raw
df = DataFrame(data=d)
df = df.set_index("times")
return df
def _decode_name(key):
return np.array(key)[0].decode()