Source code for mne_nirs.signal_enhancement._negative_correlation

# Authors: Robert Luke <mail@robertluke.net>
#
# License: BSD (3-clause)

import numpy as np

from mne.io import BaseRaw
from mne import pick_types
from mne.utils import _validate_type


[docs] def enhance_negative_correlation(raw): """ Apply negative correlation enhancement algorithm. As described in :footcite:`cui2010functional`. This function will return a modified raw instance that has the enhancement applied to it. This function can only be run on data containing hbo and hbr types. Parameters ---------- raw : instance of Raw Haemoglobin data. Returns ------- raw : instance of Raw The modified raw instance. References ---------- .. [1] Cui et al, Functional Near Infrared Spectroscopy (NIRS) signal improvement based on negative correlation between oxygenated and deoxygenated hemoglobin dynamics, NeuroImage https://doi.org/10.1016/j.neuroimage.2009.11.050 """ raw = raw.copy().load_data() _validate_type(raw, BaseRaw, 'raw') hbo_channels = pick_types(raw.info, fnirs='hbo') hbr_channels = pick_types(raw.info, fnirs='hbr') if (not len(hbo_channels)) & (not len(hbr_channels)): raise RuntimeError('enhance_negative_correlation should ' 'be run on haemoglobin data.') if len(hbo_channels) != len(hbr_channels): raise RuntimeError('Same number of hbo and hbr channels required.') for idx in range(len(hbo_channels)): if raw.info['chs'][hbo_channels[idx]]['ch_name'][:-4] != \ raw.info['chs'][hbr_channels[idx]]['ch_name'][:-4]: raise RuntimeError('Channels must alternate between HBO and HBR.') for idx in range(len(hbo_channels)): hbo = raw._data[hbo_channels[idx]] hbr = raw._data[hbr_channels[idx]] hbo = hbo - np.mean(hbo) hbr = hbr - np.mean(hbr) hbo_std = np.std(hbo) hbr_std = np.std(hbr) alpha = hbo_std / hbr_std raw._data[hbo_channels[idx]] = 0.5 * (hbo - alpha * hbr) raw._data[hbr_channels[idx]] = -(1 / alpha) * \ raw._data[hbo_channels[idx]] return raw