From 1974a82a9d35e382b57a64a0d9d94517f595b3cd Mon Sep 17 00:00:00 2001 From: bsandeepan95 Date: Sat, 7 Sep 2019 14:06:41 +0530 Subject: [PATCH 01/12] Converted Py2.x code to Py3.x compatible code --- EDF.py | 88 ++++++++++++++++++++++++------------------- test_generator_2.edf | Bin 0 -> 2704528 bytes testedf.py | 23 +++++++++++ 3 files changed, 72 insertions(+), 39 deletions(-) create mode 100644 test_generator_2.edf create mode 100644 testedf.py diff --git a/EDF.py b/EDF.py index 7f08e02..804538d 100644 --- a/EDF.py +++ b/EDF.py @@ -17,10 +17,19 @@ def padtrim(buf, num): # trim the input to the specified length return buf[0:num] + +# custom Sandeepan B +def writebyte(file, content, encoding='utf8'): + file.write(bytes(content, encoding)) + + #################################################################################################### # the EDF header is represented as a tuple of (meas_info, chan_info) -# meas_info should have ['record_length', 'magic', 'hour', 'subject_id', 'recording_id', 'n_records', 'month', 'subtype', 'second', 'nchan', 'data_size', 'data_offset', 'lowpass', 'year', 'highpass', 'day', 'minute'] -# chan_info should have ['physical_min', 'transducers', 'physical_max', 'digital_max', 'ch_names', 'n_samps', 'units', 'digital_min'] +# meas_info should have ['record_length', 'magic', 'hour', 'subject_id', 'recording_id', +# 'n_records', 'month', 'subtype', 'second', 'nchan', 'data_size', +# 'data_offset', 'lowpass', 'year', 'highpass', 'day', 'minute'] +# chan_info should have ['physical_min', 'transducers', 'physical_max', 'digital_max', +# 'ch_names', 'n_samps', 'units', 'digital_min'] #################################################################################################### class EDFWriter(): @@ -53,7 +62,7 @@ def close(self): assert(fid2.tell() == 0) fid2.write(fid1.read(236)) fid1.read(8) # skip this part - fid2.write(padtrim(str(self.n_records), 8)) # but write this instead + writebyte(fid2, padtrim(str(self.n_records), 8)) # but write this instead fid2.write(fid1.read(meas_info['data_offset'] - 236 - 8)) blocksize = np.sum(chan_info['n_samps']) * meas_info['data_size'] for block in range(self.n_records): @@ -95,52 +104,52 @@ def writeHeader(self, header): else: meas_info['data_size'] = 2 # 16-bit (2 byte) integers - fid.write(padtrim('0', 8)) - fid.write(padtrim(meas_info['subject_id'], 80)) - fid.write(padtrim(meas_info['recording_id'], 80)) - fid.write(padtrim('{:0>2d}.{:0>2d}.{:0>2d}'.format(meas_info['day'], meas_info['month'], meas_info['year']), 8)) - fid.write(padtrim('{:0>2d}.{:0>2d}.{:0>2d}'.format(meas_info['hour'], meas_info['minute'], meas_info['second']), 8)) - fid.write(padtrim(str(meas_size + chan_size), 8)) - fid.write(' ' * 44) - fid.write(padtrim(str(-1), 8)) # the final n_records should be inserted on byte 236 - fid.write(padtrim(str(meas_info['record_length']), 8)) - fid.write(padtrim(str(meas_info['nchan']), 4)) + writebyte(fid, (padtrim('0', 8))) + writebyte(fid, (padtrim(meas_info['subject_id'], 80))) + writebyte(fid, (padtrim(meas_info['recording_id'], 80))) + writebyte(fid, (padtrim('{:0>2d}.{:0>2d}.{:0>2d}'.format(meas_info['day'], meas_info['month'], meas_info['year']), 8))) + writebyte(fid, (padtrim('{:0>2d}.{:0>2d}.{:0>2d}'.format(meas_info['hour'], meas_info['minute'], meas_info['second']), 8))) + writebyte(fid, (padtrim(str(meas_size + chan_size), 8))) + writebyte(fid, (' ' * 44)) + writebyte(fid, (padtrim(str(-1), 8))) # the final n_records should be inserted on byte 236 + writebyte(fid, (padtrim(str(meas_info['record_length']), 8))) + writebyte(fid, (padtrim(str(meas_info['nchan']), 4))) # ensure that these are all np arrays rather than lists for key in ['physical_min', 'transducers', 'physical_max', 'digital_max', 'ch_names', 'n_samps', 'units', 'digital_min']: chan_info[key] = np.asarray(chan_info[key]) for i in range(meas_info['nchan']): - fid.write(padtrim( chan_info['ch_names'][i], 16)) + writebyte(fid, (padtrim( chan_info['ch_names'][i], 16))) for i in range(meas_info['nchan']): - fid.write(padtrim( chan_info['transducers'][i], 80)) + writebyte(fid, (padtrim( chan_info['transducers'][i], 80))) for i in range(meas_info['nchan']): - fid.write(padtrim( chan_info['units'][i], 8)) + writebyte(fid, (padtrim( chan_info['units'][i], 8))) for i in range(meas_info['nchan']): - fid.write(padtrim(str(chan_info['physical_min'][i]), 8)) + writebyte(fid, (padtrim(str(chan_info['physical_min'][i]), 8))) for i in range(meas_info['nchan']): - fid.write(padtrim(str(chan_info['physical_max'][i]), 8)) + writebyte(fid, (padtrim(str(chan_info['physical_max'][i]), 8))) for i in range(meas_info['nchan']): - fid.write(padtrim(str(chan_info['digital_min'][i]), 8)) + writebyte(fid, (padtrim(str(int(chan_info['digital_min'][i])), 8))) for i in range(meas_info['nchan']): - fid.write(padtrim(str(chan_info['digital_max'][i]), 8)) + writebyte(fid, (padtrim(str(int(chan_info['digital_max'][i])), 8))) for i in range(meas_info['nchan']): - fid.write(' ' * 80) # prefiltering + writebyte(fid, (' ' * 80)) # prefiltering for i in range(meas_info['nchan']): - fid.write(padtrim(str(chan_info['n_samps'][i]), 8)) + writebyte(fid, (padtrim(str(chan_info['n_samps'][i]), 8))) for i in range(meas_info['nchan']): - fid.write(' ' * 32) # reserved + writebyte(fid, (' ' * 32)) # reserved meas_info['data_offset'] = fid.tell() self.meas_info = meas_info self.chan_info = chan_info - self.calibrate = (chan_info['physical_max'] - chan_info['physical_min'])/(chan_info['digital_max'] - chan_info['digital_min']); - self.offset = chan_info['physical_min'] - self.calibrate * chan_info['digital_min']; + self.calibrate = (chan_info['physical_max'] - chan_info['physical_min'])/(chan_info['digital_max'] - chan_info['digital_min']) + self.offset = chan_info['physical_min'] - self.calibrate * chan_info['digital_min'] channels = list(range(meas_info['nchan'])) for ch in channels: if self.calibrate[ch]<0: - self.calibrate[ch] = 1; - self.offset[ch] = 0; + self.calibrate[ch] = 1 + self.offset[ch] = 0 def writeBlock(self, data): meas_info = self.meas_info @@ -152,9 +161,9 @@ def writeBlock(self, data): assert(len(raw)==chan_info['n_samps'][i]) if min(raw)chan_info['physical_max'][i]: - warnings.warn('Value exceeds physical_max: '+ str(max(raw))); + warnings.warn('Value exceeds physical_max: '+ str(max(raw))) raw -= self.offset[i] # FIXME I am not sure about the order of calibrate and offset raw /= self.calibrate[i] @@ -211,8 +220,8 @@ def readHeader(self): meas_info['hour'] = hour meas_info['minute'] = minute meas_info['second'] = second - # date = datetime.datetime(year + 2000, month, day, hour, minute, sec) - # meas_info['meas_date'] = calendar.timegm(date.utctimetuple()) + date = datetime.datetime(year + 2000, month, day, hour, minute, second) + meas_info['meas_date'] = calendar.timegm(date.utctimetuple()) meas_info['data_offset'] = header_nbytes = int(fid.read(8).decode()) @@ -288,12 +297,13 @@ def readHeader(self): tot_samps = (os.path.getsize(self.fname)-meas_info['data_offset'])/meas_info['data_size'] meas_info['n_records'] = tot_samps/sum(n_samps) - self.calibrate = (chan_info['physical_max'] - chan_info['physical_min'])/(chan_info['digital_max'] - chan_info['digital_min']); - self.offset = chan_info['physical_min'] - self.calibrate * chan_info['digital_min']; + self.calibrate = (chan_info['physical_max'] - chan_info['physical_min']) / ( + chan_info['digital_max'] - chan_info['digital_min']) + self.offset = chan_info['physical_min'] - self.calibrate * chan_info['digital_min'] for ch in channels: if self.calibrate[ch]<0: - self.calibrate[ch] = 1; - self.offset[ch] = 0; + self.calibrate[ch] = 1 + self.offset[ch] = 0 self.meas_info = meas_info self.chan_info = chan_info @@ -348,8 +358,8 @@ def getNSamples(self): return self.chan_info['n_samps'] * self.meas_info['n_records'] def readSignal(self, chanindx): - begsample = 0; - endsample = self.chan_info['n_samps'][chanindx] * self.meas_info['n_records'] - 1; + begsample = 0 + endsample = self.chan_info['n_samps'][chanindx] * self.meas_info['n_records'] - 1 return self.readSamples(chanindx, begsample, endsample) #################################################################################################### @@ -357,8 +367,8 @@ def readSignal(self, chanindx): if False: file_in = EDFReader() file_in.open('/Users/roboos/day 01[10.03].edf') - print file_in.readSamples(0, 0, 0) - print file_in.readSamples(0, 0, 128) + print (file_in.readSamples(0, 0, 0)) + print (file_in.readSamples(0, 0, 128)) if False: diff --git a/test_generator_2.edf b/test_generator_2.edf new file mode 100644 index 0000000000000000000000000000000000000000..68a678767ab8fdae3c3caa606572f30970396f67 GIT binary patch literal 2704528 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

6#3I+Y$l*hg*26 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⪚Kl!te<#)3!Oms5?x5$bvUadOH|oCRj3>q`7lu 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 VN@bMFD3wtvb51H#{`OOu{{@4eo Date: Wed, 11 Sep 2019 17:51:02 +0530 Subject: [PATCH 02/12] Made EDF.py Py2.7+3.x compatible. --- EDF.py | 62 +++++++++++++++++++-------------- __pycache__/EDF.cpython-37.pyc | Bin 0 -> 12470 bytes testedf.py | 38 +++++++++++++------- 3 files changed, 61 insertions(+), 39 deletions(-) create mode 100644 __pycache__/EDF.cpython-37.pyc diff --git a/EDF.py b/EDF.py index 804538d..43bc1fa 100644 --- a/EDF.py +++ b/EDF.py @@ -20,7 +20,20 @@ def padtrim(buf, num): # custom Sandeepan B def writebyte(file, content, encoding='utf8'): - file.write(bytes(content, encoding)) + try: + # Py3 onwards bytes and strings are separate data format + content = bytes(content, encoding) + except TypeError: + # Py2.7 Support + pass + except Exception as e: + print(e) + print( + "If you see this message, please go to " + + "https://github.com/bids-standard/pyedf/issues" + + " and open an issue there regarding this. Thank you!") + finally: + file.write(content) #################################################################################################### @@ -34,15 +47,18 @@ def writebyte(file, content, encoding='utf8'): class EDFWriter(): def __init__(self, fname=None): + self.init_properties() + if fname: + self.open(fname) + + def init_properties(self): self.fname = None self.meas_info = None self.chan_info = None self.calibrate = None self.offset = None self.n_records = 0 - if fname: - self.open(fname) - + def open(self, fname): with open(fname, 'wb') as fid: assert(fid.tell() == 0) @@ -63,18 +79,12 @@ def close(self): fid2.write(fid1.read(236)) fid1.read(8) # skip this part writebyte(fid2, padtrim(str(self.n_records), 8)) # but write this instead - fid2.write(fid1.read(meas_info['data_offset'] - 236 - 8)) + writebyte(fid2, fid1.read(meas_info['data_offset'] - 236 - 8)) blocksize = np.sum(chan_info['n_samps']) * meas_info['data_size'] for block in range(self.n_records): - fid2.write(fid1.read(blocksize)) + writebyte(fid2, fid1.read(blocksize)) os.remove(tempname) - self.fname = None - self.meas_info = None - self.chan_info = None - self.calibrate = None - self.offset = None - self.n_records = 0 - return + self.init_properties() def writeHeader(self, header): meas_info = header[0] @@ -178,13 +188,16 @@ def writeBlock(self, data): class EDFReader(): def __init__(self, fname=None): + self.init_properties() + if fname: + self.open(fname) + + def init_properties(self): self.fname = None self.meas_info = None self.chan_info = None self.calibrate = None self.offset = None - if fname: - self.open(fname) def open(self, fname): with open(fname, 'rb') as fid: @@ -194,11 +207,7 @@ def open(self, fname): return self.meas_info, self.chan_info def close(self): - self.fname = None - self.meas_info = None - self.chan_info = None - self.calibrate = None - self.offset = None + self.init_properties() def readHeader(self): # the following is copied over from MNE-Python and subsequently modified @@ -236,7 +245,7 @@ def readHeader(self): else: meas_info['data_size'] = 2 # 16-bit (2 byte) integers - meas_info['n_records'] = n_records = int(fid.read(8).decode()) + meas_info['n_records'] = int(fid.read(8).decode()) # record length in seconds record_length = float(fid.read(8).decode()) @@ -252,10 +261,10 @@ def readHeader(self): chan_info['ch_names'] = [fid.read(16).strip().decode() for ch in channels] chan_info['transducers'] = [fid.read(80).strip().decode() for ch in channels] chan_info['units'] = [fid.read(8).strip().decode() for ch in channels] - chan_info['physical_min'] = physical_min = np.array([float(fid.read(8).decode()) for ch in channels]) - chan_info['physical_max'] = physical_max = np.array([float(fid.read(8).decode()) for ch in channels]) - chan_info['digital_min'] = digital_min = np.array([float(fid.read(8).decode()) for ch in channels]) - chan_info['digital_max'] = digital_max = np.array([float(fid.read(8).decode()) for ch in channels]) + chan_info['physical_min'] = np.array([float(fid.read(8).decode()) for ch in channels]) + chan_info['physical_max'] = np.array([float(fid.read(8).decode()) for ch in channels]) + chan_info['digital_min'] = np.array([float(fid.read(8).decode()) for ch in channels]) + chan_info['digital_max'] = np.array([float(fid.read(8).decode()) for ch in channels]) prefiltering = [fid.read(80).strip().decode() for ch in channels][:-1] highpass = np.ravel([re.findall('HP:\s+(\w+)', filt) for filt in prefiltering]) @@ -297,8 +306,7 @@ def readHeader(self): tot_samps = (os.path.getsize(self.fname)-meas_info['data_offset'])/meas_info['data_size'] meas_info['n_records'] = tot_samps/sum(n_samps) - self.calibrate = (chan_info['physical_max'] - chan_info['physical_min']) / ( - chan_info['digital_max'] - chan_info['digital_min']) + self.calibrate = (chan_info['physical_max'] - chan_info['physical_min']) / (chan_info['digital_max'] - chan_info['digital_min']) self.offset = chan_info['physical_min'] - self.calibrate * chan_info['digital_min'] for ch in channels: if self.calibrate[ch]<0: diff --git a/__pycache__/EDF.cpython-37.pyc b/__pycache__/EDF.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..793e616c27d730acc616f520b7d3827dfaf6105a GIT binary patch literal 12470 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 Date: Thu, 19 Sep 2019 18:15:31 +0530 Subject: [PATCH 03/12] Modified code syntax to reflect PEP-8 Guidelines --- .vscode/.ropeproject/config.py | 114 +++++++++ .vscode/.ropeproject/objectdb | Bin 0 -> 6 bytes EDF.py | 450 +++++++++++++++++++++++++-------- README.md | 6 +- __pycache__/EDF.cpython-37.pyc | Bin 12470 -> 17851 bytes testedf.py | 22 +- 6 files changed, 471 insertions(+), 121 deletions(-) create mode 100644 .vscode/.ropeproject/config.py create mode 100644 .vscode/.ropeproject/objectdb diff --git a/.vscode/.ropeproject/config.py b/.vscode/.ropeproject/config.py new file mode 100644 index 0000000..dee2d1a --- /dev/null +++ b/.vscode/.ropeproject/config.py @@ -0,0 +1,114 @@ +# The default ``config.py`` +# flake8: noqa + + +def set_prefs(prefs): + """This function is called before opening the project""" + + # Specify which files and folders to ignore in the project. + # Changes to ignored resources are not added to the history and + # VCSs. Also they are not returned in `Project.get_files()`. + # Note that ``?`` and ``*`` match all characters but slashes. + # '*.pyc': matches 'test.pyc' and 'pkg/test.pyc' + # 'mod*.pyc': matches 'test/mod1.pyc' but not 'mod/1.pyc' + # '.svn': matches 'pkg/.svn' and all of its children + # 'build/*.o': matches 'build/lib.o' but not 'build/sub/lib.o' + # 'build//*.o': matches 'build/lib.o' and 'build/sub/lib.o' + prefs['ignored_resources'] = ['*.pyc', '*~', '.ropeproject', + '.hg', '.svn', '_svn', '.git', '.tox'] + + # Specifies which files should be considered python files. It is + # useful when you have scripts inside your project. Only files + # ending with ``.py`` are considered to be python files by + # default. + # prefs['python_files'] = ['*.py'] + + # Custom source folders: By default rope searches the project + # for finding source folders (folders that should be searched + # for finding modules). You can add paths to that list. Note + # that rope guesses project source folders correctly most of the + # time; use this if you have any problems. + # The folders should be relative to project root and use '/' for + # separating folders regardless of the platform rope is running on. + # 'src/my_source_folder' for instance. + # prefs.add('source_folders', 'src') + + # You can extend python path for looking up modules + # prefs.add('python_path', '~/python/') + + # Should rope save object information or not. + prefs['save_objectdb'] = True + prefs['compress_objectdb'] = False + + # If `True`, rope analyzes each module when it is being saved. + prefs['automatic_soa'] = True + # The depth of calls to follow in static object analysis + prefs['soa_followed_calls'] = 0 + + # If `False` when running modules or unit tests "dynamic object + # analysis" is turned off. This makes them much faster. + prefs['perform_doa'] = True + + # Rope can check the validity of its object DB when running. + prefs['validate_objectdb'] = True + + # How many undos to hold? + prefs['max_history_items'] = 32 + + # Shows whether to save history across sessions. + prefs['save_history'] = True + prefs['compress_history'] = False + + # Set the number spaces used for indenting. According to + # :PEP:`8`, it is best to use 4 spaces. Since most of rope's + # unit-tests use 4 spaces it is more reliable, too. + prefs['indent_size'] = 4 + + # Builtin and c-extension modules that are allowed to be imported + # and inspected by rope. + prefs['extension_modules'] = [] + + # Add all standard c-extensions to extension_modules list. + prefs['import_dynload_stdmods'] = True + + # If `True` modules with syntax errors are considered to be empty. + # The default value is `False`; When `False` syntax errors raise + # `rope.base.exceptions.ModuleSyntaxError` exception. + prefs['ignore_syntax_errors'] = False + + # If `True`, rope ignores unresolvable imports. Otherwise, they + # appear in the importing namespace. + prefs['ignore_bad_imports'] = False + + # If `True`, rope will insert new module imports as + # `from import ` by default. + prefs['prefer_module_from_imports'] = False + + # If `True`, rope will transform a comma list of imports into + # multiple separate import statements when organizing + # imports. + prefs['split_imports'] = False + + # If `True`, rope will remove all top-level import statements and + # reinsert them at the top of the module when making changes. + prefs['pull_imports_to_top'] = True + + # If `True`, rope will sort imports alphabetically by module name instead + # of alphabetically by import statement, with from imports after normal + # imports. + prefs['sort_imports_alphabetically'] = False + + # Location of implementation of + # rope.base.oi.type_hinting.interfaces.ITypeHintingFactory In general + # case, you don't have to change this value, unless you're an rope expert. + # Change this value to inject you own implementations of interfaces + # listed in module rope.base.oi.type_hinting.providers.interfaces + # For example, you can add you own providers for Django Models, or disable + # the search type-hinting in a class hierarchy, etc. + prefs['type_hinting_factory'] = ( + 'rope.base.oi.type_hinting.factory.default_type_hinting_factory') + + +def project_opened(project): + """This function is called after opening the project""" + # Do whatever you like here! diff --git a/.vscode/.ropeproject/objectdb b/.vscode/.ropeproject/objectdb new file mode 100644 index 0000000000000000000000000000000000000000..0a47446c0ad231c193bdd44ff327ba2ab28bf3d8 GIT binary patch literal 6 NcmZo*sx4&D0{{kv0iOT> literal 0 HcmV?d00001 diff --git a/EDF.py b/EDF.py index 43bc1fa..2977d1f 100644 --- a/EDF.py +++ b/EDF.py @@ -1,3 +1,37 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" pyedf is a python package to read from and write EEG data to European Data + Format files. Since EDF is such a widely used format, there exist multiple + Python implementations for reading and writing EDF files. However, most of + these Python modules consist of wrappers around the C-code implementation, + which makes installation more cumbersome and reduces portability. This + implementation is in pure python with limited dependencies on external + packages while having support for Python 2.7 and 3.x. + + Note: the EDF header is represented as a tuple of (meas_info, chan_info) + meas_info should have the following: [ + 'record_length', 'file_ver', 'hour', 'subject_id', + 'recording_id', 'n_records', 'month', 'subtype', + 'second', 'nchan', 'data_size', 'data_offset', + 'lowpass', 'year', 'highpass', 'day', 'minute'] + chan_info should have the following: [ + 'physical_min', 'transducers', 'physical_max', + 'digital_max', 'ch_names', 'n_samps', 'units', 'digital_min'] + + The EDF standard was introduced in 1992. The extension of EDF with + annotations was first described in 1998 and more formalized with the EDF+ + standard that was published in 2003. To learn more about both standards and + implementation details, check out https://www.edfplus.info/index.html +""" +__version__ = "0.4.0" +__author__ = "https://github.com/robertoostenveld | https://github.com/bsandeepan95>" +__copyright__ = "https://bids.neuroimaging.io/" +__credits__ = ["various"] +__license__ = "BSD 3-Clause License" +__maintainer__ = "https://github.com/bids-standard" +__status__ = "Production" + from copy import deepcopy from math import ceil, floor from struct import pack, unpack @@ -9,17 +43,28 @@ import warnings def padtrim(buf, num): + """ Calibate the length w.r.t. buffer parameter and pad the input if the + calibrated length >= 0 (zero). Else trim (slice) the input using it. + + Arguments: + buf (Any): Values to be inserted in EDF Header. + num (int): Value used for padding/trimming the buffer value. + """ + num -= len(buf) - if num>=0: - # pad the input to the specified length - return str(buf) + ' ' * num - else: - # trim the input to the specified length - return buf[0:num] + return (str(buf) + ' ' * num) if (num >= 0) else buf[0:num] -# custom Sandeepan B def writebyte(file, content, encoding='utf8'): + """ Writes byte data into file. If string input is given, it will be + converted into byte data first before further operations + + Arguments: + file (FILE): Value having a file pointer. + content (bytes/str): Value to be written in a file. + encoding(str): Value defines the byte encoding to use for strings. + """ + try: # Py3 onwards bytes and strings are separate data format content = bytes(content, encoding) @@ -35,23 +80,41 @@ def writebyte(file, content, encoding='utf8'): finally: file.write(content) - -#################################################################################################### -# the EDF header is represented as a tuple of (meas_info, chan_info) -# meas_info should have ['record_length', 'magic', 'hour', 'subject_id', 'recording_id', -# 'n_records', 'month', 'subtype', 'second', 'nchan', 'data_size', -# 'data_offset', 'lowpass', 'year', 'highpass', 'day', 'minute'] -# chan_info should have ['physical_min', 'transducers', 'physical_max', 'digital_max', -# 'ch_names', 'n_samps', 'units', 'digital_min'] -#################################################################################################### +############################################################################### class EDFWriter(): + """ Writes EEG Data into BIDS-Standard Compliant EDF/EDF+/BDF/BDF+ files. + + Attributes: + fname (str): Contains the filename. + meas_info (list): Dictionary having information of Measurement + chan_info (list) Dictionary having information of Channels + calibrate (float): Calibration Value for signals + offset (float): Offset Value for signals + n_records (int): number of data records + + Methods: + init_properties: Used to initialize/reset class attributes. + open: Creates a new file for writing data. + close: Closes the file after writing data. + write_header: Writes the header record to the file. + write_block: Writes the data records to the file. + """ + def __init__(self, fname=None): + """ Class Initializer. Calls init_properties() method to initialize. + + Arguments: + fname(str): Name of the to-be-created file. + """ + self.init_properties() if fname: self.open(fname) def init_properties(self): + """ Initializes/Resets Class Attributes.""" + self.fname = None self.meas_info = None self.chan_info = None @@ -60,53 +123,104 @@ def init_properties(self): self.n_records = 0 def open(self, fname): + """ Opens file to write. + + Arguments: + fname(str): Name of the to-be-created file. + """ + with open(fname, 'wb') as fid: assert(fid.tell() == 0) self.fname = fname def close(self): + """ Updates "Number of Data Records" field in header after writing + is complete and closes file. + """ + # it is still needed to update the number of records in the header # this requires copying the whole file content meas_info = self.meas_info chan_info = self.chan_info + # update the n_records value in the file tempname = self.fname + '.bak' os.rename(self.fname, tempname) + with open(tempname, 'rb') as fid1: assert(fid1.tell() == 0) with open(self.fname, 'wb') as fid2: assert(fid2.tell() == 0) fid2.write(fid1.read(236)) - fid1.read(8) # skip this part - writebyte(fid2, padtrim(str(self.n_records), 8)) # but write this instead - writebyte(fid2, fid1.read(meas_info['data_offset'] - 236 - 8)) - blocksize = np.sum(chan_info['n_samps']) * meas_info['data_size'] + + # skip this part + fid1.read(8) + # but write this instead + writebyte(fid2, padtrim(str(self.n_records), 8)) + + writebyte(fid2, fid1.read( + meas_info['data_offset'] - 236 - 8)) + + blocksize = np.sum( + chan_info['n_samps']) * meas_info['data_size'] + for block in range(self.n_records): writebyte(fid2, fid1.read(blocksize)) + os.remove(tempname) self.init_properties() - def writeHeader(self, header): + def write_header(self, header): + """ Writes the header record to the file. + + Arguments: + header(tuple): the EDF header is represented as a tuple of + two dictionaries (meas_info{}, chan_info{}). + + meas_info should have the following: { + 'record_length', 'file_ver', 'hour', + 'subject_id', 'recording_id', 'n_records', + 'month', 'subtype', 'second', 'nchan', + 'data_size', 'data_offset', 'lowpass', + 'year', 'highpass', 'day', 'minute'} + + chan_info should have the following: { + 'physical_min', 'transducers', + 'physical_max', 'digital_max', + 'ch_names', 'n_samps', 'units', + 'digital_min'} + """ + meas_info = header[0] chan_info = header[1] meas_size = 256 chan_size = 256 * meas_info['nchan'] + with open(self.fname, 'wb') as fid: assert(fid.tell() == 0) # fill in the missing or incomplete information if not 'subject_id' in meas_info: meas_info['subject_id'] = '' + if not 'recording_id' in meas_info: meas_info['recording_id'] = '' + if not 'subtype' in meas_info: meas_info['subtype'] = 'edf' + nchan = meas_info['nchan'] - if not 'ch_names' in chan_info or len(chan_info['ch_names'])2d}.{:0>2d}.{:0>2d}'.format(meas_info['day'], meas_info['month'], meas_info['year']), 8))) - writebyte(fid, (padtrim('{:0>2d}.{:0>2d}.{:0>2d}'.format(meas_info['hour'], meas_info['minute'], meas_info['second']), 8))) + + writebyte(fid, (padtrim('{:0>2d}.{:0>2d}.{:0>2d}'.format( + meas_info['day'], meas_info['month'], + meas_info['year']), 8))) + + writebyte(fid, (padtrim('{:0>2d}.{:0>2d}.{:0>2d}'.format( + meas_info['hour'], meas_info['minute'], + meas_info['second']), 8))) + writebyte(fid, (padtrim(str(meas_size + chan_size), 8))) writebyte(fid, (' ' * 44)) - writebyte(fid, (padtrim(str(-1), 8))) # the final n_records should be inserted on byte 236 + + # the final n_records should be inserted on byte 236 + writebyte(fid, (padtrim(str(-1), 8))) writebyte(fid, (padtrim(str(meas_info['record_length']), 8))) writebyte(fid, (padtrim(str(meas_info['nchan']), 4))) # ensure that these are all np arrays rather than lists - for key in ['physical_min', 'transducers', 'physical_max', 'digital_max', 'ch_names', 'n_samps', 'units', 'digital_min']: + for key in [ + 'physical_min', 'transducers', 'physical_max', 'digital_max', + 'ch_names', 'n_samps', 'units', 'digital_min']: chan_info[key] = np.asarray(chan_info[key]) for i in range(meas_info['nchan']): - writebyte(fid, (padtrim( chan_info['ch_names'][i], 16))) + writebyte(fid, ( + padtrim( chan_info['ch_names'][i], 16))) + for i in range(meas_info['nchan']): - writebyte(fid, (padtrim( chan_info['transducers'][i], 80))) + writebyte(fid, ( + padtrim( chan_info['transducers'][i], 80))) + for i in range(meas_info['nchan']): - writebyte(fid, (padtrim( chan_info['units'][i], 8))) + writebyte(fid, ( + padtrim( chan_info['units'][i], 8))) + for i in range(meas_info['nchan']): - writebyte(fid, (padtrim(str(chan_info['physical_min'][i]), 8))) + writebyte(fid, ( + padtrim(str(chan_info['physical_min'][i]), 8))) + for i in range(meas_info['nchan']): - writebyte(fid, (padtrim(str(chan_info['physical_max'][i]), 8))) + writebyte(fid, ( + padtrim(str(chan_info['physical_max'][i]), 8))) + for i in range(meas_info['nchan']): - writebyte(fid, (padtrim(str(int(chan_info['digital_min'][i])), 8))) + writebyte(fid, ( + padtrim(str(int(chan_info['digital_min'][i])), 8))) + for i in range(meas_info['nchan']): - writebyte(fid, (padtrim(str(int(chan_info['digital_max'][i])), 8))) + writebyte(fid, ( + padtrim(str(int(chan_info['digital_max'][i])), 8))) + for i in range(meas_info['nchan']): writebyte(fid, (' ' * 80)) # prefiltering + for i in range(meas_info['nchan']): - writebyte(fid, (padtrim(str(chan_info['n_samps'][i]), 8))) + writebyte(fid, ( + padtrim(str(chan_info['n_samps'][i]), 8))) + for i in range(meas_info['nchan']): writebyte(fid, (' ' * 32)) # reserved + meas_info['data_offset'] = fid.tell() self.meas_info = meas_info self.chan_info = chan_info - self.calibrate = (chan_info['physical_max'] - chan_info['physical_min'])/(chan_info['digital_max'] - chan_info['digital_min']) - self.offset = chan_info['physical_min'] - self.calibrate * chan_info['digital_min'] + self.calibrate = ( + chan_info['physical_max'] - chan_info['physical_min']) / ( + chan_info['digital_max'] - chan_info['digital_min']) + + self.offset = chan_info['physical_min'] - ( + self.calibrate * chan_info['digital_min']) + channels = list(range(meas_info['nchan'])) + for ch in channels: if self.calibrate[ch]<0: self.calibrate[ch] = 1 self.offset[ch] = 0 - def writeBlock(self, data): + def write_block(self, data): + """ Writes list of data into file block by block. + + Arguments: + data (list): A numpy array of 16-bit integer value + representation of signal records. + """ + meas_info = self.meas_info chan_info = self.chan_info with open(self.fname, 'ab') as fid: @@ -171,9 +327,11 @@ def writeBlock(self, data): assert(len(raw)==chan_info['n_samps'][i]) if min(raw)chan_info['physical_max'][i]: - warnings.warn('Value exceeds physical_max: '+ str(max(raw))) + warnings.warn( + 'Value exceeds physical_max: '+ str(max(raw))) raw -= self.offset[i] # FIXME I am not sure about the order of calibrate and offset raw /= self.calibrate[i] @@ -187,12 +345,36 @@ def writeBlock(self, data): #################################################################################################### class EDFReader(): + """ Reads EEG Data from BIDS-Standard Compliant EDF/EDF+/BDF/BDF+ files. + + Attributes: + fname (str): Contains the filename. + meas_info (list): Dictionary having information of Measurement + chan_info (list) Dictionary having information of Channels + calibrate (float): Calibration Value for signals + offset (float): Offset Value for signals. + + Methods: + init_properties: Used to initialize/reset class attributes. + open: Creates a new file for writing data. + close: Closes the file after writing data. + write_header: Writes the header record to the file. + write_block: Writes the data records to the file. + """ def __init__(self, fname=None): + """ Class Initializer. Calls init_properties() method to initialize. + + Arguments: + fname(str): Name of the to-be-created file. + """ + self.init_properties() if fname: self.open(fname) def init_properties(self): + """ Initializes/Resets Class Attributes.""" + self.fname = None self.meas_info = None self.chan_info = None @@ -200,45 +382,61 @@ def init_properties(self): self.offset = None def open(self, fname): + """ Opens file to read. + + Arguments: + fname(str): Name of the to-be-opened existing file. + """ + with open(fname, 'rb') as fid: assert(fid.tell() == 0) self.fname = fname - self.readHeader() + self.read_header() return self.meas_info, self.chan_info def close(self): + """Closes opened file""" + self.init_properties() - def readHeader(self): - # the following is copied over from MNE-Python and subsequently modified - # to more closely reflect the native EDF standard + def read_header(self): + """ Reads header rcord from file. + + The contents were copied over from MNE-Python and subsequently + modified to closely reflect the native EDF File standard. + """ + meas_info = {} chan_info = {} with open(self.fname, 'rb') as fid: assert(fid.tell() == 0) - meas_info['magic'] = fid.read(8).strip().decode() - meas_info['subject_id'] = fid.read(80).strip().decode() # subject id - meas_info['recording_id'] = fid.read(80).strip().decode() # recording id + meas_info['file_ver'] = fid.read(8).strip().decode() + meas_info['subject_id'] = fid.read(80).strip().decode() + meas_info['recording_id'] = fid.read(80).strip().decode() - day, month, year = [int(x) for x in re.findall('(\d+)', fid.read(8).decode())] - hour, minute, second = [int(x) for x in re.findall('(\d+)', fid.read(8).decode())] + day, month, year = [int(x) for x in re.findall( + '(\d+)', fid.read(8).decode())] + hour, minute, second = [int(x) for x in re.findall( + '(\d+)', fid.read(8).decode())] meas_info['day'] = day meas_info['month'] = month meas_info['year'] = year meas_info['hour'] = hour meas_info['minute'] = minute meas_info['second'] = second - date = datetime.datetime(year + 2000, month, day, hour, minute, second) + date = datetime.datetime( + year + 2000, month, day, hour, minute, second) meas_info['meas_date'] = calendar.timegm(date.utctimetuple()) - meas_info['data_offset'] = header_nbytes = int(fid.read(8).decode()) + meas_info['data_offset'] = header_nbyte = int(fid.read(8).decode()) subtype = fid.read(44).strip().decode()[:5] if len(subtype) > 0: meas_info['subtype'] = subtype else: - meas_info['subtype'] = os.path.splitext(self.fname)[1][1:].lower() + meas_info['subtype'] = os.path.splitext( + self.fname)[1][1:].lower() if meas_info['subtype'] in ('24BIT', 'bdf'): meas_info['data_size'] = 3 # 24-bit (3 byte) integers @@ -251,24 +449,36 @@ def readHeader(self): record_length = float(fid.read(8).decode()) if record_length == 0: meas_info['record_length'] = record_length = 1. - warnings.warn('Headermeas_information is incorrect for record length. ' - 'Default record length set to 1.') + warnings.warn( + "Header measurement information is incorrect " + + "for recordlength. Default record length set to 1.") else: meas_info['record_length'] = record_length meas_info['nchan'] = nchan = int(fid.read(4).decode()) channels = list(range(nchan)) - chan_info['ch_names'] = [fid.read(16).strip().decode() for ch in channels] - chan_info['transducers'] = [fid.read(80).strip().decode() for ch in channels] - chan_info['units'] = [fid.read(8).strip().decode() for ch in channels] - chan_info['physical_min'] = np.array([float(fid.read(8).decode()) for ch in channels]) - chan_info['physical_max'] = np.array([float(fid.read(8).decode()) for ch in channels]) - chan_info['digital_min'] = np.array([float(fid.read(8).decode()) for ch in channels]) - chan_info['digital_max'] = np.array([float(fid.read(8).decode()) for ch in channels]) - - prefiltering = [fid.read(80).strip().decode() for ch in channels][:-1] - highpass = np.ravel([re.findall('HP:\s+(\w+)', filt) for filt in prefiltering]) - lowpass = np.ravel([re.findall('LP:\s+(\w+)', filt) for filt in prefiltering]) + chan_info['ch_names'] = [ + fid.read(16).strip().decode() for ch in channels] + chan_info['transducers'] = [ + fid.read(80).strip().decode() for ch in channels] + chan_info['units'] = [ + fid.read(8).strip().decode() for ch in channels] + chan_info['physical_min'] = np.array([ + float(fid.read(8).decode()) for ch in channels]) + chan_info['physical_max'] = np.array([ + float(fid.read(8).decode()) for ch in channels]) + chan_info['digital_min'] = np.array([ + float(fid.read(8).decode()) for ch in channels]) + chan_info['digital_max'] = np.array([ + float(fid.read(8).decode()) for ch in channels]) + + prefiltering = [ + fid.read(80).strip().decode() for ch in channels][:-1] + highpass = np.ravel([ + re.findall('HP:\s+(\w+)', filt) for filt in prefiltering]) + lowpass = np.ravel([ + re.findall('LP:\s+(\w+)', filt) for filt in prefiltering]) + high_pass_default = 0. if highpass.size == 0: meas_info['highpass'] = high_pass_default @@ -281,8 +491,9 @@ def readHeader(self): meas_info['highpass'] = float(highpass[0]) else: meas_info['highpass'] = float(np.max(highpass)) - warnings.warn('Channels contain different highpass filters. ' - 'Highest filter setting will be stored.') + warnings.warn( + "Channels contain different highpass filters. " + + "Highest filter setting will be stored.") if lowpass.size == 0: meas_info['lowpass'] = None @@ -293,21 +504,29 @@ def readHeader(self): meas_info['lowpass'] = float(lowpass[0]) else: meas_info['lowpass'] = float(np.min(lowpass)) - warnings.warn('%s' % ('Channels contain different lowpass filters.' - ' Lowest filter setting will be stored.')) + warnings.warn('%s' % ( + "Channels contain different lowpass filters. " + + "Lowest filter setting will be stored.")) # number of samples per record - chan_info['n_samps'] = n_samps = np.array([int(fid.read(8).decode()) for ch in channels]) + chan_info['n_samps'] = n_samps = np.array([ + int(fid.read(8).decode()) for ch in channels]) fid.read(32 *meas_info['nchan']).decode() # reserved - assert fid.tell() == header_nbytes + assert fid.tell() == header_nbyte if meas_info['n_records']==-1: # this happens if the n_records is not updated at the end of recording - tot_samps = (os.path.getsize(self.fname)-meas_info['data_offset'])/meas_info['data_size'] + tot_samps = ( + os.path.getsize(self.fname)-meas_info['data_offset'] + ) / meas_info['data_size'] meas_info['n_records'] = tot_samps/sum(n_samps) - self.calibrate = (chan_info['physical_max'] - chan_info['physical_min']) / (chan_info['digital_max'] - chan_info['digital_min']) - self.offset = chan_info['physical_min'] - self.calibrate * chan_info['digital_min'] + self.calibrate = ( + chan_info['physical_max'] - chan_info['physical_min'] + ) / (chan_info['digital_max'] - chan_info['digital_min']) + self.offset = chan_info['physical_min'] - ( + self.calibrate * chan_info['digital_min']) + for ch in channels: if self.calibrate[ch]<0: self.calibrate[ch] = 1 @@ -317,7 +536,7 @@ def readHeader(self): self.chan_info = chan_info return (meas_info, chan_info) - def readBlock(self, block): + def read_block(self, block): assert(block>=0) meas_info = self.meas_info chan_info = self.chan_info @@ -326,23 +545,28 @@ def readBlock(self, block): assert(fid.tell() == 0) blocksize = np.sum(chan_info['n_samps']) * meas_info['data_size'] fid.seek(meas_info['data_offset'] + block * blocksize) + for i in range(meas_info['nchan']): buf = fid.read(chan_info['n_samps'][i]*meas_info['data_size']) - raw = np.asarray(unpack('<{}h'.format(chan_info['n_samps'][i]), buf), dtype=np.float32) + + raw = np.asarray( + unpack('<{}h'.format( + chan_info['n_samps'][i]), buf), dtype=np.float32) + raw *= self.calibrate[i] raw += self.offset[i] # FIXME I am not sure about the order of calibrate and offset data.append(raw) return data - def readSamples(self, channel, begsample, endsample): + def read_samples(self, channel, begsample, endsample): meas_info = self.meas_info chan_info = self.chan_info n_samps = chan_info['n_samps'][channel] begblock = int(floor((begsample) / n_samps)) endblock = int(floor((endsample) / n_samps)) - data = self.readBlock(begblock)[channel] + data = self.read_block(begblock)[channel] for block in range(begblock+1, endblock+1): - data = np.append(data, self.readBlock(block)[channel]) + data = np.append(data, self.read_block(block)[channel]) begsample -= begblock*n_samps endsample -= begblock*n_samps return data[begsample:(endsample+1)] @@ -352,48 +576,58 @@ def readSamples(self, channel, begsample, endsample): # class more similar to https://bitbucket.org/cleemesser/python-edf/ #################################################################################################### - def getSignalTextLabels(self): + def get_signal_text_labels(self): # convert from unicode to string return [str(x) for x in self.chan_info['ch_names']] - def getNSignals(self): + def get_n_signals(self): return self.meas_info['nchan'] - def getSignalFreqs(self): + def get_signal_freqs(self): return self.chan_info['n_samps'] / self.meas_info['record_length'] - def getNSamples(self): + def get_n_samples(self): return self.chan_info['n_samps'] * self.meas_info['n_records'] - def readSignal(self, chanindx): + def read_signal(self, chanindx): begsample = 0 - endsample = self.chan_info['n_samps'][chanindx] * self.meas_info['n_records'] - 1 - return self.readSamples(chanindx, begsample, endsample) - -#################################################################################################### - -if False: + endsample = ( + self.chan_info['n_samps'][chanindx] * self.meas_info['n_records'] + ) - 1 + return self.read_samples(chanindx, begsample, endsample) + +########################################################################## + +if __name__ == "__main__": + # Edit the name of files to test out EDFReader and EDFWriter class + input_str = ( + "Type 1 to only read from test EDF file.\n" + + "Type 2 to only write from test EDF file.\n" + + "Type 3 to read and write from test EDF file.\n" + + "Press Enter after typing your choice: ") + user_input = int(input(input_str)) + + filename = 'test_generator_2.edf' file_in = EDFReader() - file_in.open('/Users/roboos/day 01[10.03].edf') - print (file_in.readSamples(0, 0, 0)) - print (file_in.readSamples(0, 0, 128)) - + file_in.open(filename) -if False: - file_in = EDFReader() - file_in.open('/Users/roboos/test_generator.edf') + if user_input in (1, 3): + print("Following are data blocks from the EDF file.") + print (file_in.read_samples(0, 0, 0)) + print (file_in.read_samples(0, 0, 128)) - file_out = EDFWriter() - file_out.open('/Users/roboos/test_generator copy.edf') + if user_input in (2, 3): + file_out = EDFWriter() + file_out.open('copy of ' + filename) - header = file_in.readHeader() + header = file_in.read_header() + print(header) + file_out.write_header(header) - file_out.writeHeader(header) - - meas_info = header[0] - for i in range(meas_info['n_records']): - data = file_in.readBlock(i) - file_out.writeBlock(data) + meas_info = header[0] + for i in range(meas_info['n_records']): + data = file_in.read_block(i) + file_out.write_block(data) + file_out.close() file_in.close() - file_out.close() diff --git a/README.md b/README.md index 4070f4a..a16b8a8 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # pyedf -Python package to read from and write EEG data to European Data Format files. +pyedf is a python package to read from and write EEG data to European Data Format files. -The EDF standard was introduced in [1992](https://doi.org/10.1016/0013-4694(92)90009-7). The extension of EDF with annotations was first described in [1998](https://doi.org/10.1016/S0013-4694(98)00029-7) and more formalized with the EDF+ standard that was published in [2003](https://doi.org/10.1016/S1388-2457(03)00123-8). The [EDF](http://www.edfplus.info) website describes both standards and discusses implementation details. +Since EDF is such a widely used format, there exist multiple Python implementations for reading and writing EDF files. However, most of these Python modules consist of wrappers around the C-code implementation `edflib`, which makes installation more cumbersome and reduces portability. This implementation is in pure python with limited dependencies on external packages while having support for Python 2.7 and 3.x. -Since EDF is such a widely used format, there exist multiple implementations for reading and writing EDF files. Most Python implementations consist of wrappers around the C-code implementation, which makes installation more cumbersome and reduces portability. This implementation is in pure Python with limited dependencies on external packages. +The EDF standard was introduced in [1992](https://doi.org/10.1016/0013-4694(92)90009-7). The extension of EDF with annotations was first described in [1998](https://doi.org/10.1016/S0013-4694(98)00029-7) and more formalized with the EDF+ standard that was published in [2003](https://doi.org/10.1016/S1388-2457(03)00123-8). The [EDF](http://www.edfplus.info) website describes both standards and discusses implementation details. ## See also - http://www.edfplus.info diff --git a/__pycache__/EDF.cpython-37.pyc b/__pycache__/EDF.cpython-37.pyc index 793e616c27d730acc616f520b7d3827dfaf6105a..cc5c0f0456b4fb6dc8e470129bd8d1477299e9f0 100644 GIT binary patch delta 7597 zcmeHMTWlQHd7d-7B$s=kRuu2L9Z{0WmB^(`DRHGFjxFk9HL`3=cCAb-PiFU=|1{jv2o-(%6`LLsZ+GvRLC`;V_{+DCNL{S2b> z0)D}JOw)vBXo49`=!Py*MoOetnUNL)#()?!2E~vuBr;;y$ux$IVWy#ahg~o_6(l}roQ1^MKXhcN}%sU5-gX%hJ98%XYV@zGgjd69IFeXGnj6BkeNpV~h z#lc6+n7XcsQE}*zCJt@s#x(B6#5nH8aW^9mi-|S;J?4L3Od3bzQF%-r*V&AROQA)Duq*cb*&|+>;;7`4n&Nrl@iW_+F$Yd_ivINDc{!)v%!$mjW|SVDksEp|n_H)EWI z&;@yRn;DB>R+fu2{5^L6?Kd^tFKug3>_l=E`8!&PTh4%{@#cmUHEsvoLN}~?E^k`Z zHEUJ!(Br%JXIe)Z~gF09bv5e8gs`Ce06F26!gvK*glp5L%SUb7t; zl=&Uot%BytH4+iDs&&X&w}o^zcq@=#u0}8Lur7Vc;|4R zq#IhH?YRL6BVXxfyQ@9zs86yw!e8>%C_>r4NhvUJKL4c)qe&^@QYoN<{8L!f?HAV_pqw4SZ}j2rb7^N+SLzuH}Js<-GttJU4(|4_~Tz*a|cfS0voKwDD!rhxy!4iilejHDQZf1-s2Rq!pO9Tk{rpwQjkpTTtWaoE-fvsudkPpTboWRDATG~ zvawPhmg`}|$+id1l`oXfwXbyt!wdCRrCjwIOTLGE5qd~j(tRMYP&VV&^zp9+&_T+k z4^X;Qux{57=vMZ5>?S{3ANH5#ok}>qa@@=mbw8t*rxx&vct~eI5Ex&13VR+dF zzY}>Q`>OH|rPKF+a-E%vb#^`~rL1KDHeazEyJ8{TlRcC5$Jfh#IV|%^t5!oYXj(oZ z1?ff^rwO2-p|;zE3G5o(>_s&(^TADYSv~(1evZ$#rSFx>{Hg=pLf>xi`6zIpV`(3& zRzNw+4m){?0{%sRwM9q}TAmeWE;1VU9vrvL^`JWk>ElFDY~ zK4P~8>9+f&ut(j)C(Kj`D6vE;Vu`IP?K)O?K!Orh@t4`x3X4?oq|s=@c^3aRb0S^n z@1(w!x~qL%bM?F0o0`x!wa4jAM)-UecfjJ5RU@OnNdO!0$_DJNAQmggQ(#u+H);q+ zU)drtallvY2ND=$Bd~49!AyHILgGS_R8x+K#U96GK~*G{4H9q5hnsv32#0qFR+HpU z*8CJBQv&Am*KXXrN`~qfx{EB9(iPAKy``U6rJJP)VG+nJyI(pe}(>++8M_!Cn{3B5$rO?YjbkrWS*!T^k zFskejCcQYL2-t%xVi1<-S(knVxamsg(`mbjfzQ_*&k9Qsf=Z>HBp#D>oH)>4MO_p0 ziB7P$ORM6MzoPK?GYETi0Im6C${ZP>B2iNUlhoSlR0?|*e_5hD7EhSl1~QsWDuVqG zHJH-j4JvFAeDu!74BK*vYNn7^9h3yz>Upl;6X4;}{P_yXZps4|cjbDrq$q@GanSlF z?fNOJju)U><12LCb2hhXl%7AGj^0Q!Deg!x;#DOeT1uUgFR=p6h8|J~^@~neR2;9m zrsfV7q&f}WZ^fq>#J`hTju>*E-u^u(PKLSBvzK3{C~&BR=riwp31uXCq2Ijwuz{lQ zQ&JbbQmdo0IBr?bV5Pv_q-^LdR^(z;SsuHRzIn#~n7W*+Q=*_vtu_?%^!ZoWrehBvOSMn$n^>@Pn<63T%=pE

46vZ{-3Kk|!al_@ngO7gDcj zw}BCx3F{QtrQ75D6$A>EM##kQi}FBuS6{FAz!2?L{Pw{0+&jcbX`9;l;lMb{WfM+7 zpKSc|!RaUqUb(i*-)O>3aMpLTvn`u^#zmb1GDq{*u?QeEb^D~0Br|D-zNHWd&y?u+a>c?c- zk2SQr18O(mpNzAG-#Yd)QeH6*S@(abE zMfuKqRfqh5SbTs+8_ci_OS3#?T1=sjnRkBZ6&YC~X-Cl?VOc$ckz=qgV23@1Wea^(n|OfJsiNqhWBo{Fx-Zk4j} zzl@z4+8r`Y;Z@_Y@ry^_AY+Z7$sA1U*<2=@8Oof_yyH*dQT6?Uxh^ZGq@g5cz;CU{cRc1KH2&wLl|W`{;AxJ%LuI2B6(kQqie;?SBUM!0#ZT+=mJO8^BHA z2i%VS&wx8YUF>%LAGmv|K0ZIOn7d60r~}+<6X$>RzX$H5BKZX&`==An+v5?UeIeS{^vNt2|17w26jyy z`VR}!@mG&o`nOp8!LexU-b?DOIz{VNb0&tYWV*DUigR%l;wdT zM>>Etks8I=Jm@okxEVbUq`?>WQ~Q6Z86^Qy0R4IPRu)7A7sPB-!PHP|6rzbH4Y@#GOm!40 zr}1QlAPg$E$DVLpW#`tJyKE(|xY79;4wrLqaxkIz5jU!C2>hnl4Ep&5RQGF?kj00~ zhhu%={^D^W@5IT4J#nit#8D(|ip&rvYNlgVq!YwHEsVuKS~&UDiBEoiw98D>+qBE< z$bD*XTv&YN*#bSrF<_EWPxMGxd$OOjI|e$RjsJ4-!iC~KhBaT_4^HhPp6Ms|`9(7DeB|K)*qaON~d(QEH~C znW5&3)ZCAMcj-$}6WtdnFpi*;DW(~!k6~0FsZ4~zZ6Y(8Nu!UiPa}6TCXQ5X*EHLI z@H)Z^MT{;T#d~=!3E=#)q9GT#n7HL|0;ac~g z9)FE=_IGN*pw6fNh^PXGYm@1G{B00|{(3?W@=VohZqNq9pQTsKr#h~5P8ohTXHs6I zLt)e0&6=jw!Zy!0O`~9%ME4aRr{^K=F%Y{nf%E9(hRzFdzK5HU#N<=}NumT79N>m6 z42*NAS<~loD@!-+&Ig1L}S^i!)Lm|61S#b62HmIxX29Qc2r(lZc?BBLBNY zlq7Q;`1+I_{kN$3CN;;XS*GR%YJP(n>>e|kzee3J#?OvVuI*;Noc#6lJOx^C7Y!v< z`cl5ZSM7p|`%)_Q0)_11kw|Oc7i0%8Lgk_?@>>RlH08NL6xNi4u{XdI%6l38zW^y_ BGnoJY delta 2174 zcmb7FO>7%Q6rPz~uh+ZljlGE-$4#P;lr~PGN}7_=A2q3In@TC}PY_9$pWtMckg`tG zbwt}J8)ZiACDUZe%jrO&)s{1kh|h9E4BCrtZ>4qPfFCK6vxbGCB;=r zs;kPm;zvrFtCgZ|RL)gjcXimO`Y|^qwc(mlTdpN_+>J|ZyEcz-ZH2gX+~zuutxz{H zNVvhx6~fKS%uOX>YVkNs<1lr&I!tnP;>YM9-7UKH-Y6%qpcKTrv7w|1Sj#%*KrO1X zgd%>6`P%^UtIC2hO3sjJHcCcdK2NTx^K=!`8HE`*U9O*>-WbHU{ z5QZLcDJL!ikc=w;QsF9(0Bn_OJPJA@!4p>tp}Wx#Gn9cM-nH0~!$(JgsaY=&SGVtq zU`Q$o$-LQv(X=qyJIUT0KpT?)#~>h#nUso@DyOg#2?2{%=UKB4t*y}dHRpM8Cl^mt z3$n&8j0Y4xiN^Xt6O*WhsZ77YCHtm^K6Vzw(v}-7XVIR4 z(8yeFy&gL+U|Eidq2_t&i!Yle>2#&L+EgfpH3_wj| zhcs+R0+NCCxrPV1&CxA-P8oSXUazdv@MA!9*p4NwgjJRhtEl$JoI+wHm zo69z@1Fpw-f+s;6+~M`0P2Rv$pe>%}jiBQ^!<#_clKWdE_fN|stl|DEosXKIAkr%L zZ+7-}{5SW*JF_FV$NUWK^~b2=fUouTbebCbB)U1UEHk?dKto<1h=mb_wlOkD5jpl#xdo)2h5%mOcbUe--0o#+h(AG^V&So68h@*AiP~bh?*gr>{L%L$r8_Evk3T}~ z_)F6B*!1|NS+6XX_P*%N0I=^6+}j|Cq5`#n1uPBcpJqth4SMUqLWgBp7Wu&1s}xTw z4zRobv(OG&bJ$=nUI0C)c6%3K$Mo4l=c}cd~ zDpfw+cbDd4STRZ60eD`@tq2-|BY9Q%7+`P*Zs1m!+2C`o9!Oi`Ctvybz$iUrqMzYn zX~y@;r_d8VyhQrJX9X#r0WXkNc;RY1gjV9~fi2?wgXbUi(7JlEJsYtmz1iWZ$?2m1 zly`CVxY*x+U~m2XYsGQTFHihqP1sz^zgpkwKhbG|bs=K$N56&cJvzLRgbhjRih9)%?Qle(j;FoG7~t{e?) mRQ2NI;c Date: Mon, 23 Sep 2019 12:38:37 +0530 Subject: [PATCH 04/12] Added documentation + independent module design. --- EDF.py | 95 +++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 67 insertions(+), 28 deletions(-) diff --git a/EDF.py b/EDF.py index 2977d1f..76ef94f 100644 --- a/EDF.py +++ b/EDF.py @@ -1,6 +1,5 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- - """ pyedf is a python package to read from and write EEG data to European Data Format files. Since EDF is such a widely used format, there exist multiple Python implementations for reading and writing EDF files. However, most of @@ -42,6 +41,7 @@ import re import warnings + def padtrim(buf, num): """ Calibate the length w.r.t. buffer parameter and pad the input if the calibrated length >= 0 (zero). Else trim (slice) the input using it. @@ -72,7 +72,8 @@ def writebyte(file, content, encoding='utf8'): # Py2.7 Support pass except Exception as e: - print(e) + print(type(e)) + print(str(e)) print( "If you see this message, please go to " + "https://github.com/bids-standard/pyedf/issues" + @@ -80,7 +81,6 @@ def writebyte(file, content, encoding='utf8'): finally: file.write(content) -############################################################################### class EDFWriter(): """ Writes EEG Data into BIDS-Standard Compliant EDF/EDF+/BDF/BDF+ files. @@ -342,7 +342,6 @@ def write_block(self, data): fid.write(val) self.n_records += 1 -#################################################################################################### class EDFReader(): """ Reads EEG Data from BIDS-Standard Compliant EDF/EDF+/BDF/BDF+ files. @@ -356,11 +355,24 @@ class EDFReader(): Methods: init_properties: Used to initialize/reset class attributes. - open: Creates a new file for writing data. - close: Closes the file after writing data. - write_header: Writes the header record to the file. - write_block: Writes the data records to the file. + open: Opens an existing file to read data. + close: Closes the file after reading data. + read_header: Reads the header record from the file. + read_block: Reads the data record blocks from the file. + read_samples: Reads the data samples from the file. + + Helper Methods: The following are a number of helper functions to make + the behaviour of this EDFReader class more similar to + https://bitbucket.org/cleemesser/python-edf/ + get_signal_text_labels: Convert Signal Text Labels from unicode + to strings. + get_n_signals: Get Number of Channels. + get_signal_freqs: Get Signal Frequencies. + get_n_samples: Get Total Number of Samples. + read_signal: Reads Entire Signal Record and returns the + values as an array. """ + def __init__(self, fname=None): """ Class Initializer. Calls init_properties() method to initialize. @@ -400,7 +412,7 @@ def close(self): self.init_properties() def read_header(self): - """ Reads header rcord from file. + """ Reads header record from file. The contents were copied over from MNE-Python and subsequently modified to closely reflect the native EDF File standard. @@ -454,9 +466,10 @@ def read_header(self): "for recordlength. Default record length set to 1.") else: meas_info['record_length'] = record_length - meas_info['nchan'] = nchan = int(fid.read(4).decode()) - channels = list(range(nchan)) + meas_info['nchan'] = int(fid.read(4).decode()) + channels = list(range(meas_info['nchan'])) + chan_info['ch_names'] = [ fid.read(16).strip().decode() for ch in channels] chan_info['transducers'] = [ @@ -515,7 +528,7 @@ def read_header(self): assert fid.tell() == header_nbyte if meas_info['n_records']==-1: - # this happens if the n_records is not updated at the end of recording + # happens if n_records is not updated at the end of recording tot_samps = ( os.path.getsize(self.fname)-meas_info['data_offset'] ) / meas_info['data_size'] @@ -537,6 +550,15 @@ def read_header(self): return (meas_info, chan_info) def read_block(self, block): + """ Reads data records blockwise. + + Arguments: + block (int): indicates block number in file. + + Example: + If you want to read data block 63 from file, use read_block(63) + """ + assert(block>=0) meas_info = self.meas_info chan_info = self.chan_info @@ -559,6 +581,14 @@ def read_block(self, block): return data def read_samples(self, channel, begsample, endsample): + """ Reads data sample from data block in file. + + Arguments: + channel (int): Indicates channel number. + begsample (int): Value of beginning sample (to start reading) + endsample (int): Value of ending sample (to stop reading) + """ + meas_info = self.meas_info chan_info = self.chan_info n_samps = chan_info['n_samps'][channel] @@ -569,37 +599,43 @@ def read_samples(self, channel, begsample, endsample): data = np.append(data, self.read_block(block)[channel]) begsample -= begblock*n_samps endsample -= begblock*n_samps - return data[begsample:(endsample+1)] - -#################################################################################################### -# the following are a number of helper functions to make the behaviour of this EDFReader -# class more similar to https://bitbucket.org/cleemesser/python-edf/ -#################################################################################################### + return data[begsample:(endsample + 1)] def get_signal_text_labels(self): - # convert from unicode to string + """ Convert Signal Text Labels from unicode to string.""" + return [str(x) for x in self.chan_info['ch_names']] def get_n_signals(self): + """ Get Number of Channels.""" + return self.meas_info['nchan'] def get_signal_freqs(self): + """ Get Signal Frequencies.""" + return self.chan_info['n_samps'] / self.meas_info['record_length'] def get_n_samples(self): + """ Get Total Number of Samples.""" + return self.chan_info['n_samps'] * self.meas_info['n_records'] def read_signal(self, chanindx): + """ Reads Entire Signal Record and returns the values as an array. + + Arguments: + chanindx: Indicates channel index. + """ + begsample = 0 endsample = ( self.chan_info['n_samps'][chanindx] * self.meas_info['n_records'] ) - 1 return self.read_samples(chanindx, begsample, endsample) -########################################################################## if __name__ == "__main__": - # Edit the name of files to test out EDFReader and EDFWriter class input_str = ( "Type 1 to only read from test EDF file.\n" + "Type 2 to only write from test EDF file.\n" + @@ -607,23 +643,26 @@ def read_signal(self, chanindx): "Press Enter after typing your choice: ") user_input = int(input(input_str)) + # Edit the filename variable to test out EDFReader and EDFWriter class + # with different files. filename = 'test_generator_2.edf' file_in = EDFReader() file_in.open(filename) + header = file_in.read_header() if user_input in (1, 3): - print("Following are data blocks from the EDF file.") - print (file_in.read_samples(0, 0, 0)) - print (file_in.read_samples(0, 0, 128)) + print("Following are data blocks from the EDF file.\n") + print(file_in.read_samples(0, 0, 0)) + print('\n') + print(file_in.read_samples(0, 0, 128)) + print('\n') + print(header) if user_input in (2, 3): file_out = EDFWriter() file_out.open('copy of ' + filename) - - header = file_in.read_header() - print(header) file_out.write_header(header) - + meas_info = header[0] for i in range(meas_info['n_records']): data = file_in.read_block(i) From bf765d52eeb48f34b06d9dffc517bfb496bcaef8 Mon Sep 17 00:00:00 2001 From: bsandeepan95 Date: Mon, 23 Sep 2019 12:40:08 +0530 Subject: [PATCH 05/12] EDF.py is independent module.removed testedf.py. --- testedf.py | 39 --------------------------------------- 1 file changed, 39 deletions(-) delete mode 100644 testedf.py diff --git a/testedf.py b/testedf.py deleted file mode 100644 index 2f0fab1..0000000 --- a/testedf.py +++ /dev/null @@ -1,39 +0,0 @@ -import EDF - -__author__ = "Sandeepan Bhattacharyya " -__version__ = "0.1.1" - -# Edit the name of files to test out EDFReader and EDFWriter class -input_str = ( - "Type 1 to only read from test EDF file.\n" + - "Type 2 to only write from test EDF file.\n" + - "Type 3 to read and write from test EDF file.\n" + - "Press Enter after typing your choice: ") -user_input = int(input(input_str)) - -filename = 'test_generator_2.edf' -file_in = EDF.EDFReader() -file_in.open(filename) -header = file_in.read_header() - -if user_input in (1, 3): - print("Following are data blocks from the EDF file.\n") - print(file_in.read_samples(0, 0, 0)) - print('\n') - print(file_in.read_samples(0, 0, 128)) - print('\n') - print(header) - - -if user_input in (2, 3): - file_out = EDF.EDFWriter() - file_out.open('copy of ' + filename) - file_out.write_header(header) - - meas_info = header[0] - for i in range(meas_info['n_records']): - data = file_in.read_block(i) - file_out.write_block(data) - file_out.close() - -file_in.close() From 7f117d7e02a37b61551f9b4bfe7b93afb0c458ed Mon Sep 17 00:00:00 2001 From: bsandeepan95 Date: Mon, 23 Sep 2019 12:50:34 +0530 Subject: [PATCH 06/12] cleanup --- .gitignore | 3 +++ README.md | 2 ++ 2 files changed, 5 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..239199a --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# Exclude these dirs +/_pycache_/ +/.vscode/ \ No newline at end of file diff --git a/README.md b/README.md index a16b8a8..628d16e 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ pyedf is a python package to read from and write EEG data to European Data Forma Since EDF is such a widely used format, there exist multiple Python implementations for reading and writing EDF files. However, most of these Python modules consist of wrappers around the C-code implementation `edflib`, which makes installation more cumbersome and reduces portability. This implementation is in pure python with limited dependencies on external packages while having support for Python 2.7 and 3.x. +The edf file, included for testing, is taken from [EDFBrowser Test Files](https://www.teuniz.net/edf_bdf_testfiles/index.html). + The EDF standard was introduced in [1992](https://doi.org/10.1016/0013-4694(92)90009-7). The extension of EDF with annotations was first described in [1998](https://doi.org/10.1016/S0013-4694(98)00029-7) and more formalized with the EDF+ standard that was published in [2003](https://doi.org/10.1016/S1388-2457(03)00123-8). The [EDF](http://www.edfplus.info) website describes both standards and discusses implementation details. ## See also From 75a6e946020f09e30b3b258c4ed170fc32933d93 Mon Sep 17 00:00:00 2001 From: bsandeepan95 Date: Mon, 23 Sep 2019 12:56:10 +0530 Subject: [PATCH 07/12] cleanup II --- .vscode/.ropeproject/config.py | 114 --------------------------------- .vscode/.ropeproject/objectdb | Bin 6 -> 0 bytes __pycache__/EDF.cpython-37.pyc | Bin 17851 -> 0 bytes 3 files changed, 114 deletions(-) delete mode 100644 .vscode/.ropeproject/config.py delete mode 100644 .vscode/.ropeproject/objectdb delete mode 100644 __pycache__/EDF.cpython-37.pyc diff --git a/.vscode/.ropeproject/config.py b/.vscode/.ropeproject/config.py deleted file mode 100644 index dee2d1a..0000000 --- a/.vscode/.ropeproject/config.py +++ /dev/null @@ -1,114 +0,0 @@ -# The default ``config.py`` -# flake8: noqa - - -def set_prefs(prefs): - """This function is called before opening the project""" - - # Specify which files and folders to ignore in the project. - # Changes to ignored resources are not added to the history and - # VCSs. Also they are not returned in `Project.get_files()`. - # Note that ``?`` and ``*`` match all characters but slashes. - # '*.pyc': matches 'test.pyc' and 'pkg/test.pyc' - # 'mod*.pyc': matches 'test/mod1.pyc' but not 'mod/1.pyc' - # '.svn': matches 'pkg/.svn' and all of its children - # 'build/*.o': matches 'build/lib.o' but not 'build/sub/lib.o' - # 'build//*.o': matches 'build/lib.o' and 'build/sub/lib.o' - prefs['ignored_resources'] = ['*.pyc', '*~', '.ropeproject', - '.hg', '.svn', '_svn', '.git', '.tox'] - - # Specifies which files should be considered python files. It is - # useful when you have scripts inside your project. Only files - # ending with ``.py`` are considered to be python files by - # default. - # prefs['python_files'] = ['*.py'] - - # Custom source folders: By default rope searches the project - # for finding source folders (folders that should be searched - # for finding modules). You can add paths to that list. Note - # that rope guesses project source folders correctly most of the - # time; use this if you have any problems. - # The folders should be relative to project root and use '/' for - # separating folders regardless of the platform rope is running on. - # 'src/my_source_folder' for instance. - # prefs.add('source_folders', 'src') - - # You can extend python path for looking up modules - # prefs.add('python_path', '~/python/') - - # Should rope save object information or not. - prefs['save_objectdb'] = True - prefs['compress_objectdb'] = False - - # If `True`, rope analyzes each module when it is being saved. - prefs['automatic_soa'] = True - # The depth of calls to follow in static object analysis - prefs['soa_followed_calls'] = 0 - - # If `False` when running modules or unit tests "dynamic object - # analysis" is turned off. This makes them much faster. - prefs['perform_doa'] = True - - # Rope can check the validity of its object DB when running. - prefs['validate_objectdb'] = True - - # How many undos to hold? - prefs['max_history_items'] = 32 - - # Shows whether to save history across sessions. - prefs['save_history'] = True - prefs['compress_history'] = False - - # Set the number spaces used for indenting. According to - # :PEP:`8`, it is best to use 4 spaces. Since most of rope's - # unit-tests use 4 spaces it is more reliable, too. - prefs['indent_size'] = 4 - - # Builtin and c-extension modules that are allowed to be imported - # and inspected by rope. - prefs['extension_modules'] = [] - - # Add all standard c-extensions to extension_modules list. - prefs['import_dynload_stdmods'] = True - - # If `True` modules with syntax errors are considered to be empty. - # The default value is `False`; When `False` syntax errors raise - # `rope.base.exceptions.ModuleSyntaxError` exception. - prefs['ignore_syntax_errors'] = False - - # If `True`, rope ignores unresolvable imports. Otherwise, they - # appear in the importing namespace. - prefs['ignore_bad_imports'] = False - - # If `True`, rope will insert new module imports as - # `from import ` by default. - prefs['prefer_module_from_imports'] = False - - # If `True`, rope will transform a comma list of imports into - # multiple separate import statements when organizing - # imports. - prefs['split_imports'] = False - - # If `True`, rope will remove all top-level import statements and - # reinsert them at the top of the module when making changes. - prefs['pull_imports_to_top'] = True - - # If `True`, rope will sort imports alphabetically by module name instead - # of alphabetically by import statement, with from imports after normal - # imports. - prefs['sort_imports_alphabetically'] = False - - # Location of implementation of - # rope.base.oi.type_hinting.interfaces.ITypeHintingFactory In general - # case, you don't have to change this value, unless you're an rope expert. - # Change this value to inject you own implementations of interfaces - # listed in module rope.base.oi.type_hinting.providers.interfaces - # For example, you can add you own providers for Django Models, or disable - # the search type-hinting in a class hierarchy, etc. - prefs['type_hinting_factory'] = ( - 'rope.base.oi.type_hinting.factory.default_type_hinting_factory') - - -def project_opened(project): - """This function is called after opening the project""" - # Do whatever you like here! diff --git a/.vscode/.ropeproject/objectdb b/.vscode/.ropeproject/objectdb deleted file mode 100644 index 0a47446c0ad231c193bdd44ff327ba2ab28bf3d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6 NcmZo*sx4&D0{{kv0iOT> diff --git a/__pycache__/EDF.cpython-37.pyc b/__pycache__/EDF.cpython-37.pyc deleted file mode 100644 index cc5c0f0456b4fb6dc8e470129bd8d1477299e9f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17851 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 From d88f578d9a938103b2b556a2c1f1f48c4bbb5664 Mon Sep 17 00:00:00 2001 From: bsandeepan95 Date: Thu, 11 Jun 2020 19:50:31 +0530 Subject: [PATCH 08/12] only py3 support --- .gitignore | 5 +- EDF.py | 174 ++--------------------------------------------------- 2 files changed, 10 insertions(+), 169 deletions(-) diff --git a/.gitignore b/.gitignore index 239199a..191b92d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ # Exclude these dirs /_pycache_/ -/.vscode/ \ No newline at end of file +/.vscode/ + +# files +EDF Docs.py diff --git a/EDF.py b/EDF.py index 76ef94f..29b4957 100644 --- a/EDF.py +++ b/EDF.py @@ -43,28 +43,11 @@ def padtrim(buf, num): - """ Calibate the length w.r.t. buffer parameter and pad the input if the - calibrated length >= 0 (zero). Else trim (slice) the input using it. - - Arguments: - buf (Any): Values to be inserted in EDF Header. - num (int): Value used for padding/trimming the buffer value. - """ - num -= len(buf) return (str(buf) + ' ' * num) if (num >= 0) else buf[0:num] def writebyte(file, content, encoding='utf8'): - """ Writes byte data into file. If string input is given, it will be - converted into byte data first before further operations - - Arguments: - file (FILE): Value having a file pointer. - content (bytes/str): Value to be written in a file. - encoding(str): Value defines the byte encoding to use for strings. - """ - try: # Py3 onwards bytes and strings are separate data format content = bytes(content, encoding) @@ -83,38 +66,12 @@ def writebyte(file, content, encoding='utf8'): class EDFWriter(): - """ Writes EEG Data into BIDS-Standard Compliant EDF/EDF+/BDF/BDF+ files. - - Attributes: - fname (str): Contains the filename. - meas_info (list): Dictionary having information of Measurement - chan_info (list) Dictionary having information of Channels - calibrate (float): Calibration Value for signals - offset (float): Offset Value for signals - n_records (int): number of data records - - Methods: - init_properties: Used to initialize/reset class attributes. - open: Creates a new file for writing data. - close: Closes the file after writing data. - write_header: Writes the header record to the file. - write_block: Writes the data records to the file. - """ - def __init__(self, fname=None): - """ Class Initializer. Calls init_properties() method to initialize. - - Arguments: - fname(str): Name of the to-be-created file. - """ - self.init_properties() if fname: self.open(fname) def init_properties(self): - """ Initializes/Resets Class Attributes.""" - self.fname = None self.meas_info = None self.chan_info = None @@ -123,21 +80,11 @@ def init_properties(self): self.n_records = 0 def open(self, fname): - """ Opens file to write. - - Arguments: - fname(str): Name of the to-be-created file. - """ - with open(fname, 'wb') as fid: assert(fid.tell() == 0) self.fname = fname def close(self): - """ Updates "Number of Data Records" field in header after writing - is complete and closes file. - """ - # it is still needed to update the number of records in the header # this requires copying the whole file content meas_info = self.meas_info @@ -171,26 +118,6 @@ def close(self): self.init_properties() def write_header(self, header): - """ Writes the header record to the file. - - Arguments: - header(tuple): the EDF header is represented as a tuple of - two dictionaries (meas_info{}, chan_info{}). - - meas_info should have the following: { - 'record_length', 'file_ver', 'hour', - 'subject_id', 'recording_id', 'n_records', - 'month', 'subtype', 'second', 'nchan', - 'data_size', 'data_offset', 'lowpass', - 'year', 'highpass', 'day', 'minute'} - - chan_info should have the following: { - 'physical_min', 'transducers', - 'physical_max', 'digital_max', - 'ch_names', 'n_samps', 'units', - 'digital_min'} - """ - meas_info = header[0] chan_info = header[1] meas_size = 256 @@ -211,16 +138,16 @@ def write_header(self, header): nchan = meas_info['nchan'] - if (not 'ch_names' in chan_info) or ( - len(chan_info['ch_names']) < nchan): + if ((not 'ch_names' in chan_info) or ( + len(chan_info['ch_names']) < nchan)): chan_info['ch_names'] = [str(i) for i in range(nchan)] - if (not 'transducers' in chan_info) or ( - len(chan_info['transducers']) < nchan): + if ((not 'transducers' in chan_info) or ( + len(chan_info['transducers']) < nchan)): chan_info['transducers'] = ['' for i in range(nchan)] - if (not 'units' in chan_info) or ( - len(chan_info['units']) < nchan): + if ((not 'units' in chan_info) or ( + len(chan_info['units']) < nchan)): chan_info['units'] = ['' for i in range(nchan)] if meas_info['subtype'] in ('24BIT', 'bdf'): @@ -311,13 +238,6 @@ def write_header(self, header): self.offset[ch] = 0 def write_block(self, data): - """ Writes list of data into file block by block. - - Arguments: - data (list): A numpy array of 16-bit integer value - representation of signal records. - """ - meas_info = self.meas_info chan_info = self.chan_info with open(self.fname, 'ab') as fid: @@ -344,49 +264,12 @@ def write_block(self, data): class EDFReader(): - """ Reads EEG Data from BIDS-Standard Compliant EDF/EDF+/BDF/BDF+ files. - - Attributes: - fname (str): Contains the filename. - meas_info (list): Dictionary having information of Measurement - chan_info (list) Dictionary having information of Channels - calibrate (float): Calibration Value for signals - offset (float): Offset Value for signals. - - Methods: - init_properties: Used to initialize/reset class attributes. - open: Opens an existing file to read data. - close: Closes the file after reading data. - read_header: Reads the header record from the file. - read_block: Reads the data record blocks from the file. - read_samples: Reads the data samples from the file. - - Helper Methods: The following are a number of helper functions to make - the behaviour of this EDFReader class more similar to - https://bitbucket.org/cleemesser/python-edf/ - get_signal_text_labels: Convert Signal Text Labels from unicode - to strings. - get_n_signals: Get Number of Channels. - get_signal_freqs: Get Signal Frequencies. - get_n_samples: Get Total Number of Samples. - read_signal: Reads Entire Signal Record and returns the - values as an array. - """ - def __init__(self, fname=None): - """ Class Initializer. Calls init_properties() method to initialize. - - Arguments: - fname(str): Name of the to-be-created file. - """ - self.init_properties() if fname: self.open(fname) def init_properties(self): - """ Initializes/Resets Class Attributes.""" - self.fname = None self.meas_info = None self.chan_info = None @@ -394,12 +277,6 @@ def init_properties(self): self.offset = None def open(self, fname): - """ Opens file to read. - - Arguments: - fname(str): Name of the to-be-opened existing file. - """ - with open(fname, 'rb') as fid: assert(fid.tell() == 0) self.fname = fname @@ -407,17 +284,9 @@ def open(self, fname): return self.meas_info, self.chan_info def close(self): - """Closes opened file""" - self.init_properties() def read_header(self): - """ Reads header record from file. - - The contents were copied over from MNE-Python and subsequently - modified to closely reflect the native EDF File standard. - """ - meas_info = {} chan_info = {} with open(self.fname, 'rb') as fid: @@ -550,15 +419,6 @@ def read_header(self): return (meas_info, chan_info) def read_block(self, block): - """ Reads data records blockwise. - - Arguments: - block (int): indicates block number in file. - - Example: - If you want to read data block 63 from file, use read_block(63) - """ - assert(block>=0) meas_info = self.meas_info chan_info = self.chan_info @@ -581,14 +441,6 @@ def read_block(self, block): return data def read_samples(self, channel, begsample, endsample): - """ Reads data sample from data block in file. - - Arguments: - channel (int): Indicates channel number. - begsample (int): Value of beginning sample (to start reading) - endsample (int): Value of ending sample (to stop reading) - """ - meas_info = self.meas_info chan_info = self.chan_info n_samps = chan_info['n_samps'][channel] @@ -602,32 +454,18 @@ def read_samples(self, channel, begsample, endsample): return data[begsample:(endsample + 1)] def get_signal_text_labels(self): - """ Convert Signal Text Labels from unicode to string.""" - return [str(x) for x in self.chan_info['ch_names']] def get_n_signals(self): - """ Get Number of Channels.""" - return self.meas_info['nchan'] def get_signal_freqs(self): - """ Get Signal Frequencies.""" - return self.chan_info['n_samps'] / self.meas_info['record_length'] def get_n_samples(self): - """ Get Total Number of Samples.""" - return self.chan_info['n_samps'] * self.meas_info['n_records'] def read_signal(self, chanindx): - """ Reads Entire Signal Record and returns the values as an array. - - Arguments: - chanindx: Indicates channel index. - """ - begsample = 0 endsample = ( self.chan_info['n_samps'][chanindx] * self.meas_info['n_records'] From d0fda11f52269049fd574cf73e3c2568a1b63773 Mon Sep 17 00:00:00 2001 From: = <=> Date: Wed, 12 Aug 2020 22:43:56 +0530 Subject: [PATCH 09/12] restructured styling. Restructured functions. --- .gitignore | 3 - EDF.py | 232 +++++++++++++++++++++++------------------------------ 2 files changed, 101 insertions(+), 134 deletions(-) diff --git a/.gitignore b/.gitignore index 191b92d..00c5b70 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,3 @@ # Exclude these dirs /_pycache_/ /.vscode/ - -# files -EDF Docs.py diff --git a/EDF.py b/EDF.py index 29b4957..61d8c8d 100644 --- a/EDF.py +++ b/EDF.py @@ -23,8 +23,8 @@ standard that was published in 2003. To learn more about both standards and implementation details, check out https://www.edfplus.info/index.html """ -__version__ = "0.4.0" -__author__ = "https://github.com/robertoostenveld | https://github.com/bsandeepan95>" +__version__ = "0.2.0" +__author__ = "Robert Oostenveld | Sandeepan B " __copyright__ = "https://bids.neuroimaging.io/" __credits__ = ["various"] __license__ = "BSD 3-Clause License" @@ -39,21 +39,33 @@ import numpy as np import os import re -import warnings +from warnings import warn +countS = countN = 0 def padtrim(buf, num): num -= len(buf) - return (str(buf) + ' ' * num) if (num >= 0) else buf[0:num] - - -def writebyte(file, content, encoding='utf8'): + if num >= 0: + # pad the input to the specified length + return (str(buf) + ' ' * num) + else: + # trim the input to the specified length + return buf[0:num] + +def writebyte(file, content, encoding='ascii'): + # format non-string inputs to string + global countN, countS + if not isinstance(content, str): + content = str(content) + countS = countS + 1 + else: + countN = countN + 1 try: # Py3 onwards bytes and strings are separate data format content = bytes(content, encoding) - except TypeError: + except TypeError : # Py2.7 Support - pass + content = content.encode(encoding) except Exception as e: print(type(e)) print(str(e)) @@ -64,14 +76,23 @@ def writebyte(file, content, encoding='utf8'): finally: file.write(content) +def set_offset(chan_obj): + # return a tuple of offset value and calibrate value + physical_range = chan_obj['physical_max'] - chan_obj['physical_min'] + digital_range = chan_obj['digital_max'] - chan_obj['digital_min'] + calibrate = physical_range / digital_range + calibrated_dig_min = calibrate * chan_obj['digital_min'] + offset = chan_obj['physical_min'] - calibrated_dig_min + return (offset, calibrate) + class EDFWriter(): def __init__(self, fname=None): - self.init_properties() + self._initial_state() if fname: self.open(fname) - def init_properties(self): + def _initial_state(self): self.fname = None self.meas_info = None self.chan_info = None @@ -81,7 +102,7 @@ def init_properties(self): def open(self, fname): with open(fname, 'wb') as fid: - assert(fid.tell() == 0) + assert fid.tell() == 0 self.fname = fname def close(self): @@ -95,9 +116,9 @@ def close(self): os.rename(self.fname, tempname) with open(tempname, 'rb') as fid1: - assert(fid1.tell() == 0) + assert fid1.tell() == 0 with open(self.fname, 'wb') as fid2: - assert(fid2.tell() == 0) + assert fid2.tell() == 0 fid2.write(fid1.read(236)) # skip this part @@ -105,17 +126,15 @@ def close(self): # but write this instead writebyte(fid2, padtrim(str(self.n_records), 8)) - writebyte(fid2, fid1.read( - meas_info['data_offset'] - 236 - 8)) + writebyte(fid2, fid1.read(meas_info['data_offset'] - 236 - 8)) - blocksize = np.sum( - chan_info['n_samps']) * meas_info['data_size'] + blocksize = np.sum(chan_info['n_samps']) * meas_info['data_size'] for block in range(self.n_records): writebyte(fid2, fid1.read(blocksize)) os.remove(tempname) - self.init_properties() + self._initial_state() def write_header(self, header): meas_info = header[0] @@ -124,7 +143,7 @@ def write_header(self, header): chan_size = 256 * meas_info['nchan'] with open(self.fname, 'wb') as fid: - assert(fid.tell() == 0) + assert fid.tell() == 0 # fill in the missing or incomplete information if not 'subject_id' in meas_info: @@ -138,12 +157,10 @@ def write_header(self, header): nchan = meas_info['nchan'] - if ((not 'ch_names' in chan_info) or ( - len(chan_info['ch_names']) < nchan)): + if ((not 'ch_names' in chan_info) or (len(chan_info['ch_names']) < nchan)): chan_info['ch_names'] = [str(i) for i in range(nchan)] - if ((not 'transducers' in chan_info) or ( - len(chan_info['transducers']) < nchan)): + if ((not 'transducers' in chan_info) or (len(chan_info['transducers']) < nchan)): chan_info['transducers'] = ['' for i in range(nchan)] if ((not 'units' in chan_info) or ( @@ -160,12 +177,10 @@ def write_header(self, header): writebyte(fid, (padtrim(meas_info['recording_id'], 80))) writebyte(fid, (padtrim('{:0>2d}.{:0>2d}.{:0>2d}'.format( - meas_info['day'], meas_info['month'], - meas_info['year']), 8))) + meas_info['day'], meas_info['month'], meas_info['year']), 8))) writebyte(fid, (padtrim('{:0>2d}.{:0>2d}.{:0>2d}'.format( - meas_info['hour'], meas_info['minute'], - meas_info['second']), 8))) + meas_info['hour'], meas_info['minute'], meas_info['second']), 8))) writebyte(fid, (padtrim(str(meas_size + chan_size), 8))) writebyte(fid, (' ' * 44)) @@ -176,45 +191,36 @@ def write_header(self, header): writebyte(fid, (padtrim(str(meas_info['nchan']), 4))) # ensure that these are all np arrays rather than lists - for key in [ - 'physical_min', 'transducers', 'physical_max', 'digital_max', - 'ch_names', 'n_samps', 'units', 'digital_min']: + for key in ['physical_min', 'transducers', 'physical_max', + 'digital_max', 'ch_names', 'n_samps', 'units', 'digital_min']: chan_info[key] = np.asarray(chan_info[key]) for i in range(meas_info['nchan']): - writebyte(fid, ( - padtrim( chan_info['ch_names'][i], 16))) + writebyte(fid, (padtrim(chan_info['ch_names'][i], 16))) for i in range(meas_info['nchan']): - writebyte(fid, ( - padtrim( chan_info['transducers'][i], 80))) + writebyte(fid, (padtrim(chan_info['transducers'][i], 80))) for i in range(meas_info['nchan']): - writebyte(fid, ( - padtrim( chan_info['units'][i], 8))) + writebyte(fid, (padtrim(chan_info['units'][i], 8))) for i in range(meas_info['nchan']): - writebyte(fid, ( - padtrim(str(chan_info['physical_min'][i]), 8))) + writebyte(fid, (padtrim(str(chan_info['physical_min'][i]), 8))) for i in range(meas_info['nchan']): - writebyte(fid, ( - padtrim(str(chan_info['physical_max'][i]), 8))) + writebyte(fid, (padtrim(str(chan_info['physical_max'][i]), 8))) for i in range(meas_info['nchan']): - writebyte(fid, ( - padtrim(str(int(chan_info['digital_min'][i])), 8))) + writebyte(fid, (padtrim(str(int(chan_info['digital_min'][i])), 8))) for i in range(meas_info['nchan']): - writebyte(fid, ( - padtrim(str(int(chan_info['digital_max'][i])), 8))) + writebyte(fid, (padtrim(str(int(chan_info['digital_max'][i])), 8))) for i in range(meas_info['nchan']): writebyte(fid, (' ' * 80)) # prefiltering for i in range(meas_info['nchan']): - writebyte(fid, ( - padtrim(str(chan_info['n_samps'][i]), 8))) + writebyte(fid, (padtrim(str(chan_info['n_samps'][i]), 8))) for i in range(meas_info['nchan']): writebyte(fid, (' ' * 32)) # reserved @@ -223,15 +229,9 @@ def write_header(self, header): self.meas_info = meas_info self.chan_info = chan_info - self.calibrate = ( - chan_info['physical_max'] - chan_info['physical_min']) / ( - chan_info['digital_max'] - chan_info['digital_min']) - - self.offset = chan_info['physical_min'] - ( - self.calibrate * chan_info['digital_min']) + self.offset, self.calibrate = set_offset(chan_info) channels = list(range(meas_info['nchan'])) - for ch in channels: if self.calibrate[ch]<0: self.calibrate[ch] = 1 @@ -241,17 +241,15 @@ def write_block(self, data): meas_info = self.meas_info chan_info = self.chan_info with open(self.fname, 'ab') as fid: - assert(fid.tell() > 0) + assert fid.tell() > 0 for i in range(meas_info['nchan']): raw = deepcopy(data[i]) - assert(len(raw)==chan_info['n_samps'][i]) - if min(raw)chan_info['physical_max'][i]: - warnings.warn( - 'Value exceeds physical_max: '+ str(max(raw))) + assert len(raw) == chan_info['n_samps'][i] + if min(raw) < chan_info['physical_min'][i]: + warn('Value exceeds physical_min: ' + str(min(raw))) + if max(raw) > chan_info['physical_max'][i]: + warn('Value exceeds physical_max: '+ str(max(raw))) raw -= self.offset[i] # FIXME I am not sure about the order of calibrate and offset raw /= self.calibrate[i] @@ -265,11 +263,11 @@ def write_block(self, data): class EDFReader(): def __init__(self, fname=None): - self.init_properties() + self._initial_state() if fname: self.open(fname) - def init_properties(self): + def _initial_state(self): self.fname = None self.meas_info = None self.chan_info = None @@ -278,46 +276,44 @@ def init_properties(self): def open(self, fname): with open(fname, 'rb') as fid: - assert(fid.tell() == 0) + assert fid.tell() == 0 self.fname = fname self.read_header() return self.meas_info, self.chan_info def close(self): - self.init_properties() + self._initial_state() def read_header(self): meas_info = {} chan_info = {} with open(self.fname, 'rb') as fid: - assert(fid.tell() == 0) + assert fid.tell() == 0 meas_info['file_ver'] = fid.read(8).strip().decode() meas_info['subject_id'] = fid.read(80).strip().decode() meas_info['recording_id'] = fid.read(80).strip().decode() - day, month, year = [int(x) for x in re.findall( - '(\d+)', fid.read(8).decode())] - hour, minute, second = [int(x) for x in re.findall( - '(\d+)', fid.read(8).decode())] + day, month, year = [int(x) for x in re.findall('(\d+)', fid.read(8).decode())] + hour, minute, second = [int(x) for x in re.findall('(\d+)', fid.read(8).decode())] + meas_info['day'] = day meas_info['month'] = month meas_info['year'] = year meas_info['hour'] = hour meas_info['minute'] = minute meas_info['second'] = second - date = datetime.datetime( - year + 2000, month, day, hour, minute, second) - meas_info['meas_date'] = calendar.timegm(date.utctimetuple()) + date = datetime.datetime(year + 2000, month, day, hour, minute, second) + + meas_info['meas_date'] = calendar.timegm(date.utctimetuple()) meas_info['data_offset'] = header_nbyte = int(fid.read(8).decode()) subtype = fid.read(44).strip().decode()[:5] if len(subtype) > 0: meas_info['subtype'] = subtype else: - meas_info['subtype'] = os.path.splitext( - self.fname)[1][1:].lower() + meas_info['subtype'] = os.path.splitext(self.fname)[1][1:].lower() if meas_info['subtype'] in ('24BIT', 'bdf'): meas_info['data_size'] = 3 # 24-bit (3 byte) integers @@ -330,36 +326,24 @@ def read_header(self): record_length = float(fid.read(8).decode()) if record_length == 0: meas_info['record_length'] = record_length = 1. - warnings.warn( - "Header measurement information is incorrect " + - "for recordlength. Default record length set to 1.") + warn("Header measurement information is incorrect for recordlength. Default record length set to 1.") else: meas_info['record_length'] = record_length meas_info['nchan'] = int(fid.read(4).decode()) channels = list(range(meas_info['nchan'])) - chan_info['ch_names'] = [ - fid.read(16).strip().decode() for ch in channels] - chan_info['transducers'] = [ - fid.read(80).strip().decode() for ch in channels] - chan_info['units'] = [ - fid.read(8).strip().decode() for ch in channels] - chan_info['physical_min'] = np.array([ - float(fid.read(8).decode()) for ch in channels]) - chan_info['physical_max'] = np.array([ - float(fid.read(8).decode()) for ch in channels]) - chan_info['digital_min'] = np.array([ - float(fid.read(8).decode()) for ch in channels]) - chan_info['digital_max'] = np.array([ - float(fid.read(8).decode()) for ch in channels]) - - prefiltering = [ - fid.read(80).strip().decode() for ch in channels][:-1] - highpass = np.ravel([ - re.findall('HP:\s+(\w+)', filt) for filt in prefiltering]) - lowpass = np.ravel([ - re.findall('LP:\s+(\w+)', filt) for filt in prefiltering]) + chan_info['ch_names'] = [fid.read(16).strip().decode() for ch in channels] + chan_info['transducers'] = [fid.read(80).strip().decode() for ch in channels] + chan_info['units'] = [fid.read(8).strip().decode() for ch in channels] + chan_info['physical_min'] = np.array([float(fid.read(8).decode()) for ch in channels]) + chan_info['physical_max'] = np.array([float(fid.read(8).decode()) for ch in channels]) + chan_info['digital_min'] = np.array([float(fid.read(8).decode()) for ch in channels]) + chan_info['digital_max'] = np.array([float(fid.read(8).decode()) for ch in channels]) + + prefiltering = [fid.read(80).strip().decode() for ch in channels][:-1] + highpass = np.ravel([re.findall('HP:\s+(\w+)', filt) for filt in prefiltering]) + lowpass = np.ravel([re.findall('LP:\s+(\w+)', filt) for filt in prefiltering]) high_pass_default = 0. if highpass.size == 0: @@ -373,9 +357,7 @@ def read_header(self): meas_info['highpass'] = float(highpass[0]) else: meas_info['highpass'] = float(np.max(highpass)) - warnings.warn( - "Channels contain different highpass filters. " + - "Highest filter setting will be stored.") + warn("Channels contain different highpass filters. Highest filter setting will be stored.") if lowpass.size == 0: meas_info['lowpass'] = None @@ -386,31 +368,23 @@ def read_header(self): meas_info['lowpass'] = float(lowpass[0]) else: meas_info['lowpass'] = float(np.min(lowpass)) - warnings.warn('%s' % ( - "Channels contain different lowpass filters. " + - "Lowest filter setting will be stored.")) + warn('%s' % ("Channels contain different lowpass filters. Lowest filter setting will be stored.")) # number of samples per record - chan_info['n_samps'] = n_samps = np.array([ - int(fid.read(8).decode()) for ch in channels]) + chan_info['n_samps'] = n_samps = np.array([int(fid.read(8).decode()) for ch in channels]) fid.read(32 *meas_info['nchan']).decode() # reserved assert fid.tell() == header_nbyte - if meas_info['n_records']==-1: + if meas_info['n_records'] == -1: # happens if n_records is not updated at the end of recording - tot_samps = ( - os.path.getsize(self.fname)-meas_info['data_offset'] - ) / meas_info['data_size'] - meas_info['n_records'] = tot_samps/sum(n_samps) - - self.calibrate = ( - chan_info['physical_max'] - chan_info['physical_min'] - ) / (chan_info['digital_max'] - chan_info['digital_min']) - self.offset = chan_info['physical_min'] - ( - self.calibrate * chan_info['digital_min']) - + file_size = os.path.getsize(self.fname) + total_samples = (file_size - meas_info['data_offset']) / meas_info['data_size'] + meas_info['n_records'] = total_samples / sum(n_samps) + + self.offset, self.calibrate = set_offset(chan_info) + for ch in channels: - if self.calibrate[ch]<0: + if self.calibrate[ch] < 0: self.calibrate[ch] = 1 self.offset[ch] = 0 @@ -419,22 +393,19 @@ def read_header(self): return (meas_info, chan_info) def read_block(self, block): - assert(block>=0) + assert block >= 0 meas_info = self.meas_info chan_info = self.chan_info data = [] with open(self.fname, 'rb') as fid: - assert(fid.tell() == 0) + assert fid.tell() == 0 blocksize = np.sum(chan_info['n_samps']) * meas_info['data_size'] fid.seek(meas_info['data_offset'] + block * blocksize) for i in range(meas_info['nchan']): buf = fid.read(chan_info['n_samps'][i]*meas_info['data_size']) - - raw = np.asarray( - unpack('<{}h'.format( - chan_info['n_samps'][i]), buf), dtype=np.float32) - + raw = np.asarray(unpack('<{}h'.format(chan_info['n_samps'][i]), buf), dtype=np.float32) + raw *= self.calibrate[i] raw += self.offset[i] # FIXME I am not sure about the order of calibrate and offset data.append(raw) @@ -467,9 +438,7 @@ def get_n_samples(self): def read_signal(self, chanindx): begsample = 0 - endsample = ( - self.chan_info['n_samps'][chanindx] * self.meas_info['n_records'] - ) - 1 + endsample = (self.chan_info['n_samps'][chanindx] * self.meas_info['n_records']) - 1 return self.read_samples(chanindx, begsample, endsample) @@ -508,3 +477,4 @@ def read_signal(self, chanindx): file_out.close() file_in.close() + print(countS, countN) \ No newline at end of file From a983a7c57f0f03eab0f5f7a4640eae97472f32d4 Mon Sep 17 00:00:00 2001 From: = <=> Date: Wed, 12 Aug 2020 22:52:18 +0530 Subject: [PATCH 10/12] Optimization : removed 'if' from writebyte --- EDF.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/EDF.py b/EDF.py index 61d8c8d..17e4f79 100644 --- a/EDF.py +++ b/EDF.py @@ -41,7 +41,6 @@ import re from warnings import warn -countS = countN = 0 def padtrim(buf, num): num -= len(buf) @@ -53,13 +52,6 @@ def padtrim(buf, num): return buf[0:num] def writebyte(file, content, encoding='ascii'): - # format non-string inputs to string - global countN, countS - if not isinstance(content, str): - content = str(content) - countS = countS + 1 - else: - countN = countN + 1 try: # Py3 onwards bytes and strings are separate data format content = bytes(content, encoding) @@ -126,12 +118,12 @@ def close(self): # but write this instead writebyte(fid2, padtrim(str(self.n_records), 8)) - writebyte(fid2, fid1.read(meas_info['data_offset'] - 236 - 8)) + writebyte(fid2, str(fid1.read(meas_info['data_offset'] - 236 - 8))) blocksize = np.sum(chan_info['n_samps']) * meas_info['data_size'] for block in range(self.n_records): - writebyte(fid2, fid1.read(blocksize)) + writebyte(fid2, str(fid1.read(blocksize))) os.remove(tempname) self._initial_state() @@ -477,4 +469,3 @@ def read_signal(self, chanindx): file_out.close() file_in.close() - print(countS, countN) \ No newline at end of file From ff41c02f49f6520944a6ed919ad091dade385934 Mon Sep 17 00:00:00 2001 From: = <=> Date: Wed, 12 Aug 2020 22:57:38 +0530 Subject: [PATCH 11/12] Edited README --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 628d16e..40b9155 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ # pyedf -pyedf is a python package to read from and write EEG data to European Data Format files. +The EDF standard was introduced in [1992](https://doi.org/10.1016/0013-4694(92)90009-7). The extension of EDF with annotations was first described in [1998](https://doi.org/10.1016/S0013-4694(98)00029-7) and more formalized with the EDF+ standard that was published in [2003](https://doi.org/10.1016/S1388-2457(03)00123-8). The [EDF](http://www.edfplus.info) website describes both standards and discusses implementation details. + +pyedf is a python package to read from and write EEG data to EDF/EDF+ files. Since EDF is such a widely used format, there exist multiple Python implementations for reading and writing EDF files. However, most of these Python modules consist of wrappers around the C-code implementation `edflib`, which makes installation more cumbersome and reduces portability. This implementation is in pure python with limited dependencies on external packages while having support for Python 2.7 and 3.x. The edf file, included for testing, is taken from [EDFBrowser Test Files](https://www.teuniz.net/edf_bdf_testfiles/index.html). -The EDF standard was introduced in [1992](https://doi.org/10.1016/0013-4694(92)90009-7). The extension of EDF with annotations was first described in [1998](https://doi.org/10.1016/S0013-4694(98)00029-7) and more formalized with the EDF+ standard that was published in [2003](https://doi.org/10.1016/S1388-2457(03)00123-8). The [EDF](http://www.edfplus.info) website describes both standards and discusses implementation details. - ## See also - http://www.edfplus.info - https://github.com/holgern/pyedflib From 9a02510012deaea12e561b6812bec0bb905008c1 Mon Sep 17 00:00:00 2001 From: Sandeepan Bhattacharyya Date: Sat, 20 Mar 2021 21:15:15 +0530 Subject: [PATCH 12/12] restored method documentations --- EDF.py | 169 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 168 insertions(+), 1 deletion(-) diff --git a/EDF.py b/EDF.py index 17e4f79..16b3580 100644 --- a/EDF.py +++ b/EDF.py @@ -43,6 +43,14 @@ def padtrim(buf, num): + """ Calibate the length w.r.t. buffer parameter and pad the input if the + calibrated length >= 0 (zero). Else trim (slice) the input using it. + + Arguments: + buf (Any): Values to be inserted in EDF Header. + num (int): Value used for padding/trimming the buffer value. + """ + num -= len(buf) if num >= 0: # pad the input to the specified length @@ -52,6 +60,15 @@ def padtrim(buf, num): return buf[0:num] def writebyte(file, content, encoding='ascii'): + """ Writes byte data into file. If string input is given, it will be + converted into byte data first before further operations + + Arguments: + file (FILE): Value having a file pointer. + content (bytes/str): Value to be written in a file. + encoding(str): Value defines the byte encoding to use for strings. + """ + try: # Py3 onwards bytes and strings are separate data format content = bytes(content, encoding) @@ -69,7 +86,12 @@ def writebyte(file, content, encoding='ascii'): file.write(content) def set_offset(chan_obj): - # return a tuple of offset value and calibrate value + """ Return a tuple of offset value and calibrate value. + + Arguments: + chan_obj (dict): Dictionary containing channel information. + """ + physical_range = chan_obj['physical_max'] - chan_obj['physical_min'] digital_range = chan_obj['digital_max'] - chan_obj['digital_min'] calibrate = physical_range / digital_range @@ -79,12 +101,38 @@ def set_offset(chan_obj): class EDFWriter(): + """ Writes EEG Data into BIDS-Standard Compliant EDF/EDF+/BDF/BDF+ files. + + Attributes: + fname (str): Contains the filename. + meas_info (list): Dictionary having information of Measurement + chan_info (list) Dictionary having information of Channels + calibrate (float): Calibration Value for signals + offset (float): Offset Value for signals + n_records (int): number of data records + + Methods: + _initial_state: Used to initialize/reset class attributes. + open: Creates a new file for writing data. + close: Closes the file after writing data. + write_header: Writes the header record to the file. + write_block: Writes the data records to the file. + """ + def __init__(self, fname=None): + """ Class Initializer. Calls _initial_state() method to initialize. + + Arguments: + fname(str): Name of the to-be-created file. + """ + self._initial_state() if fname: self.open(fname) def _initial_state(self): + """ Initializes/Resets Class Attributes.""" + self.fname = None self.meas_info = None self.chan_info = None @@ -93,11 +141,21 @@ def _initial_state(self): self.n_records = 0 def open(self, fname): + """ Opens file to write. + + Arguments: + fname(str): Name of the to-be-created file. + """ + with open(fname, 'wb') as fid: assert fid.tell() == 0 self.fname = fname def close(self): + """ Updates "Number of Data Records" field in header after writing + is complete and closes file. + """ + # it is still needed to update the number of records in the header # this requires copying the whole file content meas_info = self.meas_info @@ -129,6 +187,26 @@ def close(self): self._initial_state() def write_header(self, header): + """ Writes the header record to the file. + + Arguments: + header(tuple): the EDF header is represented as a tuple of + two dictionaries (meas_info{}, chan_info{}). + + meas_info should have the following: { + 'record_length', 'file_ver', 'hour', + 'subject_id', 'recording_id', 'n_records', + 'month', 'subtype', 'second', 'nchan', + 'data_size', 'data_offset', 'lowpass', + 'year', 'highpass', 'day', 'minute'} + + chan_info should have the following: { + 'physical_min', 'transducers', + 'physical_max', 'digital_max', + 'ch_names', 'n_samps', 'units', + 'digital_min'} + """ + meas_info = header[0] chan_info = header[1] meas_size = 256 @@ -230,6 +308,13 @@ def write_header(self, header): self.offset[ch] = 0 def write_block(self, data): + """ Writes list of data into file block by block. + + Arguments: + data (list): A numpy array of 16-bit integer value + representation of signal records. + """ + meas_info = self.meas_info chan_info = self.chan_info with open(self.fname, 'ab') as fid: @@ -254,12 +339,49 @@ def write_block(self, data): class EDFReader(): + """ Reads EEG Data from BIDS-Standard Compliant EDF/EDF+/BDF/BDF+ files. + + Attributes: + fname (str): Contains the filename. + meas_info (list): Dictionary having information of Measurement + chan_info (list) Dictionary having information of Channels + calibrate (float): Calibration Value for signals + offset (float): Offset Value for signals. + + Methods: + _initial_state: Used to initialize/reset class attributes. + open: Opens an existing file to read data. + close: Closes the file after reading data. + read_header: Reads the header record from the file. + read_block: Reads the data record blocks from the file. + read_samples: Reads the data samples from the file. + + Helper Methods: The following are a number of helper functions to make + the behaviour of this EDFReader class more similar to + https://bitbucket.org/cleemesser/python-edf/ + get_signal_text_labels: Convert Signal Text Labels from unicode + to strings. + get_n_signals: Get Number of Channels. + get_signal_freqs: Get Signal Frequencies. + get_n_samples: Get Total Number of Samples. + read_signal: Reads Entire Signal Record and returns the + values as an array. + """ + def __init__(self, fname=None): + """ Class Initializer. Calls _initial_state() method to initialize. + + Arguments: + fname(str): Name of the to-be-created file. + """ + self._initial_state() if fname: self.open(fname) def _initial_state(self): + """ Initializes/Resets Class Attributes.""" + self.fname = None self.meas_info = None self.chan_info = None @@ -267,6 +389,12 @@ def _initial_state(self): self.offset = None def open(self, fname): + """ Opens file to read. + + Arguments: + fname(str): Name of the to-be-opened existing file. + """ + with open(fname, 'rb') as fid: assert fid.tell() == 0 self.fname = fname @@ -274,9 +402,17 @@ def open(self, fname): return self.meas_info, self.chan_info def close(self): + """Closes opened file""" + self._initial_state() def read_header(self): + """ Reads header record from file. + + The contents were copied over from MNE-Python and subsequently + modified to closely reflect the native EDF File standard. + """ + meas_info = {} chan_info = {} with open(self.fname, 'rb') as fid: @@ -385,6 +521,15 @@ def read_header(self): return (meas_info, chan_info) def read_block(self, block): + """ Reads data records blockwise. + + Arguments: + block (int): indicates block number in file. + + Example: + If you want to read data block 63 from file, use read_block(63) + """ + assert block >= 0 meas_info = self.meas_info chan_info = self.chan_info @@ -404,6 +549,14 @@ def read_block(self, block): return data def read_samples(self, channel, begsample, endsample): + """ Reads data sample from data block in file. + + Arguments: + channel (int): Indicates channel number. + begsample (int): Value of beginning sample (to start reading) + endsample (int): Value of ending sample (to stop reading) + """ + meas_info = self.meas_info chan_info = self.chan_info n_samps = chan_info['n_samps'][channel] @@ -417,18 +570,32 @@ def read_samples(self, channel, begsample, endsample): return data[begsample:(endsample + 1)] def get_signal_text_labels(self): + """ Retieve and convert Signal Text Labels from unicode to string.""" + return [str(x) for x in self.chan_info['ch_names']] def get_n_signals(self): + """ Get number of signal channels.""" + return self.meas_info['nchan'] def get_signal_freqs(self): + """ Get signal frequencies.""" + return self.chan_info['n_samps'] / self.meas_info['record_length'] def get_n_samples(self): + """ Get total number of samples.""" + return self.chan_info['n_samps'] * self.meas_info['n_records'] def read_signal(self, chanindx): + """ Reads Entire Signal Record and returns the values as an array. + + Arguments: + chanindx: Indicates channel index. + """ + begsample = 0 endsample = (self.chan_info['n_samps'][chanindx] * self.meas_info['n_records']) - 1 return self.read_samples(chanindx, begsample, endsample)