Source code for km3pipe.utils.hdf2root

# Filename: cmd.py
"""
Convert HDF5 to vanilla ROOT.

Can convert multiple files at once, "foo.h5" -> "foo.h5.root".

Usage:
     hdf2root [--verbose] FILES...
     hdf2root (-h | --help)
     hdf2root --version

Options:
    -h --help           Show this screen.
    --verbose           Print more info [default: False]
"""

import numpy as np

from km3pipe import version

__author__ = "Moritz Lotze"
__copyright__ = "Copyright 2016, Tamas Gal and the KM3NeT collaboration."
__credits__ = []
__license__ = "MIT"
__maintainer__ = "Tamas Gal and Moritz Lotze"
__email__ = "tgal@km3net.de"
__status__ = "Development"


[docs]def hdf2root(infile, outfile, verbose=False): try: from rootpy.io import root_open from rootpy import asrootpy from root_numpy import array2tree except ImportError: raise ImportError( "Please load ROOT into PYTHONPATH and install rootpy+root_numpy:\n" " `pip install rootpy root_numpy`" ) from tables import open_file h5 = open_file(infile, 'r') rf = root_open(outfile, 'recreate') # 'walk_nodes' does not allow to check if is a group or leaf # exception handling is bugged # introspection/typecheck is buged # => this moronic nested loop instead of simple `walk` for group in h5.walk_groups(): for leafname, leaf in group._v_leaves.items(): arr = leaf[:] if arr.dtype.names is None: dt = np.dtype((arr.dtype, [(leafname, arr.dtype)])) arr = arr.view(dt) treename = leaf._v_pathname.replace('/', '_') tree = asrootpy(array2tree(arr, name=treename)) tree.write() rf.close() h5.close()
[docs]def main(): from docopt import docopt args = docopt(__doc__, version=version) files = args['FILES'] verbose = bool(args['--verbose']) for fn in files: print('Converting {}...'.format(fn)) hdf2root(fn, fn + '.root', verbose=verbose)