@@ -72,8 +72,8 @@ def get_affine_trackvis_to_rasmm(header):
7272
7373 Parameters
7474 ----------
75- header : dict
76- Dict containing trackvis header.
75+ header : dict or ndarray
76+ Dict or numpy structured array containing trackvis header.
7777
7878 Returns
7979 -------
@@ -101,9 +101,12 @@ def get_affine_trackvis_to_rasmm(header):
101101 # If the voxel order implied by the affine does not match the voxel
102102 # order in the TRK header, change the orientation.
103103 # 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 ()
105108 affine_ornt = "" .join (aff2axcodes (header [Field .VOXEL_TO_RASMM ]))
106- header_ornt = axcodes2ornt (header_ornt )
109+ header_ornt = axcodes2ornt (vox_order . decode ( 'latin1' ) )
107110 affine_ornt = axcodes2ornt (affine_ornt )
108111 ornt = nib .orientations .ornt_transform (header_ornt , affine_ornt )
109112 M = nib .orientations .inv_ornt_aff (ornt , header [Field .DIMENSIONS ])
@@ -235,10 +238,6 @@ def __init__(self, tractogram, header=None):
235238 and *mm* space where coordinate (0,0,0) refers to the center
236239 of the voxel.
237240 """
238- if header is None :
239- header_rec = self .create_empty_header ()
240- header = dict (zip (header_rec .dtype .names , header_rec [0 ]))
241-
242241 super (TrkFile , self ).__init__ (tractogram , header )
243242
244243 @classmethod
@@ -266,20 +265,28 @@ def is_correct_format(cls, fileobj):
266265 return magic_number == cls .MAGIC_NUMBER
267266
268267 @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 )
272272
273273 # 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
281281
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 ()))
283290
284291 @classmethod
285292 def load (cls , fileobj , lazy_load = False ):
@@ -388,7 +395,7 @@ def save(self, fileobj):
388395 of the TRK header data).
389396 """
390397 # Enforce little-endian byte order for header
391- header = self .create_empty_header ().newbyteorder ('<' )
398+ header = self ._default_structarr ().newbyteorder ('<' )
392399
393400 # Override hdr's fields by those contained in `header`.
394401 for k , v in self .header .items ():
@@ -406,7 +413,6 @@ def save(self, fileobj):
406413 nb_scalars = 0
407414 nb_properties = 0
408415
409- header = header [0 ]
410416 with Opener (fileobj , mode = "wb" ) as f :
411417 # Keep track of the beginning of the header.
412418 beginning = f .tell ()
0 commit comments