3
0
mirror of https://github.com/triqs/dft_tools synced 2024-11-01 19:53:45 +01:00
dft_tools/doc/reference/python/data_analysis/hdf5/ref.rst
Olivier Parcollet f2c7d449cc First commit : triqs libs version 1.0 alpha1
for earlier commits, see TRIQS0.x repository.
2013-07-17 19:24:07 +02:00

219 lines
6.2 KiB
ReStructuredText

Reference manual
##############################
The :class:`HDFArchive` class offers a convenient interface between the python objects and the HDF5 files,
similar to a dictionary (or a shelve).
The module contains two classes :
* :class:`HDFArchiveGroup` : operates on a subtree of the HDF5 file
* :class:`HDFArchive` : an :class:`HDFArchiveGroup` at the root path, with a simple constructor.
* :class:`HDFArchiveInert` :
Typically, one constructs an :class:`HDFArchive` explicitely, the :class:`HDFArchiveGroup` is created during operations, e.g.::
h = HDFArchive( "myfile.h5", 'r')
g = h['subgroup1'] # g is a HDFArchiveGroup.
Apart from the root path and the constructor, the classes are the same (in fact :class:`HDFArchive` `is a` :class:`HDFArchiveGroup`).
Let us first document :class:`HDFArchive`.
.. warning::
:class:`HDFArchive` and :class:`HDFArchiveGroup` do **NOT** handle parallelism.
Check however the :class:`HDFArchiveInert` below.
HDFArchive
=======================================
.. autoclass:: pytriqs.archive.HDFArchive
HDFArchiveGroup
=======================================
.. class:: HDFArchiveGroup
There is no explicit constructor for the user of the class.
The :class:`HDFArchiveGroup` support most of the operations supported by dictionaries. In the following, *H* is a :class:`HDFArchiveGroup`.
.. describe:: len(H)
Return the number of items in the :class:`HDFArchiveGroup` *H*.
.. describe:: H[key]
Return the item of *H* with key *key*, retrieved from the file. Raises a :exc:`KeyError` if *key*
is not in the :class:`HDFArchiveGroup`.
.. method:: get_raw (key)
Returns the subgroup key, **without any reconstruction**, ignoring the HDF5_data_scheme.
.. describe:: H[key] = value
Set ``H[key]`` to *value*.
.. describe:: del H[key]
Remove ``H[key]`` from *H*. Raises a :exc:`KeyError` if *key* is not in the
:class:`HDFArchiveGroup`.
.. describe:: key in H
Return ``True`` if *H* has a key *key*, else ``False``.
.. describe:: key not in H
Equivalent to ``not key in H``.
.. describe:: iter(H)
Return an iterator over the keys of the dictionary. This is a shortcut
for :meth:`iterkeys`.
.. method:: items()
Generator returning couples (key, values) in the group.
.. warning::
Note that in all these iterators, the objects will only be retrieved from the file and loaded into memory
one by one.
.. method:: keys()
Generator returning the keys of the group.
.. method:: update(d)
Add into the archive the content of any mapping *d* : keys->values, with
hfd-compliant values.
.. method:: values()
Generator returning the values in the group
.. method:: create_group(K)
Creates a new subgroup named `K` to the root path of the group.
Raises exception if the subgroup already exists.
.. method:: is_group(K)
Return True iif K is a subgroup.
.. method:: is_data(K)
Return True iif K is a leaf.
.. method:: read_attr(AttributeName)
Return the attribute `AttributeName` of the root path of the group.
If there is no attribute, return None.
.. method:: root_path()
Return the root path of the group
.. method:: apply_on_leaves (f)
For each named leaf (name,value) of the tree, it calls `f(name,value)`.
f should return :
- `None` : no action is taken
- an `empty tuple` () : the leaf is removed from the tree
- an hdf-compliant value : the leaf is replaced by the value
HDFArchiveInert
=======================================
.. class:: HDFArchiveInert
:class:`HDFArchive` and :class:`HDFArchiveGroup` do **NOT** handle parallelism.
In general, one wish to write/read only on master node, which is a good practice
cluster : reading from all nodes may lead to communication problems.
To simplify the writing of code, the simple HDFArchiveInert class may be useful.
It is basically inert but does not fail.
.. describe:: H[key]
Return H and never raise exception so e.g. H['a']['b'] never raise exception...
.. describe:: H[key] = value
Does nothing
Usage in a mpi code, e.g. ::
R = HDFArchive("Results.h5",'w') if mpi.is_master_node() else HDFArchiveInert()
a= mpi.bcast(R['a']) # properly broadcast the R['a'] from the master to the nodes.
R['b'] = X # sets R['b'] in the file on the master only, does nothing on the nodes.
.. highlight:: python
.. _HDF_Protocol:
Hdf-compliant objects
=======================================
By definition, hdf-compliant objects are those which can be stored/retrieved in an :class:`HDFArchive`.
In order to be hdf-compliant, a class must :
* have a `HDF5_data_scheme` tag properly registered.
* implement one of the two protocols described below.
.. _HDF_Protocol_data_scheme:
HDF5 data scheme
-----------------------
To each hdf-compliant object, we associate
a `data scheme` which describes how the data is stored in the hdf5 tree,
i.e. the tree structure with the name of the nodes and their contents.
This `data scheme` is added in the attribute `HDF5_data_scheme`
at the node corresponding to the object in the file.
For a given class `Cls`, the `HDF5_data_scheme` is `Cls._hdf5_data_scheme_` if it exists or the name of the class `Cls.__name__`.
The `HDF5_data_scheme` of a class must be registered in order for :class:`HDFArchive` to properly reconstruct the object when rereading.
The class is registered using the module `hdf_archive_schemes` ::
class myclass :
pass #....
from pytriqs.archive.hdf_archive_schemes import register_class
register_class (myclass)
The function is
.. py:function:: register_class (cls [, doc = None] )
:param cls: the class to be registered.
:param doc: a doc directory
Register the class for :class:`HDFArchive` use.
The name of `data scheme` will be `myclass._hdf5_data_scheme_` if it is defined, or the name of the class otherwise.
.. _HDF_Protocol_details:
How to become hdf-compliant ?
-----------------------------------
There are two ways in which a class can become hdf-compliant:
.. toctree::
:maxdepth: 1
protocol1
protocol2