Skip to content

Commit 437b35e

Browse files
authored
Merge pull request #341 from EIT-ALIVE/249_document_limitations_draeger
Document limitations for loading Draeger data
2 parents 5cc0e13 + fd30980 commit 437b35e

File tree

6 files changed

+56
-30
lines changed

6 files changed

+56
-30
lines changed

eitprocessing/datahandling/loading/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ def load_eit_data(
1818
) -> Sequence:
1919
"""Load EIT data from path(s).
2020
21+
Current limitations:
22+
- Dräger data is assumed to have a limited set of (Medibus) data. Newer additions that add data like pleural
23+
pressure are not yet supported.
24+
2125
Args:
2226
path: relative or absolute path(s) to data file.
2327
vendor: vendor indicating the device used.
@@ -64,6 +68,10 @@ def load_eit_data(
6468
Vendor.SENTEC: sentec.load_from_single_path,
6569
}[vendor]
6670

71+
if vendor == Vendor.DRAEGER and not sample_frequency:
72+
msg = """Provide a sample frequency when loading Draeger data."""
73+
raise NotImplementedError(msg) # automatic sample frequency detection is to be implemented per #217
74+
6775
first_frame = _check_first_frame(first_frame)
6876

6977
paths = EITData.ensure_path_list(path)

eitprocessing/datahandling/loading/draeger.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,12 @@
2323
from numpy.typing import NDArray
2424

2525
_FRAME_SIZE_BYTES = 4358
26-
DRAEGER_SAMPLE_FREQUENCY = 20
2726
load_draeger_data = partial(load_eit_data, vendor=Vendor.DRAEGER)
2827

2928

3029
def load_from_single_path(
3130
path: Path,
32-
sample_frequency: float | None = 20,
31+
sample_frequency: float,
3332
first_frame: int = 0,
3433
max_frames: int | None = None,
3534
) -> dict[str, DataCollection]:
@@ -38,7 +37,9 @@ def load_from_single_path(
3837
if file_size % _FRAME_SIZE_BYTES:
3938
msg = (
4039
f"File size {file_size} of file {path!s} not divisible by {_FRAME_SIZE_BYTES}.\n"
41-
f"Make sure this is a valid and uncorrupted Dräger data file."
40+
"Currently this package does not support loading files containing "
41+
"esophageal pressure or other non-standard data. "
42+
"Make sure this is a valid and uncorrupted Dräger data file."
4243
)
4344
raise OSError(msg)
4445
total_frames = file_size // _FRAME_SIZE_BYTES
@@ -88,7 +89,8 @@ def load_from_single_path(
8889
)
8990

9091
if not sample_frequency:
91-
sample_frequency = DRAEGER_SAMPLE_FREQUENCY
92+
msg = "No sample frequency provided. "
93+
raise ValueError(msg)
9294

9395
eit_data = EITData(
9496
vendor=Vendor.DRAEGER,

tests/conftest.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,17 @@
2121

2222
@pytest.fixture(scope="session")
2323
def draeger1():
24-
return load_eit_data(draeger_file1, vendor="draeger", label="draeger1")
24+
return load_eit_data(draeger_file1, vendor="draeger", sample_frequency=20, label="draeger1")
2525

2626

2727
@pytest.fixture(scope="session")
2828
def draeger2():
29-
return load_eit_data(draeger_file2, vendor="draeger", label="draeger2")
29+
return load_eit_data(draeger_file2, vendor="draeger", sample_frequency=20, label="draeger2")
3030

3131

3232
@pytest.fixture(scope="session")
3333
def draeger_both():
34-
return load_eit_data([draeger_file2, draeger_file1], vendor="draeger", label="draeger_both")
34+
return load_eit_data([draeger_file2, draeger_file1], vendor="draeger", sample_frequency=20, label="draeger_both")
3535

3636

3737
@pytest.fixture(scope="session")

tests/mixins/test_eq.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88

99

1010
def test_eq():
11-
data = load_eit_data(draeger_file1, vendor="draeger")
12-
data2 = load_eit_data(draeger_file1, vendor="draeger")
11+
data = load_eit_data(draeger_file1, vendor="draeger", sample_frequency=20)
12+
data2 = load_eit_data(draeger_file1, vendor="draeger", sample_frequency=20)
1313

1414
data.isequivalent(data2)
1515

tests/test_labels.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77

88
def test_default_label(draeger1: Sequence):
9-
draeger_default = load_eit_data(draeger_file1, vendor="draeger")
9+
draeger_default = load_eit_data(draeger_file1, vendor="draeger", sample_frequency=20)
1010
assert isinstance(draeger_default.label, str)
1111
assert draeger_default.label == f"Sequence_{id(draeger_default)}"
1212

@@ -15,7 +15,7 @@ def test_default_label(draeger1: Sequence):
1515
assert timpel_default.label == f"Sequence_{id(timpel_default)}"
1616

1717
# test that default label changes upon reloading identical data
18-
draeger_reloaded = load_eit_data(draeger_file1, vendor="draeger")
18+
draeger_reloaded = load_eit_data(draeger_file1, vendor="draeger", sample_frequency=20)
1919
assert draeger_default == draeger_reloaded
2020
assert draeger_default.label != draeger_reloaded.label
2121
assert draeger_default.label != draeger1.label

tests/test_loading.py

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@
22

33
from eitprocessing.datahandling.eitdata import EITData, Vendor
44
from eitprocessing.datahandling.loading import load_eit_data
5-
from eitprocessing.datahandling.loading.draeger import DRAEGER_SAMPLE_FREQUENCY
65
from eitprocessing.datahandling.sequence import Sequence
7-
from tests.conftest import draeger_file1, draeger_file2, draeger_file3, dummy_file, timpel_file
6+
from tests.conftest import (
7+
draeger_file1,
8+
draeger_file2,
9+
draeger_file3,
10+
dummy_file,
11+
timpel_file,
12+
)
813

914
# ruff: noqa: ERA001 #TODO: remove this line
1015

@@ -20,8 +25,8 @@ def test_loading_draeger(
2025
assert len(draeger1.eit_data["raw"]) == len(draeger1.eit_data["raw"].time)
2126
assert len(draeger2.eit_data["raw"].time) == 20740
2227

23-
assert draeger1 == load_eit_data(draeger_file1, vendor="draeger", label="draeger1")
24-
assert draeger1 == load_eit_data(draeger_file1, vendor="draeger", label="something_else")
28+
assert draeger1 == load_eit_data(draeger_file1, vendor="draeger", sample_frequency=20, label="draeger1")
29+
assert draeger1 == load_eit_data(draeger_file1, vendor="draeger", sample_frequency=20, label="something_else")
2530
assert draeger1 != draeger2
2631

2732
# Load multiple
@@ -55,13 +60,17 @@ def test_loading_illegal():
5560
# non existing
5661
for vendor in ["draeger", "timpel"]:
5762
with pytest.raises(FileNotFoundError):
58-
_ = load_eit_data(dummy_file, vendor=vendor)
63+
_ = load_eit_data(dummy_file, vendor=vendor, sample_frequency=20)
5964

6065
# incorrect vendor
6166
with pytest.raises(OSError):
6267
_ = load_eit_data(draeger_file1, vendor="timpel")
6368
with pytest.raises(OSError):
64-
_ = load_eit_data(timpel_file, vendor="draeger")
69+
_ = load_eit_data(timpel_file, vendor="draeger", sample_frequency=20)
70+
71+
# no sample frequency provided
72+
with pytest.raises(NotImplementedError):
73+
_ = load_eit_data(timpel_file, vendor="draeger", sample_frequency=None)
6574

6675

6776
def test_load_partial(
@@ -79,8 +88,8 @@ def test_load_partial(
7988
# file for this situation.
8089

8190
# Timpel
82-
timpel_part1 = load_eit_data(timpel_file, "timpel", max_frames=cutoff, label="timpel_part_1")
83-
timpel_part2 = load_eit_data(timpel_file, "timpel", first_frame=cutoff, label="timpel_part2")
91+
timpel_part1 = load_eit_data(timpel_file, vendor="timpel", max_frames=cutoff, label="timpel_part_1")
92+
timpel_part2 = load_eit_data(timpel_file, vendor="timpel", first_frame=cutoff, label="timpel_part2")
8493

8594
assert len(timpel_part1) == cutoff
8695
assert len(timpel_part2) == len(timpel1) - cutoff
@@ -90,8 +99,20 @@ def test_load_partial(
9099
# assert Sequence.concatenate(timpel_part2, timpel_part1) != timpel1
91100

92101
# Draeger
93-
draeger2_part1 = load_eit_data(draeger_file2, "draeger", max_frames=cutoff, label="draeger_part_1")
94-
draeger2_part2 = load_eit_data(draeger_file2, "draeger", first_frame=cutoff, label="draeger_part_2")
102+
draeger2_part1 = load_eit_data(
103+
draeger_file2,
104+
vendor="draeger",
105+
sample_frequency=20,
106+
max_frames=cutoff,
107+
label="draeger_part_1",
108+
)
109+
draeger2_part2 = load_eit_data(
110+
draeger_file2,
111+
vendor="draeger",
112+
sample_frequency=20,
113+
first_frame=cutoff,
114+
label="draeger_part_2",
115+
)
95116

96117
assert len(draeger2_part1) == cutoff
97118
assert len(draeger2_part2) == len(draeger2) - cutoff
@@ -108,24 +129,19 @@ def test_load_partial(
108129
def test_illegal_first_frame():
109130
for ff in [0.5, -1, "fdw", 1e12]:
110131
with pytest.raises((TypeError, ValueError)):
111-
_ = load_eit_data(draeger_file1, "draeger", first_frame=ff)
132+
_ = load_eit_data(draeger_file1, vendor="draeger", sample_frequency=20, first_frame=ff)
112133

113134
for ff2 in [0, 0.0, 1.0, None]:
114-
_ = load_eit_data(draeger_file1, "draeger", first_frame=ff2)
135+
_ = load_eit_data(draeger_file1, vendor="draeger", sample_frequency=20, first_frame=ff2)
115136

116137

117138
def test_max_frames_too_large():
118139
with pytest.warns():
119-
_ = load_eit_data(draeger_file1, "draeger", max_frames=1e12)
120-
121-
122-
def test_sample_frequency_unset():
123-
loaded_draeger = load_eit_data(draeger_file1, "draeger", sample_frequency=None)
124-
assert loaded_draeger.eit_data["raw"].sample_frequency == DRAEGER_SAMPLE_FREQUENCY
140+
_ = load_eit_data(draeger_file1, vendor="draeger", sample_frequency=20, max_frames=1e12)
125141

126142

127143
def test_event_on_first_frame(draeger2: Sequence):
128-
draeger3 = load_eit_data(draeger_file3, vendor="draeger")
144+
draeger3 = load_eit_data(draeger_file3, vendor="draeger", sample_frequency=20)
129145
draeger3_events = draeger3.sparse_data["events_(draeger)"]
130146
assert draeger3_events == draeger2.sparse_data["events_(draeger)"]
131147
assert draeger3_events.time[0] == draeger3.eit_data["raw"].time[0]

0 commit comments

Comments
 (0)