예제 #1
0
        public static Dictionary <uint, string> GetLabelWorkingSet(long group_id)
        {
            Dictionary <uint, string> labelWorkingSet = new Dictionary <uint, string>();

            H5A.operator_t callBackMethod  = DelegateMethod;
            ArrayList      attrNameArray   = new ArrayList();
            GCHandle       nameArrayAlloc  = GCHandle.Alloc(attrNameArray);
            IntPtr         ptrOnAllocArray = (IntPtr)nameArrayAlloc;
            int            status;
            ulong          beginAt = 0;

            status = H5A.iterate(group_id, H5.index_t.CRT_ORDER, H5.iter_order_t.INC, ref beginAt, callBackMethod, ptrOnAllocArray);

            for (int i = 0; i < attrNameArray.Count; i++)
            {
                string   attr_name  = Convert.ToString(attrNameArray[i]);
                long     attr_id    = H5A.open(group_id, attr_name);
                uint[]   attr_value = { 0 };
                GCHandle valueAlloc = GCHandle.Alloc(attr_value, GCHandleType.Pinned);

                status = H5A.read(attr_id, H5T.NATIVE_UINT32, valueAlloc.AddrOfPinnedObject());
                status = H5A.close(attr_id);
                labelWorkingSet.Add(attr_value[0], attr_name);
            }

            status = H5G.close(group_id);

            return(labelWorkingSet);
        }
예제 #2
0
        public static double ReadAttribute(string file, string dataSetOrGroup, string attribute)
        {
            double attr = Double.NaN;

            try
            {
                H5FileId      fileId     = H5F.open(file, H5F.OpenMode.ACC_RDONLY);
                H5ObjectInfo  objectInfo = H5O.getInfoByName(fileId, dataSetOrGroup);
                H5GroupId     groupId    = null;
                H5DataSetId   dataSetId  = null;
                H5AttributeId attrId;

                if (objectInfo.objectType == H5ObjectType.GROUP)
                {
                    groupId = H5G.open(fileId, dataSetOrGroup);
                    attrId  = H5A.open(groupId, attribute);
                }
                else
                {
                    dataSetId = H5D.open(fileId, dataSetOrGroup);
                    attrId    = H5A.open(dataSetId, attribute);
                }
                H5DataTypeId attrTypeId = H5A.getType(attrId);

                double[] dAttrs = new double[] { };
                if (H5T.equal(attrTypeId, H5T.copy(H5T.H5Type.NATIVE_FLOAT)))
                {
                    float[] fAttrs = new float[H5S.getSimpleExtentNPoints(H5A.getSpace(attrId))];
                    H5A.read(attrId, attrTypeId, new H5Array <float>(fAttrs));
                    dAttrs = (from f in fAttrs select(double) f).ToArray();
                }
                else if (H5T.equal(attrTypeId, H5T.copy(H5T.H5Type.NATIVE_DOUBLE)))
                {
                    dAttrs = new double[H5S.getSimpleExtentNPoints(H5A.getSpace(attrId))];
                    H5A.read(attrId, attrTypeId, new H5Array <double>(dAttrs));
                }

                H5T.close(attrTypeId);
                H5A.close(attrId);
                if (groupId != null)
                {
                    H5G.close(groupId);
                }
                if (dataSetId != null)
                {
                    H5D.close(dataSetId);
                }
                H5F.close(fileId);

                return((double)dAttrs[0]);
            }

            catch (HDFException e)
            {
                Console.WriteLine("Error: Unhandled HDF5 exception");
                Console.WriteLine(e.Message);
            }

            return(attr);
        }
        public static T ReadEnumAttribute <T>(hid_t hid, string key) where T : struct, IConvertible
        {
            var attribute = H5A.open(hid, key);

            if (attribute < 0)
            {
                throw new ArgumentException(string.Format("Attribute {0} not found.", key));
            }

            var type = H5A.get_type(attribute);

            if (type < 0)
            {
                H5A.close(attribute);
                throw new Exception("H5A.get_type failed.");
            }

            var size = H5T.get_size(type).ToInt32();

            if (size == 0)
            {
                H5T.close(type);
                H5A.close(attribute);
                throw new Exception("H5T.get_size failed.");
            }

            var unmanagedBuffer = new UnmanagedBuffer(size);

            H5A.read(attribute, type, unmanagedBuffer);

            H5T.close(type);
            H5A.close(attribute);

            return(unmanagedBuffer.ReadEnum <T>());
        }
예제 #4
0
        public static string GetAttributeValue(H5ObjectWithAttributes objectWithAttributes, string name)
        {
            if (objectWithAttributes is null)
            {
                throw new ArgumentNullException(nameof(objectWithAttributes));
            }
            if (name is null)
            {
                throw new ArgumentNullException(nameof(name));
            }
            H5AttributeId h5AttributeId = H5A.open(objectWithAttributes, name);
            H5DataTypeId  h5DataTypeId  = H5A.getType(h5AttributeId);

            if (H5T.isVariableString(h5DataTypeId))
            {
                VariableLengthString[] variableLengthStrings = new VariableLengthString[1];
                H5A.read(h5AttributeId, h5DataTypeId, new H5Array <VariableLengthString> (variableLengthStrings));
                H5T.close(h5DataTypeId);
                H5A.close(h5AttributeId);
                return(variableLengthStrings[0].ToString());
            }
            byte[] bytes = new byte[H5T.getSize(h5DataTypeId)];
            H5A.read(h5AttributeId, h5DataTypeId, new H5Array <byte> (bytes));
            H5T.close(h5DataTypeId);
            H5A.close(h5AttributeId);
            return(Encoding.ASCII.GetString(bytes));
        }
예제 #5
0
        public static string AttributeAsString(H5AttributeId _attributeId)
        {
            H5DataTypeId dataTypeId       = H5A.getType(_attributeId);
            bool         isVariableLength = H5T.isVariableString(dataTypeId);

            if (isVariableLength)
            {
                // Variable length string attribute
                // NOTE: This section only works if the array length is 1
                VariableLengthString[] value = new VariableLengthString[1];
                H5A.read <VariableLengthString>(_attributeId, dataTypeId,
                                                new H5Array <VariableLengthString>(value));

                return(value[0].ToString());
            }
            else
            {
                // Make length smaller so null termination character is not read
                int length = (int)H5T.getSize(dataTypeId) - 1;

                // Fixed length string attribute
                byte[] valueBytes = new byte[length];

                H5A.read <byte>(_attributeId, dataTypeId, new H5Array <byte>(valueBytes));
                string value = System.Text.ASCIIEncoding.ASCII.GetString(valueBytes);
                return(value);
            }
        }
예제 #6
0
        public void H5AreadTest1()
        {
            double[] x   = { Math.PI };
            IntPtr   buf = Marshal.AllocHGlobal(8);
            hid_t    att = H5A.create(m_v2_test_file, "A", H5T.IEEE_F64LE,
                                      m_space_scalar);

            Assert.IsTrue(att >= 0);
            Assert.IsTrue(H5A.read(att, H5T.IEEE_F64BE, buf) >= 0);
            Assert.IsTrue(H5A.read(att, H5T.NATIVE_DOUBLE, buf) >= 0);
            Marshal.Copy(buf, x, 0, 1);
            Assert.IsTrue(x[0] == 0.0);
            Assert.IsTrue(H5A.close(att) >= 0);

            att = H5A.create(m_v0_test_file, "A", H5T.IEEE_F64LE,
                             m_space_scalar);
            Assert.IsTrue(att >= 0);
            Assert.IsTrue(H5A.read(att, H5T.IEEE_F64BE, buf) >= 0);
            Assert.IsTrue(H5A.read(att, H5T.NATIVE_DOUBLE, buf) >= 0);
            Marshal.Copy(buf, x, 0, 1);
            Assert.IsTrue(x[0] == 0.0);
            Assert.IsTrue(H5A.close(att) >= 0);

            Marshal.FreeHGlobal(buf);
        }
예제 #7
0
        public static int AttributeAsInt32(H5AttributeId _attributeId)
        {
            H5DataTypeId attributeType = H5T.copy(H5T.H5Type.NATIVE_INT);

            int[] value = new int[1];
            H5A.read <int>(_attributeId, attributeType, new H5Array <int>(value));

            return(value[0]);
        }
예제 #8
0
 public void H5AreadTest2()
 {
     Assert.IsFalse(
         H5A.read(Utilities.RandomInvalidHandle(),
                  Utilities.RandomInvalidHandle(), IntPtr.Zero) >= 0);
     Assert.IsFalse(
         H5A.read(Utilities.RandomInvalidHandle(),
                  H5T.NATIVE_DOUBLE, IntPtr.Zero) >= 0);
 }
예제 #9
0
        public static Double AttributeAsDouble(H5AttributeId _attributeId)
        {
            H5DataTypeId attributeType = H5T.copy(H5T.H5Type.NATIVE_DOUBLE);

            double[] value = new double[1];
            H5A.read <double>(_attributeId, attributeType, new H5Array <double>(value));

            return(value[0]);
        }
예제 #10
0
        public object this[string key]
        {
            get
            {
                return(Host.With <object>((objId) =>
                {
                    long attrId = 0;
                    long dtypeId = 0;
                    try
                    {
                        attrId = H5A.open(objId, key);
                        if (attrId < 0)
                        {
                            throw new ArgumentException($"Unknown Attribute: {key}", nameof(key));
                        }
                        dtypeId = H5A.get_type(attrId);
                        int size = H5T.get_size(dtypeId).ToInt32();

                        IntPtr iPtr = Marshal.AllocHGlobal(size);
                        int result = H5A.read(attrId, dtypeId, iPtr);
                        if (result < 0)
                        {
                            throw new IOException("Failed to read attribute");
                        }

                        if (H5T.equal(dtypeId, H5T.NATIVE_INT64) > 0)
                        {
                            var dest = new long[1];
                            Marshal.Copy(iPtr, dest, 0, 1);
                            Marshal.FreeHGlobal(iPtr);
                            return dest[0];
                        }
                        else // Must be a string...
                        {
                            var dest = new byte[size];
                            Marshal.Copy(iPtr, dest, 0, size);
                            Marshal.FreeHGlobal(iPtr);
                            return Encoding.ASCII.GetString(dest).TrimEnd((Char)0);
                        }

//                        return null;
                    }
                    finally
                    {
                        if (attrId > 0)
                        {
                            H5A.close(attrId);
                        }
                        if (dtypeId > 0)
                        {
                            H5T.close(dtypeId);
                        }
                    }
                }));
            }
        }
예제 #11
0
 private T[] ReadArray <T>(long size, H5AttributeId attId, H5DataTypeId typeId)
 {
     T[] v = new T[size];
     if (size == 0)
     {
         return(v);
     }
     H5A.read <T>(attId, typeId, new H5Array <T>(v));
     return(v);
 }
예제 #12
0
        protected T[] getAttribute <T>(H5AttributeId aid)
        {
            H5DataTypeId sv       = H5A.getType(aid);
            int          size     = H5T.getSize(sv);
            var          attValue = new T[size];

            H5A.read <T>(aid, sv, new H5Array <T>(attValue));

            return(attValue);
        }
예제 #13
0
        protected T[] ReadArray <T>(ulong size, int attId, int typeId)
        {
            T[] v = new T[size];
            if (size == 0)
            {
                return(v);
            }
            GCHandle hnd = GCHandle.Alloc(v, GCHandleType.Pinned);

            H5A.read(attId, typeId, hnd.AddrOfPinnedObject());
            return(v);
        }
예제 #14
0
        static void ReadFile(string filePath)
        {
            var file = H5F.open(filePath, H5F.ACC_RDONLY);

            var dataSet = H5D.open(file, "/group/dataset");

            var dataSpace = H5D.get_space(dataSet);

            var rank = H5S.get_simple_extent_ndims(dataSpace);

            if (rank == 2)
            {
                var dims = new ulong[2];
                H5S.get_simple_extent_dims(dataSpace, dims, null);

                var data = new int[dims[0], dims[1]];
                H5D.read(dataSet, H5T.NATIVE_INT, H5S.ALL, H5S.ALL, H5P.DEFAULT, new PinnedObject(data));

                for (int i = 0; i < data.GetLength(0); ++i)
                {
                    for (int j = 0; j < data.GetLength(1); ++j)
                    {
                        Write($"{data[i,j],3}");
                    }
                    WriteLine();
                }
            }

            H5S.close(dataSpace);

            var doubleAttribute = H5A.open(dataSet, "double");

#if false
            double pi     = 0.0;
            var    handle = GCHandle.Alloc(pi, GCHandleType.Pinned);
            H5A.read(doubleAttribute, H5T.NATIVE_DOUBLE, handle.AddrOfPinnedObject());
            handle.Free();
            WriteLine($"PI = {pi}");
#else
            var values = new double[1];
            H5A.read(doubleAttribute, H5T.NATIVE_DOUBLE, new PinnedObject(values));
            WriteLine($"PI = {values[0]}");
#endif
            H5A.close(doubleAttribute);

            WriteLine($"string: {ReadStringAttribute(dataSet, "string")}");
            WriteLine($"string-ascii: {ReadStringAttribute(dataSet, "string-ascii")}");
            WriteLine($"string-vlen: {ReadStringAttribute(dataSet, "string-vlen")}");

            H5D.close(dataSet);
            H5F.close(file);
        }
예제 #15
0
        public static T ReadScalarNumericAttribute <T>(hid_t attribute) where T : struct
        {
            var space = H5A.get_space(attribute);

            if (space < 0)
            {
                throw new Exception("Failed to get space");
            }

            if (H5S.get_simple_extent_type(space) != H5S.class_t.SCALAR)
            {
                H5S.close(space);
                throw new Exception("Not a scalar data space");
            }

            H5S.close(space);

            var type = H5A.get_type(attribute);

            if (type < 0)
            {
                throw new Exception("Failed to get type");
            }

            var typeClass = H5T.get_class(type);

            H5T.close(type);
            if (typeClass != H5T.class_t.INTEGER && typeClass != H5T.class_t.FLOAT)
            {
                throw new Exception("Not an integral or floating point data type");
            }

            // TODO:
            // Check if value can be cast to type of this attribute.
            //
            // TODO:
            // T[] value = new T[1];
            // H5A.read(attribute, NumericTypeToHDF5Type<T>(), new PinnedObject(value));
            object boxedValue = new T();

            if (H5A.read(attribute, NumericTypeToHDF5Type <T>(), new PinnedObject(boxedValue)) < 0)
            {
                throw new Exception("Failed to read attribute");
            }

            return((T)boxedValue);
        }
예제 #16
0
        /// <summary>
        /// Reads from the hdf file
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="_dataType"></param>
        /// <param name="_attributeId"></param>
        /// <returns></returns>
        private static T ReadValue <T>(
            Hdf5DataType _dataType,
            Hdf5Identifier _attributeId)
        {
            T[] value = new T[1];

            GCHandle arrayHandle = GCHandle.Alloc(value, GCHandleType.Pinned);

            var dataType = H5T.copy(_dataType.NativeType.Value).ToId();

            int result = H5A.read(_attributeId.Value, dataType.Value, arrayHandle.AddrOfPinnedObject());

            arrayHandle.Free();

            H5T.close(dataType.Value);

            return(value[0]);
        }
예제 #17
0
        public static IEnumerable <string> ReadStringAttributes(hid_t groupId, string name)
        {
            hid_t datatype = H5T.create(H5T.class_t.STRING, H5T.VARIABLE);

            H5T.set_cset(datatype, H5T.cset_t.UTF8);
            H5T.set_strpad(datatype, H5T.str_t.NULLTERM);

            //name = ToHdf5Name(name);

            var   datasetId = H5A.open(groupId, name);
            hid_t spaceId   = H5A.get_space(datasetId);

            long count = H5S.get_simple_extent_npoints(spaceId);

            H5S.close(spaceId);

            IntPtr[] rdata = new IntPtr[count];
            GCHandle hnd   = GCHandle.Alloc(rdata, GCHandleType.Pinned);

            H5A.read(datasetId, datatype, hnd.AddrOfPinnedObject());

            var strs = new List <string>();

            for (int i = 0; i < rdata.Length; ++i)
            {
                int len = 0;
                while (Marshal.ReadByte(rdata[i], len) != 0)
                {
                    ++len;
                }
                byte[] buffer = new byte[len];
                Marshal.Copy(rdata[i], buffer, 0, buffer.Length);
                string s = Encoding.UTF8.GetString(buffer);

                strs.Add(s);

                H5.free_memory(rdata[i]);
            }

            hnd.Free();
            H5T.close(datatype);
            H5A.close(datasetId);
            return(strs);
        }
예제 #18
0
        /// <summary>
        /// Read the numeric value stored in this *attribute* specified by `T`.
        /// </summary>
        /// <remarks>
        /// For reading a `string`, use `Reads()` instead!
        /// </remarks>
        public T Read <T>()
        {
            using (H5Type dtype = GetDType())
            {
                if (typeof(T) != dtype.PrimitiveType)
                {
                    throw new InvalidCastException(dtype.PrimitiveType.ToString());
                }

                T[]      buf         = new T[1];
                GCHandle pinnedArray = GCHandle.Alloc(buf, GCHandleType.Pinned);
                int      status      = H5A.read(ID, dtype.ID, pinnedArray.AddrOfPinnedObject());
                pinnedArray.Free();
                if (status < 0)
                {
                    throw new H5LibraryException($"H5A.read() returned ({status})");
                }

                return(buf[0]);
            }
        }
예제 #19
0
        /// <summary>
        /// Reads a string scalar attribute value.
        /// Assumes that the parent object is already open.
        /// </summary>
        /// <param name="_objectId"></param>
        /// <param name="_title"></param>
        /// <returns></returns>
        public static Hdf5Attribute GetStringAttribute(Hdf5Identifier _objectId, string _title)
        {
            int attributeId = 0;
            int typeId      = 0;

            attributeId = H5A.open(_objectId.Value, _title);
            typeId      = H5A.get_type(attributeId);
            var sizeData = H5T.get_size(typeId);
            var size     = sizeData.ToInt32();

            byte[] strBuffer = new byte[size];

            var      aTypeMem    = H5T.get_native_type(typeId, H5T.direction_t.ASCEND);
            GCHandle pinnedArray = GCHandle.Alloc(strBuffer, GCHandleType.Pinned);

            H5A.read(attributeId, aTypeMem, pinnedArray.AddrOfPinnedObject());
            pinnedArray.Free();
            H5T.close(aTypeMem);

            string value = System.Text.Encoding.ASCII.GetString(strBuffer, 0, strBuffer.Length - 1);

            var attribute = new Hdf5Attribute
            {
                Id    = attributeId.ToId(),
                Name  = _title,
                Value = value
            };

            if (attributeId > 0)
            {
                H5A.close(attributeId);
            }

            if (typeId > 0)
            {
                H5T.close(typeId);
            }

            return(attribute);
        }
예제 #20
0
        void FindAttribute(int i)
        {
            var attr_field = "FIELD_" + i + "_NAME";

            var attr  = H5A.open(Id, attr_field);
            var dtype = H5A.getType(attr);
            var size  = H5T.getSize(dtype);

            var mtype  = H5T.create(H5T.CreateClass.STRING, size);
            var buffer = new byte[size];

            H5A.read(attr, mtype, new H5Array <byte>(buffer));

            var attr_datatype = H5T.getMemberType(H5D.getType(Id), i);
            var attr_size     = H5T.getSize(attr_datatype);

            var attr_class = H5T.getMemberClass(H5D.getType(Id), i).ToString();
            var attr_name  = Encoding.GetString(buffer).Replace('\0', ' ').Trim();

            switch (attr_class)
            {
            case "STRING":
                _attributes[i] = new StringAttribute(attr_name, attr_size);
                break;

            case "INTEGER":
                _attributes[i] = new IntegerAttribute(attr_name, attr_size);
                break;

            case "FLOAT":
                _attributes[i] = new FloatingPointAttribute(attr_name, attr_size);
                break;

            default:
                throw new ArgumentException("Unknown attribute type " + attr_class, "attr_type");
            }
        }
예제 #21
0
        public static Array ReadPrimitiveAttributes <T>(hid_t groupId, string name) //where T : struct
        {
            Type type     = typeof(T);
            var  datatype = GetDatatype(type);

            var attributeId = H5A.open(groupId, name);
            var spaceId     = H5A.get_space(attributeId);
            int rank        = H5S.get_simple_extent_ndims(spaceId);

            ulong[] maxDims = new ulong[rank];
            ulong[] dims    = new ulong[rank];
            hid_t   memId   = H5S.get_simple_extent_dims(spaceId, dims, maxDims);

            long[] lengths    = dims.Select(d => Convert.ToInt64(d)).ToArray();
            Array  attributes = Array.CreateInstance(type, lengths);

            var typeId   = H5A.get_type(attributeId);
            var mem_type = H5T.copy(datatype);

            if (datatype == H5T.C_S1)
            {
                H5T.set_size(datatype, new IntPtr(2));
            }

            var propId = H5A.get_create_plist(attributeId);

            memId = H5S.create_simple(rank, dims, maxDims);
            GCHandle hnd = GCHandle.Alloc(attributes, GCHandleType.Pinned);

            H5A.read(attributeId, datatype, hnd.AddrOfPinnedObject());
            hnd.Free();
            H5A.close(typeId);
            H5A.close(attributeId);
            H5S.close(spaceId);
            return(attributes);
        }
예제 #22
0
        private string GetModelConfig()
        {
            long fileId  = H5F.open(this.fileName, H5F.ACC_RDONLY);
            long attrId  = H5A.open(fileId, @"model_config");
            long typeId  = H5A.get_type(attrId);
            long spaceId = H5A.get_space(attrId);
            long count   = H5S.get_simple_extent_npoints(spaceId);

            H5S.close(spaceId);
            IntPtr[] dest   = new IntPtr[count];
            GCHandle handle = GCHandle.Alloc(dest, GCHandleType.Pinned);

            H5A.read(attrId, typeId, handle.AddrOfPinnedObject());

            var attrStrings = new List <string>();

            for (int i = 0; i < dest.Length; ++i)
            {
                int attrLength = 0;
                while (Marshal.ReadByte(dest[i], attrLength) != 0)
                {
                    ++attrLength;
                }

                byte[] buffer = new byte[attrLength];
                Marshal.Copy(dest[i], buffer, 0, buffer.Length);
                string stringPart = Encoding.UTF8.GetString(buffer);

                attrStrings.Add(stringPart);

                H5.free_memory(dest[i]);
            }

            handle.Free();
            return(attrStrings.ToArray().ToString());
        }
예제 #23
0
        /// <summary>
        /// Read the string value stored in this *attribute*.
        /// </summary>
        public string Reads()
        {
            using (H5Type dtype = GetDType())
            {
                if (typeof(System.String) != dtype.PrimitiveType)
                {
                    throw new InvalidCastException(dtype.PrimitiveType.ToString());
                }

                long     slen        = dtype.Size;
                byte[]   buf         = new byte[slen];
                GCHandle pinnedArray = GCHandle.Alloc(buf, GCHandleType.Pinned);
                int      status      = H5A.read(ID, dtype.ID, pinnedArray.AddrOfPinnedObject());
                pinnedArray.Free();
                if (status < 0)
                {
                    throw new H5LibraryException($"H5A.read() returned ({status})");
                }

                string decoded = System.Text.Encoding.ASCII.GetString(buf);

                return(decoded.TrimEnd('\0'));
            }
        }
예제 #24
0
        private static void ReadFile(string filePath)
        {
            var file = H5F.open(filePath, H5F.OpenMode.ACC_RDONLY);

            var dataSet = H5D.open(file, "/group/dataset");

            var fileSpace = H5D.getSpace(dataSet);

            var rank = H5S.getSimpleExtentNDims(fileSpace);

            WriteLine("Rank: {0}", rank);

            var dims = H5S.getSimpleExtentDims(fileSpace);

            Write("Dims:");
            foreach (var d in dims)
            {
                Write(" {0}", d);
            }
            WriteLine();

            H5S.close(fileSpace);

            var ints         = new int[1];
            var intAttribute = H5A.openName(dataSet, "int");

            H5A.read(intAttribute, H5A.getType(intAttribute), new H5Array <int>(ints));
            WriteLine("int: {0}", ints[0]);
            H5A.close(intAttribute);

            var stringAttribute = H5A.openName(dataSet, "string");
            var stringType      = H5A.getType(stringAttribute);
            var stringSize      = H5T.getSize(stringType);

            WriteLine("string length: {0}", stringSize);
            var buffer = new byte[stringSize];

            H5A.read(stringAttribute, stringType, new H5Array <byte>(buffer));
            WriteLine("string: {0}", Encoding.ASCII.GetString(buffer));
            H5T.close(stringType);
            H5A.close(stringAttribute);

            if (rank == 2)
            {
                var data = new int[dims[0], dims[1]];
                H5D.read(dataSet, H5D.getType(dataSet), new H5Array <int>(data));

                for (int i = 0; i < data.GetLength(0); ++i)
                {
                    for (int j = 0; j < data.GetLength(1); ++j)
                    {
                        Write(" {0}", data[i, j]);
                    }

                    WriteLine();
                }
            }

            H5D.close(dataSet);

            H5F.close(file);
        }
예제 #25
0
        } // test_attr_basic_write

        static void test_attr_basic_read()
        {
            try
            {
                Console.Write("Testing basic reading attribute functions");

                // Make an integer type object to use in various calls (instead of copying like in test_attr_basic_write)
                H5DataTypeId inttype = new H5DataTypeId(H5T.H5Type.NATIVE_INT);

                // Open file
                H5FileId fileId = H5F.open(FILE_NAME, H5F.OpenMode.ACC_RDWR);

                // Open dataset DSET1_NAME.
                H5DataSetId dsetId = H5D.open(fileId, DSET1_NAME);

                // Verify the correct number of attributes.
                H5ObjectInfo oinfo = H5O.getInfo(dsetId);

                if (oinfo.nAttributes != 2)
                {
                    Console.WriteLine("\ntest_attr_basic_read: incorrect number of attributes: read {0} - should be {1}",
                                      oinfo.nAttributes, 2);
                    nerrors++;
                }

                // Open first attribute for the dataset.
                H5AttributeId attrId = H5A.open(dsetId, D1ATTR1_NAME);

                // Read attribute data.
                int[] read_data1 = new int[3];
                H5A.read(attrId, inttype, new H5Array <int>(read_data1));

                // Verify values read in.
                int[] attr_data1 = new int[] { 512, -234, 98123 }; /* Test data for 1st attribute */
                int   ii;
                for (ii = 0; ii < ATTR1_DIM; ii++)
                {
                    if (attr_data1[ii] != read_data1[ii])
                    {
                        Console.WriteLine("\ntest_attr_basic_read:check2: read value differs from input: read {0} - input {1}", read_data1[ii], attr_data1[ii]);
                        nerrors++;
                    }
                }

                H5A.close(attrId);

                // Open second attribute for the dataset.
                attrId = H5A.open(dsetId, D1ATTR2_NAME);

                // Read attribute data.
                H5A.read(attrId, inttype, new H5Array <int>(read_data1));

                // Verify values read in.
                int[] attr_data2 = new int[] { 256, 11945, -22107 }; // Data to test second attribute of dataset.
                for (ii = 0; ii < ATTR1_DIM; ii++)
                {
                    if (attr_data2[ii] != read_data1[ii])
                    {
                        Console.WriteLine("\ntest_attr_basic_read: check3: read value differs from input: read {0} - input {1}", read_data1[ii], attr_data2[ii]);
                        nerrors++;
                    }
                }

                // Close the attribute and dataset.
                H5A.close(attrId);
                H5D.close(dsetId);

                /* Checking group's attribute */

                // Open the group.
                H5GroupId groupId = H5G.open(fileId, GROUP1_NAME);

                // Verify the correct number of attributes for this group.
                oinfo = H5O.getInfo(groupId);
                if (oinfo.nAttributes != 1)
                {
                    Console.WriteLine("\ntest_attr_basic_read: incorrect number of attributes: read {0} - should be {1}",
                                      oinfo.nAttributes, 1);
                    nerrors++;
                }

                // Open the attribute for the group.
                attrId = H5A.open(groupId, GATTR_NAME);

                // Read attribute information.
                int[,] read_data2 = new int[GATTR_DIM1, GATTR_DIM2];
                H5A.read(attrId, new H5DataTypeId(H5T.H5Type.NATIVE_INT), new H5Array <int>(read_data2));

                // Verify values read in.
                int jj;
                for (ii = 0; ii < GATTR_DIM1; ii++)
                {
                    for (jj = 0; jj < GATTR_DIM2; jj++)
                    {
                        if (gattr_data[ii, jj] != read_data2[ii, jj])
                        {
                            Console.WriteLine("\ntest_attr_basic_read: check4: read value differs from input: read {0} - input {1}", read_data2[ii, jj], gattr_data[ii, jj]);
                            nerrors++;
                        }
                    }
                }

                // Close attribute, group, and file.
                H5A.close(attrId);
                H5G.close(groupId);
                H5F.close(fileId);

                Console.WriteLine("\t\tPASSED");
            }
            catch (HDFException anyHDF5E)
            {
                Console.WriteLine(anyHDF5E.Message);
                nerrors++;
            }
            catch (System.Exception sysE)
            {
                Console.WriteLine(sysE.TargetSite);
                Console.WriteLine(sysE.Message);
                nerrors++;
            }
        } // test_attr_basic_read
        public static string ReadStringAttribute(hid_t hid, string key)
        {
            var attribute = H5A.open(hid, key);

            if (attribute < 0)
            {
                throw new ArgumentException(string.Format("Attribute {0} not found.", key));
            }

            var type = H5A.get_type(attribute);

            if (type < 0)
            {
                H5A.close(attribute);
                throw new Exception("H5A.get_type failed.");
            }

            var typeClass = H5T.get_class(type);

            if (typeClass != H5T.class_t.STRING)
            {
                H5T.close(type);
                throw new Exception("Not a string attribute");
            }

            var utf8  = H5T.get_cset(type) == H5T.cset_t.UTF8;
            var ascii = H5T.get_cset(type) == H5T.cset_t.ASCII;

            if (!utf8 && !ascii)
            {
                H5T.close(type);
                H5A.close(attribute);
                throw new Exception("Neither ASCII nor UTF8.");
            }

            var isVariableString = H5T.is_variable_str(type);

            if (isVariableString < 0)
            {
                H5T.close(type);
                H5A.close(attribute);
                throw new Exception("H5T.is_variable_str failed");
            }

            if (isVariableString > 0)
            {
                var space = H5A.get_space(attribute);
                if (space < 0)
                {
                    H5T.close(type);
                    H5A.close(attribute);
                    throw new Exception("H5A.get_space failed.");
                }

                hid_t count = H5S.get_simple_extent_npoints(space);
                var   rdata = new IntPtr[count];

                H5A.read(attribute, type, new PinnedObject(rdata));

                var attrStrings = new List <string>();
                for (int i = 0; i < rdata.Length; ++i)
                {
                    int attrLength = 0;
                    while (Marshal.ReadByte(rdata[i], attrLength) != 0)
                    {
                        ++attrLength;
                    }

                    byte[] buffer = new byte[attrLength];
                    Marshal.Copy(rdata[i], buffer, 0, buffer.Length);

                    string part = utf8 ? Encoding.UTF8.GetString(buffer)
                        : Encoding.ASCII.GetString(buffer);

                    attrStrings.Add(part);

                    H5.free_memory(rdata[i]);
                }

                H5S.close(space);
                H5T.close(type);
                H5A.close(attribute);

                return(attrStrings[0]);
            }

            // Must be a non-variable length string.
            var size            = H5T.get_size(type).ToInt32();
            var unmanagedBuffer = new UnmanagedBuffer(size);

            int result = H5A.read(attribute, type, unmanagedBuffer);

            if (result < 0)
            {
                H5T.close(type);
                H5D.close(attribute);
                throw new IOException("Failed to read attribute.");
            }

            var bytes = new byte[size];

            unmanagedBuffer.CopyTo(bytes, 0, bytes.Length);

            H5T.close(type);
            H5A.close(attribute);

            var value = utf8 ? Encoding.UTF8.GetString(bytes)
                : Encoding.ASCII.GetString(bytes);

            return(value.TrimEnd('\0'));
        }
예제 #27
0
        } // test_attr_compound_write

        static void test_attr_compound_read()
        {
            try
            {
                Console.Write("Testing read attribute with compound datatype");

                // Open file.
                H5FileId fileId = H5F.open(COMP_FNAME, H5F.OpenMode.ACC_RDWR);

                // Open the dataset.
                H5DataSetId dsetId = H5D.open(fileId, DSET1_NAME);

                // Verify the correct number of attributes for this dataset.
                H5ObjectInfo oinfo = H5O.getInfo(dsetId);
                if (oinfo.nAttributes != 1)
                {
                    Console.WriteLine("\ntest_attr_basic_read: incorrect number of attributes: read {0} - should be {1}",
                                      oinfo.nAttributes, 1);
                    nerrors++;
                }

                // Open first attribute for the dataset.
                H5AttributeId attrId = H5A.openByIndex(dsetId, ".", H5IndexType.CRT_ORDER, H5IterationOrder.INCREASING, 0);

                // Verify dataspace.
                H5DataSpaceId spaceId = H5A.getSpace(attrId);

                int rank = H5S.getSimpleExtentNDims(spaceId);
                if (rank != ATTR4_RANK)
                {
                    Console.WriteLine("\ntest_attr_compound_read: incorrect rank = {0} - should be {1}", rank, ATTR4_RANK);
                    nerrors++;
                }

                long[] dims = H5S.getSimpleExtentDims(spaceId);
                if (dims[0] != ATTR4_DIM1)
                {
                    Console.WriteLine("\ntest_attr_compound_read: incorrect dim[0] = {0} - should be {1}", dims[0], ATTR4_DIM1);
                    nerrors++;
                }
                if (dims[1] != ATTR4_DIM2)
                {
                    Console.WriteLine("\ntest_attr_compound_read: incorrect dim[1] = {0} - should be {1}", dims[1], ATTR4_DIM2);
                    nerrors++;
                }

                // Close dataspace.
                H5S.close(spaceId);

                // Verify datatype of the attribute.
                H5DataTypeId typeId = H5A.getType(attrId);

                H5T.H5TClass t_class = H5T.getClass(typeId);
                if (t_class != H5T.H5TClass.COMPOUND)
                {
                    Console.WriteLine("test_compound_dtypes: H5T.getMemberClass and H5T.getClass return different classes for the same type.");
                    nerrors++;
                }
                int nfields = H5T.getNMembers(typeId);
                if (nfields != 3)
                {
                    Console.WriteLine("test_compound_dtypes: H5T.getMemberClass and H5T.getClass return different classes for the same type.");
                    nerrors++;
                }

                // Check name against this list
                string[] memb_names   = { ATTR4_FIELDNAME1, ATTR4_FIELDNAME2, ATTR4_FIELDNAME3 };
                int[]    memb_offsets = { 0, 1, 5 }; // list of member offsets

                H5DataTypeId mtypeId;                // member type
                H5T.H5TClass memb_cls1;              // member classes retrieved different ways
                string       memb_name;              // member name
                int          memb_idx;               // member index
                int          memb_offset, idx;       // member offset, loop index

                // how to handle int versus uint for memb_idx and idx???

                // For each member, check its name, class, index, and size.
                for (idx = 0; idx < nfields; idx++)
                {
                    // Get the type of the ith member to test other functions later.
                    mtypeId = H5T.getMemberType(typeId, idx);

                    // Get the name of the ith member.
                    memb_name = H5T.getMemberName(typeId, idx);
                    if (memb_name != memb_names[idx])
                    {
                        Console.WriteLine("test_compound_dtypes: incorrect member name, {0}, for member no {1}", memb_name, idx);
                        nerrors++;
                    }

                    // Get the class of the ith member and then verify the class.
                    memb_cls1 = H5T.getMemberClass(typeId, idx);
                    if (memb_cls1 != H5T.H5TClass.INTEGER)
                    {
                        Console.WriteLine("test_compound_dtypes: incorrect class, {0}, for member no {1}", memb_cls1, idx);
                        nerrors++;
                    }

                    // Get member's index back using its name and verify it.
                    memb_idx = H5T.getMemberIndex(typeId, memb_name);
                    if (memb_idx != idx)
                    {
                        Console.WriteLine("test_attr_compound_read: H5T.getMemberName and/or H5T.getMemberIndex returned false values.");
                        nerrors++;
                    }

                    // Get member's offset and verify it.
                    memb_offset = H5T.getMemberOffset(typeId, idx);
                    if (memb_offset != memb_offsets[idx])
                    {
                        Console.WriteLine("test_attr_compound_read: H5T.getMemberOffset returned incorrect value - {0}, should be {1}", memb_offset, memb_offsets[idx]);
                        nerrors++;
                    }

                    // Get member's size and verify it.
                    int tsize = H5T.getSize(mtypeId);
                    switch (idx)
                    {
                    case 0:
                        if (tsize != H5T.getSize(H5T.H5Type.STD_U8LE))
                        {
                            Console.WriteLine("test_attr_compound_read: H5T.getSize returned incorrect value.");
                            nerrors++;
                        }
                        break;

                    case 1:
                        if (tsize != H5T.getSize(H5T.H5Type.NATIVE_INT))
                        {
                            Console.WriteLine("test_attr_compound_read: H5T.getSize returned incorrect value.");
                            nerrors++;
                        }
                        break;

                    case 2:
                        if (tsize != H5T.getSize(H5T.H5Type.STD_I64BE))
                        {
                            Console.WriteLine("test_attr_compound_read: H5T.getSize returned incorrect value.");
                            nerrors++;
                        }
                        break;

                    default:
                        Console.WriteLine("test_attr_compound_read: We should only have 3 members.");
                        nerrors++;
                        break;
                    } // end switch

                    // Close current member type.
                    H5T.close(mtypeId);
                } // end for

                // Prepare the check array to verify read data.  It should be the same as the attr_data4 array
                // in the previous test function test_attr_compound_write.
                attr4_struct[,] check = new attr4_struct[ATTR4_DIM1, ATTR4_DIM2];

                // Initialize the dataset
                int ii, jj, nn;
                for (ii = nn = 0; ii < ATTR4_DIM1; ii++)
                {
                    for (jj = 0; jj < ATTR4_DIM2; jj++)
                    {
                        check[ii, jj].c = 't';
                        check[ii, jj].i = nn++;
                        check[ii, jj].l = (ii * 10 + jj * 100) * nn;
                    }
                }

                // Read attribute information.
                attr4_struct[,] read_data4 = new attr4_struct[ATTR4_DIM1, ATTR4_DIM2];
                H5A.read(attrId, typeId, new H5Array <attr4_struct>(read_data4));

                // Verify values read in.
                for (ii = 0; ii < ATTR4_DIM1; ii++)
                {
                    for (jj = 0; jj < ATTR4_DIM2; jj++)
                    {
                        if ((check[ii, jj].c != read_data4[ii, jj].c) ||
                            (check[ii, jj].i != read_data4[ii, jj].i) ||
                            (check[ii, jj].l != read_data4[ii, jj].l))
                        {
                            Console.WriteLine("test_attr_compound_read: Incorrect read data: {0}, should be {1}", read_data4[ii, jj], check[ii, jj]);
                            nerrors++;
                        }
                    }
                }

                // Close resources.
                H5T.close(typeId);
                H5A.close(attrId);
                H5D.close(dsetId);
                H5F.close(fileId);

                Console.WriteLine("\t\tPASSED");
            }
            catch (HDFException anyHDF5E)
            {
                Console.WriteLine(anyHDF5E.Message);
                nerrors++;
            }
            catch (System.Exception sysE)
            {
                Console.WriteLine(sysE.TargetSite);
                Console.WriteLine(sysE.Message);
                nerrors++;
            }
        } // test_attr_compound_read
예제 #28
0
        static void Main(string[] args)
        {
            try
            {
                // We will write and read an int array of this length.
                const int DATA_ARRAY_LENGTH = 12;

                // Rank is the number of dimensions of the data array.
                const int RANK = 1;

                // Create an HDF5 file.
                // The enumeration type H5F.CreateMode provides only the legal
                // creation modes.  Missing H5Fcreate parameters are provided
                // with default values.
                H5FileId fileId = H5F.create("myCSharp.h5",
                                             H5F.CreateMode.ACC_TRUNC);

                // Create a HDF5 group.
                H5GroupId groupId  = H5G.create(fileId, "/cSharpGroup");
                H5GroupId subGroup = H5G.create(groupId, "mySubGroup");

                // Close the subgroup.
                H5G.close(subGroup);

                // Prepare to create a data space for writing a 1-dimensional
                // signed integer array.
                long[] dims = new long[RANK];
                dims[0] = DATA_ARRAY_LENGTH;

                // Put descending ramp data in an array so that we can
                // write it to the file.
                int[] dset_data = new int[DATA_ARRAY_LENGTH];
                for (int i = 0; i < DATA_ARRAY_LENGTH; i++)
                {
                    dset_data[i] = DATA_ARRAY_LENGTH - i;
                }

                // Create a data space to accommodate our 1-dimensional array.
                // The resulting H5DataSpaceId will be used to create the
                // data set.
                H5DataSpaceId spaceId = H5S.create_simple(RANK, dims);

                // Create a copy of a standard data type.  We will use the
                // resulting H5DataTypeId to create the data set.  We could
                // have  used the HST.H5Type data directly in the call to
                // H5D.create, but this demonstrates the use of H5T.copy
                // and the use of a H5DataTypeId in H5D.create.
                H5DataTypeId typeId = H5T.copy(H5T.H5Type.NATIVE_INT);

                // Find the size of the type
                int typeSize = H5T.getSize(typeId);
                Console.WriteLine("typeSize is {0}", typeSize);

                // Set the order to big endian
                H5T.setOrder(typeId, H5T.Order.BE);

                // Set the order to little endian
                H5T.setOrder(typeId, H5T.Order.LE);

                // Create the data set.
                H5DataSetId dataSetId = H5D.create(fileId, "/csharpExample",
                                                   typeId, spaceId);

                // Write the integer data to the data set.
                H5D.write(dataSetId, new H5DataTypeId(H5T.H5Type.NATIVE_INT),
                          new H5Array <int>(dset_data));

                // If we were writing a single value it might look like this.
                //  int singleValue = 100;
                //  H5D.writeScalar(dataSetId,
                //                 new H5DataTypeId(H5T.H5Type.NATIVE_INT),
                //                 ref singleValue);

                // Create an integer array to receive the read data.
                int[] readDataBack = new int[DATA_ARRAY_LENGTH];

                // Read the integer data back from the data set
                H5D.read(dataSetId, new H5DataTypeId(H5T.H5Type.NATIVE_INT),
                         new H5Array <int>(readDataBack));

                // Echo the data
                for (int i = 0; i < DATA_ARRAY_LENGTH; i++)
                {
                    Console.WriteLine(readDataBack[i]);
                }

                // Close all the open resources.
                H5D.close(dataSetId);

                // Reopen and close the data sets to show that we can.
                dataSetId = H5D.open(fileId, "/csharpExample");
                H5D.close(dataSetId);
                dataSetId = H5D.open(groupId, "/csharpExample");

                H5D.close(dataSetId);
                H5T.close(typeId);
                H5G.close(groupId);

                // Get H5O info
                H5ObjectInfo objectInfo = H5O.getInfoByName(fileId,
                                                            "/csharpExample");

                Console.WriteLine("header.space.message is {0}",
                                  objectInfo.header.space.message);
                Console.WriteLine("fileNumber is {0}", objectInfo.fileNumber);
                Console.WriteLine("address is {0}", objectInfo.address);
                Console.WriteLine("type is {0}",
                                  objectInfo.objectType.ToString());
                Console.WriteLine("reference count is {0}",
                                  objectInfo.referenceCount);
                Console.WriteLine("modification time is {0}",
                                  objectInfo.modificationTime);
                Console.WriteLine("birth time is {0}",
                                  objectInfo.birthTime);
                Console.WriteLine("access time is {0}",
                                  objectInfo.accessTime);
                Console.WriteLine("change time is {0}",
                                  objectInfo.changeTime);
                Console.WriteLine("number of attributes is {0}",
                                  objectInfo.nAttributes);

                Console.WriteLine("header version is {0}",
                                  objectInfo.header.version);

                Console.WriteLine("header nMessages is {0}",
                                  objectInfo.header.nMessages);

                Console.WriteLine("header nChunks is {0}",
                                  objectInfo.header.nChunks);

                Console.WriteLine("header flags is {0}",
                                  objectInfo.header.flags);

                H5LinkInfo linkInfo = H5L.getInfo(fileId, "/cSharpGroup");

                Console.WriteLine(
                    "address: {0:x}, charSet: {1}, creationOrder: {2}",
                    linkInfo.address, linkInfo.charSet, linkInfo.creationOrder);

                Console.WriteLine("linkType: {0}, softLinkSizeOrUD: {1}",
                                  linkInfo.linkType, linkInfo.softLinkSizeOrUD);

                // Reopen the group id to show that we can.
                groupId = H5G.open(fileId, "/cSharpGroup");


                // Use H5L.iterate to visit links
                H5LIterateCallback myDelegate;
                myDelegate = MyH5LFunction;
                ulong             linkNumber = 0;
                H5IterationResult result     =
                    H5L.iterate(groupId, H5IndexType.NAME,
                                H5IterationOrder.INCREASING,
                                ref linkNumber, myDelegate, 0);

                // Create some attributes
                H5DataTypeId attributeType = H5T.copy(H5T.H5Type.NATIVE_INT);
                long[]       attributeDims = new long[1];
                const int    RAMP_LENGTH   = 5;
                attributeDims[0] = RAMP_LENGTH;
                int[] ascendingRamp = new int[RAMP_LENGTH] {
                    1, 2, 3, 4, 5
                };
                int[] descendingRamp = new int[RAMP_LENGTH] {
                    5, 4, 3, 2, 1
                };
                int[] randomData = new int[RAMP_LENGTH] {
                    3, 123, 27, 6, 1
                };
                int[] readBackRamp = new int[RAMP_LENGTH];



                // Call set buffer using H5Memory
                // Allocate memory from "C" runtime heap (not garbage collected)
                H5Memory typeConversionBuffer = new H5Memory(new IntPtr(DATA_ARRAY_LENGTH));
                H5Memory backgroundBuffer     = new H5Memory(new IntPtr(DATA_ARRAY_LENGTH));

                // Set the property list type conversion and background buffers.
                H5PropertyListId myPropertyListId =
                    H5P.create(H5P.PropertyListClass.DATASET_XFER);
                H5P.setBuffer(myPropertyListId,
                              typeConversionBuffer, backgroundBuffer);

                // Test use of vlen

                // Create a vlen data type
                H5DataTypeId tid1 = H5T.vlenCreate(H5T.H5Type.NATIVE_UINT);

                H5DataSetId vDataSetId = H5D.create(fileId, "/vlenTest", tid1,
                                                    spaceId);

                // Create a jagged array of integers.
                hvl_t[] vlArray = new hvl_t[DATA_ARRAY_LENGTH];

                // HDF5 variable length data types require the use of void
                // pointers.  C# requires that sections of code that deal
                // directly with pointer be marked
                // as unsafe.
                unsafe
                {
                    for (int i = 0; i < DATA_ARRAY_LENGTH; i++)
                    {
                        IntPtr ptr = new IntPtr((i + 1) * sizeof(int));
                        // Allocate memory that is not garbage collected.
                        vlArray[i].p = H5CrtHeap.Allocate(
                            new IntPtr((i + 1) * sizeof(int))
                            ).ToPointer();

                        // Fill the array with integers = the row number
                        int *intPointer = (int *)vlArray[i].p;
                        for (int j = 0; j < i + 1; j++)
                        {
                            intPointer[j] = (int)i;
                        }

                        if (IntPtr.Size == 8)
                        {
                            vlArray[i].len = (ulong)i + 1;
                        }
                        else
                        {
                            vlArray[i].len = (uint)i + 1;
                        }
                    }

                    // Write the variable length data
                    H5D.write(vDataSetId, tid1,
                              new H5Array <hvl_t>(vlArray));

                    // Create an array to read back the array.
                    hvl_t[] vlReadBackArray = new hvl_t[DATA_ARRAY_LENGTH];

                    // Read the array back
                    H5D.read(vDataSetId, tid1, new H5Array <hvl_t>(vlReadBackArray));

                    // Write the data to the console
                    for (int i = 0; i < DATA_ARRAY_LENGTH; i++)
                    {
                        int *iPointer = (int *)vlReadBackArray[i].p;
                        for (int j = 0; j < i + 1; j++)
                        {
                            Console.WriteLine(iPointer[j]);
                        }
                    }

                    // Reclaim the memory that read allocated
                    H5D.vlenReclaim(tid1, spaceId, new H5PropertyListId(H5P.Template.DEFAULT),
                                    new H5Array <hvl_t>(vlReadBackArray));

                    // Now read it back again using our own memory manager


                    //H5AllocateCallback allocDelegate = new H5AllocCallback(userAlloc);
                    H5FreeCallback freeDelegate = new H5FreeCallback(userFree);

                    H5PropertyListId memManagerPlist = H5P.create(H5P.PropertyListClass.DATASET_XFER);

                    unsafe
                    {
                        H5P.setVlenMemManager(memManagerPlist, userAlloc, IntPtr.Zero,
                                              freeDelegate, IntPtr.Zero);
                    }

                    // Read the array back
                    H5D.read(vDataSetId, tid1,
                             new H5DataSpaceId(H5S.H5SType.ALL),
                             new H5DataSpaceId(H5S.H5SType.ALL),
                             memManagerPlist,
                             new H5Array <hvl_t>(vlReadBackArray));

                    // Write the data to the console
                    for (int i = 0; i < DATA_ARRAY_LENGTH; i++)
                    {
                        int *iPointer = (int *)vlReadBackArray[i].p;
                        for (int j = 0; j < i + 1; j++)
                        {
                            Console.WriteLine(iPointer[j]);
                        }
                    }

                    // Reclaim the memory that read allocated using our free routines
                    H5D.vlenReclaim(tid1, spaceId, memManagerPlist,
                                    new H5Array <hvl_t>(vlReadBackArray));
                }
                H5S.close(spaceId);


                H5DataSpaceId attributeSpace =
                    H5S.create_simple(1, attributeDims);

                H5AttributeId attributeId =
                    H5A.create(groupId, "ascendingRamp", attributeType, attributeSpace);

                int offset = H5T.getOffset(attributeType);
                Console.WriteLine("Offset is {0}", offset);

                H5DataTypeId float32BE = H5T.copy(H5T.H5Type.IEEE_F32BE);
                H5T.Norm     norm      = H5T.getNorm(float32BE);
                Console.WriteLine("Norm is {0}", norm);


                int precision = H5T.getPrecision(float32BE);
                Console.WriteLine("Precision is {0}", precision);

                H5FloatingBitFields bitFields = H5T.getFields(float32BE);
                Console.WriteLine("getFields: sign bit position: {0}", bitFields.signBitPosition);
                Console.WriteLine("getFields: exponent bit position: {0}", bitFields.exponentBitPosition);
                Console.WriteLine("getFields: number of exponent bits: {0}", bitFields.nExponentBits);
                Console.WriteLine("getFields: mantissa bit position: {0} ", bitFields.mantissaBitPosition);
                Console.WriteLine("getFields: number of mantissa bits: {0}", bitFields.nMantissaBits);

                Console.Write("{0}", bitFields);
                // Write to an attribute
                H5A.write <int>(attributeId, attributeType,
                                new H5Array <int>(ascendingRamp));

                // Read from an attribute
                H5A.read <int>(attributeId, attributeType,
                               new H5Array <int>(readBackRamp));

                // Echo results
                Console.WriteLine("ramp elements are: ");
                foreach (int rampElement in readBackRamp)
                {
                    Console.WriteLine("   {0}", rampElement);
                }
                H5A.close(attributeId);

                // Create and write two more attributes.
                attributeId = H5A.createByName(groupId, ".", "descendingRamp",
                                               attributeType, attributeSpace);
                H5A.write <int>(attributeId, attributeType,
                                new H5Array <int>(descendingRamp));
                H5A.close(attributeId);

                attributeId = H5A.createByName(groupId, ".",
                                               "randomData", attributeType,
                                               attributeSpace);
                H5A.write <int>(attributeId, attributeType,
                                new H5Array <int>(randomData));

                // Read back the attribute data
                H5A.read <int>(attributeId, attributeType,
                               new H5Array <int>(readBackRamp));
                Console.WriteLine("ramp elements are: ");
                foreach (int rampElement in readBackRamp)
                {
                    Console.WriteLine("   {0}", rampElement);
                }
                H5A.close(attributeId);

                // Iterate through the attributes.
                long position = 0;
                H5AIterateCallback attributeDelegate;
                attributeDelegate = MyH5AFunction;
                H5ObjectInfo groupInfo = H5O.getInfo(groupId);
                Console.WriteLine(
                    "fileNumber: {0}, total space: {1}, referceCount: {2}, modification time: {3}",
                    groupInfo.fileNumber, groupInfo.header.space.total,
                    groupInfo.referenceCount, groupInfo.modificationTime);

                // While iterating, collect the names of all the attributes.
                ArrayList attributeNames = new ArrayList();
                H5A.iterate(groupId, H5IndexType.CRT_ORDER,
                            H5IterationOrder.INCREASING,
                            ref position, attributeDelegate,
                            (object)attributeNames);

                // Write out the names of the attributes
                foreach (string attributeName in attributeNames)
                {
                    Console.WriteLine("attribute name is {0}", attributeName);
                }

                // Demonstrate H5A.openName
                attributeId = H5A.openName(groupId, "descendingRamp");
                Console.WriteLine("got {0} by name", H5A.getName(attributeId));
                H5A.close(attributeId);

                // Demonstrate H5A.getNameByIndex
                string secondAttribute = H5A.getNameByIndex(groupId, ".",
                                                            H5IndexType.CRT_ORDER, H5IterationOrder.INCREASING, 1);

                Console.WriteLine("second attribute is named {0}",
                                  secondAttribute);

                // Demonstrate H5G.getInfo
                H5GInfo gInfo = H5G.getInfo(groupId);
                Console.WriteLine(
                    "link storage: {0}, max creation order: {1}, nLinks: {2}",
                    gInfo.linkStorageType, gInfo.maxCreationOrder, gInfo.nLinks);


                // Demonstrate H5A.getSpace
                //attributeId = H5A.openByName(groupId, ".", "descendingRamp");
                attributeId = H5A.open(groupId, "descendingRamp");
                H5DataSpaceId rampSpaceId = H5A.getSpace(attributeId);
                H5S.close(rampSpaceId);

                // Demonstrate H5A.getType
                H5DataTypeId rampTypeId = H5A.getType(attributeId);
                Console.WriteLine("size of ramp data type is {0} bytes.",
                                  H5T.getSize(rampTypeId));
                H5T.close(rampTypeId);

                // Demonstrate H5A.getInfo
                H5AttributeInfo rampInfo = H5A.getInfo(attributeId);
                Console.WriteLine(
                    "characterset: {0}, creationOrder: {1}, creationOrderValid: {2}, dataSize: {3}",
                    rampInfo.characterSet, rampInfo.creationOrder,
                    rampInfo.creationOrderValid, rampInfo.dataSize);

                // Demonstrate H5A.Delete
                H5A.Delete(groupId, "descendingRamp");
                //H5A.DeleteByName(groupId, ".", "descendingRamp");

                // Iterate through the attributes to show that the deletion
                // was successful.
                position = 0;
                ArrayList namesAfterDeletion = new ArrayList();
                H5A.iterate(groupId, H5IndexType.CRT_ORDER,
                            H5IterationOrder.DECREASING, ref position,
                            attributeDelegate,
                            (object)namesAfterDeletion);


                H5G.close(groupId);

                H5F.close(fileId);

                // Reopen and reclose the file.
                H5FileId openId = H5F.open("myCSharp.h5",
                                           H5F.OpenMode.ACC_RDONLY);
                H5F.close(openId);

                // Set the function to be called on error.
                unsafe
                {
                    H5AutoCallback myErrorDelegate = new H5AutoCallback(myErrorFunction);
                    H5E.setAuto(0, myErrorDelegate, IntPtr.Zero);
                }

                // Uncomment the next line if you want to generate an error to
                // test H5E.setAuto
                // H5G.open(openId, "noGroup");
            }
            // This catches all the HDF exception classes.  Because each call
            // generates a unique exception, different exception can be handled
            // separately.  For example, to catch open errors we could have used
            // catch (H5FopenException openException).
            catch (HDFException e)
            {
                Console.WriteLine(e.Message);
            }

            Console.WriteLine("Processing complete!");
            Console.ReadLine();
        }
예제 #29
0
        static void test_attr_basic_write()
        {
            try
            {
                Console.Write("Testing Basic Scalar Attribute Writing Functions");

                // Create a new file using H5F_ACC_TRUNC access,
                // default file creation properties, and default file
                // access properties.
                H5FileId fileId = H5F.create(FILE_NAME, H5F.CreateMode.ACC_TRUNC);

                // Copy datatype for use.
                H5DataTypeId typeId = H5T.copy(H5T.H5Type.NATIVE_INT);

                // Open the root group.
                H5GroupId groupId = H5G.open(fileId, "/");

                // Create dataspace for attribute.
                hssize_t[]    gdims     = { GATTR_DIM1, GATTR_DIM2 };
                H5DataSpaceId gspace_Id = H5S.create_simple(GATTR_RANK, gdims);

                // Create an attribute for the group.
                H5AttributeId attrId = H5A.create(groupId, RGATTR_NAME, typeId, gspace_Id);
                H5A.close(attrId);
                H5G.close(groupId);

                // Create a group in this file.
                groupId = H5G.create(fileId, GROUP1_NAME);

                // Create an attribute for group /Group1.
                attrId = H5A.create(groupId, GATTR_NAME, typeId, gspace_Id);
                H5A.write(attrId, typeId, new H5Array <int>(gattr_data));

                // Create the dataspace.
                hssize_t[]    dims1     = { SPACE1_DIM1, SPACE1_DIM2 };
                H5DataSpaceId space1_Id = H5S.create_simple(SPACE1_RANK, dims1);

                // Create a dataset using default properties.
                H5DataSetId dsetId = H5D.create(fileId, DSET1_NAME, H5T.H5Type.NATIVE_UCHAR, space1_Id);

                // Close objects and file.
                H5A.close(attrId);
                H5D.close(dsetId);
                H5G.close(groupId);
                H5F.close(fileId);

                // Open the file again.
                fileId = H5F.open(FILE_NAME, H5F.OpenMode.ACC_RDWR);

                // Open the root group.
                groupId = H5G.open(fileId, "/");

                // Open attribute again.
                attrId = H5A.open(groupId, RGATTR_NAME);

                // Close attribute and root group.
                H5A.close(attrId);
                H5G.close(groupId);

                // Open dataset.
                dsetId = H5D.open(fileId, DSET1_NAME);

                // Create the dataspace for dataset's attribute.
                hssize_t[]    attdims    = { ATTR1_DIM };
                H5DataSpaceId attspaceId = H5S.create_simple(ATTR1_RANK, attdims);

                // Create an attribute for the dataset.
                attrId = H5A.create(dsetId, D1ATTR1_NAME, typeId, attspaceId);

                // Try to create the same attribute again (should fail.)
                try
                {
                    H5AttributeId attr_twice = H5A.create(dsetId, D1ATTR1_NAME, typeId, attspaceId);

                    // should fail, but didn't, print an error message.
                    Console.WriteLine("\ntest_attr_basic_write: Attempting to create an existing attribute.");
                    nerrors++;
                }
                catch (HDFException) { } // does nothing, it should fail

                // Write attribute information.
                int[] attr_data1 = new int[] { 512, -234, 98123 }; /* Test data for 1st attribute */
                H5A.write(attrId, typeId, new H5Array <int>(attr_data1));

                // Create another attribute for the dataset.
                H5AttributeId attr2Id = H5A.create(dsetId, D1ATTR2_NAME, typeId, attspaceId);

                // Write attribute information.
                int[] attr_data2 = new int[] { 256, 11945, -22107 };
                H5A.write(attr2Id, typeId, new H5Array <int>(attr_data2));

                // Read attribute information immediately, without closing attribute.
                int[] read_data1 = new int[3];
                H5A.read(attrId, typeId, new H5Array <int>(read_data1));

                // Verify values read in.
                int ii;
                for (ii = 0; ii < ATTR1_DIM; ii++)
                {
                    if (attr_data1[ii] != read_data1[ii])
                    {
                        Console.WriteLine("\ntest_attr_basic_write: check1: read value differs from input: read {0} - input {1}", read_data1[ii], attr_data1[ii]);
                        nerrors++;
                    }
                }

                // Close attributes.
                H5A.close(attrId);
                H5A.close(attr2Id);

                // Open attribute again and verify its name.
                attrId = H5A.openIndex(dsetId, 0);

                string attr_name = H5A.getName(attrId);
                if (attr_name != D1ATTR1_NAME)
                {
                    Console.WriteLine("\ntest_attr_basic_write: attribute name incorrect: is {0} - should be {1}", attr_name, D1ATTR1_NAME);
                    nerrors++;
                }

                // Close attribute.
                H5A.close(attrId);

                // Open the second attribute again and verify its name.
                attr2Id   = H5A.openIndex(dsetId, 1);
                attr_name = H5A.getName(attr2Id);
                if (attr_name != D1ATTR2_NAME)
                {
                    Console.WriteLine("\ntest_attr_basic_write: attribute name incorrect: is {0} - should be {1}", attr_name, D1ATTR2_NAME);
                    nerrors++;
                }
                // Close all objects.
                H5A.close(attr2Id);
                H5S.close(space1_Id);
                H5S.close(gspace_Id);
                H5D.close(dsetId);
                H5F.close(fileId);

                Console.WriteLine("\tPASSED");
            } // end try block
            catch (HDFException anyHDF5E)
            {
                Console.WriteLine(anyHDF5E.Message);
                nerrors++;
            }
            catch (System.Exception sysE)
            {
                Console.WriteLine(sysE.TargetSite);
                Console.WriteLine(sysE.Message);
                nerrors++;
            }
        } // test_attr_basic_write
예제 #30
0
        static void ReadFile(string filePath)
        {
            var file = H5F.open(filePath, H5F.ACC_RDONLY);

            IterateObjects(file);

            var group = H5G.open(file, "group");

            IterateObjects(group);
            H5G.close(group);

            var dataSet = H5D.open(file, "/group/dataset");

            IterateObjects(dataSet);

            var dataSpace = H5D.get_space(dataSet);

            var rank = H5S.get_simple_extent_ndims(dataSpace);

            if (rank == 2)
            {
                var dims = new ulong[2];
                H5S.get_simple_extent_dims(dataSpace, dims, null);

                var data = new int[dims[0], dims[1]];
                H5D.read(dataSet, H5T.NATIVE_INT, H5S.ALL, H5S.ALL, H5P.DEFAULT, new PinnedObject(data));

                for (int i = 0; i < data.GetLength(0); ++i)
                {
                    for (int j = 0; j < data.GetLength(1); ++j)
                    {
                        Write($"{data[i,j],3}");
                    }
                    WriteLine();
                }
            }

            H5S.close(dataSpace);

            var doubleAttribute = H5A.open(dataSet, "double");

#if true
            //double pi = 0.0; // Won't work
            object pi = 0.0;
            H5A.read(doubleAttribute, H5T.NATIVE_DOUBLE, new PinnedObject(pi));
            WriteLine($"PI = {pi}");
#else
            var values = new double[1];
            H5A.read(doubleAttribute, H5T.NATIVE_DOUBLE, new PinnedObject(values));
            WriteLine($"PI = {values[0]}");
#endif
            H5A.close(doubleAttribute);

            WriteLine($"string: {ReadStringAttribute(dataSet, "string")}");
            WriteLine($"string-ascii: {ReadStringAttribute(dataSet, "string-ascii")}");
            WriteLine($"string-vlen: {ReadStringAttribute(dataSet, "string-vlen")}");
            WriteLine($"boolean-8-bit-enum: {ReadEnumAttribute<Boolean>(dataSet, "boolean-8-bit-enum")}");

            H5D.close(dataSet);
            H5F.close(file);
        }