Skip to content

Commit f651b07

Browse files
TEST: create most CIFTI file types from scratch and read them back in
1 parent 3ced10a commit f651b07

File tree

1 file changed

+385
-0
lines changed

1 file changed

+385
-0
lines changed
Lines changed: 385 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,385 @@
1+
"""Tests the generation of new CIFTI2 files from scratch
2+
3+
Contains a series of functions to create and check each of the 5 CIFTI index types
4+
(i.e. BRAIN_MODELS, PARCELS, SCALARS, LABELS, and SERIES).
5+
6+
These functions are used in the tests to generate most CIFTI file types from scratch.
7+
"""
8+
import numpy as np
9+
10+
from nibabel import cifti2 as ci
11+
from nibabel.tmpdirs import InTemporaryDirectory
12+
13+
from nose.tools import assert_true, assert_equal
14+
15+
affine = [[-1.5, 0, 0, 90],
16+
[0, 1.5, 0, -85],
17+
[0, 0, 1.5, -71]]
18+
19+
dimensions = (120, 83, 78)
20+
21+
number_of_vertices = 30000
22+
23+
brain_models = [('CIFTI_STRUCTURE_THALAMUS_LEFT', [[60, 60, 60],
24+
[61, 59, 60],
25+
[61, 60, 59],
26+
[80, 90, 92]]),
27+
('CIFTI_STRUCTURE_CORTEX_LEFT', [0, 1000, 1301, 19972, 27312])]
28+
29+
30+
def create_geometry_map(applies_to_matrix_dimension):
31+
voxels = ci.Cifti2VoxelIndicesIJK(brain_models[0][1])
32+
left_thalamus= ci.Cifti2BrainModel(index_offset=0, index_count=4, model_type='CIFTI_MODEL_TYPE_VOXELS',
33+
brain_structure=brain_models[0][0], voxel_indices_ijk=voxels)
34+
vertices = ci.Cifti2VertexIndices(np.array(brain_models[1][1]))
35+
left_cortex = ci.Cifti2BrainModel(index_offset=4, index_count=5, model_type='CIFTI_MODEL_TYPE_SURFACE',
36+
brain_structure=brain_models[1][0], vertex_indices=vertices)
37+
return ci.Cifti2MatrixIndicesMap(applies_to_matrix_dimension, 'CIFTI_INDEX_TYPE_BRAIN_MODELS',
38+
maps=[left_thalamus, left_cortex])
39+
40+
41+
def check_geometry_map(mapping):
42+
assert_equal(mapping.indices_map_to_data_type, 'CIFTI_INDEX_TYPE_BRAIN_MODELS')
43+
assert_equal(len(list(mapping.brain_models)), 2)
44+
left_thalamus, left_cortex = mapping.brain_models
45+
46+
assert_equal(left_thalamus.index_offset, 0)
47+
assert_equal(left_thalamus.index_count, 4)
48+
assert_equal(left_thalamus.model_type, 'CIFTI_MODEL_TYPE_VOXELS')
49+
assert_equal(left_thalamus.brain_structure, brain_models[0][0])
50+
assert_equal(left_thalamus.vertex_indices, None)
51+
assert_equal(left_thalamus.voxel_indices_ijk._indices, brain_models[0][1])
52+
53+
assert_equal(left_cortex.index_offset, 4)
54+
assert_equal(left_cortex.index_count, 5)
55+
assert_equal(left_cortex.model_type, 'CIFTI_MODEL_TYPE_SURFACE')
56+
assert_equal(left_cortex.brain_structure, brain_models[1][0])
57+
assert_equal(left_cortex.voxel_indices_ijk, None)
58+
assert_equal(left_cortex.vertex_indices._indices, brain_models[1][1])
59+
60+
61+
parcels = [('volume_parcel', ([[60, 60, 60],
62+
[61, 59, 60],
63+
[61, 60, 59],
64+
[80, 90, 92]], )),
65+
('surface_parcel', (('CIFTI_STRUCTURE_CORTEX_LEFT', [0, 1000, 1301, 19972, 27312]),
66+
('CIFTI_STRUCTURE_CORTEX_RIGHT', [0, 100, 381]))),
67+
('mixed_parcel', ([[71, 81, 39],
68+
[53, 21, 91]],
69+
('CIFTI_STRUCTURE_CORTEX_LEFT', [71, 88, 999])))]
70+
71+
72+
def create_parcel_map(applies_to_matrix_dimension):
73+
mapping = ci.Cifti2MatrixIndicesMap(applies_to_matrix_dimension, 'CIFTI_INDEX_TYPE_PARCELS')
74+
for name, elements in parcels:
75+
surfaces = []
76+
volume = None
77+
for element in elements:
78+
if isinstance(element[0], str):
79+
surfaces.append(ci.Cifti2Vertices(element[0], element[1]))
80+
else:
81+
volume = ci.Cifti2VoxelIndicesIJK(element)
82+
mapping.append(ci.Cifti2Parcel(name, volume, surfaces))
83+
return mapping
84+
85+
86+
def check_parcel_map(mapping):
87+
assert_equal(mapping.indices_map_to_data_type, 'CIFTI_INDEX_TYPE_PARCELS')
88+
assert_equal(len(list(mapping.parcels)), 3)
89+
for (name, elements), parcel in zip(parcels, mapping.parcels):
90+
assert_equal(parcel.name, name)
91+
idx_surface = 0
92+
for element in elements:
93+
if isinstance(element[0], str):
94+
surface = parcel.vertices[idx_surface]
95+
assert_equal(surface.brain_structure, element[0])
96+
assert_equal(surface._vertices, element[1])
97+
idx_surface += 1
98+
else:
99+
assert_equal(parcel.voxel_indices_ijk._indices, element)
100+
101+
scalars = [('first_name', {'meta_key': 'some_metadata'}),
102+
('another name', {})]
103+
104+
def create_scalar_map(applies_to_matrix_dimension):
105+
maps = [ci.Cifti2NamedMap(name, ci.Cifti2MetaData(meta)) for name, meta in scalars]
106+
return ci.Cifti2MatrixIndicesMap(applies_to_matrix_dimension, 'CIFTI_INDEX_TYPE_SCALARS',
107+
maps=maps)
108+
109+
def check_scalar_map(mapping):
110+
assert_equal(mapping.indices_map_to_data_type, 'CIFTI_INDEX_TYPE_SCALARS')
111+
assert_equal(len(list(mapping.named_maps)), 2)
112+
113+
for expected, named_map in zip(scalars, mapping.named_maps):
114+
assert_equal(named_map.map_name, expected[0])
115+
if len(expected[1]) == 0:
116+
assert_equal(named_map.metadata, None)
117+
else:
118+
assert_equal(named_map.metadata, expected[1])
119+
120+
121+
labels = [('first_name', {'meta_key': 'some_metadata'}, {0: ('label0', (0.1, 0.3, 0.2, 0.5)),
122+
1: ('new_label', (0.5, 0.3, 0.1, 0.4))}),
123+
('another name', {}, {0: ('???', (0, 0, 0, 0)),
124+
1: ('great region', (0.4, 0.1, 0.23, 0.15))})]
125+
126+
127+
def create_label_map(applies_to_matrix_dimension):
128+
maps = []
129+
for name, meta, label in labels:
130+
label_table = ci.Cifti2LabelTable()
131+
for key, (tag, rgba) in label.items():
132+
label_table[key] = ci.Cifti2Label(key, tag, *rgba)
133+
maps.append(ci.Cifti2NamedMap(name, ci.Cifti2MetaData(meta), label_table))
134+
return ci.Cifti2MatrixIndicesMap(applies_to_matrix_dimension, 'CIFTI_INDEX_TYPE_LABELS',
135+
maps=maps)
136+
137+
def check_label_map(mapping):
138+
assert_equal(mapping.indices_map_to_data_type, 'CIFTI_INDEX_TYPE_LABELS')
139+
assert_equal(len(list(mapping.named_maps)), 2)
140+
141+
for expected, named_map in zip(scalars, mapping.named_maps):
142+
assert_equal(named_map.map_name, expected[0])
143+
if len(expected[1]) == 0:
144+
assert_equal(named_map.metadata, None)
145+
else:
146+
assert_equal(named_map.metadata, expected[1])
147+
148+
149+
def create_series_map(applies_to_matrix_dimension):
150+
return ci.Cifti2MatrixIndicesMap(applies_to_matrix_dimension, 'CIFTI_INDEX_TYPE_SERIES',
151+
number_of_series_points=13, series_exponent=-3, series_start=18.2,
152+
series_step=10.5, series_unit='SECOND')
153+
154+
155+
def check_series_map(mapping):
156+
assert_equal(mapping.indices_map_to_data_type, 'CIFTI_INDEX_TYPE_SERIES')
157+
assert_equal(mapping.number_of_series_points, 13)
158+
assert_equal(mapping.series_exponent, -3)
159+
assert_equal(mapping.series_start, 18.2)
160+
assert_equal(mapping.series_step, 10.5)
161+
assert_equal(mapping.series_unit, 'SECOND')
162+
163+
164+
def test_dtseries():
165+
series_map = create_series_map((0, ))
166+
geometry_map = create_geometry_map((1, ))
167+
matrix = ci.Cifti2Matrix()
168+
matrix.append(series_map)
169+
matrix.append(geometry_map)
170+
hdr = ci.Cifti2Header(matrix)
171+
data = np.random.randn(13, 9)
172+
img = ci.Cifti2Image(data, hdr)
173+
174+
with InTemporaryDirectory():
175+
ci.save(img, 'test.dtseries.nii')
176+
img2 = ci.load('test.dtseries.nii')
177+
assert_true((img2.get_data() == data).all())
178+
check_series_map(img2.header.matrix.get_index_map(0))
179+
check_geometry_map(img2.header.matrix.get_index_map(1))
180+
181+
182+
def test_dscalar():
183+
scalar_map = create_scalar_map((0, ))
184+
geometry_map = create_geometry_map((1, ))
185+
matrix = ci.Cifti2Matrix()
186+
matrix.append(scalar_map)
187+
matrix.append(geometry_map)
188+
hdr = ci.Cifti2Header(matrix)
189+
data = np.random.randn(2, 9)
190+
img = ci.Cifti2Image(data, hdr)
191+
192+
with InTemporaryDirectory():
193+
ci.save(img, 'test.dscalar.nii')
194+
img2 = ci.load('test.dscalar.nii')
195+
assert_true((img2.get_data() == data).all())
196+
check_scalar_map(img2.header.matrix.get_index_map(0))
197+
check_geometry_map(img2.header.matrix.get_index_map(1))
198+
199+
200+
def test_dlabel():
201+
label_map = create_label_map((0, ))
202+
geometry_map = create_geometry_map((1, ))
203+
matrix = ci.Cifti2Matrix()
204+
matrix.append(label_map)
205+
matrix.append(geometry_map)
206+
hdr = ci.Cifti2Header(matrix)
207+
data = np.random.randn(2, 9)
208+
img = ci.Cifti2Image(data, hdr)
209+
210+
with InTemporaryDirectory():
211+
ci.save(img, 'test.dlabel.nii')
212+
img2 = ci.load('test.dlabel.nii')
213+
assert_true((img2.get_data() == data).all())
214+
check_label_map(img2.header.matrix.get_index_map(0))
215+
check_geometry_map(img2.header.matrix.get_index_map(1))
216+
217+
218+
def test_dconn():
219+
mapping = create_geometry_map((0, 1))
220+
matrix = ci.Cifti2Matrix()
221+
matrix.append(mapping)
222+
hdr = ci.Cifti2Header(matrix)
223+
data = np.random.randn(9, 9)
224+
img = ci.Cifti2Image(data, hdr)
225+
226+
with InTemporaryDirectory():
227+
ci.save(img, 'test.dconn.nii')
228+
img2 = ci.load('test.dconn.nii')
229+
assert_true((img2.get_data() == data).all())
230+
assert_equal(img2.header.matrix.get_index_map(0),
231+
img2.header.matrix.get_index_map(1))
232+
233+
check_geometry_map(img2.header.matrix.get_index_map(0))
234+
235+
236+
def test_ptseries():
237+
series_map = create_series_map((0, ))
238+
parcel_map = create_parcel_map((1, ))
239+
matrix = ci.Cifti2Matrix()
240+
matrix.append(series_map)
241+
matrix.append(parcel_map)
242+
hdr = ci.Cifti2Header(matrix)
243+
data = np.random.randn(13, 3)
244+
img = ci.Cifti2Image(data, hdr)
245+
246+
with InTemporaryDirectory():
247+
ci.save(img, 'test.ptseries.nii')
248+
img2 = ci.load('test.ptseries.nii')
249+
assert_true((img2.get_data() == data).all())
250+
check_series_map(img2.header.matrix.get_index_map(0))
251+
check_parcel_map(img2.header.matrix.get_index_map(1))
252+
253+
254+
def test_pscalar():
255+
scalar_map = create_scalar_map((0, ))
256+
parcel_map = create_parcel_map((1, ))
257+
matrix = ci.Cifti2Matrix()
258+
matrix.append(scalar_map)
259+
matrix.append(parcel_map)
260+
hdr = ci.Cifti2Header(matrix)
261+
data = np.random.randn(2, 3)
262+
img = ci.Cifti2Image(data, hdr)
263+
264+
with InTemporaryDirectory():
265+
ci.save(img, 'test.pscalar.nii')
266+
img2 = ci.load('test.pscalar.nii')
267+
assert_true((img2.get_data() == data).all())
268+
check_scalar_map(img2.header.matrix.get_index_map(0))
269+
check_parcel_map(img2.header.matrix.get_index_map(1))
270+
271+
272+
def test_pdconn():
273+
geometry_map = create_geometry_map((0, ))
274+
parcel_map = create_parcel_map((1, ))
275+
matrix = ci.Cifti2Matrix()
276+
matrix.append(geometry_map)
277+
matrix.append(parcel_map)
278+
hdr = ci.Cifti2Header(matrix)
279+
data = np.random.randn(2, 3)
280+
img = ci.Cifti2Image(data, hdr)
281+
282+
with InTemporaryDirectory():
283+
ci.save(img, 'test.pdconn.nii')
284+
img2 = ci.load('test.pdconn.nii')
285+
assert_true((img2.get_data() == data).all())
286+
check_geometry_map(img2.header.matrix.get_index_map(0))
287+
check_parcel_map(img2.header.matrix.get_index_map(1))
288+
289+
290+
def test_dpconn():
291+
parcel_map = create_parcel_map((0, ))
292+
geometry_map = create_geometry_map((1, ))
293+
matrix = ci.Cifti2Matrix()
294+
matrix.append(parcel_map)
295+
matrix.append(geometry_map)
296+
hdr = ci.Cifti2Header(matrix)
297+
data = np.random.randn(2, 3)
298+
img = ci.Cifti2Image(data, hdr)
299+
300+
with InTemporaryDirectory():
301+
ci.save(img, 'test.dpconn.nii')
302+
img2 = ci.load('test.dpconn.nii')
303+
assert_true((img2.get_data() == data).all())
304+
check_parcel_map(img2.header.matrix.get_index_map(0))
305+
check_geometry_map(img2.header.matrix.get_index_map(1))
306+
307+
308+
def test_plabel():
309+
label_map = create_label_map((0, ))
310+
parcel_map = create_parcel_map((1, ))
311+
matrix = ci.Cifti2Matrix()
312+
matrix.append(label_map)
313+
matrix.append(parcel_map)
314+
hdr = ci.Cifti2Header(matrix)
315+
data = np.random.randn(2, 3)
316+
img = ci.Cifti2Image(data, hdr)
317+
318+
with InTemporaryDirectory():
319+
ci.save(img, 'test.plabel.nii')
320+
img2 = ci.load('test.plabel.nii')
321+
assert_true((img2.get_data() == data).all())
322+
check_label_map(img2.header.matrix.get_index_map(0))
323+
check_parcel_map(img2.header.matrix.get_index_map(1))
324+
325+
326+
def test_pconn():
327+
mapping = create_parcel_map((0, 1))
328+
matrix = ci.Cifti2Matrix()
329+
matrix.append(mapping)
330+
hdr = ci.Cifti2Header(matrix)
331+
data = np.random.randn(3, 3)
332+
img = ci.Cifti2Image(data, hdr)
333+
334+
with InTemporaryDirectory():
335+
ci.save(img, 'test.pconn.nii')
336+
img2 = ci.load('test.pconn.nii')
337+
assert_true((img2.get_data() == data).all())
338+
assert_equal(img2.header.matrix.get_index_map(0),
339+
img2.header.matrix.get_index_map(1))
340+
341+
check_parcel_map(img2.header.matrix.get_index_map(0))
342+
343+
344+
def test_pconnseries():
345+
parcel_map = create_parcel_map((0, 1))
346+
series_map = create_series_map((2, ))
347+
348+
matrix = ci.Cifti2Matrix()
349+
matrix.append(parcel_map)
350+
matrix.append(series_map)
351+
hdr = ci.Cifti2Header(matrix)
352+
data = np.random.randn(3, 3, 13)
353+
img = ci.Cifti2Image(data, hdr)
354+
355+
with InTemporaryDirectory():
356+
ci.save(img, 'test.pconnseries.nii')
357+
img2 = ci.load('test.pconnseries.nii')
358+
assert_true((img2.get_data() == data).all())
359+
assert_equal(img2.header.matrix.get_index_map(0),
360+
img2.header.matrix.get_index_map(1))
361+
362+
check_parcel_map(img2.header.matrix.get_index_map(0))
363+
check_series_map(img2.header.matrix.get_index_map(2))
364+
365+
366+
def test_pconnscalar():
367+
parcel_map = create_parcel_map((0, 1))
368+
scalar_map = create_scalar_map((2, ))
369+
370+
matrix = ci.Cifti2Matrix()
371+
matrix.append(parcel_map)
372+
matrix.append(scalar_map)
373+
hdr = ci.Cifti2Header(matrix)
374+
data = np.random.randn(3, 3, 13)
375+
img = ci.Cifti2Image(data, hdr)
376+
377+
with InTemporaryDirectory():
378+
ci.save(img, 'test.pconnscalar.nii')
379+
img2 = ci.load('test.pconnscalar.nii')
380+
assert_true((img2.get_data() == data).all())
381+
assert_equal(img2.header.matrix.get_index_map(0),
382+
img2.header.matrix.get_index_map(1))
383+
384+
check_parcel_map(img2.header.matrix.get_index_map(0))
385+
check_scalar_map(img2.header.matrix.get_index_map(2))

0 commit comments

Comments
 (0)