Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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
Beispiel #4
0
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
Beispiel #5
0
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
Beispiel #6
0
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