Skip to content

Commit 8ca88bd

Browse files
committed
BF: fixed TCK buferring and added a unit test
1 parent e49a25b commit 8ca88bd

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed

nibabel/streamlines/tck.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -347,9 +347,11 @@ def _read(fileobj, header, buffer_size=4):
347347
points : ndarray of shape (n_pts, 3)
348348
Streamline points
349349
"""
350-
buffer_size = buffer_size * MEGABYTE
351-
buffer_size += 3 - (buffer_size % 3) # Make it a multiple of 3.
352350
dtype = header["_dtype"]
351+
coordinate_size = 3 * dtype.itemsize
352+
# Make buffer_size an integer and a multiple of coordinate_size.
353+
buffer_size = int(buffer_size * MEGABYTE)
354+
buffer_size += coordinate_size - (buffer_size % coordinate_size)
353355

354356
with Opener(fileobj) as f:
355357
start_position = f.tell()

nibabel/streamlines/tests/test_tck.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
from nibabel.testing import data_path
1212
from .test_tractogram import assert_tractogram_equal
13+
from ..array_sequence import ArraySequence
1314
from ..tractogram import Tractogram
1415
from ..tractogram_file import DataError
1516

@@ -80,13 +81,23 @@ class TestTCK(unittest.TestCase):
8081

8182
def test_load_empty_file(self):
8283
for lazy_load in [False, True]:
83-
trk = TckFile.load(DATA['empty_tck_fname'], lazy_load=lazy_load)
84-
assert_tractogram_equal(trk.tractogram, DATA['empty_tractogram'])
84+
tck = TckFile.load(DATA['empty_tck_fname'], lazy_load=lazy_load)
85+
assert_tractogram_equal(tck.tractogram, DATA['empty_tractogram'])
8586

8687
def test_load_simple_file(self):
8788
for lazy_load in [False, True]:
88-
trk = TckFile.load(DATA['simple_tck_fname'], lazy_load=lazy_load)
89-
assert_tractogram_equal(trk.tractogram, DATA['simple_tractogram'])
89+
tck = TckFile.load(DATA['simple_tck_fname'], lazy_load=lazy_load)
90+
assert_tractogram_equal(tck.tractogram, DATA['simple_tractogram'])
91+
92+
# Force TCK loading to use buffering.
93+
buffer_size = 1. / 1024**2 # 1 bytes
94+
hdr = TckFile._read_header(DATA['simple_tck_fname'])
95+
tck_reader = TckFile._read(DATA['simple_tck_fname'], hdr, buffer_size)
96+
streamlines = ArraySequence(tck_reader)
97+
tractogram = Tractogram(streamlines)
98+
tractogram.affine_to_rasmm = np.eye(4)
99+
tck = TckFile(tractogram, header=hdr)
100+
assert_tractogram_equal(tck.tractogram, DATA['simple_tractogram'])
90101

91102
def test_load_simple_file_in_big_endian(self):
92103
for lazy_load in [False, True]:

0 commit comments

Comments
 (0)