Source code for wonambi.graphoelement

"""This module contains classes of graphoelements.

These graphoelements can be generated by the package "detect".

"""
from copy import deepcopy
from csv import reader, writer
from numpy import empty, asarray, sum, mean

from .datatype import Data


[docs]class Graphoelement: """Class containing all the events of one type in one dataset. Attributes ---------- chan_name : ndarray (dtype='U') list of channels """ def __init__(self): self.chan_name = None self.events = [] def __iter__(self): for one_event in self.events: yield one_event def __len__(self): return len(self.events) def __getitem__(self, index): return self.events[index] def __call__(self, func=None): events = [] for one_ev in self.events: if func(one_ev): events.append(one_ev) output = deepcopy(self) output.events = events return output
[docs] def to_data(self, parameter, operator=mean): data = Data() data.axis = {'chan': empty(1, dtype='O')} data.axis['chan'][0] = self.chan_name data.data = empty(1, dtype='O') values = [] for one_chan in self.chan_name: if parameter == 'count': value = sum(1 for x in self.events if x['chan'] == one_chan) else: value = operator([x[parameter] for x in self.events if x['chan'] == one_chan]) values.append(value) data.data[0] = asarray(values) return data
[docs] def to_annot(self, annot, name=None, chan=None): """Write events to Annotations file. Parameters ---------- annot : instance of Annotations Annotations file name : str name for the event type """ annot.add_events(self.events, name=name, chan=chan)
[docs]class Ripple(Graphoelement): def __init__(self): super().__init__() pass
[docs]class SlowWaves(Graphoelement): """Class containing all the slow waves in one dataset. Attributes ---------- events : list of dict list of slow waves, where each SW contains: - start_time : float start time of the SW - trough_time : float time of the lowest value - zero_time : float time of the neg to pos zero-crossing - peak_time : float time of the highest value - end_time : float end time of the SW - trough_val : float the lowest value - peak_val : float the highest value - dur: float duration of the SW - area_under_curve : float sum of all values divided by duration - ptp : float peak-to-peak (difference between highest and lowest value) - chan': str channel label """ def __init__(self): super().__init__() one_sw = {'start_time': None, 'trough_time': None, 'zero_time': None, 'peak_time': None, 'end_time': None, 'trough_val': None, 'peak_val': None, 'dur': None, 'area_under_curve': None, 'ptp': None, 'chan': [], } self.events.append(one_sw)
[docs]class Spindles(Graphoelement): """Class containing all the spindles in one dataset. Attributes ---------- mean : ndarray (dtype='float') mean of each channel std : ndarray (dtype='float') standard deviation of each channel det_value : ndarray (dtype='float') value used for detection for each channel sel_value : ndarray (dtype='float') value used for selection for each channel events : list of dict list of spindles, where each spindle contains: - start_time : float start time of the spindle - end_time : float end time of the spindle - peak_time : float time of the highest value - peak_val : float the highest value - chan': str channel label """ def __init__(self): super().__init__() self.mean = None self.std = None self.det_value = None self.sel_value = None self.density = None one_spindle = {'start_time': None, 'end_time': None, 'chan': [], 'peak_val': None, 'peak_time': None, } self.events.append(one_spindle)
[docs]class Arousals(Graphoelement): """Class containing all the arousals in one dataset. Attributes ---------- events : list of dict list of arousals, where each arousal contains: - start_time : float start time of the arousal - end_time : float end time of the arousal - chan': str channel label """ def __init__(self): super().__init__() one_arousal = {'start_time': None, 'end_time': None, 'chan': [], } self.events.append(one_arousal)
[docs]def events_from_csv(source_file, stage=[]): """Import events from Wonambi event CSV. Parameters ---------- source_file : str path to file CSV file stage : list of str (optional) target stage, eg ['NREM2', 'NREM3'] or ['REM'] Returns ------- instance of wonambi.Graphoelement class with events list """ events = [] stage_cond = True with open(source_file, 'r', encoding='utf-8') as csvfile: csv_reader = reader(csvfile, delimiter=',') for row in csv_reader: try: int(row[0]) if stage: stage_cond = row[4] in stage if stage_cond: one_ev = {'name': row[6], 'start': float(row[1]), 'end': float(row[2]), 'chan': row[7].split(', '), # always a list 'stage': row[4], 'quality': 'Good' } events.append(one_ev) except ValueError: continue grapho = Graphoelement() grapho.events = events grapho.chan_name = list(set([chan for e in events for chan in e['chan']])) return grapho