Source code for E200.classes

import os as _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
from .E200_api_getdat import E200_api_getdat
from .E200_Dat import *                        # noqa

__all__ = ['Data', 'Drill', 'E200_Dat', 'E200_Image']


[docs]class Data(object): """ Top-level data file representing all information for a single dataset loaded from *filename*. *read_file* (type :class:`h5py._hl.files.File`, an h5py file) is the loaded data, to be read-only. **Should not be created directly, only accessed through** :func:`E200.E200_load_data` **or** :func:`E200.E200_load_data_gui`\ **.** """ def __init__(self, read_file, filename=None): self._filename = filename self.read_file = read_file self.rdrill = Drill(read_file) # self.data=datalevel() # recursivePopulate(self._data, self) def __enter__(self): return self @property def filename(self): """ The *filename* the dataset was loaded with. """ return self._filename @property def loadname(self): """ The name of the dataset (i.e. :code:`'E217_17990'`). """ return _os.path.splitext(_os.path.basename(self.filename))[0]
[docs] def close(self): """ Closes the *read_file* """ self.read_file.close()
def __exit__(self, type, value, traceback): self.close()
[docs]class Drill(object): """ Designed for representing hierarchical h5py data. *data* (type :class:`h5py._hl.files.File`, an h5py file) is the h5py file at a particular hierarchical depth. Members: If not nested :class:`E200.Drill` objects, they may be arrays representing various types of information particular to their parent. **Should not be created directly, only accessed through** :func:`E200.E200_load_data` **or** :func:`E200.E200_load_data_gui`\ **.** """ def __init__(self, data): self._hdf5 = data for key in data.keys(): if key[0] != '#': out = data[key] if type(out) == _h5._hl.group.Group: setattr(self, key, Drill(out)) elif key == 'desc': desc = out.value.flatten() desc = desc.view('S2') desc = _np.char.decode(desc, 'UTF-8') setattr(self, key, ''.join(desc)) elif key == 'dat' and ('UID' in data.keys()): uids = data['UID'].value dats = E200_api_getdat(data, uids) setattr(self, key, dats.dat) elif len(out.shape) == 2: if out.shape[0] == 1 or out.shape[1] == 1: out = out.value.flatten() setattr(self, key, out) elif key == 'UID': setattr(self, key, out.value) else: setattr(self, key, out) def __repr__(self): out = '\<E200.E200_load_data.Drill with keys:\n_hdf5' for val in self._hdf5.keys(): out = out + '\n' + val out = out[1:] + '\n>' return out
[docs]class E200_Image(E200_Dat): """ Bases: :class:`E200.E200_Dat` Contains image data. This is designed to prevent accidental incorrect correlation of images with UIDs, in case a request for images cannot find UIDs. **Should not be created directly, only accessed through** :func:`E200.E200_load_images`\ **.** """ def __init__(self, images, dat, uid, timestamps, image_backgrounds=None): self._imgs_subbed = None E200_Dat.__init__(self, dat, uid, field='dat') self._images = images self._image_backgrounds = image_backgrounds self._timestamps = timestamps @property def images(self): """ An array of images, correlated with :attr:`E200.E200_Image.UID`. """ return self._images @property def image_backgrounds(self): """ An array of image backgrounds, correlated with :attr:`E200.E200_Image.UID`. """ return self._image_backgrounds @property def imgs_subbed(self): """ An array of images with backgrounds subtracted, correlated with :attr:`E200.E200_Image.UID`. """ if self._imgs_subbed is None: self._imgs_subbed = self.images - 2*_np.fliplr(self.image_backgrounds) return self._imgs_subbed @property def timestamps(self): """ An array of timestamps indicating when :attr:`E200.E200_Image.images` were taken, correlated with :attr:`E200.E200_Image.UID`. """ return self._timestamps