def write(self, surface_obj, file_path): image_metadata = GiftiMetaData().from_dict( surface_obj.generic_metadata) vertices_metadata = GiftiMetaData().from_dict( surface_obj.vertices_metadata) triangles_metadata = GiftiMetaData().from_dict( surface_obj.triangles_metadata) gifti_image = GiftiImage() gifti_image.set_metadata(image_metadata) data = GiftiDataArray(surface_obj.vertices, datatype='NIFTI_TYPE_FLOAT32', intent='NIFTI_INTENT_POINTSET') data.meta = vertices_metadata data.coordsys = surface_obj.vertices_coord_system gifti_image.add_gifti_data_array(data) data = GiftiDataArray(surface_obj.triangles, datatype='NIFTI_TYPE_INT32', intent='NIFTI_INTENT_TRIANGLE') data.meta = triangles_metadata data.coordsys = None gifti_image.add_gifti_data_array(data) nibabel.save(gifti_image, file_path)
def test_metadata(): nvpair = GiftiNVPairs('key', 'value') md = GiftiMetaData(nvpair=nvpair) assert_equal(md.data[0].name, 'key') assert_equal(md.data[0].value, 'value') # Test deprecation with clear_and_catch_warnings() as w: warnings.filterwarnings('always', category=DeprecationWarning) assert_equal(md.get_metadata(), dict(key='value')) assert_equal(len(w), 1) assert_equal(len(GiftiDataArray().get_metadata()), 0) assert_equal(len(w), 2)
def test_metadata(): # Test deprecation with clear_and_catch_warnings() as w: warnings.filterwarnings('once', category=DeprecationWarning) assert_equal(len(GiftiDataArray().get_metadata()), 0) # Test deprecation with clear_and_catch_warnings() as w: warnings.filterwarnings('once', category=DeprecationWarning) assert_equal(len(GiftiMetaData().get_metadata()), 0)
def test_dataarray_init(): # Test non-default dataarray initialization gda = GiftiDataArray # shortcut assert_equal(gda(None).data, None) arr = np.arange(12, dtype=np.float32).reshape((3, 4)) assert_array_equal(gda(arr).data, arr) # Intents assert_raises(KeyError, gda, intent=1) # Invalid code assert_raises(KeyError, gda, intent='not an intent') # Invalid string assert_equal(gda(intent=2).intent, 2) assert_equal(gda(intent='correlation').intent, 2) assert_equal(gda(intent='NIFTI_INTENT_CORREL').intent, 2) # Datatype assert_equal(gda(datatype=2).datatype, 2) assert_equal(gda(datatype='uint8').datatype, 2) assert_raises(KeyError, gda, datatype='not_datatype') # Float32 datatype comes from array if datatype not set assert_equal(gda(arr).datatype, 16) # Can be overriden by init assert_equal(gda(arr, datatype='uint8').datatype, 2) # Encoding assert_equal(gda(encoding=1).encoding, 1) assert_equal(gda(encoding='ASCII').encoding, 1) assert_equal(gda(encoding='GIFTI_ENCODING_ASCII').encoding, 1) assert_raises(KeyError, gda, encoding='not an encoding') # Endian assert_equal(gda(endian=1).endian, 1) assert_equal(gda(endian='big').endian, 1) assert_equal(gda(endian='GIFTI_ENDIAN_BIG').endian, 1) assert_raises(KeyError, gda, endian='not endian code') # CoordSys aff = np.diag([2, 3, 4, 1]) cs = GiftiCoordSystem(1, 2, aff) da = gda(coordsys=cs) assert_equal(da.coordsys.dataspace, 1) assert_equal(da.coordsys.xformspace, 2) assert_array_equal(da.coordsys.xform, aff) # Ordering assert_equal(gda(ordering=2).ind_ord, 2) assert_equal(gda(ordering='F').ind_ord, 2) assert_equal(gda(ordering='ColumnMajorOrder').ind_ord, 2) assert_raises(KeyError, gda, ordering='not an ordering') # metadata meta_dict = dict(one=1, two=2) assert_equal( gda(meta=GiftiMetaData.from_dict(meta_dict)).meta.metadata, meta_dict) assert_equal(gda(meta=meta_dict).meta.metadata, meta_dict) assert_equal(gda(meta=None).meta.metadata, {}) # ext_fname and ext_offset assert_equal(gda(ext_fname='foo').ext_fname, 'foo') assert_equal(gda(ext_offset=12).ext_offset, 12)
def test_dataarray_init(): # Test non-default dataarray initialization gda = GiftiDataArray # shortcut assert_equal(gda(None).data, None) arr = np.arange(12, dtype=np.float32).reshape((3, 4)) assert_array_equal(gda(arr).data, arr) # Intents assert_raises(KeyError, gda, intent=1) # Invalid code assert_raises(KeyError, gda, intent='not an intent') # Invalid string assert_equal(gda(intent=2).intent, 2) assert_equal(gda(intent='correlation').intent, 2) assert_equal(gda(intent='NIFTI_INTENT_CORREL').intent, 2) # Datatype assert_equal(gda(datatype=2).datatype, 2) assert_equal(gda(datatype='uint8').datatype, 2) assert_raises(KeyError, gda, datatype='not_datatype') # Float32 datatype comes from array if datatype not set assert_equal(gda(arr).datatype, 16) # Can be overriden by init assert_equal(gda(arr, datatype='uint8').datatype, 2) # Encoding assert_equal(gda(encoding=1).encoding, 1) assert_equal(gda(encoding='ASCII').encoding, 1) assert_equal(gda(encoding='GIFTI_ENCODING_ASCII').encoding, 1) assert_raises(KeyError, gda, encoding='not an encoding') # Endian assert_equal(gda(endian=1).endian, 1) assert_equal(gda(endian='big').endian, 1) assert_equal(gda(endian='GIFTI_ENDIAN_BIG').endian, 1) assert_raises(KeyError, gda, endian='not endian code') # CoordSys aff = np.diag([2, 3, 4, 1]) cs = GiftiCoordSystem(1, 2, aff) da = gda(coordsys=cs) assert_equal(da.coordsys.dataspace, 1) assert_equal(da.coordsys.xformspace, 2) assert_array_equal(da.coordsys.xform, aff) # Ordering assert_equal(gda(ordering=2).ind_ord, 2) assert_equal(gda(ordering='F').ind_ord, 2) assert_equal(gda(ordering='ColumnMajorOrder').ind_ord, 2) assert_raises(KeyError, gda, ordering='not an ordering') # metadata meta_dict=dict(one=1, two=2) assert_equal(gda(meta=GiftiMetaData.from_dict(meta_dict)).meta.metadata, meta_dict) assert_equal(gda(meta=meta_dict).meta.metadata, meta_dict) assert_equal(gda(meta=None).meta.metadata, {}) # ext_fname and ext_offset assert_equal(gda(ext_fname='foo').ext_fname, 'foo') assert_equal(gda(ext_offset=12).ext_offset, 12)
def write_gifti(self, surface, surface_path): gifti_image = GiftiImage() data_array = [0 for _ in xrange(2)] data_array[0] = surface.vertices data_array[1] = surface.triangles image_metadata = GiftiMetaData().from_dict(surface.image_metadata) vertices_metadata = GiftiMetaData().from_dict(surface.vertices_metadata) triangles_metadata = GiftiMetaData().from_dict(surface.triangles_metadata) # TODO We currently write metadata of the old surface gifti_image.set_metadata(image_metadata) data = GiftiDataArray(data_array[0], datatype='NIFTI_TYPE_FLOAT32', intent='NIFTI_INTENT_POINTSET') data.meta = vertices_metadata data.coordsys = surface.vertices_coord_system gifti_image.add_gifti_data_array(data) data = GiftiDataArray(data_array[1], datatype='NIFTI_TYPE_INT32', intent='NIFTI_INTENT_TRIANGLE') data.meta = triangles_metadata data.coordsys = None gifti_image.add_gifti_data_array(data) nibabel.save(gifti_image, surface_path)
def ply2gii(in_file, metadata, out_file=None): """Convert from ply to GIfTI""" from pathlib import Path from numpy import eye from nibabel.gifti import ( GiftiMetaData, GiftiCoordSystem, GiftiImage, GiftiDataArray, ) from pyntcloud import PyntCloud in_file = Path(in_file) surf = PyntCloud.from_file(str(in_file)) # Update centroid metadata metadata.update( zip( ("SurfaceCenterX", "SurfaceCenterY", "SurfaceCenterZ"), ["%.4f" % c for c in surf.centroid], )) # Prepare data arrays da = ( GiftiDataArray( data=surf.xyz.astype("float32"), datatype="NIFTI_TYPE_FLOAT32", intent="NIFTI_INTENT_POINTSET", meta=GiftiMetaData.from_dict(metadata), coordsys=GiftiCoordSystem(xform=eye(4), xformspace=3), ), GiftiDataArray( data=surf.mesh.values, datatype="NIFTI_TYPE_INT32", intent="NIFTI_INTENT_TRIANGLE", coordsys=None, ), ) surfgii = GiftiImage(darrays=da) if out_file is None: out_file = fname_presuffix(in_file.name, suffix=".gii", use_ext=False, newpath=str(Path.cwd())) surfgii.to_filename(str(out_file)) return out_file
def ply2gii(in_file, metadata, out_file=None): """Convert from ply to GIfTI""" from pathlib import Path from numpy import eye from nibabel.gifti import ( GiftiMetaData, GiftiCoordSystem, GiftiImage, GiftiDataArray, ) from pyntcloud import PyntCloud in_file = Path(in_file) surf = PyntCloud.from_file(str(in_file)) # Update centroid metadata metadata.update( zip(('SurfaceCenterX', 'SurfaceCenterY', 'SurfaceCenterZ'), ['%.4f' % c for c in surf.centroid]) ) # Prepare data arrays da = ( GiftiDataArray( data=surf.xyz.astype('float32'), datatype='NIFTI_TYPE_FLOAT32', intent='NIFTI_INTENT_POINTSET', meta=GiftiMetaData.from_dict(metadata), coordsys=GiftiCoordSystem(xform=eye(4), xformspace=3)), GiftiDataArray( data=surf.mesh.values, datatype='NIFTI_TYPE_INT32', intent='NIFTI_INTENT_TRIANGLE', coordsys=None)) surfgii = GiftiImage(darrays=da) if out_file is None: out_file = fname_presuffix( in_file.name, suffix='.gii', use_ext=False, newpath=str(Path.cwd())) surfgii.to_filename(str(out_file)) return out_file