@@ -34,8 +34,8 @@ def read_data_block(encoding, endian, ordering, datatype, shape, data):
34
34
c = StringIO (data )
35
35
da = np .loadtxt (c )
36
36
da = da .astype (data_type_codes .type [datatype ])
37
- # independent of the endianness
38
- return da
37
+ return da # independent of the endianness
38
+
39
39
elif enclabel == 'B64BIN' :
40
40
# GIFTI_ENCODING_B64BIN
41
41
dec = base64 .b64decode (data .encode ('ascii' ))
@@ -44,6 +44,7 @@ def read_data_block(encoding, endian, ordering, datatype, shape, data):
44
44
newarr = np .fromstring (dec , dtype = dt )
45
45
if len (newarr .shape ) != len (sh ):
46
46
newarr = newarr .reshape (sh , order = ord )
47
+
47
48
elif enclabel == 'B64GZ' :
48
49
# GIFTI_ENCODING_B64GZ
49
50
# convert to bytes array for python 3.2
@@ -55,24 +56,28 @@ def read_data_block(encoding, endian, ordering, datatype, shape, data):
55
56
newarr = np .fromstring (zdec , dtype = dt )
56
57
if len (newarr .shape ) != len (sh ):
57
58
newarr = newarr .reshape (sh , order = ord )
59
+
58
60
elif enclabel == 'External' :
59
61
# GIFTI_ENCODING_EXTBIN
60
62
raise NotImplementedError ("In what format are the external files?" )
63
+
61
64
else :
62
65
return 0
66
+
63
67
# check if we need to byteswap
64
68
required_byteorder = gifti_endian_codes .byteorder [endian ]
65
69
if (required_byteorder in ('big' , 'little' ) and
66
- required_byteorder != sys .byteorder ):
70
+ required_byteorder != sys .byteorder ):
67
71
newarr = newarr .byteswap ()
68
72
return newarr
69
73
70
74
71
75
class GiftiImageParser (XmlImageParser ):
72
76
73
- def __init__ (self , encoding = None , buffer_size = 35000000 ):
77
+ def __init__ (self , encoding = None , buffer_size = 35000000 , verbose = 0 ):
74
78
super (GiftiImageParser , self ).__init__ (encoding = encoding ,
75
- buffer_size = buffer_size )
79
+ buffer_size = buffer_size ,
80
+ verbose = verbose )
76
81
77
82
# finite state machine stack
78
83
self .fsm_state = []
@@ -98,40 +103,43 @@ def StartElementHandler(self, name, attrs):
98
103
self .flush_chardata ()
99
104
if self .verbose > 0 :
100
105
print ('Start element:\n \t ' , repr (name ), attrs )
106
+
101
107
if name == 'GIFTI' :
102
108
# create gifti image
103
109
self .img = GiftiImage ()
104
110
if 'Version' in attrs :
105
111
self .img .version = attrs ['Version' ]
106
112
if 'NumberOfDataArrays' in attrs :
107
113
self .expected_numDA = int (attrs ['NumberOfDataArrays' ])
108
-
109
114
self .fsm_state .append ('GIFTI' )
115
+
110
116
elif name == 'MetaData' :
111
117
self .fsm_state .append ('MetaData' )
112
-
113
118
# if this metadata tag is first, create self.img.meta
114
119
if len (self .fsm_state ) == 2 :
115
120
self .meta_global = GiftiMetaData ()
116
121
else :
117
122
# otherwise, create darray.meta
118
123
self .meta_da = GiftiMetaData ()
124
+
119
125
elif name == 'MD' :
120
126
self .nvpair = GiftiNVPairs ()
121
127
self .fsm_state .append ('MD' )
128
+
122
129
elif name == 'Name' :
123
130
if self .nvpair is None :
124
131
raise ExpatError
125
- else :
126
- self . write_to = 'Name'
132
+ self . write_to = 'Name'
133
+
127
134
elif name == 'Value' :
128
135
if self .nvpair is None :
129
136
raise ExpatError
130
- else :
131
- self . write_to = 'Value'
137
+ self . write_to = 'Value'
138
+
132
139
elif name == 'LabelTable' :
133
140
self .lata = GiftiLabelTable ()
134
141
self .fsm_state .append ('LabelTable' )
142
+
135
143
elif name == 'Label' :
136
144
self .label = GiftiLabel ()
137
145
if "Index" in attrs :
@@ -147,6 +155,7 @@ def StartElementHandler(self, name, attrs):
147
155
if "Alpha" in attrs :
148
156
self .label .alpha = float (attrs ["Alpha" ])
149
157
self .write_to = 'Label'
158
+
150
159
elif name == 'DataArray' :
151
160
self .da = GiftiDataArray ()
152
161
if "Intent" in attrs :
@@ -174,32 +183,35 @@ def StartElementHandler(self, name, attrs):
174
183
self .da .ext_offset = attrs ["ExternalFileOffset" ]
175
184
self .img .darrays .append (self .da )
176
185
self .fsm_state .append ('DataArray' )
186
+
177
187
elif name == 'CoordinateSystemTransformMatrix' :
178
188
self .coordsys = GiftiCoordSystem ()
179
189
self .img .darrays [- 1 ].coordsys = self .coordsys
180
190
self .fsm_state .append ('CoordinateSystemTransformMatrix' )
191
+
181
192
elif name == 'DataSpace' :
182
193
if self .coordsys is None :
183
194
raise ExpatError
184
- else :
185
- self . write_to = 'DataSpace'
195
+ self . write_to = 'DataSpace'
196
+
186
197
elif name == 'TransformedSpace' :
187
198
if self .coordsys is None :
188
199
raise ExpatError
189
- else :
190
- self . write_to = 'TransformedSpace'
200
+ self . write_to = 'TransformedSpace'
201
+
191
202
elif name == 'MatrixData' :
192
203
if self .coordsys is None :
193
204
raise ExpatError
194
- else :
195
- self . write_to = 'MatrixData'
205
+ self . write_to = 'MatrixData'
206
+
196
207
elif name == 'Data' :
197
208
self .write_to = 'Data'
198
209
199
210
def EndElementHandler (self , name ):
200
211
self .flush_chardata ()
201
212
if self .verbose > 0 :
202
213
print ('End element:\n \t ' , repr (name ))
214
+
203
215
if name == 'GIFTI' :
204
216
if hasattr (self , 'expected_numDA' ) and self .expected_numDA != self .img .numDA :
205
217
warnings .warn ("Actual # of data arrays does not match "
@@ -208,6 +220,7 @@ def EndElementHandler(self, name):
208
220
# remove last element of the list
209
221
self .fsm_state .pop ()
210
222
# assert len(self.fsm_state) == 0
223
+
211
224
elif name == 'MetaData' :
212
225
self .fsm_state .pop ()
213
226
if len (self .fsm_state ) == 1 :
@@ -218,6 +231,7 @@ def EndElementHandler(self, name):
218
231
else :
219
232
self .img .darrays [- 1 ].meta = self .meta_da
220
233
self .meta_da = None
234
+
221
235
elif name == 'MD' :
222
236
self .fsm_state .pop ()
223
237
if self .meta_global is not None and self .meta_da is None :
@@ -226,28 +240,24 @@ def EndElementHandler(self, name):
226
240
self .meta_da .data .append (self .nvpair )
227
241
# remove reference
228
242
self .nvpair = None
243
+
229
244
elif name == 'LabelTable' :
230
245
self .fsm_state .pop ()
231
246
# add labeltable
232
247
self .img .labeltable = self .lata
233
248
self .lata = None
249
+
234
250
elif name == 'DataArray' :
235
251
self .fsm_state .pop ()
252
+
236
253
elif name == 'CoordinateSystemTransformMatrix' :
237
254
self .fsm_state .pop ()
238
255
self .coordsys = None
239
- elif name == 'DataSpace' :
240
- self .write_to = None
241
- elif name == 'TransformedSpace' :
242
- self .write_to = None
243
- elif name == 'MatrixData' :
244
- self .write_to = None
245
- elif name == 'Name' :
246
- self .write_to = None
247
- elif name == 'Value' :
248
- self .write_to = None
249
- elif name == 'Data' :
256
+
257
+ elif name in ['DataSpace' , 'TransformedSpace' , 'MatrixData' ,
258
+ 'Name' , 'Value' , 'Data' ]:
250
259
self .write_to = None
260
+
251
261
elif name == 'Label' :
252
262
self .lata .labels .append (self .label )
253
263
self .label = None
@@ -277,24 +287,30 @@ def flush_chardata(self):
277
287
data = '' .join (self ._char_blocks )
278
288
# Reset the char collector
279
289
self ._char_blocks = None
290
+
280
291
# Process data
281
292
if self .write_to == 'Name' :
282
293
data = data .strip ()
283
294
self .nvpair .name = data
295
+
284
296
elif self .write_to == 'Value' :
285
297
data = data .strip ()
286
298
self .nvpair .value = data
299
+
287
300
elif self .write_to == 'DataSpace' :
288
301
data = data .strip ()
289
302
self .coordsys .dataspace = xform_codes .code [data ]
303
+
290
304
elif self .write_to == 'TransformedSpace' :
291
305
data = data .strip ()
292
306
self .coordsys .xformspace = xform_codes .code [data ]
307
+
293
308
elif self .write_to == 'MatrixData' :
294
309
# conversion to numpy array
295
310
c = StringIO (data )
296
311
self .coordsys .xform = np .loadtxt (c )
297
312
c .close ()
313
+
298
314
elif self .write_to == 'Data' :
299
315
da_tmp = self .img .darrays [- 1 ]
300
316
da_tmp .data = read_data_block (da_tmp .encoding , da_tmp .endian ,
@@ -303,13 +319,14 @@ def flush_chardata(self):
303
319
# update the endianness according to the
304
320
# current machine setting
305
321
self .endian = gifti_endian_codes .code [sys .byteorder ]
322
+
306
323
elif self .write_to == 'Label' :
307
324
self .label .label = data .strip ()
308
325
309
326
@property
310
327
def pending_data (self ):
311
328
" True if there is character data pending for processing "
312
- return not self ._char_blocks is None
329
+ return self ._char_blocks is not None
313
330
314
331
315
332
class Outputter (GiftiImageParser ):
0 commit comments