Am 31.07.2013, 22:40 Uhr, schrieb Peter Colberg
<address@hidden>:
Hi all,
I have discovered the perfect implementation of units in H5MD :-).
Please marvel at the output of the attached example:
HDF5 "h5md_units.h5" {
GROUP "/" {
ATTRIBUTE "data" {
DATATYPE "/units/acceleration"
DATASPACE SCALAR
DATA {
(0): 9.81
}
}
GROUP "units" {
DATATYPE "acceleration" H5T_IEEE_F64LE;
ATTRIBUTE "unit" {
DATATYPE H5T_STRING {
STRSIZE H5T_VARIABLE;
STRPAD H5T_STR_NULLTERM;
CSET H5T_CSET_UTF8;
CTYPE H5T_C_S1;
}
DATASPACE SCALAR
DATA {
(0): "meter per square second"
}
}
}
}
}
I will prepare a complete H5MD units proposal for your consideration.
Peter
Hi Peter,
Thanks for working out the example. It is an interesting solution, and I
consider it superior over the compound type way.
I played a bit with h5py, which seems to ignore user-defined types
unfortunately. The type is immediately converted to a NumPy type, and it
is not possible (for me) to retrieve the actual HDF5 type of the
attribute (and the 'unit' attribute of this type):
import h5py
f = h5py.File('h5md_units.h5')
t = f['units/acceleration']
print f.attrs['data'].dtype
f.create_dataset('dataset', dtype=t, data=(1,2))
print type(f['dataset'])
print f['dataset'].dtype
f.close()
The output is:
float64
<class 'h5py._hl.dataset.Dataset'>
float64
And the new dataset is shown by h5dump as:
DATASET "dataset" {
DATATYPE H5T_IEEE_F64LE
DATASPACE SIMPLE { ( 2 ) / ( 2 ) }
DATA {
(0): 1, 2
}
}
Maybe there is still a trick with h5py. But a solution that works only
with low-level APIs would not be practical either :-(
Cheers,
Felix