1
2
3
4
5
6
7
8
9 """Unit tests for PyMVPA nifti dataset"""
10
11 import unittest
12 import os.path
13 import numpy as N
14
15 from mvpa import pymvpa_dataroot
16 from mvpa.datasets.nifti import *
17 from mvpa.misc.exceptions import *
18 from mvpa.misc.fsl import FslEV3
19 from mvpa.misc.support import Event
20
22 """Tests of various Nifti-based datasets
23 """
24
26 """Basic testing of NiftiDataset
27 """
28 data = NiftiDataset(samples=os.path.join(pymvpa_dataroot,'example4d'),
29 labels=[1,2])
30 self.failUnless(data.nfeatures == 294912)
31 self.failUnless(data.nsamples == 2)
32
33 self.failUnless((data.mapper.metric.elementsize \
34 == data.niftihdr['pixdim'][3:0:-1]).all())
35
36
37 nb22 = N.array([i for i in data.mapper.getNeighborIn((1, 1, 1), 2.2)])
38 nb20 = N.array([i for i in data.mapper.getNeighborIn((1, 1, 1), 2.0)])
39 self.failUnless(nb22.shape[0] == 7)
40 self.failUnless(nb20.shape[0] == 5)
41
42
43
44 self.failUnless(data.dt in [2.0, 2000.0])
45 self.failUnless(data.samplingrate in [5e-4, 5e-1])
46 merged = data + data
47
48 self.failUnless(merged.nfeatures == 294912)
49 self.failUnless(merged.nsamples == 4)
50
51
52
53 for k in merged.niftihdr.keys():
54 self.failUnless(N.mean(merged.niftihdr[k] == data.niftihdr[k]) == 1)
55
56
57 del data
58 self.failUnless(merged.samples[3, 120000] == merged.samples[1, 120000])
59
60
61 mask = N.zeros((24, 96, 128), dtype='bool')
62 mask[12, 20, 40] = True
63 nddata = NiftiDataset(samples=os.path.join(pymvpa_dataroot,'example4d'),
64 labels=[1,2],
65 mask=mask)
66 self.failUnless(nddata.nfeatures == 1)
67 rmap = nddata.mapReverse([44])
68 self.failUnless(rmap.shape == (24, 96, 128))
69 self.failUnless(N.sum(rmap) == 44)
70 self.failUnless(rmap[12, 20, 40] == 44)
71
72
74 """Basic testing of map2Nifti
75 """
76 data = NiftiDataset(samples=os.path.join(pymvpa_dataroot,'example4d'),
77 labels=[1,2])
78
79
80 vol = data.map2Nifti(N.ones((294912,), dtype='int16'))
81 self.failUnless(vol.data.shape == (24, 96, 128))
82 self.failUnless((vol.data == 1).all())
83
84
85 vol = data.map2Nifti(data)
86 self.failUnless(vol.data.shape == (2, 24, 96, 128))
87
88
106
107
126
127
129 """Basic testing of ERNiftiDataset
130 """
131 self.failUnlessRaises(DatasetError, ERNiftiDataset)
132
133
134 tssrc = os.path.join(pymvpa_dataroot, 'bold')
135 evsrc = os.path.join(pymvpa_dataroot, 'fslev3.txt')
136
137 evs = FslEV3(evsrc).toEvents()
138
139
140
141 self.failUnlessRaises(ValueError, ERNiftiDataset,
142 samples=tssrc, events=evs)
143
144
145 for ev in evs:
146 ev['label'] = 1
147
148
149
150 ds = ERNiftiDataset(samples=tssrc, events=evs)
151
152
153 self.failUnless(ds.nfeatures == 7201)
154 self.failUnless(ds.nsamples == len(evs))
155
156
157 origsamples = getNiftiFromAnySource(tssrc).data
158 for i, ev in enumerate(evs):
159 self.failUnless((ds.samples[i][:-1] \
160 == origsamples[ev['onset']:ev['onset'] + ev['duration']].ravel()
161 ).all())
162
163
164 ds = ERNiftiDataset(samples=tssrc, events=evs, evconv=True,
165 storeoffset=True)
166 self.failUnless(ds.nsamples == len(evs))
167
168
169 self.failUnless(ds.nfeatures == 3202)
170
171
172 nim = ds.map2Nifti()
173 self.failUnless(nim.data.shape == origsamples.shape)
174
175 nim = ds.map2Nifti(ds.samples[0])
176 self.failUnless(nim.data.shape == (4, 1, 20, 40))
177
178
180 """Some mapping testing -- more tests is better
181 """
182 sample_size = (4, 3, 2)
183 samples = N.arange(120).reshape((5,) + sample_size)
184 dsmask = N.arange(24).reshape(sample_size)%2
185 ds = ERNiftiDataset(samples=NiftiImage(samples),
186 events=[Event(onset=0, duration=2, label=1,
187 chunk=1, features=[1000, 1001]),
188 Event(onset=1, duration=2, label=2,
189 chunk=1, features=[2000, 2001])],
190 mask=dsmask)
191 nfeatures = ds.mapper._mappers[1].getInSize()
192 mask = N.zeros(sample_size)
193 mask[0, 0, 0] = mask[1, 0, 1] = mask[0, 0, 1] = 1
194
195
196
197
198
199 ds_sel = ds.selectFeatures(
200 ds.mapper.forward([mask, [1]*nfeatures]).nonzero()[0])
201
202
203 self.failUnless((mask.reshape(24).nonzero()[0] == [0, 1, 7]).all())
204 self.failUnless(ds_sel.samples.shape == (2, 6),
205 msg="We should have selected all samples, and 6 "
206 "features (2 voxels at 2 timepoints + 2 features). "
207 "Got %s" % (ds_sel.samples.shape,))
208 self.failUnless((ds_sel.samples[:, -2:] ==
209 [[1000, 1001], [2000, 2001]]).all(),
210 msg="We should have selected additional features "
211 "correctly. Got %s" % ds_sel.samples[:, -2:])
212 self.failUnless((ds_sel.samples[:, :-2] ==
213 [[ 1, 7, 25, 31],
214 [ 25, 31, 49, 55]]).all(),
215 msg="We should have selected original features "
216 "correctly. Got %s" % ds_sel.samples[:, :-2])
217
218
220 """Test NiftiDataset based on 3D volume(s)
221 """
222 tssrc = os.path.join(pymvpa_dataroot, 'bold')
223 masrc = os.path.join(pymvpa_dataroot, 'mask')
224
225
226
227
228 self.failUnlessRaises(Exception, NiftiDataset,
229 masrc, mask=masrc, labels=1, enforce4D=False)
230
231 ds = NiftiDataset(masrc, mask=masrc, labels=1)
232
233 plain_data = NiftiImage(masrc).data
234
235 self.failUnless(N.all(plain_data == \
236 ds.map2Nifti().data.reshape(plain_data.shape)))
237
238
239
240
241 self.failUnlessRaises(ValueError, NiftiDataset, (masrc, tssrc),
242 mask=masrc, labels=1)
243
244
245 dsfull = NiftiDataset(tssrc, mask=masrc, labels=1)
246 ds_selected = dsfull['samples', [3]]
247 nifti_selected = ds_selected.map2Nifti()
248
249
250
251 labels = [123, 2, 123]
252 ds2 = NiftiDataset((masrc, masrc, nifti_selected),
253 mask=masrc, labels=labels)
254 self.failUnless(ds2.nsamples == 3)
255 self.failUnless((ds2.samples[0] == ds2.samples[1]).all())
256 self.failUnless((ds2.samples[2] == dsfull.samples[3]).all())
257 self.failUnless((ds2.labels == labels).all())
258
260 """Test if we could request neighbors within spherical ROI whenever
261 center is outside of the mask
262 """
263
264
265 mask_roi = N.zeros((24, 96, 128), dtype='bool')
266 mask_roi[12, 20, 38:42] = True
267 mask_roi[23, 20, 38:42] = True
268 ds_full = NiftiDataset(samples=os.path.join(pymvpa_dataroot,'example4d'),
269 labels=[1,2])
270 ds_roi = NiftiDataset(samples=os.path.join(pymvpa_dataroot,'example4d'),
271 labels=[1,2], mask=mask_roi)
272
273 ids_roi = ds_roi.mapper.getNeighbors(ds_roi.mapper.getOutId((12, 20, 40)),
274 radius=20)
275 self.failUnless(len(ids_roi) == 4)
276
277
278 self.failUnlessRaises(ValueError, ds_roi.mapper.getOutId, (12, 20, 37))
279
280
281 ids_out = []
282 for id_in in ds_full.mapper.getNeighborIn( (12, 20, 37), radius=20):
283 try:
284 ids_out.append(ds_roi.mapper.getOutId(id_in))
285 except ValueError:
286 pass
287 self.failUnless(ids_out == ids_roi)
288
289
292
293
294 if __name__ == '__main__':
295 import runner
296