def createDatasetWithCompoundType(h5file): # component name -> (offset, size, type) ht = { 'a_name': (0, 4, H5T_NATIVE_INT), 'b_name': (4, 4, H5T_NATIVE_FLOAT), 'c_name': (8, 8, H5T_NATIVE_DOUBLE) } sizeof = 0 for k in ht.keys(): sizeof += ht[k][1] dtype = H5T.create(H5T.CreateClass.COMPOUND, sizeof) for k in ht.keys(): H5T.insert(dtype, k, ht[k][0], ht[k][2]) npoints = 10 shape = Array[Int64]((npoints,)) dspace = H5S.create_simple(shape.Length, shape) dset = H5D.create(h5file, 'ArrayOfStructures', dtype, dspace) # create an array of Byte # use BitConverter to get Byte representations shape = Array[Int64]((npoints*sizeof,)) byteArray = Array.CreateInstance(Byte, shape) for i in range(npoints): offset = i*sizeof a = Int32(i) Array.Copy(BitConverter.GetBytes(a), 0, byteArray, offset+ht['a_name'][0], ht['a_name'][1]) b = Single(i*i) Array.Copy(BitConverter.GetBytes(b), 0, byteArray, offset+ht['b_name'][0], ht['b_name'][1]) c = Double(1.0/(i+1.0)) Array.Copy(BitConverter.GetBytes(c), 0, byteArray, offset+ht['c_name'][0], ht['c_name'][1]) H5D.write(dset, dtype, H5Array[Byte](byteArray)) H5S.close(dspace) H5T.close(dtype) return dset
def writeGroupAndDatasets(h5file): grp = H5G.create(h5file, 'A') dtype = H5T.copy(H5T_NATIVE_FLOAT) shape = Array[Int64]((2, 6)) dspacev = H5S.create_simple(shape.Length, shape) dsetv = H5D.create(h5file, 'B', dtype, dspacev) H5T.close(dtype) dtype = H5T.copy(H5T_STD_REF_OBJ) shape = Array[Int64]((2, )) dspacer = H5S.create_simple(shape.Length, shape) dsetr = H5D.create(h5file, 'R', dtype, dspacer) oref = Array.CreateInstance(ObjectReference, 2) oref[0] = H5R.createObjectReference(h5file, 'A') oref[1] = H5R.createObjectReference(h5file, 'B') nBytes = ObjectReference.SizeInBytes data = Array.CreateInstance(Byte, oref.Length * nBytes) for i in range(oref.Length): Array.Copy(oref[i].ToByteArray(), 0, data, i * nBytes, nBytes) H5D.write(dsetr, dtype, H5Array[Byte](data)) H5T.close(dtype) H5D.close(dsetv) H5S.close(dspacev) H5D.close(dsetr) H5S.close(dspacer) return None
def writeDatasets(h5file): dtype = H5T.copy(H5T.H5Type.NATIVE_INT) shape = Array[Int64]((2, 9)) dspacev = H5S.create_simple(shape.Length, shape) dsetv = H5D.create(h5file, 'MATRIX', dtype, dspacev) data = Array.CreateInstance(Int32, shape) data[0, 0] = data[0, 1] = data[1, 0] = 1 data[0, 2] = data[1, 1] = data[1, 2] = 2 data[0, 3] = data[0, 4] = data[1, 3] = 3 data[0, 5] = data[1, 4] = data[1, 5] = 4 data[0, 6] = data[0, 7] = data[1, 6] = 5 data[0, 8] = data[1, 7] = data[1, 8] = 6 H5D.write(dsetv, dtype, H5Array[Int32](data)) H5T.close(dtype) dtype = H5T.copy(H5T.H5Type.STD_REF_DSETREG) shape = Array[Int64]((2, )) dspacer = H5S.create_simple(shape.Length, shape) dsetr = H5D.create(h5file, 'REGION_REFERENCES', dtype, dspacer) start = Array[Int64]((0, 3)) count = Array[Int64]((2, 3)) H5S.selectHyperslab(dspacev, H5S.SelectOperator.SET, start, count) rr = Array.CreateInstance(RegionReference, 2) rr[0] = H5R.createRegionReference(h5file, 'MATRIX', dspacev) coord = Array.CreateInstance(Int64, 6) coord[0] = coord[1] = coord[4] = 0 coord[2] = 1 coord[3] = 6 coord[5] = 8 H5S.selectNone(dspacev) H5S.selectElements(dspacev, H5S.SelectOperator.SET, IntPtr(3), coord) rr[1] = H5R.createRegionReference(h5file, 'MATRIX', dspacev) nBytes = RegionReference.SizeInBytes data = Array.CreateInstance(Byte, rr.Length * nBytes) for i in range(rr.Length): Array.Copy(rr[i].ToByteArray(), 0, data, i * nBytes, nBytes) H5D.write(dsetr, dtype, H5Array[Byte](data)) H5T.close(dtype) H5D.close(dsetv) H5S.close(dspacev) H5D.close(dsetr) H5S.close(dspacer) return None
def writeVlenData(h5file): dtype = H5T.vlenCreate(H5T.H5Type.NATIVE_INT) array = range(16) npoints = len(array) shape = Array[Int64]((npoints, )) dspace = H5S.create_simple(shape.Length, shape) dset = H5D.create(h5file, 'Vlen Dataset', dtype, dspace) wdata = Array.CreateInstance(hvl_t, npoints) sizeofInt = 4 for i in range(npoints): nElems = array[i] + 1 nBytes = nElems * sizeofInt # the data to be written (array of length i+1 with all elements = i) data = Array.CreateInstance(Byte, nBytes) for j in range(nElems): Array.Copy(System.BitConverter.GetBytes(i), 0, data, j * sizeofInt, sizeofInt) # allocate and copy to array in unmanaged memory mem = Marshal.AllocHGlobal(nBytes) Marshal.Copy(data, 0, mem, nBytes) wdata[i] = VLen(IntPtr(nElems), mem).To_hvl_t() H5D.write(dset, dtype, H5Array[hvl_t](wdata)) # free unmanaged buffer space for i in range(npoints): vl = VLen(wdata[i]) Marshal.FreeHGlobal(vl.Pointer) H5D.close(dset) H5S.close(dspace) H5T.close(dtype) return None
def readAndDereference(h5file): dsetr = H5D.open(h5file, 'R') dtyper = H5T.copy(H5T_STD_REF_OBJ) dspacer = H5D.getSpace(dsetr) npoints = H5S.getSimpleExtentNPoints(dspacer) nBytes = ObjectReference.SizeInBytes datar = Array.CreateInstance(Byte, npoints * nBytes) H5D.read(dsetr, dtyper, H5Array[Byte](datar)) oref = Array.CreateInstance(ObjectReference, npoints) a = Array.CreateInstance(Byte, nBytes) for i in range(oref.Length): Array.Copy(datar, i * nBytes, a, 0, nBytes) oref[i] = ObjectReference(a) otype = H5R.getObjectType(h5file, oref[0]) if (otype == H5O.ObjectType.GROUP): print 'First dereferenced object is a group.' otype = H5R.getObjectType(h5file, oref[1]) if (otype == H5O.ObjectType.DATASET): print 'Second dereferenced object is a dataset.' dset = H5R.dereference(dsetr, H5R.ReferenceType.OBJECT, oref[1]) dtype = H5D.getType(dset) dtype1 = H5T.copy(H5T_NATIVE_FLOAT) if (H5T.equal(dtype, dtype1)): print 'Datatype of the dataset is H5T_NATIVE_FLOAT.' H5T.close(dtype) H5T.close(dtype1) H5D.close(dset) H5S.close(dspacer) H5T.close(dtyper) H5D.close(dsetr) return None
def readDatasets(h5file): dsetr = H5D.open(h5file, 'REGION_REFERENCES') dtyper = H5T.copy(H5T.H5Type.STD_REF_DSETREG) dspacer = H5D.getSpace(dsetr) npoints = H5S.getSimpleExtentNPoints(dspacer) nBytes = RegionReference.SizeInBytes datar = Array.CreateInstance(Byte, npoints * nBytes) H5D.read(dsetr, dtyper, H5Array[Byte](datar)) rr = Array.CreateInstance(RegionReference, npoints) a = Array.CreateInstance(Byte, nBytes) for i in range(rr.Length): Array.Copy(datar, i * nBytes, a, 0, nBytes) rr[i] = RegionReference(a) # examine the first region reference dsetv = H5R.dereference(dsetr, H5R.ReferenceType.DATASET_REGION, rr[0]) name = H5R.getName(dsetr, H5R.ReferenceType.DATASET_REGION, rr[0]) print ' The dataset\'s name (returned by H5Rget_name) the reference points to is \'%s\', name length is %d\n' % ( name, len(name)) name = H5I.getName(dsetv) print ' The dataset\'s name (returned by H5Iget_name) the reference points to is \'%s\', name length is %d\n' % ( name, len(name)) dspace = H5R.getRegion(dsetr, rr[0]) dtype = H5T.copy(H5T.H5Type.NATIVE_INT) shape = Array[Int64]((2, 9)) data = Array.CreateInstance(Int32, shape) H5D.read(dsetv, dtype, H5S_ALL, dspace, H5P_DEFAULT, H5Array[Int32](data)) print 'Selected hyperslab: ' for i in range(data.GetLength(0)): print '' for j in range(data.GetLength(1)): print '%d ' % (data[i, j]), print '\n' H5S.close(dspace) H5D.close(dsetv) # examine the second region reference dsetv = H5R.dereference(dsetr, H5R.ReferenceType.DATASET_REGION, rr[1]) dspace = H5R.getRegion(dsetr, rr[1]) H5D.read(dsetv, dtype, H5S_ALL, dspace, H5P_DEFAULT, H5Array[Int32](data)) print 'Selected points: ' for i in range(data.GetLength(0)): print '' for j in range(data.GetLength(1)): print '%d ' % (data[i, j]), print '' H5T.close(dtype) H5S.close(dspace) H5D.close(dsetv) H5S.close(dspacer) H5T.close(dtyper) H5D.close(dsetr) return None