Skip to content
Snippets Groups Projects
Commit c62e2195 authored by Köllőd Csaba's avatar Köllőd Csaba
Browse files

New Feature: saving to mne, DBF

parent fcd11a8e
No related branches found
No related tags found
No related merge requests found
...@@ -3,9 +3,11 @@ from datetime import datetime, timedelta ...@@ -3,9 +3,11 @@ from datetime import datetime, timedelta
from pathlib import Path from pathlib import Path
from struct import unpack from struct import unpack
import mne
import numpy as np import numpy as np
from matplotlib import pyplot as plt from matplotlib import pyplot as plt
from pyedflib import EdfWriter, FILETYPE_EDFPLUS from pyedflib import EdfWriter, FILETYPE_BDFPLUS
from scipy import signal
HEADER_FS = 1 HEADER_FS = 1
EEG_EMG_FS = 250 EEG_EMG_FS = 250
...@@ -92,17 +94,16 @@ class FlowPacket: ...@@ -92,17 +94,16 @@ class FlowPacket:
def to_edf(self, filename): def to_edf(self, filename):
to_save = [self.eeg, self.eeg_giro, self.eeg_acc, to_save = [self.eeg, self.eeg_giro, self.eeg_acc,
self.emg, self.emg_giro, self.emg_acc, self.emg, self.emg_giro, self.emg_acc,
self.flow, self.hr, self.spo2, self.flow, self.hr, self.spo2, self.gsr]
self.sound, self.gsr]
with EdfWriter(filename, sum(pkt.chs for pkt in to_save), FILETYPE_EDFPLUS) as edf: with EdfWriter(filename, sum(pkt.chs for pkt in to_save), FILETYPE_BDFPLUS) as edf:
data_buffer = [] data_buffer = []
sig = 0 sig = 0
for pkt in to_save: for pkt in to_save:
for i, ch_dat in enumerate(pkt.data): for i, ch_dat in enumerate(pkt.data):
# print(sig) # print(sig)
edf.setPhysicalMaximum(sig, 3000 * EEG_EMG_SCALE) edf.setPhysicalMaximum(sig, 3000)
edf.setPhysicalMinimum(sig, -3000 * EEG_EMG_SCALE) edf.setPhysicalMinimum(sig, -3000)
# edf.setDigitalMaximum(sig, 2**7) # edf.setDigitalMaximum(sig, 2**7)
# edf.setDigitalMinimum(sig, -2**7) # edf.setDigitalMinimum(sig, -2**7)
edf.setPhysicalDimension(sig, pkt.unit) edf.setPhysicalDimension(sig, pkt.unit)
...@@ -112,6 +113,28 @@ class FlowPacket: ...@@ -112,6 +113,28 @@ class FlowPacket:
sig += 1 sig += 1
edf.writeSamples(data_buffer) edf.writeSamples(data_buffer)
def to_mne(self, filename):
to_save = [self.eeg, self.eeg_giro, self.eeg_acc,
self.emg, self.emg_giro, self.emg_acc,
self.flow, self.hr, self.spo2, self.gsr]
data_buffer = []
ch_types = []
ch_names = []
for pkt in to_save:
if pkt.fs == EEG_EMG_FS:
data_buffer.extend(pkt.data * 1e-6)
ch_types.extend([pkt.type] * pkt.chs)
else:
# https://docs.scipy.org/doc/scipy-1.9.3/reference/generated/scipy.interpolate.interp1d.html#scipy.interpolate.interp1d
dat = np.array([signal.resample(t, self.eeg.data.shape[-1]) for t in pkt.data])
data_buffer.extend(dat)
ch_types.extend(['misc'] * pkt.chs)
ch_names.extend([f'{pkt.type}{i}' for i in range(pkt.chs)])
info = mne.create_info(ch_names, EEG_EMG_FS, ch_types)
raw = mne.io.RawArray(np.array(data_buffer), info)
raw.save(filename)
def _read_block_data(file, shape, format_, format_size): def _read_block_data(file, shape, format_, format_size):
sh = np.prod(shape) sh = np.prod(shape)
...@@ -195,16 +218,18 @@ def read_data(path): ...@@ -195,16 +218,18 @@ def read_data(path):
if dat.date - data.date < timedelta(seconds=data.duration + 10): if dat.date - data.date < timedelta(seconds=data.duration + 10):
data += dat data += dat
else: else:
data.plot() # data.plot()
# data.to_edf(f'exp{exp:03}-rec{rec:03}.edf') # data.to_edf(f'exp{exp:03}-rec{rec:03}.bdf')
data.to_mne(f'exp{exp:03}-rec{rec:03}_raw.fif')
if dat.date - data.date < timedelta(minutes=10): if dat.date - data.date < timedelta(minutes=10):
rec += 1 rec += 1
else: else:
rec = 1 rec = 1
exp += 1 exp += 1
data = dat data = dat
data.plot() # data.plot()
# data.to_edf(f'exp{exp:03}-rec{rec:03}.edf') # data.to_edf(f'exp{exp:03}-rec{rec:03}.bdf')
data.to_mne(f'exp{exp:03}-rec{rec:03}_raw.fif')
if __name__ == '__main__': if __name__ == '__main__':
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment