63 lines
2.4 KiB
Python
63 lines
2.4 KiB
Python
import os
|
|
from mne_bids.read import _from_tsv, _drop
|
|
import mne
|
|
import numpy as np
|
|
|
|
"""
|
|
The ccs_eeg_utils.py file from the lecture, but reduced to the read_annotations_core method needed for the project
|
|
"""
|
|
|
|
|
|
def read_annotations_core(bids_path, raw):
|
|
tsv = os.path.join(bids_path.directory, bids_path.update(suffix="events", extension=".tsv").basename)
|
|
_handle_events_reading_core(tsv, raw)
|
|
|
|
|
|
def _handle_events_reading_core(events_fname, raw):
|
|
"""Read associated events.tsv and populate raw.
|
|
Handle onset, duration, and description of each event.
|
|
"""
|
|
events_dict = _from_tsv(events_fname)
|
|
|
|
if ('value' in events_dict) and ('trial_type' in events_dict):
|
|
events_dict = _drop(events_dict, 'n/a', 'trial_type')
|
|
events_dict = _drop(events_dict, 'n/a', 'value')
|
|
|
|
descriptions = np.asarray([a + ':' + b for a, b in zip(events_dict["trial_type"], events_dict["value"])],
|
|
dtype=str)
|
|
|
|
# Get the descriptions of the events
|
|
elif 'trial_type' in events_dict:
|
|
|
|
# Drop events unrelated to a trial type
|
|
events_dict = _drop(events_dict, 'n/a', 'trial_type')
|
|
descriptions = np.asarray(events_dict['trial_type'], dtype=str)
|
|
|
|
# If we don't have a proper description of the events, perhaps we have
|
|
# at least an event value?
|
|
elif 'value' in events_dict:
|
|
# Drop events unrelated to value
|
|
events_dict = _drop(events_dict, 'n/a', 'value')
|
|
descriptions = np.asarray(events_dict['value'], dtype=str)
|
|
# Worst case, we go with 'n/a' for all events
|
|
else:
|
|
descriptions = 'n/a'
|
|
# Deal with "n/a" strings before converting to float
|
|
ons = [np.nan if on == 'n/a' else on for on in events_dict['onset']]
|
|
dus = [0 if du == 'n/a' else du for du in events_dict['duration']]
|
|
onsets = np.asarray(ons, dtype=float)
|
|
durations = np.asarray(dus, dtype=float)
|
|
# Keep only events where onset is known
|
|
good_events_idx = ~np.isnan(onsets)
|
|
onsets = onsets[good_events_idx]
|
|
durations = durations[good_events_idx]
|
|
descriptions = descriptions[good_events_idx]
|
|
del good_events_idx
|
|
# Add Events to raw as annotations
|
|
annot_from_events = mne.Annotations(onset=onsets,
|
|
duration=durations,
|
|
description=descriptions,
|
|
orig_time=None)
|
|
raw.set_annotations(annot_from_events)
|
|
return raw
|