Exemplo n.º 1
0
 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)
Exemplo n.º 2
0
 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)
Exemplo n.º 3
0
 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)
Exemplo n.º 4
0
    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)
Exemplo n.º 5
0
 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')
Exemplo n.º 6
0
 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']
Exemplo n.º 7
0
 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
Exemplo n.º 8
0
 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)