@@ -72,8 +72,8 @@ def get_affine_trackvis_to_rasmm(header):
72
72
73
73
Parameters
74
74
----------
75
- header : dict
76
- Dict containing trackvis header.
75
+ header : dict or ndarray
76
+ Dict or numpy structured array containing trackvis header.
77
77
78
78
Returns
79
79
-------
@@ -101,9 +101,12 @@ def get_affine_trackvis_to_rasmm(header):
101
101
# If the voxel order implied by the affine does not match the voxel
102
102
# order in the TRK header, change the orientation.
103
103
# voxel (header) -> voxel (affine)
104
- header_ornt = asstr (header [Field .VOXEL_ORDER ])
104
+ vox_order = header [Field .VOXEL_ORDER ]
105
+ # Input header can be dict or structured array
106
+ if hasattr (vox_order , 'item' ): # structured array
107
+ vox_order = header [Field .VOXEL_ORDER ].item ()
105
108
affine_ornt = "" .join (aff2axcodes (header [Field .VOXEL_TO_RASMM ]))
106
- header_ornt = axcodes2ornt (header_ornt )
109
+ header_ornt = axcodes2ornt (vox_order . decode ( 'latin1' ) )
107
110
affine_ornt = axcodes2ornt (affine_ornt )
108
111
ornt = nib .orientations .ornt_transform (header_ornt , affine_ornt )
109
112
M = nib .orientations .inv_ornt_aff (ornt , header [Field .DIMENSIONS ])
@@ -235,10 +238,6 @@ def __init__(self, tractogram, header=None):
235
238
and *mm* space where coordinate (0,0,0) refers to the center
236
239
of the voxel.
237
240
"""
238
- if header is None :
239
- header_rec = self .create_empty_header ()
240
- header = dict (zip (header_rec .dtype .names , header_rec [0 ]))
241
-
242
241
super (TrkFile , self ).__init__ (tractogram , header )
243
242
244
243
@classmethod
@@ -266,20 +265,28 @@ def is_correct_format(cls, fileobj):
266
265
return magic_number == cls .MAGIC_NUMBER
267
266
268
267
@classmethod
269
- def create_empty_header (cls ):
270
- """ Return an empty compliant TRK header. """
271
- header = np .zeros (1 , dtype = header_2_dtype )
268
+ def _default_structarr (cls ):
269
+ """ Return an empty compliant TRK header as numpy structured array
270
+ """
271
+ st_arr = np .zeros ((), dtype = header_2_dtype )
272
272
273
273
# Default values
274
- header [Field .MAGIC_NUMBER ] = cls .MAGIC_NUMBER
275
- header [Field .VOXEL_SIZES ] = np .array ((1 , 1 , 1 ), dtype = "f4" )
276
- header [Field .DIMENSIONS ] = np .array ((1 , 1 , 1 ), dtype = "h" )
277
- header [Field .VOXEL_TO_RASMM ] = np .eye (4 , dtype = "f4" )
278
- header [Field .VOXEL_ORDER ] = b"RAS"
279
- header ['version' ] = 2
280
- header ['hdr_size' ] = cls .HEADER_SIZE
274
+ st_arr [Field .MAGIC_NUMBER ] = cls .MAGIC_NUMBER
275
+ st_arr [Field .VOXEL_SIZES ] = np .array ((1 , 1 , 1 ), dtype = "f4" )
276
+ st_arr [Field .DIMENSIONS ] = np .array ((1 , 1 , 1 ), dtype = "h" )
277
+ st_arr [Field .VOXEL_TO_RASMM ] = np .eye (4 , dtype = "f4" )
278
+ st_arr [Field .VOXEL_ORDER ] = b"RAS"
279
+ st_arr ['version' ] = 2
280
+ st_arr ['hdr_size' ] = cls .HEADER_SIZE
281
281
282
- return header
282
+ return st_arr
283
+
284
+ @classmethod
285
+ def create_empty_header (cls ):
286
+ """ Return an empty compliant TRK header as dict
287
+ """
288
+ st_arr = cls ._default_structarr ()
289
+ return dict (zip (st_arr .dtype .names , st_arr .tolist ()))
283
290
284
291
@classmethod
285
292
def load (cls , fileobj , lazy_load = False ):
@@ -388,7 +395,7 @@ def save(self, fileobj):
388
395
of the TRK header data).
389
396
"""
390
397
# Enforce little-endian byte order for header
391
- header = self .create_empty_header ().newbyteorder ('<' )
398
+ header = self ._default_structarr ().newbyteorder ('<' )
392
399
393
400
# Override hdr's fields by those contained in `header`.
394
401
for k , v in self .header .items ():
@@ -406,7 +413,6 @@ def save(self, fileobj):
406
413
nb_scalars = 0
407
414
nb_properties = 0
408
415
409
- header = header [0 ]
410
416
with Opener (fileobj , mode = "wb" ) as f :
411
417
# Keep track of the beginning of the header.
412
418
beginning = f .tell ()
0 commit comments