Skip to content

Commit 3e94158

Browse files
committed
moved read_metadata into extra_implementation method
1 parent 51156c5 commit 3e94158

File tree

1 file changed

+45
-37
lines changed

1 file changed

+45
-37
lines changed

related-packages/fileformats/fileformats/medimage_mrtrix3/image.py

Lines changed: 45 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
from pathlib import Path
2+
import typing as ty
3+
from fileformats.core import FileSet, extra_implementation
24
from fileformats.generic import File
35
from fileformats.application import Gzip
46
from fileformats.core.mixin import WithMagicNumber
@@ -15,43 +17,6 @@ class BaseMrtrixImage(WithMagicNumber, fileformats.medimage.MedicalImage, File):
1517
magic_number = b"mrtrix image\n"
1618
binary = True
1719

18-
def read_metadata(self):
19-
metadata = {}
20-
with open(self.fspath, "rb") as f:
21-
line = f.readline()
22-
if line != self.magic_number:
23-
raise FormatMismatchError(
24-
f"Magic line {line} doesn't match reference {self.magic_number}"
25-
)
26-
line = f.readline().decode("utf-8")
27-
while line and line != "END\n":
28-
key, value = line.split(": ", maxsplit=1)
29-
if "," in value:
30-
try:
31-
value = [int(v) for v in value.split(",")]
32-
except ValueError:
33-
try:
34-
value = [float(v) for v in value.split(",")]
35-
except ValueError:
36-
pass
37-
else:
38-
try:
39-
value = int(value)
40-
except ValueError:
41-
try:
42-
value = float(value)
43-
except ValueError:
44-
pass
45-
if key in metadata:
46-
if isinstance(metadata[key], MultiLineMetadataValue):
47-
metadata[key].append(value)
48-
else:
49-
metadata[key] = MultiLineMetadataValue([metadata[key], value])
50-
else:
51-
metadata[key] = value
52-
line = f.readline().decode("utf-8")
53-
return metadata
54-
5520
@property
5621
def data_fspath(self):
5722
data_fspath = self.metadata["file"].split()[0]
@@ -121,3 +86,46 @@ def __attrs_post_init__(self):
12186
class ImageDataFile(File):
12287

12388
ext = ".dat"
89+
90+
91+
@extra_implementation(FileSet.read_metadata)
92+
def mrtrix_read_metadata(
93+
mif: BaseMrtrixImage, selected_keys: ty.Optional[ty.Sequence[str]] = None
94+
) -> ty.Mapping[str, ty.Any]:
95+
metadata = {}
96+
with open(mif.fspath, "rb") as f:
97+
line = f.readline()
98+
if line != mif.magic_number:
99+
raise FormatMismatchError(
100+
f"Magic line {line} doesn't match reference {mif.magic_number}"
101+
)
102+
line = f.readline().decode("utf-8")
103+
while line and line != "END\n":
104+
key, value = line.split(": ", maxsplit=1)
105+
if "," in value:
106+
try:
107+
value = [int(v) for v in value.split(",")]
108+
except ValueError:
109+
try:
110+
value = [float(v) for v in value.split(",")]
111+
except ValueError:
112+
pass
113+
else:
114+
try:
115+
value = int(value)
116+
except ValueError:
117+
try:
118+
value = float(value)
119+
except ValueError:
120+
pass
121+
if key in metadata:
122+
if isinstance(metadata[key], MultiLineMetadataValue):
123+
metadata[key].append(value)
124+
else:
125+
metadata[key] = MultiLineMetadataValue([metadata[key], value])
126+
else:
127+
metadata[key] = value
128+
line = f.readline().decode("utf-8")
129+
if selected_keys:
130+
metadata = {k: v for k, v in metadata.items() if k in selected_keys}
131+
return metadata

0 commit comments

Comments
 (0)