Source code for neurokit2.eeg.mne_channel_add
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
[docs]
def mne_channel_add(
raw, channel, channel_type=None, channel_name=None, sync_index_raw=0, sync_index_channel=0
):
"""**Add channel as array to MNE**
Add a channel to a mne's Raw m/eeg file. It will basically synchronize the channel to the eeg
data following a particular index and add it.
Parameters
----------
raw : mne.io.Raw
Raw EEG data from MNE.
channel : list or array
The signal to be added.
channel_type : str
Channel type. Currently supported fields are 'ecg', 'bio', 'stim', 'eog', 'misc', 'seeg',
'ecog', 'mag', 'eeg', 'ref_meg', 'grad', 'emg', 'hbr' or 'hbo'.
channel_name : str
Desired channel name.
sync_index_raw : int or list
An index (e.g., the onset of the same event marked in the same signal), in the raw data, by
which to align the two inputs. This can be used in case the EEG data and the channel to add
do not have the same onsets and must be aligned through some common event.
sync_index_channel : int or list
An index (e.g., the onset of the same event marked in the same signal), in the channel to
add, by which to align the two inputs. This can be used in case the EEG data and the channel
to add do not have the same onsets and must be aligned through some common event.
Returns
----------
mne.io.Raw
Raw data in FIF format.
Example
----------
.. ipython:: python
import neurokit2 as nk
import mne
raw = nk.mne_data("filt-0-40_raw")
ecg = nk.ecg_simulate(length=50000)
# Let the 42nd sample point in the EEG signal correspond to the 333rd point in the ECG
event_index_in_eeg = 42
event_index_in_ecg = 333
raw = nk.mne_channel_add(raw,
ecg,
sync_index_raw=event_index_in_eeg,
sync_index_channel=event_index_in_ecg,
channel_type="ecg")
"""
# Try loading mne
try:
import mne
except ImportError:
raise ImportError(
"NeuroKit error: eeg_channel_add(): the 'mne' module is required for this function to run. ",
"Please install it first (`pip install mne`).",
)
if channel_name is None:
if isinstance(channel, pd.Series):
if channel.name is not None:
channel_name = channel.name
else:
channel_name = "Added_Channel"
else:
channel_name = "Added_Channel"
# Compute the distance between the two signals
diff = sync_index_channel - sync_index_raw
# Pre-empt the channel with nans if shorter or crop if longer
if diff > 0:
channel = list(channel)[diff : len(channel)]
channel = channel + [np.nan] * diff
if diff < 0:
channel = [np.nan] * abs(diff) + list(channel)
# Extend the channel with nans if shorter or crop if longer
if len(channel) < len(raw):
channel = list(channel) + [np.nan] * (len(raw) - len(channel))
else:
# Crop to fit the raw data
channel = list(channel)[0 : len(raw)]
old_verbosity_level = mne.set_log_level(verbose="WARNING", return_old_level=True)
# Create RawArray
info = mne.create_info([channel_name], raw.info["sfreq"], ch_types=channel_type)
channel = mne.io.RawArray([channel], info)
# Add channel
raw = raw.copy()
raw.add_channels([channel], force_update_info=True) # In-place
# Restore old verbosity level
mne.set_log_level(old_verbosity_level)
return raw