Source code for anypytools.h5py_wrapper

# -*- coding: utf-8 -*-
"""
Created on Mon Jan 16 11:40:42 2012.

@author: mel
"""
import logging

import h5py

logger = logging.getLogger("abt.anypytools")


def _follow_reftarget(elem):
    completename = elem.attrs["CompleteName"]
    completename = completename.replace(b".", b"/")
    reftarget = elem.attrs["RefTarget"].replace(b".", b"/")
    prefix = completename[: -len(elem.name)]
    h5target = reftarget[len(prefix) :]
    elem = elem.file[h5target]
    return elem


def _check_input_path(path):
    """Convert dot notation to stardard h5py path."""
    if "/" not in path:
        # path does not have traditional h5 format.
        if path.startswith("Main.") and "Output" in path:
            path = "/Output" + path.split("Output")[-1]
        path = path.replace(".", "/")
    return path


[docs]class File(h5py.File): # noqa __doc__ = h5py.File.__doc__ def __init__(self, *args, **kwargs): # noqa super(File, self).__init__(*args, **kwargs) self.wrapped = True def __getitem__(self, path): # noqa """.""" path = _check_input_path(path) try: elem = super(File, self).file[path] if isinstance(elem, h5py.Group) and not len(elem.keys()): if "RefTarget" in elem.attrs: elem = _follow_reftarget(elem) except KeyError: elem = super(type(self), self) levels = path.strip("/").split("/") for level in levels: if elem.__contains__(level): elem = elem.__getitem__(level) else: try: if "RefTarget" in elem.attrs: elem = _follow_reftarget(elem) elem = elem.__getitem__(level) except Exception: raise KeyError("Entry not found: " + path) if isinstance(elem, h5py.Group): return Group(elem.id) elif isinstance(elem, h5py.Dataset): return Dataset(elem.id) elif isinstance(elem, h5py.File): return File(elem.id)
[docs] def get(self, path, *args): try: return self.__getitem__(path) except KeyError: if len(args) == 0: raise return args[0]
@property def file(self): # noqa id = super(File, self).file.id return File(id) @property def parent(self): # noqa id = super(File, self).parent.id return Group(id) def __contains__(self, name): # noqa """Test if a member name exists""" if super(File, self).__contains__(name): return True else: try: self.__getitem__(name) return True except KeyError: pass return False
[docs] def resolve_anyreference(self, path): """Resolve anyreference in the file.""" elem = self.__getitem__(path) return elem.id
[docs]class Group(h5py.Group): # noqa __doc__ = h5py.Group.__doc__ def __init__(self, arg): # noqa super(Group, self).__init__(arg) self.wrapped = True def __getitem__(self, path): # noqa path = _check_input_path(path) try: elem = super(Group, self).__getitem__(path) if isinstance(elem, h5py.Group) and not len(elem.keys()): if "RefTarget" in elem.attrs: elem = _follow_reftarget(elem) except KeyError: elem = super(type(self), self) levels = path.strip("/").split("/") for level in levels: if elem.__contains__(level): elem = elem.__getitem__(level) else: try: if "RefTarget" in elem.attrs: elem = _follow_reftarget(elem) elem = elem.__getitem__(level) except Exception: raise KeyError("Entry not found: " + path) if isinstance(elem, h5py.Group): return Group(elem.id) elif isinstance(elem, h5py.Dataset): return Dataset(elem.id) elif isinstance(elem, h5py.File): return File(elem.id)
[docs] def get(self, path, *args): try: return self.__getitem__(path) except KeyError: if len(args) == 0: raise return args[0]
@property def file(self): # noqa id = super(Group, self).file.id return File(id) @property def parent(self): # noqa id = super(Group, self).parent.id return Group(id) def __contains__(self, name): # noqa """Test if a member name exists""" if super(Group, self).__contains__(name): return True else: try: self.__getitem__(name) return True except KeyError: pass return False
class Dataset(h5py.Dataset): # noqa __doc__ = h5py.Dataset.__doc__ def __init__(self, arg): # noqa super(Dataset, self).__init__(arg) self.wrapped = True @property def file(self): # noqa id = super(Dataset, self).file.id return File(id) @property def parent(self): # noqa id = super(Dataset, self).parent.id return Group(id)