Skip to content

Commit 43d607e

Browse files
committed
Show error dialog for non-compliant EDF files
1 parent 351c192 commit 43d607e

File tree

2 files changed

+37
-16
lines changed

2 files changed

+37
-16
lines changed

anonymizedf/editor.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from functools import partial
77

88
from .model import EDFModel
9+
from .model import EDFModel, InvalidFileError
910

1011

1112
class EditorFrame(wx.Frame):
@@ -29,12 +30,25 @@ def __init__(self, parent, path: Path):
2930
self.input_path = path
3031
self.Bind(wx.EVT_CLOSE, self.on_close)
3132

32-
self.model = EDFModel(self.input_path)
33+
self._read_edf()
3334
self._setup()
3435
self.Layout()
3536
self.Fit()
3637
self.header_panel.SetupScrolling()
3738

39+
def _read_edf(self):
40+
try:
41+
self.model = EDFModel(self.input_path)
42+
except InvalidFileError:
43+
dialog = wx.MessageDialog(
44+
self,
45+
f"The selected file is not EDF(+) compliant.",
46+
"Could not open the EDF file",
47+
style=wx.ICON_ERROR | wx.OK
48+
)
49+
dialog.ShowModal()
50+
self.Close()
51+
3852
def _setup(self):
3953
panel = wx.Panel(self)
4054

anonymizedf/model.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,23 @@ class EDFModel:
2727
]
2828

2929
def __init__(self, path):
30-
with EdfReader(str(path)) as f:
31-
self._header = f.getHeader()
32-
self._annots = [annot for annot in zip(*f.readAnnotations())]
33-
self._signal_headers = f.getSignalHeaders()
34-
self._signals = [
35-
f.readSignal(s, digital=True) for s in range(f.signals_in_file)
36-
]
37-
edf_file_type = f.filetype
38-
39-
if edf_file_type == pyedflib.FILETYPE_EDF:
40-
# This is a legacy EDF file, so we copy the legacy header
41-
# fields into the EDF+ “extra” fields.
42-
self._header["patient_additional"] = f.patient
43-
self._header["recording_additional"] = f.recording
30+
try:
31+
with EdfReader(str(path)) as f:
32+
self._header = f.getHeader()
33+
self._annots = [annot for annot in zip(*f.readAnnotations())]
34+
self._signal_headers = f.getSignalHeaders()
35+
self._signals = [
36+
f.readSignal(s, digital=True) for s in range(f.signals_in_file)
37+
]
38+
edf_file_type = f.filetype
39+
40+
if edf_file_type == pyedflib.FILETYPE_EDF:
41+
# This is a legacy EDF file, so we copy the legacy header
42+
# fields into the EDF+ “extra” fields.
43+
self._header["patient_additional"] = f.patient
44+
self._header["recording_additional"] = f.recording
45+
except OSError as err:
46+
raise InvalidFileError(str(err))
4447

4548
@property
4649
def header_fields(self):
@@ -62,7 +65,7 @@ def get_header_field_value(self, field_name):
6265

6366
def _parse_birthdate(self):
6467
birthdate_str = self._header.get("birthdate")
65-
if birthdate_str == '':
68+
if birthdate_str == "":
6669
return None
6770
return datetime.datetime.strptime(birthdate_str, "%d %b %Y")
6871

@@ -91,3 +94,7 @@ def write(self, filename):
9194
header["annotations"] = self.annotations
9295

9396
write_edf(filename, self._signals, self._signal_headers, header, digital=True)
97+
98+
99+
class InvalidFileError(IOError):
100+
"""The EDF file is invalid or malformed."""

0 commit comments

Comments
 (0)