def test_er_nifti_dataset_mapping(): """Some mapping testing -- more tests is better """ # z,y,x sample_size = (4, 3, 2) # t,z,y,x samples = np.arange(120).reshape((5, ) + sample_size) dsmask = np.arange(24).reshape(sample_size) % 2 if externals.exists('nibabel'): import nibabel tds = fmri_dataset(nibabel.Nifti1Image(samples.T, None), mask=nibabel.Nifti1Image(dsmask.T, None)) else: import nifti tds = fmri_dataset(nifti.NiftiImage(samples), mask=nifti.NiftiImage(dsmask)) ds = eventrelated_dataset(tds, events=[ Event(onset=0, duration=2, label=1, chunk=1, features=[1000, 1001]), Event(onset=1, duration=2, label=2, chunk=1, features=[2000, 2001]) ]) nfeatures = tds.nfeatures mask = np.zeros(dsmask.shape, dtype='bool') mask[0, 0, 0] = mask[1, 0, 1] = mask[0, 0, 1] = 1 fmask = ds.a.mapper.forward1(mask.T) # select using mask in volume and all features in the other part ds_sel = ds[:, fmask] # now tests assert_array_equal(mask.reshape(24).nonzero()[0], [0, 1, 7]) # two events, 2 orig features at 2 timepoints assert_equal(ds_sel.samples.shape, (2, 4)) assert_array_equal(ds_sel.sa.features, [[1000, 1001], [2000, 2001]]) assert_array_equal(ds_sel.samples, [[1, 7, 25, 31], [25, 31, 49, 55]]) # reproducability assert_array_equal(ds_sel.samples, ds_sel.a.mapper.forward(np.rollaxis(samples.T, -1))) # reverse-mapping rmapped = ds_sel.a.mapper.reverse1(np.arange(10, 14)) assert_equal(np.rollaxis(rmapped, 0, 4).T.shape, (2, ) + sample_size) expected = np.zeros((2, ) + sample_size, dtype='int') expected[0, 0, 0, 1] = 10 expected[0, 1, 0, 1] = 11 expected[1, 0, 0, 1] = 12 expected[1, 1, 0, 1] = 13 assert_array_equal(np.rollaxis(rmapped, 0, 4).T, expected)
def test_er_nifti_dataset_mapping(): """Some mapping testing -- more tests is better """ # z,y,x sample_size = (4, 3, 2) # t,z,y,x samples = np.arange(120).reshape((5,) + sample_size) dsmask = np.arange(24).reshape(sample_size) % 2 if externals.exists('nibabel'): import nibabel tds = fmri_dataset(nibabel.Nifti1Image(samples.T, None), mask=nibabel.Nifti1Image(dsmask.T, None)) else: import nifti tds = fmri_dataset(nifti.NiftiImage(samples), mask=nifti.NiftiImage(dsmask)) ds = eventrelated_dataset( tds, events=[Event(onset=0, duration=2, label=1, chunk=1, features=[1000, 1001]), Event(onset=1, duration=2, label=2, chunk=1, features=[2000, 2001])]) nfeatures = tds.nfeatures mask = np.zeros(dsmask.shape, dtype='bool') mask[0, 0, 0] = mask[1, 0, 1] = mask[0, 0, 1] = 1 fmask = ds.a.mapper.forward1(mask.T) # select using mask in volume and all features in the other part ds_sel = ds[:, fmask] # now tests assert_array_equal(mask.reshape(24).nonzero()[0], [0, 1, 7]) # two events, 2 orig features at 2 timepoints assert_equal(ds_sel.samples.shape, (2, 4)) assert_array_equal(ds_sel.sa.features, [[1000, 1001], [2000, 2001]]) assert_array_equal(ds_sel.samples, [[ 1, 7, 25, 31], [ 25, 31, 49, 55]]) # reproducability assert_array_equal(ds_sel.samples, ds_sel.a.mapper.forward(np.rollaxis(samples.T, -1))) # reverse-mapping rmapped = ds_sel.a.mapper.reverse1(np.arange(10, 14)) assert_equal(np.rollaxis(rmapped, 0, 4).T.shape, (2,) + sample_size) expected = np.zeros((2,)+sample_size, dtype='int') expected[0,0,0,1] = 10 expected[0,1,0,1] = 11 expected[1,0,0,1] = 12 expected[1,1,0,1] = 13 assert_array_equal(np.rollaxis(rmapped, 0, 4).T, expected)
def test_er_nifti_dataset(): # setup data sources tssrc = os.path.join(pymvpa_dataroot, 'bold.nii.gz') evsrc = os.path.join(pymvpa_dataroot, 'fslev3.txt') masrc = os.path.join(pymvpa_dataroot, 'mask.nii.gz') evs = FslEV3(evsrc).to_events() # load timeseries ds_orig = fmri_dataset(tssrc) # segment into events ds = eventrelated_dataset(ds_orig, evs, time_attr='time_coords') # we ask for boxcars of 9s length, and the tr in the file header says 2.5s # hence we should get round(9.0/2.4) * np.prod((1,20,40) == 3200 features assert_equal(ds.nfeatures, 3200) assert_equal(len(ds), len(evs)) # the voxel indices are reflattened after boxcaring , but still 3D assert_equal(ds.fa.voxel_indices.shape, (ds.nfeatures, 3)) # and they have been broadcasted through all boxcars assert_array_equal(ds.fa.voxel_indices[:800], ds.fa.voxel_indices[800:1600]) # each feature got an event offset value assert_array_equal(ds.fa.event_offsetidx, np.repeat([0,1,2,3], 800)) # check for all event attributes assert_true('onset' in ds.sa) assert_true('duration' in ds.sa) assert_true('features' in ds.sa) # check samples origsamples = _load_anyimg(tssrc)[0] for i, onset in \ enumerate([value2idx(e['onset'], ds_orig.sa.time_coords, 'floor') for e in evs]): assert_array_equal(ds.samples[i], origsamples[onset:onset+4].ravel()) assert_array_equal(ds.sa.time_indices[i], np.arange(onset, onset + 4)) assert_array_equal(ds.sa.time_coords[i], np.arange(onset, onset + 4) * 2.5) for evattr in [a for a in ds.sa if a.count("event_attrs") and not a.count('event_attrs_event')]: assert_array_equal(evs[i]['_'.join(evattr.split('_')[2:])], ds.sa[evattr].value[i]) # check offset: only the last one exactly matches the tr assert_array_equal(ds.sa.orig_offset, [1, 1, 0]) # map back into voxel space, should ignore addtional features nim = map2nifti(ds) # origsamples has t,x,y,z assert_equal(nim.get_shape(), origsamples.shape[1:] + (len(ds) * 4,)) # check shape of a single sample nim = map2nifti(ds, ds.samples[0]) # pynifti image has [t,]z,y,x assert_equal(nim.get_shape(), (40, 20, 1, 4)) # and now with masking ds = fmri_dataset(tssrc, mask=masrc) ds = eventrelated_dataset(ds, evs, time_attr='time_coords') nnonzero = len(_load_anyimg(masrc)[0].nonzero()[0]) assert_equal(nnonzero, 530) # we ask for boxcars of 9s length, and the tr in the file header says 2.5s # hence we should get round(9.0/2.4) * np.prod((1,20,40) == 3200 features assert_equal(ds.nfeatures, 4 * 530) assert_equal(len(ds), len(evs)) # and they have been broadcasted through all boxcars assert_array_equal(ds.fa.voxel_indices[:nnonzero], ds.fa.voxel_indices[nnonzero:2*nnonzero])
def test_er_nifti_dataset(): # setup data sources tssrc = os.path.join(pymvpa_dataroot, 'bold.nii.gz') evsrc = os.path.join(pymvpa_dataroot, 'fslev3.txt') masrc = os.path.join(pymvpa_dataroot, 'mask.nii.gz') evs = FslEV3(evsrc).to_events() # load timeseries ds_orig = fmri_dataset(tssrc) # segment into events ds = eventrelated_dataset(ds_orig, evs, time_attr='time_coords') # we ask for boxcars of 9s length, and the tr in the file header says 2.5s # hence we should get round(9.0/2.4) * np.prod((1,20,40) == 3200 features assert_equal(ds.nfeatures, 3200) assert_equal(len(ds), len(evs)) # the voxel indices are reflattened after boxcaring , but still 3D assert_equal(ds.fa.voxel_indices.shape, (ds.nfeatures, 3)) # and they have been broadcasted through all boxcars assert_array_equal(ds.fa.voxel_indices[:800], ds.fa.voxel_indices[800:1600]) # each feature got an event offset value assert_array_equal(ds.fa.event_offsetidx, np.repeat([0, 1, 2, 3], 800)) # check for all event attributes assert_true('onset' in ds.sa) assert_true('duration' in ds.sa) assert_true('features' in ds.sa) # check samples origsamples = _load_anyimg(tssrc)[0] for i, onset in \ enumerate([value2idx(e['onset'], ds_orig.sa.time_coords, 'floor') for e in evs]): assert_array_equal(ds.samples[i], origsamples[onset:onset + 4].ravel()) assert_array_equal(ds.sa.time_indices[i], np.arange(onset, onset + 4)) assert_array_equal(ds.sa.time_coords[i], np.arange(onset, onset + 4) * 2.5) for evattr in [ a for a in ds.sa if a.count("event_attrs") and not a.count('event_attrs_event') ]: assert_array_equal(evs[i]['_'.join(evattr.split('_')[2:])], ds.sa[evattr].value[i]) # check offset: only the last one exactly matches the tr assert_array_equal(ds.sa.orig_offset, [1, 1, 0]) # map back into voxel space, should ignore addtional features nim = map2nifti(ds) if externals.exists('nibabel'): # origsamples has t,x,y,z assert_equal(nim.get_shape(), origsamples.shape[1:] + (len(ds) * 4, )) # check shape of a single sample nim = map2nifti(ds, ds.samples[0]) # pynifti image has [t,]z,y,x assert_equal(nim.get_shape(), (40, 20, 1, 4)) else: # origsamples has t,x,y,z but pynifti image has [t,]z,y,x assert_equal(nim.data.T.shape, origsamples.shape[1:] + (len(ds) * 4, )) # check shape of a single sample nim = map2nifti(ds, ds.samples[0]) # pynifti image has [t,]z,y,x assert_equal(nim.data.T.shape, (40, 20, 1, 4)) # and now with masking ds = fmri_dataset(tssrc, mask=masrc) ds = eventrelated_dataset(ds, evs, time_attr='time_coords') nnonzero = len(_load_anyimg(masrc)[0].nonzero()[0]) assert_equal(nnonzero, 530) # we ask for boxcars of 9s length, and the tr in the file header says 2.5s # hence we should get round(9.0/2.4) * np.prod((1,20,40) == 3200 features assert_equal(ds.nfeatures, 4 * 530) assert_equal(len(ds), len(evs)) # and they have been broadcasted through all boxcars assert_array_equal(ds.fa.voxel_indices[:nnonzero], ds.fa.voxel_indices[nnonzero:2 * nnonzero])
def test_erdataset(): # 3 chunks, 5 targets, blocks of 5 samples each nchunks = 3 ntargets = 5 blocklength = 5 nfeatures = 10 targets = np.tile(np.repeat(range(ntargets), blocklength), nchunks) chunks = np.repeat(np.arange(nchunks), ntargets * blocklength) samples = np.repeat( np.arange(nchunks * ntargets * blocklength), nfeatures).reshape(-1, nfeatures) ds = dataset_wizard(samples, targets=targets, chunks=chunks) # check if events are determined properly evs = find_events(targets=ds.sa.targets, chunks=ds.sa.chunks) for ev in evs: assert_equal(ev['duration'], blocklength) assert_equal(ntargets * nchunks, len(evs)) for t in range(ntargets): assert_equal(len([ev for ev in evs if ev['targets'] == t]), nchunks) # now turn `ds` into an eventreleated dataset erds = eventrelated_dataset(ds, evs) # the only unprefixed sample attributes are assert_equal(sorted([a for a in ds.sa if not a.startswith('event')]), ['chunks', 'targets']) # samples as expected? assert_array_equal(erds.samples[0], np.repeat(np.arange(blocklength), nfeatures)) # that should also be the temporal feature offset assert_array_equal(erds.samples[0], erds.fa.event_offsetidx) assert_array_equal(erds.sa.event_onsetidx, np.arange(0,71,5)) # finally we should see two mappers assert_equal(len(erds.a.mapper), 2) assert_true(isinstance(erds.a.mapper[0], BoxcarMapper)) assert_true(isinstance(erds.a.mapper[1], FlattenMapper)) # # now check the same dataset with event descretization tr = 2.5 ds.sa['time'] = np.arange(nchunks * ntargets * blocklength) * tr evs = [{'onset': 4.9, 'duration': 6.2}] # doesn't work without conversion assert_raises(ValueError, eventrelated_dataset, ds, evs) erds = eventrelated_dataset(ds, evs, time_attr='time') assert_equal(len(erds), 1) assert_array_equal(erds.samples[0], np.repeat(np.arange(1,5), nfeatures)) assert_array_equal(erds.sa.orig_onset, [evs[0]['onset']]) assert_array_equal(erds.sa.orig_duration, [evs[0]['duration']]) assert_array_almost_equal(erds.sa.orig_offset, [2.4]) assert_array_equal(erds.sa.time, [np.arange(2.5, 11, 2.5)]) # now with closest match erds = eventrelated_dataset(ds, evs, time_attr='time', match='closest') expected_nsamples = 3 assert_equal(len(erds), 1) assert_array_equal(erds.samples[0], np.repeat(np.arange(2,2+expected_nsamples), nfeatures)) assert_array_equal(erds.sa.orig_onset, [evs[0]['onset']]) assert_array_equal(erds.sa.orig_duration, [evs[0]['duration']]) assert_array_almost_equal(erds.sa.orig_offset, [-0.1]) assert_array_equal(erds.sa.time, [np.arange(5.0, 11, 2.5)]) # now test the way back results = np.arange(erds.nfeatures) assert_array_equal(erds.a.mapper.reverse1(results), results.reshape(expected_nsamples, nfeatures)) # what about multiple results? nresults = 5 results = dataset_wizard([results] * nresults) # and let's have an attribute to make it more difficult results.sa['myattr'] = np.arange(5) rds = erds.a.mapper.reverse(results) assert_array_equal(rds, results.samples.reshape(nresults * expected_nsamples, nfeatures)) assert_array_equal(rds.sa.myattr, np.repeat(results.sa.myattr, expected_nsamples))