def test_gifti_dataset_with_anatomical_surface(fn, format_, include_nodes): ds = _get_test_dataset(include_nodes) nsamples, nfeatures = ds.shape vertices = np.random.normal(size=(nfeatures, 3)) faces = np.asarray([i + np.arange(3) for i in range(2 * nfeatures)]) % nfeatures surf = Surface(vertices, faces) img = map2gifti(ds, surface=surf) arr_index = 0 if include_nodes: # check node indices node_arr = img.darrays[arr_index] assert_equal(node_arr.intent, intent_codes.code['NIFTI_INTENT_NODE_INDEX']) assert_equal(node_arr.coordsys, None) assert_equal(node_arr.data.dtype, np.int32) assert_equal(node_arr.datatype, data_type_codes['int32']) arr_index += 1 for sample in ds.samples: # check sample content arr = img.darrays[arr_index] data = arr.data assert_almost_equal(data, sample) assert_equal(arr.coordsys, None) assert_equal(arr.data.dtype, np.float32) assert_equal(arr.datatype, data_type_codes['float32']) arr_index += 1 # check vertices vertex_arr = img.darrays[arr_index] assert_almost_equal(vertex_arr.data, vertices) assert_equal(vertex_arr.data.dtype, np.float32) assert_equal(vertex_arr.datatype, data_type_codes['float32']) # check faces arr_index += 1 face_arr = img.darrays[arr_index] assert_almost_equal(face_arr.data, faces) assert_equal(face_arr.data.dtype, np.int32) assert_equal(face_arr.datatype, data_type_codes['int32']) # getting the functional data should ignore faces and vertices ds_again = gifti_dataset(img) assert_datasets_almost_equal(ds, ds_again)
def test_gifti_dataset_with_anatomical_surface(fn, format_, include_nodes): ds = _get_test_dataset(include_nodes) nsamples, nfeatures = ds.shape vertices = np.random.normal(size=(nfeatures, 3)) faces = np.asarray([i + np.arange(3) for i in xrange(2 * nfeatures)]) % nfeatures surf = Surface(vertices, faces) img = map2gifti(ds, surface=surf) arr_index = 0 if include_nodes: # check node indices node_arr = img.darrays[arr_index] assert_equal(node_arr.intent, intent_codes.code['NIFTI_INTENT_NODE_INDEX']) assert_equal(node_arr.coordsys, None) assert_equal(node_arr.data.dtype, np.int32) assert_equal(node_arr.datatype, data_type_codes['int32']) arr_index += 1 for sample in ds.samples: # check sample content arr = img.darrays[arr_index] data = arr.data assert_almost_equal(data, sample) assert_equal(arr.coordsys, None) assert_equal(arr.data.dtype, np.float32) assert_equal(arr.datatype, data_type_codes['float32']) arr_index += 1 # check vertices vertex_arr = img.darrays[arr_index] assert_almost_equal(vertex_arr.data, vertices) assert_equal(vertex_arr.data.dtype, np.float32) assert_equal(vertex_arr.datatype, data_type_codes['float32']) # check faces arr_index += 1 face_arr = img.darrays[arr_index] assert_almost_equal(face_arr.data, faces) assert_equal(face_arr.data.dtype, np.int32) assert_equal(face_arr.datatype, data_type_codes['int32']) # getting the functional data should ignore faces and vertices ds_again = gifti_dataset(img) assert_datasets_almost_equal(ds, ds_again)
def test_gifti_dataset(fn, format_, include_nodes): expected_ds = _get_test_dataset(include_nodes) expected_ds_sa = expected_ds.copy(deep=True) expected_ds_sa.sa['chunks'] = [4, 3, 2, 1, 3, 2] expected_ds_sa.sa['targets'] = ['t%d' % i for i in xrange(6)] # build GIFTI file from scratch gifti_string = _build_gifti_string(format_, include_nodes) with open(fn, 'w') as f: f.write(gifti_string) # reading GIFTI file ds = gifti_dataset(fn) assert_datasets_almost_equal(ds, expected_ds) # test GiftiImage input img = nb_giftiio.read(fn) ds2 = gifti_dataset(img) assert_datasets_almost_equal(ds2, expected_ds) # test using Nibabel's output from write nb_giftiio.write(img, fn) ds3 = gifti_dataset(fn) assert_datasets_almost_equal(ds3, expected_ds) # test targets and chunks arguments ds3_sa = gifti_dataset(fn, targets=expected_ds_sa.targets, chunks=expected_ds_sa.chunks) assert_datasets_almost_equal(ds3_sa, expected_ds_sa) # test map2gifti img2 = map2gifti(ds) ds4 = gifti_dataset(img2) assert_datasets_almost_equal(ds4, expected_ds) # test float64 and int64, which must be converted to float32 and int32 fa = dict() if include_nodes: fa['node_indices'] = ds.fa.node_indices.astype(np.int64) ds_float64 = Dataset(samples=ds.samples.astype(np.float64), fa=fa) ds_float64_again = gifti_dataset(map2gifti(ds_float64)) assert_equal(ds_float64_again.samples.dtype, np.float32) if include_nodes: assert_equal(ds_float64_again.fa.node_indices.dtype, np.int32) # test contents of GIFTI image assert (isinstance(img2, nb_gifti.GiftiImage)) nsamples = ds.samples.shape[0] if include_nodes: node_arr = img2.darrays[0] assert_equal(node_arr.intent, intent_codes.code['NIFTI_INTENT_NODE_INDEX']) assert_equal(node_arr.coordsys, None) assert_equal(node_arr.data.dtype, np.int32) assert_equal(node_arr.datatype, data_type_codes['int32']) first_data_array_pos = 1 narrays = nsamples + 1 else: first_data_array_pos = 0 narrays = nsamples assert_equal(len(img.darrays), narrays) for i in xrange(nsamples): arr = img2.darrays[i + first_data_array_pos] # check intent code illegal_intents = ['NIFTI_INTENT_NODE_INDEX', 'NIFTI_INTENT_GENMATRIX', 'NIFTI_INTENT_POINTSET', 'NIFTI_INTENT_TRIANGLE'] assert (arr.intent not in [intent_codes.code[s] for s in illegal_intents]) # although the GIFTI standard is not very clear about whether # arrays with other intent than NODE_INDEX can have a # GiftiCoordSystem, FreeSurfer's mris_convert # does not seem to like its presence. Thus we make sure that # it's not there. assert_equal(arr.coordsys, None) assert_equal(arr.data.dtype, np.float32) assert_equal(arr.datatype, data_type_codes['float32']) # another test for map2gifti, setting the encoding explicitly map2gifti(ds, fn, encoding=format_) ds5 = gifti_dataset(fn) assert_datasets_almost_equal(ds5, expected_ds) # test map2gifti with array input; nodes are not stored map2gifti(ds.samples, fn) ds6 = gifti_dataset(fn) if include_nodes: assert_raises(AssertionError, assert_datasets_almost_equal, ds6, expected_ds) else: assert_datasets_almost_equal(ds6, expected_ds) assert_raises(TypeError, gifti_dataset, ds3_sa) assert_raises(TypeError, map2gifti, img, fn)
def test_assert_datasets_almost_equal(digits, attribute): samples = np.random.standard_normal((2, 5)) args = dict(sa=dict(targets=np.asarray([1., 2])), fa=dict(ids=np.asarray([0., 1, 2, 3, 4])), a=dict(a_value=[66])) ds = Dataset(samples=samples, **args) def negate_assert(f): def raiser(*args, **kwargs): assert_raises(AssertionError, f, *args, **kwargs) return raiser assert_datasets_not_almost_equal = negate_assert( assert_datasets_almost_equal) assert_datasets_not_equal = negate_assert(assert_datasets_equal) def change_attribute(name, how_much): # change a single attribute in samples, a, fa, or sa. ds2 = ds.copy(deep=True) attr = ds2.__dict__[name] if name == 'samples': value = attr else: for key in attr: break value = attr[key].value value[0] += how_much return ds2 def remove_attribute(name): ds2 = ds.copy(deep=True) attr = ds2.__dict__[name] for key in list(attr.keys()): attr.pop(key) return ds2 if digits is None: ds2 = change_attribute(attribute, 0) assert_datasets_equal(ds, ds2) else: ds2 = change_attribute(attribute, .5 * 10**-digits) assert_datasets_not_equal(ds, ds2) assert_datasets_not_almost_equal(ds, ds2, decimal=digits + 1) if attribute == 'samples': assert_datasets_almost_equal(ds, ds2, decimal=digits) else: assert_datasets_not_almost_equal(ds, ds2, decimal=digits - 1) # test ignore_ options args = {('ignore_' + attribute): list(args[attribute].keys())} assert_datasets_equal(ds, ds2, **args) assert_datasets_almost_equal(ds, ds2, **args) ds3 = remove_attribute(attribute) assert_datasets_not_equal(ds, ds3) assert_datasets_not_almost_equal(ds, ds3)
def test_assert_datasets_almost_equal(digits, attribute): samples = np.random.standard_normal((2, 5)) args = dict(sa=dict(targets=np.asarray([1., 2])), fa=dict(ids=np.asarray([0., 1, 2, 3, 4])), a=dict(a_value=[66])) ds = Dataset(samples=samples, **args) def negate_assert(f): def raiser(*args, **kwargs): assert_raises(AssertionError, f, *args, **kwargs) return raiser assert_datasets_not_almost_equal = negate_assert(assert_datasets_almost_equal) assert_datasets_not_equal = negate_assert(assert_datasets_equal) def change_attribute(name, how_much): # change a single attribute in samples, a, fa, or sa. ds2 = ds.copy(deep=True) attr = ds2.__dict__[name] if name == 'samples': value = attr else: for key in attr: break value = attr[key].value value[0] += how_much return ds2 def remove_attribute(name): ds2 = ds.copy(deep=True) attr = ds2.__dict__[name] for key in attr.keys(): attr.pop(key) return ds2 if digits is None: ds2 = change_attribute(attribute, 0) assert_datasets_equal(ds, ds2) else: ds2 = change_attribute(attribute, .5 * 10 ** -digits) assert_datasets_not_equal(ds, ds2) assert_datasets_not_almost_equal(ds, ds2, decimal=digits + 1) if attribute == 'samples': assert_datasets_almost_equal(ds, ds2, decimal=digits) else: assert_datasets_not_almost_equal(ds, ds2, decimal=digits - 1) # test ignore_ options args = {('ignore_' + attribute): args[attribute].keys()} assert_datasets_equal(ds, ds2, **args) assert_datasets_almost_equal(ds, ds2, **args) ds3 = remove_attribute(attribute) assert_datasets_not_equal(ds, ds3) assert_datasets_not_almost_equal(ds, ds3)
def test_gifti_dataset(fn, format_, include_nodes): expected_ds = _get_test_dataset(include_nodes) expected_ds_sa = expected_ds.copy(deep=True) expected_ds_sa.sa['chunks'] = [4, 3, 2, 1, 3, 2] expected_ds_sa.sa['targets'] = ['t%d' % i for i in xrange(6)] # build GIFTI file from scratch gifti_string = _build_gifti_string(format_, include_nodes) with open(fn, 'w') as f: f.write(gifti_string) # reading GIFTI file ds = gifti_dataset(fn) assert_datasets_almost_equal(ds, expected_ds) # test GiftiImage input img = nb_giftiio.read(fn) ds2 = gifti_dataset(img) assert_datasets_almost_equal(ds2, expected_ds) # test using Nibabel's output from write nb_giftiio.write(img, fn) ds3 = gifti_dataset(fn) assert_datasets_almost_equal(ds3, expected_ds) # test targets and chunks arguments ds3_sa = gifti_dataset(fn, targets=expected_ds_sa.targets, chunks=expected_ds_sa.chunks) assert_datasets_almost_equal(ds3_sa, expected_ds_sa) # test map2gifti img2 = map2gifti(ds) ds4 = gifti_dataset(img2) assert_datasets_almost_equal(ds4, expected_ds) map2gifti(ds, fn, encoding=format_) ds5 = gifti_dataset(fn) assert_datasets_almost_equal(ds5, expected_ds) # test map2gifti with array input; nodes are not stored map2gifti(ds.samples, fn) ds6 = gifti_dataset(fn) if include_nodes: assert_raises(AssertionError, assert_datasets_almost_equal, ds6, expected_ds) else: assert_datasets_almost_equal(ds6, expected_ds) assert_raises(TypeError, gifti_dataset, ds3_sa) assert_raises(TypeError, map2gifti, img, fn)