def get_info(f, drop_channels): labels, fs = get_lsl_info_from_xml(f['stream_info.xml'][0]) print('fs: {}\nall labels {}: {}'.format(fs, len(labels), labels)) channels = [label for label in labels if label not in drop_channels] print('selected channels {}: {}'.format(len(channels), channels)) n_protocols = len([k for k in f.keys() if ('protocol' in k and k != 'protocol0')]) protocol_names = [f['protocol{}'.format(j+1)].attrs['name'] for j in range(n_protocols)] print('protocol_names:', protocol_names) return fs, channels, protocol_names
def stream_file_in_a_thread(file_path, reference, stream_name): file_name, file_extension = os.path.splitext(file_path) if file_extension == '.fif': raw = mne.io.read_raw_fif(file_path, verbose='ERROR') start, stop = raw.time_as_index([0, 60]) # read the first 15s of data source_buffer = raw.get_data(start=start, stop=stop) elif file_extension == '.vhdr': raw = read_raw_brainvision(vhdr_fname=file_path, verbose='ERROR') source_buffer = raw.get_data() else: source_buffer = load_h5py_all_samples(file_path=file_path).T try: if file_extension in ('.fif', '.vhdr'): labels = raw.info['ch_names'] fs = raw.info['sfreq'] else: xml_str = load_xml_str_from_hdf5_dataset(file_path, 'stream_info.xml') labels, fs = get_lsl_info_from_xml(xml_str) exclude = [ ex.upper() for ex in ChannelsSelector.parse_channels_string(reference) ] labels = [label for label in labels if label.upper() not in exclude] print('Using {} channels and fs={}.\n[{}]'.format( len(labels), fs, labels)) except (FileNotFoundError, DatasetNotFound): print( 'Channels labels and fs not found. Using default 32 channels and fs=500Hz.' ) labels = None fs = None thread = Process(target=run_eeg_sim, args=(), kwargs={ 'chunk_size': 0, 'source_buffer': source_buffer, 'name': stream_name, 'labels': labels, 'freq': fs }) thread.start() time.sleep(2) return thread
# load rejections with h5py.File('{}\\{}\\{}'.format(pilot_dir, experiment, 'experiment_data.h5')) as f: rejections = [ f['protocol1/signals_stats/left/rejections/rejection{}'.format( j + 1)][:] for j in range(2) ] rejection = rejections[0] if reject_alpha: rejection = np.dot(rejection, rejections[1]) n_protocols = len( [k for k in f.keys() if ('protocol' in k and k != 'protocol0')]) print('number of protocols:', n_protocols) # load data labels, fs = get_lsl_info_from_xml(f['stream_info.xml'][0]) print('fs: {}\nall labels {}: {}'.format(fs, len(labels), labels)) channels = [label for label in labels if label not in drop_channels] print('selected channels {}: {}'.format(len(channels), channels)) Record = namedtuple('Record', ['name', 'alpha_pow']) full_record = [] slices = [] data = [] counter = 0 for j in range(n_protocols): raw = f['protocol{}/raw_data'.format(j + 1)][:] #raw = raw[:raw.shape[0] - raw.shape[0] % fs] x = np.dot(raw, rejection)[:, channels.index(channel)] x = dc_blocker(x)
def plot_results(pilot_dir, subj, channel, alpha_band=(9, 14), theta_band=(3, 6), drop_channels=None, dc=False, reject_alpha=True, normalize_by='opened'): drop_channels = drop_channels or [] cm = get_colors() fg = plt.figure(figsize=(30, 6)) for j_s, experiment in enumerate(subj): with h5py.File('{}\\{}\\{}'.format(pilot_dir, experiment, 'experiment_data.h5')) as f: rejections, top_alpha, top_ica = load_rejections( f, reject_alpha=reject_alpha) fs, channels, p_names = get_info(f, drop_channels) ch = channels.index(channel) # collect powers powers = OrderedDict() raw = OrderedDict() alpha = OrderedDict() pow_theta = [] for j, name in enumerate(p_names): pow, alpha_x, x = get_protocol_power(f, j, fs, rejections, ch, alpha_band, dc=dc) if 'FB' in name: pow_theta.append( get_protocol_power(f, j, fs, rejections, ch, theta_band, dc=dc)[0].mean()) powers = add_data(powers, name, pow, j) raw = add_data(raw, name, x, j) alpha = add_data(alpha, name, alpha_x, j) # plot rejections n_tops = top_ica.shape[1] #+ top_alpha.shape[1] for j_t in range(top_ica.shape[1]): ax = fg.add_subplot( 4, n_tops * len(subj), n_tops * len(subj) * 3 + n_tops * j_s + j_t + 1) ax.set_xlabel('ICA{}'.format(j_t + 1) if j_t < top_alpha else 'CSP{}'.format(-top_alpha + j_t + 1)) labels, fs = get_lsl_info_from_xml(f['stream_info.xml'][0]) channels = [ label for label in labels if label not in drop_channels ] pos = ch_names_to_2d_pos(channels) plot_topomap(data=top_ica[:, j_t], pos=pos, axes=ax, show=False) # plot powers if normalize_by == 'opened': norm = powers['1. Opened'].mean() elif normalize_by == 'beta': norm = np.mean(pow_theta) else: print('WARNING: norm = 1') print('norm', norm) ax1 = fg.add_subplot(3, len(subj), j_s + 1) ax = fg.add_subplot(3, len(subj), j_s + len(subj) + 1) t = 0 #print(powers.keys()) if j_s == 0: print(powers['4. FB'].mean() / powers['3. Baseline'].mean()) for j_p, ((name, pow), (name, x)) in enumerate(zip(powers.items(), raw.items())): if name == '2228. FB': from scipy.signal import periodogram fff = plt.figure() fff.gca().plot(*periodogram(x, fs, nfft=fs * 3), c=cm[name.split()[1]]) plt.xlim(0, 80) plt.ylim(0, 3e-11) plt.show() #print(name) time = np.arange(t, t + len(x)) / fs ax1.plot(time, x, c=cm[name.split()[1]], alpha=0.4) ax1.plot(time, alpha[name], c=cm[name.split()[1]]) t += len(x) ax.plot([j_p], [pow.mean() / norm], 'o', c=cm[name.split()[1]], markersize=10) c = cm[name.split()[1]] ax.errorbar([j_p], [pow.mean() / norm], yerr=pow.std() / norm, c=c, ecolor=c) fb_x = np.hstack([[j] * len(pows) for j, (key, pows) in enumerate(powers.items()) if 'FB' in key]) fb_y = np.hstack( [pows for key, pows in powers.items() if 'FB' in key]) / norm sns.regplot(x=fb_x, y=fb_y, ax=ax, color=cm['FB'], scatter=False, truncate=True) ax1.set_xlim(0, t / fs) ax1.set_ylim(-40, 40) plt.setp(ax.xaxis.get_majorticklabels(), rotation=70) ax.set_xticks(range(len(powers))) ax.set_xticklabels(powers.keys()) ax.set_ylim(0, 3) ax.set_xlim(-1, len(powers)) ax1.set_title('Day {}'.format(j_s + 1)) return fg