1
1
from pathlib import Path
2
+ import typing as ty
3
+ from fileformats .core import FileSet , extra_implementation
2
4
from fileformats .generic import File
3
5
from fileformats .application import Gzip
4
6
from fileformats .core .mixin import WithMagicNumber
@@ -15,43 +17,6 @@ class BaseMrtrixImage(WithMagicNumber, fileformats.medimage.MedicalImage, File):
15
17
magic_number = b"mrtrix image\n "
16
18
binary = True
17
19
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
-
55
20
@property
56
21
def data_fspath (self ):
57
22
data_fspath = self .metadata ["file" ].split ()[0 ]
@@ -121,3 +86,46 @@ def __attrs_post_init__(self):
121
86
class ImageDataFile (File ):
122
87
123
88
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