From 71f29d304ad112e8d17bf423294dce58b627f6d5 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Mon, 29 Jul 2019 22:58:20 -0400 Subject: [PATCH 1/3] FIX: Set TRK byte order to < before filling values --- nibabel/streamlines/trk.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nibabel/streamlines/trk.py b/nibabel/streamlines/trk.py index 7ff80dc59f..3100dfe5ec 100644 --- a/nibabel/streamlines/trk.py +++ b/nibabel/streamlines/trk.py @@ -269,7 +269,8 @@ def is_correct_format(cls, fileobj): def _default_structarr(cls): """ Return an empty compliant TRK header as numpy structured array """ - st_arr = np.zeros((), dtype=header_2_dtype) + # Enforce little-endian byte order for header + st_arr = np.zeros((), dtype=header_2_dtype).newbyteorder('<') # Default values st_arr[Field.MAGIC_NUMBER] = cls.MAGIC_NUMBER @@ -395,8 +396,7 @@ def save(self, fileobj): pointing to TRK file (and ready to write from the beginning of the TRK header data). """ - # Enforce little-endian byte order for header - header = self._default_structarr().newbyteorder('<') + header = self._default_structarr() # Override hdr's fields by those contained in `header`. for k, v in self.header.items(): From 2434adb2092b20fbe4a74e03e08c27f5bba42ff3 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Mon, 29 Jul 2019 23:08:27 -0400 Subject: [PATCH 2/3] DOCTEST: Display system endianness-neutral representation of >> fname = os.path.join(datadir, 'example4d+orig.HEAD') >>> header = AFNIHeader(parse_AFNI_header(fname)) - >>> header.get_data_dtype() - dtype('int16') + >>> header.get_data_dtype().str + '>> header.get_zooms() (3.0, 3.0, 3.0, 3.0) >>> header.get_data_shape() From 927b6ce8cb459e1dc1173a4da9722e2904c1b5d5 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Wed, 31 Jul 2019 07:18:24 -0400 Subject: [PATCH 3/3] ENH: Pass endianness as parameter to TrkFile._default_structarr --- nibabel/streamlines/trk.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/nibabel/streamlines/trk.py b/nibabel/streamlines/trk.py index 3100dfe5ec..805b44edcf 100644 --- a/nibabel/streamlines/trk.py +++ b/nibabel/streamlines/trk.py @@ -13,7 +13,7 @@ from nibabel.openers import Opener from nibabel.py3k import asstr -from nibabel.volumeutils import (native_code, swapped_code) +from nibabel.volumeutils import (native_code, swapped_code, endian_codes) from nibabel.orientations import (aff2axcodes, axcodes2ornt) from .array_sequence import create_arraysequences_from_generator @@ -266,11 +266,14 @@ def is_correct_format(cls, fileobj): return magic_number == cls.MAGIC_NUMBER @classmethod - def _default_structarr(cls): + def _default_structarr(cls, endianness=None): """ Return an empty compliant TRK header as numpy structured array """ - # Enforce little-endian byte order for header - st_arr = np.zeros((), dtype=header_2_dtype).newbyteorder('<') + dt = header_2_dtype + if endianness is not None: + endianness = endian_codes[endianness] + dt = dt.newbyteorder(endianness) + st_arr = np.zeros((), dtype=dt) # Default values st_arr[Field.MAGIC_NUMBER] = cls.MAGIC_NUMBER @@ -284,10 +287,10 @@ def _default_structarr(cls): return st_arr @classmethod - def create_empty_header(cls): + def create_empty_header(cls, endianness=None): """ Return an empty compliant TRK header as dict """ - st_arr = cls._default_structarr() + st_arr = cls._default_structarr(endianness) return dict(zip(st_arr.dtype.names, st_arr.tolist())) @classmethod @@ -396,7 +399,8 @@ def save(self, fileobj): pointing to TRK file (and ready to write from the beginning of the TRK header data). """ - header = self._default_structarr() + # Enforce little-endian byte order for header + header = self._default_structarr(endianness='little') # Override hdr's fields by those contained in `header`. for k, v in self.header.items():