def saveEnsemble(ensemble, filename=None, **kwargs): """Save *ensemble* model data as :file:`filename.ens.npz`. If *filename* is ``None``, title of the *ensemble* will be used as the filename, after white spaces in the title are replaced with underscores. Extension is :file:`.ens.npz`. Upon successful completion of saving, filename is returned. This function makes use of :func:`numpy.savez` function.""" if not isinstance(ensemble, Ensemble): raise TypeError('invalid type for ensemble, {0:s}' .format(type(ensemble))) if len(ensemble) == 0: raise ValueError('ensemble instance does not contain data') dict_ = ensemble.__dict__ attr_list = ['_title', '_confs', '_weights', '_coords'] if isinstance(ensemble, PDBEnsemble): attr_list.append('_labels') if filename is None: filename = ensemble.getTitle().replace(' ', '_') attr_dict = {} for attr in attr_list: value = dict_[attr] if value is not None: attr_dict[attr] = value filename += '.ens.npz' ostream = openFile(filename, 'wb', **kwargs) np.savez(ostream, **attr_dict) ostream.close() return filename
def saveModel(nma, filename=None, matrices=False, **kwargs): """Save *nma* model data as :file:`filename.nma.npz`. By default, eigenvalues, eigenvectors, variances, trace of covariance matrix, and name of the model will be saved. If *matrices* is ``True``, covariance, Hessian or Kirchhoff matrices are saved too, whichever are available. If *filename* is ``None``, name of the NMA instance will be used as the filename, after ``" "`` (white spaces) in the name are replaced with ``"_"`` (underscores). Extension may differ based on the type of the NMA model. For ANM models, it is :file:`.anm.npz`. Upon successful completion of saving, filename is returned. This function makes use of :func:`numpy.savez` function.""" if not isinstance(nma, NMA): raise TypeError('invalid type for nma, {0:s}'.format(type(nma))) if len(nma) == 0: raise ValueError('nma instance does not contain data') dict_ = nma.__dict__ attr_list = ['_title', '_trace', '_array', '_eigvals', '_vars', '_n_atoms', '_dof', '_n_modes'] if filename is None: filename = nma.getTitle().replace(' ', '_') if isinstance(nma, GNMBase): attr_list.append('_cutoff') attr_list.append('_gamma') if matrices: attr_list.append('_kirchhoff') if isinstance(nma, ANM): attr_list.append('_hessian') if isinstance(nma, ANM): type_ = 'ANM' else: type_ = 'GNM' elif isinstance(nma, EDA): type_ = 'EDA' elif isinstance(nma, PCA): type_ = 'PCA' else: type_ = 'NMA' if matrices: attr_list.append('_cov') attr_dict = {'type': type_} for attr in attr_list: value = dict_[attr] if value is not None: attr_dict[attr] = value filename += '.' + type_.lower() + '.npz' ostream = openFile(filename, 'wb', **kwargs) np.savez(ostream, **attr_dict) ostream.close() return filename
def saveAtoms(atoms, filename=None, **kwargs): """Save *atoms* in ProDy internal format. All atomic classes are accepted as *atoms* argument. This function saves user set atomic data as well. Note that title of the AtomGroup instance is used as the filename when *atoms* is not an AtomGroup. To avoid overwriting an existing file with the same name, specify a *filename*.""" if not isinstance(atoms, Atomic): raise TypeError('atoms must be Atomic instance, not {0:s}' .format(type(atoms))) if isinstance(atoms, AtomGroup): ag = atoms title = ag.getTitle() else: ag = atoms.getAtomGroup() title = str(atoms) if filename is None: filename = ag.getTitle().replace(' ', '_') filename += '.ag.npz' attr_dict = {'title': title} attr_dict['n_atoms'] = atoms.numAtoms() attr_dict['n_csets'] = atoms.numCoordsets() attr_dict['cslabels'] = atoms.getCSLabels() coords = atoms._getCoordsets() if coords is not None: attr_dict['coordinates'] = coords bonds = ag._bonds bmap = ag._bmap if bonds is not None and bmap is not None: if isinstance(atoms, AtomGroup): attr_dict['bonds'] = bonds attr_dict['bmap'] = bmap attr_dict['numbonds'] = ag._data['numbonds'] else: bonds = trimBonds(bonds, bmap, atoms._getIndices()) attr_dict['bonds'] = bonds attr_dict['bmap'], attr_dict['numbonds'] = \ evalBonds(bonds, len(atoms)) for key, data in ag._data.iteritems(): if key == 'numbonds': continue if data is not None: attr_dict[key] = data ostream = openFile(filename, 'wb', **kwargs) savez(ostream, **attr_dict) ostream.close() return filename
def saveVector(vector, filename, **kwargs): """Save *vector* data as :file:`filename.vec.npz`. Upon successful completion of saving, filename is returned. This function makes use of :func:`numpy.savez` function.""" if not isinstance(vector, Vector): raise TypeError('invalid type for vector, {0:s}'.format(type(vector))) attr_dict = {} attr_dict['title'] = vector.getTitle() attr_dict['array'] = vector._getArray() attr_dict['is3d'] = vector.is3d() filename += '.vec.npz' ostream = openFile(filename, 'wb', **kwargs) np.savez(ostream, **attr_dict) ostream.close() return filename
def writeNMD(filename, modes, atoms): """Writes an NMD file for given *modes* and includes applicable data from *atoms*. Returns *filename*, if file is successfully written. NMD file format is described at :ref:`nmd-format`. .. note:: #. This function skips modes with zero eigenvalues. #. If a :class:`Vector` instance is given, it will be normalized before it is written. It's length before normalization will be written as the scaling factor of the vector.""" if not isinstance(modes, (NMA, ModeSet, Mode, Vector)): raise TypeError('modes must be NMA, ModeSet, Mode, or Vector, ' 'not {0:s}'.format(type(modes))) if modes.numAtoms() != atoms.numAtoms(): raise Exception('number of atoms do not match') out = openFile(filename, 'w') #out.write('#!{0:s} -e\n'.format(VMDPATH)) out.write('nmwiz_load {0:s}\n'.format(os.path.abspath(filename))) name = modes.getTitle() name = name.replace(' ', '_').replace('.', '_') if not name.replace('_', '').isalnum() or len(name) > 30: name = str(atoms) name = name.replace(' ', '_').replace('.', '_') if not name.replace('_', '').isalnum() or len(name) > 30: name = os.path.splitext(os.path.split(filename)[1])[0] out.write('name {0:s}\n'.format(name)) try: coords = atoms.getCoords() except: raise ValueError('coordinates could not be retrieved from atoms') if coords is None: raise ValueError('atom coordinates are not set') try: data = atoms.getNames() if data is not None: out.write('atomnames {0:s}\n'.format(' '.join(data))) except: pass try: data = atoms.getResnames() if data is not None: out.write('resnames {0:s}\n'.format(' '.join(data))) except: pass try: data = atoms.getResnums() if data is not None: out.write('resids {0:s}\n'.format(' '.join(data.astype('|S5')))) except: pass try: data = atoms.getChids() if data is not None: out.write('chainids {0:s}\n'.format(' '.join(data))) except: pass try: data = atoms.getBetas() if data is not None: out.write('bfactors {0:s}\n'.format(' '.join( ['{0:.3f}'.format(x) for x in data.flatten()]))) except: pass out.write('coordinates {0:s}\n'.format( ' '.join(['{0:.3f}'.format(x) for x in coords.flatten()]))) count = 0 if isinstance(modes, Vector): out.write('mode 1 {0:.2f} {1:s}\n'.format(abs(modes), ' '.join( ['{0:.3f}'.format(x) for x in modes.getNormed()._getArray()]))) count += 1 else: if isinstance(modes, Mode): modes = [modes] for mode in modes: if mode.getEigenvalue() < ZERO: continue out.write('mode {0:d} {1:.2f} {2:s}\n'.format( mode.getIndex()+1, mode.getVariance()**0.5, ' '.join( ['{0:.3f}'.format(x) for x in mode._getArray()]))) count += 1 if count == 0: LOGGER.warning('No normal mode data was written. ' 'Given modes might have 0 eigenvalues.') out.close() return filename