def _store_property(self, path, property): universe = property.universe universe_path = self._get_path(universe) if universe_path is None: raise IOError("universe must be stored first") element_shape = property.data.shape[1:] if element_shape: dtype = N.dtype((property.data.dtype, element_shape)) else: dtype = property.data.dtype arr = N.ascontiguousarray(property.data) ds = self.root.require_dataset(path, shape=(len(arr),), dtype=dtype) self._stamp(ds, 'property') ds.attrs['universe'] = self.root[universe_path].ref ds.attrs['name'] = ascii(property.name) ds.attrs['units'] = ascii(property.units) ds.attrs['property_type'] = ascii(property.type) # There doesn't seem to be any way to write this array # using high-level operations, so we use the low-level access. mtype = h5py.h5t.py_create(ds.id.dtype) mspace = h5py.h5s.create_simple(ds.shape) fspace = ds.id.get_space() ds.id.write(mspace, fspace, arr, mtype)
def _store_label(self, path, label): universe = label.universe label = self._factory(label) universe_path = self._get_path(universe) if universe_path is None: raise IOError("universe must be stored first") ds = create_dataset(self.root, path, data=label._string_array) self._stamp(ds, 'label') ds.attrs['universe'] = self.root[universe_path].ref ds.attrs['name'] = ascii(label.name) ds.attrs['label_type'] = ascii(label.type)
def __iter__(self): # First pass: universes for name in self.root: node = self.root[name] if node.attrs.get('DATA_MODEL', None) == ascii('MOSAIC') \ and node.attrs['MOSAIC_DATA_TYPE'] == ascii('universe'): yield name, self.retrieve(node) # Second pass: anything else for name in self.root: node = self.root[name] if node.attrs.get('DATA_MODEL', None) == ascii('MOSAIC') \ and node.attrs['MOSAIC_DATA_TYPE'] != ascii('universe'): yield name, self.retrieve(node)
def _store_universe(self, path, universe): group = self.root.require_group(path) try: # ActivePapers support group.mark_as_data_item() except AttributeError: pass self._stamp(group, 'universe') # Convert the universe to an array_model universe = self._factory(universe) # Create HDF5 datasets create_dataset(group, 'cell_shape', data=universe.cell_shape) create_dataset(group, 'symmetry_transformations', data=N.array(universe._symmetry_transformations)) create_dataset(group, 'convention', data=universe.convention) create_dataset(group, 'fragments', data=universe._fragment_array) create_dataset(group, 'atoms', data=universe._atom_array) create_dataset(group, 'bonds', data=universe._bond_array) create_dataset(group, 'molecules', data=universe._molecule_array) if len(universe._polymer_array) > 0: create_dataset(group, 'polymers', data=universe._polymer_array) symbols = universe._symbols symbol_table = group.require_dataset('symbols', shape=(len(symbols),), dtype=h5py.special_dtype(vlen=bytes)) for i, s in enumerate(symbols): symbol_table[i] = ascii(s)
def _store_selection(self, path, selection): universe = selection.universe universe_path = self._get_path(universe) if universe_path is None: raise IOError("universe must be stored first") ds = create_dataset(self.root, path, N.ascontiguousarray(selection.indices)) ds.attrs['universe'] = self.root[universe_path].ref ds.attrs['selection_type'] = ascii(selection.type) self._stamp(ds, 'selection')
def _read_stamp(self, node): if node.attrs['DATA_MODEL'] != ascii('MOSAIC'): raise ValueError("Node %s not an Mosaic data item" % str(node)) version = (node.attrs['DATA_MODEL_MAJOR_VERSION'], node.attrs['DATA_MODEL_MINOR_VERSION']) if version[0] > api.MOSAIC_VERSION[0] \ or version[1] > api.MOSAIC_VERSION[1]: raise ValueError("HDF5 data is for version %d.%d, " "software is version %d.%d" % (version + api.MOSAIC_VERSION)) return node.attrs['MOSAIC_DATA_TYPE']
def recursive_iterator(self, group=None): if group is None: group = self.root # First pass: universes for name in group: node = group[name] if node.attrs.get('DATA_MODEL', None) == ascii('MOSAIC') \ and node.attrs['MOSAIC_DATA_TYPE'] == ascii('universe'): yield name, self.retrieve(node) if isinstance(node, h5py.Group): for gname, gnode in self.recursive_iterator(node): yield name+'/'+gname, gnode # Second pass: anything else for name in group: node = group[name] if node.attrs.get('DATA_MODEL', None) == ascii('MOSAIC') \ and node.attrs['MOSAIC_DATA_TYPE'] != ascii('universe'): yield name, self.retrieve(node) if isinstance(node, h5py.Group): for gname, gnode in self.recursive_iterator(node): yield name+'/'+gname, gnode
def _stamp(self, node, label): node.attrs['DATA_MODEL'] = ascii('MOSAIC') node.attrs['DATA_MODEL_MAJOR_VERSION'] = api.MOSAIC_VERSION[0] node.attrs['DATA_MODEL_MINOR_VERSION'] = api.MOSAIC_VERSION[1] node.attrs['MOSAIC_DATA_TYPE'] = ascii(label)