| """Read data using MDTraj.""" |
|
|
| __all__ = [ |
| 'read_frames_mdtraj', |
| ] |
|
|
| try: |
| import mdtraj |
| except ImportError: |
| mdtraj = None |
|
|
| from .utilities import Frame |
| from ..constants import nm |
|
|
|
|
| def read_frames_mdtraj(fn_in, top=None, names_atoms='type', name_data='positions', unit=nm, unit_cell=nm, chunk=100): |
| """Read data from a file using the MDTraj package. |
| |
| Arguments: |
| fn_in: name of trajectory file to read, passed to `mdtraj.iterload` |
| top: MDTraj topology, passed to `mdtraj.iterload` |
| names_atoms: which atom names to use, 'type' or 'element' |
| name_data: what quantity to take the data as |
| unit: unit to scale data by, multiplicative factor in atomic units |
| unit_cell: unit to scale cell by, multiplicative factor in atomic units |
| chunk: size of one trajectory chunk, passed to `mdtraj.iterload` |
| |
| Yields: |
| One AML `Frame` object at a time |
| """ |
|
|
| |
| trj = mdtraj.iterload(fn_in, top=top, chunk=chunk) |
|
|
| |
| names = None |
|
|
| |
| if name_data not in ('positions', 'forces'): |
| raise ValueError(f'Unsupported `name_data`: {name_data}. Expected "positions" or "forces".') |
|
|
| |
| for chunk in trj: |
|
|
| |
| |
| if names is None: |
| if names_atoms == 'type': |
| names = [atom.name for atom in chunk.topology.atoms] |
| elif names_atoms == 'element': |
| names = [atom.element.symbol for atom in chunk.topology.atoms] |
| else: |
| raise ValueError(f'Expected "type" or "element" for `name_atoms`, got {names_atoms}.') |
|
|
| for i in range(len(chunk)): |
|
|
| |
| data = chunk.xyz[i, :, :] * unit |
|
|
| |
| if chunk.unitcell_vectors is not None: |
| cell = chunk.unitcell_vectors[i, ...] * unit_cell |
| else: |
| cell = None |
|
|
| |
| kwargs = { |
| 'names': names, |
| name_data: data, |
| 'cell': cell |
| } |
| yield Frame(**kwargs) |
|
|
|
|
| if mdtraj is None: |
| del read_frames_mdtraj |
| __all__.remove('read_frames_mdtraj') |
|
|