Source code for E200.E200_api_getdat

import os
on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
if on_rtd:
    import re as _np
    import re as h5
else:
    import numpy as _np
    import h5py as h5
import logging
logger = logging.getLogger(__name__)
from .E200_Dat import *
__all__ = ['E200_api_getdat', '_numarray2str']


def _numarray2str(numarray):
    chars = [chr(val) for val in numarray.flatten()]
    string = ''.join(chars)
    return string


[docs]def E200_api_getdat(dataset, UID=None, fieldname='dat'): """ Load data from a *dataset*, which must be either an :class:`E200.Drill` or an :class:`h5py.Group` class. If no *UID* is given, all available UIDs are loaded. The *fieldname* determines which member is loaded from the *dataset*. Returns an instance of :class:`E200.E200_Dat`. """ if type(dataset) != h5.Group: dataset = dataset._hdf5 logger.log(level=10, msg='==============================') logger.debug('Accessing: {}'.format(dataset.name)) # ====================================== # Check version # ====================================== version_bool = 'origin' in dataset.file.attrs.keys() if version_bool: python_version_bool = (dataset.file.attrs['origin'] == 'python-h5py') else: python_version_bool = False logger.debug('Matlab version: {}'.format(not python_version_bool)) # ====================================== # Get available UIDs in dataset # ====================================== avail_uids = dataset['UID'].value if python_version_bool: if fieldname == 'dat': # ====================================== # Build data from HDF5 refs # ====================================== dat_refs = dataset['dat'].value vals = _np.empty((avail_uids.shape[0], ), dtype=_np.object) for i, val in enumerate(dat_refs): vals[i] = dataset.file[val].value else: vals = dataset[fieldname].value else: # ====================================== # Deref if necessary # ====================================== if type(dataset[fieldname][0][0]) == h5.h5r.Reference: vals = [dataset.file[val[0]] for val in dataset[fieldname]] else: vals = [val for val in dataset[fieldname]] if vals[0].shape[0] > 1: vals = [_np.array(val).flatten() for val in vals] # vals = [''.join(vec.view('S2')) for vec in vals] vals = [[chr(vec) for vec in val] for val in vals] vals = [''.join(val) for val in vals] vals = _np.array(vals) else: vals = [val[0] for val in vals] vals = _np.array(vals) avail_uids_num = _np.size(avail_uids) logger.debug('Number of available uids: {}'.format(avail_uids_num)) if (UID is None): # ====================================== # Return all results if no UID requested # ====================================== out_uids = avail_uids out_vals = vals elif avail_uids_num == 1: # ====================================== # Match UIDs # ====================================== if avail_uids == UID: logger.debug('Not empty') out_uids = _np.array([avail_uids]) out_vals = _np.array([vals]).flatten() else: out_uids = _np.array([]) out_vals = _np.array([]) else: # ====================================== # Match UIDs # ====================================== valbool = _np.in1d(avail_uids, UID) out_vals = vals[valbool] out_uids = avail_uids[valbool] # ====================================== # Sort UIDs # ====================================== ind_sort = _np.argsort(out_uids.flatten()) out_uids = out_uids[ind_sort] out_vals = out_vals[ind_sort] n_uids = _np.size(out_uids) logger.debug('Number of UIDs found: {}'.format(n_uids)) if n_uids > 10: logger.debug('Showing only first 10 UIDs') show_uids = out_uids[0:10] else: show_uids = out_uids for uid in show_uids: try: debug_uid = _np.int64(uid[0]) except IndexError: debug_uid = _np.int64(uid) logger.debug('UID: {:d}'.format(debug_uid)) # out_uids = _np.array([out_uids]).flatten() return E200_Dat(out_vals, out_uids, field=fieldname)