123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- from scipy import io as sio
- import mne
- import numpy as np
- from .utils import upsample_events
- # loader for test data
- def raw_preprocessing(data_file, finger_model='cylinder', epoch_time=1., fs=1000):
- data = sio.loadmat(data_file, simplify_cells=True, squeeze_me=True)
- # to double
- raw = data['data'].astype(np.float64).T * 0.0298 * 1e-6 # to V
- stim_events = data['stim'].astype(np.float64)
- # deal with line noise
- raw = mne.filter.notch_filter(raw, fs, [60, 120, 180], trans_bandwidth=3, verbose=False)
- events = extract_events(stim_events, fs)
- # upsampling
- events = upsample_events(events, int(epoch_time * fs))
- info = mne.create_info([f'ch_{i}' for i in range(raw.shape[0])], sfreq=fs, ch_types='ecog')
- # build raw
- raw = mne.io.RawArray(raw, info)
- annotations = mne.annotations_from_events(events, fs, {1: finger_model, 0: 'rest'})
- raw.set_annotations(annotations)
- return raw
- def extract_events(stim_events, fs=1000.):
- diff_stim = np.diff(stim_events)
- shift_idx = int(0.5 * fs) # shift by 500 ms, compensate for reaction time
- # hand only
- onsets = np.flatnonzero(diff_stim == 12) + shift_idx
-
- offsets = np.flatnonzero(diff_stim == -12)
- # handle cut
- if len(onsets) != len(offsets):
- # cut first trial
- if offsets[0] <= onsets[0]:
- offsets = offsets[1:]
- # cut last trial
- else:
- onsets = onsets[:-1]
- rest_onset = offsets + shift_idx
- if len(np.unique(offsets - onsets)) > 1:
- raise ValueError('Unequal trial length?')
- trial_length = (offsets - onsets)[0]
- # build events
- events = np.zeros((len(onsets) * 2, 3), dtype=np.int64)
- events[::2, 0] = onsets
- events[:, 1] = trial_length
- events[1::2, 0] = rest_onset
- events[::2, 2] = 1
- return events
|