Skip to content

Commit 2e575eb

Browse files
committed
Merge pull request #307 from agramfort/freesurfer_tests_fix
MRG : Freesurfer tests fix Add Freesurfer files to git submodule to run Freesurfer tests on travis. Fix test failures from changed freesurfer example files.
2 parents b03213c + 7a0b5e3 commit 2e575eb

File tree

4 files changed

+51
-18
lines changed

4 files changed

+51
-18
lines changed

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@
77
[submodule "nipy-ecattest"]
88
path = nibabel-data/nipy-ecattest
99
url = https://github.com/freec84/nipy-ecattest
10+
[submodule "nibabel-data/nitest-freesurfer"]
11+
path = nibabel-data/nitest-freesurfer
12+
url = https://bitbucket.org/nipy/nitest-freesurfer.git

nibabel-data/nitest-freesurfer

Submodule nitest-freesurfer added at 0110860

nibabel/freesurfer/io.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,9 @@ def read_annot(filepath, orig_ids=False):
226226
ctab[i, 4] = (ctab[i, 0] + ctab[i, 1] * (2 ** 8) +
227227
ctab[i, 2] * (2 ** 16))
228228
ctab[:, 3] = 255
229+
230+
labels = labels.astype(np.int)
231+
229232
if not orig_ids:
230233
ord = np.argsort(ctab[:, -1])
231234
mask = labels != 0
@@ -270,9 +273,9 @@ def write_string(s):
270273
clut_labels[np.where(labels == -1)] = 0
271274

272275
# vno, label
273-
data = np.vstack((np.array(range(vnum)).astype(dt),
274-
clut_labels.astype(dt))).T
275-
data.byteswap().tofile(fobj)
276+
data = np.vstack((np.array(range(vnum)),
277+
clut_labels)).T.astype(dt)
278+
data.tofile(fobj)
276279

277280
# tag
278281
write(1)

nibabel/freesurfer/tests/test_io.py

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,48 @@
11
from __future__ import division, print_function, absolute_import
22
import os
3-
from os.path import join as pjoin
3+
from os.path import join as pjoin, isdir
44
import getpass
55
import time
6+
import hashlib
7+
68

79
from ...tmpdirs import InTemporaryDirectory
810

911
from nose.tools import assert_true
1012
import numpy as np
11-
from numpy.testing import assert_equal
13+
from numpy.testing import assert_equal, dec
14+
15+
from .. import (read_geometry, read_morph_data, read_annot, read_label,
16+
write_geometry, write_annot)
17+
18+
from ...tests.nibabel_data import get_nibabel_data
1219

13-
from .. import read_geometry, read_morph_data, read_annot, read_label, \
14-
write_geometry, write_annot
1520

21+
DATA_SDIR = 'fsaverage'
1622

17-
have_freesurfer = True
18-
if 'SUBJECTS_DIR' not in os.environ:
19-
# Test suite relies on the definition of SUBJECTS_DIR
20-
have_freesurfer = False
23+
have_freesurfer = False
24+
if 'SUBJECTS_DIR' in os.environ:
25+
# May have Freesurfer installed with data
26+
data_path = pjoin(os.environ["SUBJECTS_DIR"], DATA_SDIR)
27+
have_freesurfer = isdir(data_path)
28+
else:
29+
# May have nibabel test data submodule checked out
30+
nib_data = get_nibabel_data()
31+
if nib_data != '':
32+
data_path = pjoin(nib_data, 'nitest-freesurfer', DATA_SDIR)
33+
have_freesurfer = isdir(data_path)
2134

22-
freesurfer_test = np.testing.dec.skipif(not have_freesurfer,
23-
'SUBJECTS_DIR not set')
35+
freesurfer_test = dec.skipif(
36+
not have_freesurfer,
37+
'cannot find freesurfer {0} directory'.format(DATA_SDIR))
2438

25-
if have_freesurfer:
26-
subj_dir = os.environ["SUBJECTS_DIR"]
27-
subject_id = 'fsaverage'
28-
data_path = pjoin(subj_dir, subject_id)
39+
40+
def _hash_file_content(fname):
41+
hasher = hashlib.md5()
42+
with open(fname, 'rb') as afile:
43+
buf = afile.read()
44+
hasher.update(buf)
45+
return hasher.hexdigest()
2946

3047

3148
@freesurfer_test
@@ -83,6 +100,8 @@ def test_annot():
83100
annots = ['aparc', 'aparc.a2005s']
84101
for a in annots:
85102
annot_path = pjoin(data_path, "label", "%s.%s.annot" % ("lh", a))
103+
hash_ = _hash_file_content(annot_path)
104+
86105
labels, ctab, names = read_annot(annot_path)
87106
assert_true(labels.shape == (163842, ))
88107
assert_true(ctab.shape == (len(names), 5))
@@ -91,7 +110,14 @@ def test_annot():
91110
if a == 'aparc':
92111
labels_orig, _, _ = read_annot(annot_path, orig_ids=True)
93112
np.testing.assert_array_equal(labels == -1, labels_orig == 0)
94-
assert_true(np.sum(labels_orig == 0) > 0)
113+
# Handle different version of fsaverage
114+
if hash_ == 'bf0b488994657435cdddac5f107d21e8':
115+
assert_true(np.sum(labels_orig == 0) == 13887)
116+
elif hash_ == 'd4f5b7cbc2ed363ac6fcf89e19353504':
117+
assert_true(np.sum(labels_orig == 1639705) == 13327)
118+
else:
119+
raise RuntimeError("Unknown freesurfer file. Please report "
120+
"the problem to the maintainer of nibabel.")
95121

96122
# Test equivalence of freesurfer- and nibabel-generated annot files
97123
# with respect to read_annot()

0 commit comments

Comments
 (0)