| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | """ |
| | Implements support for HDF5 dimension scales. |
| | """ |
| |
|
| | import warnings |
| |
|
| | from .. import h5ds |
| | from ..h5py_warnings import H5pyDeprecationWarning |
| | from . import base |
| | from .base import phil, with_phil |
| | from .dataset import Dataset |
| |
|
| |
|
| | class DimensionProxy(base.CommonStateObject): |
| |
|
| | """ |
| | Represents an HDF5 "dimension". |
| | """ |
| |
|
| | @property |
| | @with_phil |
| | def label(self): |
| | """ Get or set the dimension scale label """ |
| | |
| | |
| | |
| | try: |
| | dset = Dataset(self._id) |
| | return dset.attrs['DIMENSION_LABELS'][self._dimension] |
| | except (KeyError, IndexError): |
| | return '' |
| | @label.setter |
| | @with_phil |
| | def label(self, val): |
| | |
| | h5ds.set_label(self._id, self._dimension, self._e(val)) |
| |
|
| | @with_phil |
| | def __init__(self, id_, dimension): |
| | self._id = id_ |
| | self._dimension = dimension |
| |
|
| | @with_phil |
| | def __hash__(self): |
| | return hash((type(self), self._id, self._dimension)) |
| |
|
| | @with_phil |
| | def __eq__(self, other): |
| | return hash(self) == hash(other) |
| |
|
| | @with_phil |
| | def __iter__(self): |
| | for k in self.keys(): |
| | yield k |
| |
|
| | @with_phil |
| | def __len__(self): |
| | return h5ds.get_num_scales(self._id, self._dimension) |
| |
|
| | @with_phil |
| | def __getitem__(self, item): |
| |
|
| | if isinstance(item, int): |
| | scales = [] |
| | h5ds.iterate(self._id, self._dimension, scales.append, 0) |
| | return Dataset(scales[item]) |
| |
|
| | else: |
| | def f(dsid): |
| | """ Iterate over scales to find a matching name """ |
| | if h5ds.get_scale_name(dsid) == self._e(item): |
| | return dsid |
| |
|
| | res = h5ds.iterate(self._id, self._dimension, f, 0) |
| | if res is None: |
| | raise KeyError(item) |
| | return Dataset(res) |
| |
|
| | def attach_scale(self, dset): |
| | """ Attach a scale to this dimension. |
| | |
| | Provide the Dataset of the scale you would like to attach. |
| | """ |
| | with phil: |
| | h5ds.attach_scale(self._id, dset.id, self._dimension) |
| |
|
| | def detach_scale(self, dset): |
| | """ Remove a scale from this dimension. |
| | |
| | Provide the Dataset of the scale you would like to remove. |
| | """ |
| | with phil: |
| | h5ds.detach_scale(self._id, dset.id, self._dimension) |
| |
|
| | def items(self): |
| | """ Get a list of (name, Dataset) pairs with all scales on this |
| | dimension. |
| | """ |
| | with phil: |
| | scales = [] |
| |
|
| | |
| | |
| | if len(self) > 0: |
| | h5ds.iterate(self._id, self._dimension, scales.append, 0) |
| |
|
| | return [ |
| | (self._d(h5ds.get_scale_name(x)), Dataset(x)) |
| | for x in scales |
| | ] |
| |
|
| | def keys(self): |
| | """ Get a list of names for the scales on this dimension. """ |
| | with phil: |
| | return [key for (key, _) in self.items()] |
| |
|
| | def values(self): |
| | """ Get a list of Dataset for scales on this dimension. """ |
| | with phil: |
| | return [val for (_, val) in self.items()] |
| |
|
| | @with_phil |
| | def __repr__(self): |
| | if not self._id: |
| | return "<Dimension of closed HDF5 dataset>" |
| | return ('<"%s" dimension %d of HDF5 dataset at %s>' |
| | % (self.label, self._dimension, id(self._id))) |
| |
|
| |
|
| | class DimensionManager(base.CommonStateObject): |
| |
|
| | """ |
| | Represents a collection of dimension associated with a dataset. |
| | |
| | Like AttributeManager, an instance of this class is returned when |
| | accessing the ".dims" property on a Dataset. |
| | """ |
| |
|
| | @with_phil |
| | def __init__(self, parent): |
| | """ Private constructor. |
| | """ |
| | self._id = parent.id |
| |
|
| | @with_phil |
| | def __getitem__(self, index): |
| | """ Return a Dimension object |
| | """ |
| | if index > len(self) - 1: |
| | raise IndexError('Index out of range') |
| | return DimensionProxy(self._id, index) |
| |
|
| | @with_phil |
| | def __len__(self): |
| | """ Number of dimensions associated with the dataset. """ |
| | return self._id.rank |
| |
|
| | @with_phil |
| | def __iter__(self): |
| | """ Iterate over the dimensions. """ |
| | for i in range(len(self)): |
| | yield self[i] |
| |
|
| | @with_phil |
| | def __repr__(self): |
| | if not self._id: |
| | return "<Dimensions of closed HDF5 dataset>" |
| | return "<Dimensions of HDF5 object at %s>" % id(self._id) |
| |
|
| | def create_scale(self, dset, name=''): |
| | """ Create a new dimension, from an initial scale. |
| | |
| | Provide the dataset and a name for the scale. |
| | """ |
| | warnings.warn("other_ds.dims.create_scale(ds, name) is deprecated. " |
| | "Use ds.make_scale(name) instead.", |
| | H5pyDeprecationWarning, stacklevel=2, |
| | ) |
| | dset.make_scale(name) |
| |
|