schrodinger.application.desmond.packages.traj module

Molecular dynamics trajectory handling module Define common APIs for various trajectory formats. Basic trajectory handling algorithms are also implemented here.

Copyright Schrodinger, LLC. All rights reserved.

class schrodinger.application.desmond.packages.traj.Fmt

Bases: enum.Enum

Trajectory format enum

AUTO = 0
DTR = 1
XTC = 2
schrodinger.application.desmond.packages.traj.get_fmt(fname, format=<Fmt.AUTO: 0>)

Returns the format based on the given trajectory file name (fname) and the format specification (format). If the format specification is definite (i.e., not Fmt.AUTO), this function will trivially return the value of format, otherwise it will check the fname’s value, determining the format, and return the result.

Parameters:
  • fname (str) – Trajectory file name
  • format (Fmt) – Trajectory format specification

:rtype : Fmt :return: The format of the given trajectory fname

schrodinger.application.desmond.packages.traj.get_trajectory_extname(format=<Fmt.AUTO: 0>, ref_fname=None)
class schrodinger.application.desmond.packages.traj.Source(reader, name='sometraj')

Bases: object

CACHE_LIMIT_BYTES = 1000000000.0
__init__(reader, name='sometraj')

reader specifies where to retrieve a trajectory frame when it’s needed but currently NOT in the memory (in other words, it’s not cached by this source). A reader could potentially be a file reader, a string reader, a socket reader, a database dealer, etc., as long as it satisfies the duck-typing requirements (see below). And interestingly, the probably simplest reader is another ``trajectory’’ (i.e., a list of Frame objects) in memory.

Duck typing for ``readers’‘. - Random access

reader[index] should return the index-th frame. Here index is zero-based, of Python style (i.e., -1 means the last frame, etc.).
  • len support len(reader) should return the total number of frames.

If a reader doesn’t support the duck typing as specified above, a subclass can be created to bypass the typing requirements. See DtrSource below as an example.

name
retrieve_frame(index)

Retrieves the index-th frame from the source. index is zero-based. This method assumes the source allows random access to frames.

Raise:IndexError if index is out of range, or IOError if the trajectory reader is closed.
clear_cache()
used_space()
nframes()

Returns the total number of frames in this trajectory source.

close()

Closes down the trajectory reader. A couple of points to note: 1. Once this method is called, this Source object can only retrieve

frames that are internally cached. Attempting to retrieve uncached frames will incur an IOError. Normally we do NOT know which frames are cached, so to be safe this method should be called only when we are done with the trajectory.
  1. Normally, only some Frame objects reference a Source object, if all the Frame objects are garbaged, the Source object will be garbaged automatically, and there is no need to call this close method separately.
class schrodinger.application.desmond.packages.traj.DtrSource(reader, name='sometraj')

Bases: schrodinger.application.desmond.packages.traj.Source

nframes()

Returns the total number of frames in this trajectory source.

CACHE_LIMIT_BYTES = 1000000000.0
__init__(reader, name='sometraj')

reader specifies where to retrieve a trajectory frame when it’s needed but currently NOT in the memory (in other words, it’s not cached by this source). A reader could potentially be a file reader, a string reader, a socket reader, a database dealer, etc., as long as it satisfies the duck-typing requirements (see below). And interestingly, the probably simplest reader is another ``trajectory’’ (i.e., a list of Frame objects) in memory.

Duck typing for ``readers’‘. - Random access

reader[index] should return the index-th frame. Here index is zero-based, of Python style (i.e., -1 means the last frame, etc.).
  • len support len(reader) should return the total number of frames.

If a reader doesn’t support the duck typing as specified above, a subclass can be created to bypass the typing requirements. See DtrSource below as an example.

clear_cache()
close()

Closes down the trajectory reader. A couple of points to note: 1. Once this method is called, this Source object can only retrieve

frames that are internally cached. Attempting to retrieve uncached frames will incur an IOError. Normally we do NOT know which frames are cached, so to be safe this method should be called only when we are done with the trajectory.
  1. Normally, only some Frame objects reference a Source object, if all the Frame objects are garbaged, the Source object will be garbaged automatically, and there is no need to call this close method separately.
name
retrieve_frame(index)

Retrieves the index-th frame from the source. index is zero-based. This method assumes the source allows random access to frames.

Raise:IndexError if index is out of range, or IOError if the trajectory reader is closed.
used_space()
class schrodinger.application.desmond.packages.traj.XtcSource(*args, **kwargs)

Bases: schrodinger.application.desmond.packages.traj.Source

__init__(*args, **kwargs)

reader specifies where to retrieve a trajectory frame when it’s needed but currently NOT in the memory (in other words, it’s not cached by this source). A reader could potentially be a file reader, a string reader, a socket reader, a database dealer, etc., as long as it satisfies the duck-typing requirements (see below). And interestingly, the probably simplest reader is another ``trajectory’’ (i.e., a list of Frame objects) in memory.

Duck typing for ``readers’‘. - Random access

reader[index] should return the index-th frame. Here index is zero-based, of Python style (i.e., -1 means the last frame, etc.).
  • len support len(reader) should return the total number of frames.

If a reader doesn’t support the duck typing as specified above, a subclass can be created to bypass the typing requirements. See DtrSource below as an example.

nframes()

Returns the total number of frames in this trajectory source.

CACHE_LIMIT_BYTES = 1000000000.0
clear_cache()
close()

Closes down the trajectory reader. A couple of points to note: 1. Once this method is called, this Source object can only retrieve

frames that are internally cached. Attempting to retrieve uncached frames will incur an IOError. Normally we do NOT know which frames are cached, so to be safe this method should be called only when we are done with the trajectory.
  1. Normally, only some Frame objects reference a Source object, if all the Frame objects are garbaged, the Source object will be garbaged automatically, and there is no need to call this close method separately.
name
retrieve_frame(index)

Retrieves the index-th frame from the source. index is zero-based. This method assumes the source allows random access to frames.

Raise:IndexError if index is out of range, or IOError if the trajectory reader is closed.
used_space()
class schrodinger.application.desmond.packages.traj.Frame(source: Optional[schrodinger.application.desmond.packages.traj.Source], index: Optional[int])

Bases: object

This class, as its name suggests, represents a single trajectory frame. So far, we allow a frame to be mutated in the following ways: - Assign a new chemical time - Reduce to a subset of particles - Coordinates of all particles are translated

We call changes generally as ``decorations’‘. They might not make into the frame data, or at least not immediately. Why? This avoids making multiple expensive copies of the data.

__init__(source: Optional[schrodinger.application.desmond.packages.traj.Source], index: Optional[int])
Parameters:
  • source – The object to retrieve the actual frame data from. It can be None, which means this Frame object itself contains all the frame data.
  • index – The index in source to retrieve the frame data. It can be None, which means this Frame object itself contains all the frame data.
source()
copy()

Return a copy of this Frame object. The position and velocity arrays will be copied.

natoms
nactive
pos(i=None)

Return the position vector(s).

vel(i=None)

Return the velocity vector(s). This method may throw if this frame doesn’t have velocity data.

hijackPos(impos)

Tentatively replace the internal position array of this Frame object with an external numpy array impos. We can call the external array “imposter”. After calling this method, the pos method will return values from the imposter until the imposter is removed (by calling hijackPos(None)). The imposter should be a Nx3 numpy array, where N can be of any size. Note the impacts on other methods of this class: - pos Use impos. - copy The entire impos array will be copied into the copy of

this Frame object.
  • reduce Still function in the same way, but note that the impos
    array will not be changed by these methods.
  • moveby The same as reduce
  • write Still function in the same way, note that it’s the internal
    position array, not impos, that will be written out.
Parameters:impos (None, or numpy.ndarray of size Nx3, where N is arbitray number) – The position array to tentatively replac the internal position array in this Frame object. If the value is None, we remove the “imposter” and recover the internal position array.
time
box
transpose_box()

Transpose the simulation box.

orig_index
reduce(indices, copy=True)

Keep only the atoms specified by indices, the other atoms will be deleted from this frame. The caller needs to ensure the indices order matches with the msys model of the reduced system.

Parameters:copy – If true, this function will make a copy of this frame and reduce atoms in this copy, and finally return the copy.
moveby(x, y, z)

Translate all positions by the given x, y, and z.

write(writer)

Write out this frame using the given writer.

class schrodinger.application.desmond.packages.traj.MaeFrameReader(mae_fnames: List[str], cms_model: Cms, frame_template: schrodinger.application.desmond.packages.traj.Frame)

Bases: object

This class reads a number of MAE files into a sequence of “bare-metal” frame objects. See docstring of MaeSource below for more detail.

__init__(mae_fnames: List[str], cms_model: Cms, frame_template: schrodinger.application.desmond.packages.traj.Frame)

Initialize self. See help(type(self)) for accurate signature.

__len__()
class schrodinger.application.desmond.packages.traj.MaeSource(mae_fnames: List[str], cms_model: Cms, frame_template: schrodinger.application.desmond.packages.traj.Frame)

Bases: schrodinger.application.desmond.packages.traj.Source

This is to reverse-convert a list of MAE (or CMS) files into a single trajectory file. The molecular structure in each MAE file will become a single frame in the trajectory. If an MAE file contains multiple CTs, only the first one will be used.

CAVEATS: This kind of conversions always have some caveats, which in this particular case are the following: 1. Velocities are not always present in either the trajectory frame

template or the MAE file. In either case, the velocities will not be saved into the resultant frame.
  1. Since we generally don’t a priori know the exact force field to be used, it’s difficult/impossible to predict about the pseudoatoms. So if they exist in the trajectory frame, their positions will not be set. This is normally not a problem for MD simulations the pseudoatoms’ positions are normally determined on the fly in MD simulations.
  2. The time of each frame is arbitrarily set to the index of the frame.
  3. This will not work properly for GCMC systems where the number of active atoms in the frame template happens to differ from that of the structures in the MAE files.
__init__(mae_fnames: List[str], cms_model: Cms, frame_template: schrodinger.application.desmond.packages.traj.Frame)

reader specifies where to retrieve a trajectory frame when it’s needed but currently NOT in the memory (in other words, it’s not cached by this source). A reader could potentially be a file reader, a string reader, a socket reader, a database dealer, etc., as long as it satisfies the duck-typing requirements (see below). And interestingly, the probably simplest reader is another ``trajectory’’ (i.e., a list of Frame objects) in memory.

Duck typing for ``readers’‘. - Random access

reader[index] should return the index-th frame. Here index is zero-based, of Python style (i.e., -1 means the last frame, etc.).
  • len support len(reader) should return the total number of frames.

If a reader doesn’t support the duck typing as specified above, a subclass can be created to bypass the typing requirements. See DtrSource below as an example.

CACHE_LIMIT_BYTES = 1000000000.0
clear_cache()
close()

Closes down the trajectory reader. A couple of points to note: 1. Once this method is called, this Source object can only retrieve

frames that are internally cached. Attempting to retrieve uncached frames will incur an IOError. Normally we do NOT know which frames are cached, so to be safe this method should be called only when we are done with the trajectory.
  1. Normally, only some Frame objects reference a Source object, if all the Frame objects are garbaged, the Source object will be garbaged automatically, and there is no need to call this close method separately.
name
nframes()

Returns the total number of frames in this trajectory source.

retrieve_frame(index)

Retrieves the index-th frame from the source. index is zero-based. This method assumes the source allows random access to frames.

Raise:IndexError if index is out of range, or IOError if the trajectory reader is closed.
used_space()
schrodinger.application.desmond.packages.traj.read_traj(inp, format=<Fmt.AUTO: 0>, return_iter=False)

Lazy load trajectory.

Parameters:
  • inp (str) – Input trajectory’s file name
  • format (Fmt) – Trajectory file format
  • return_iter – If True, return an iterator, otherwise return a list of `Frame`s.
schrodinger.application.desmond.packages.traj.write_traj(tr, fname, format=<Fmt.AUTO: 0>)
Parameters:
  • fname (str) – Output file name
  • format (Fmt) – Trajectory file format
schrodinger.application.desmond.packages.traj.merge(*arg)

Merge a list of trajectories. If there is any overlapped frames among these trajectories, the ones from the latter trajectory (higher index in the arg list) will be kept.

schrodinger.application.desmond.packages.traj.concat(first_time, delta_time, *args)

Concatenate a list of trajectories or iterators and reassign the chemical time for each frame. Results are yielded.

Parameters:
  • first_time (float) – Chemical time of the first frame.
  • delta_time (float) – The chemical time interval between two successive frames.
  • args – trajectories as iterables
schrodinger.application.desmond.packages.traj.extract_subsystem(tr, gids)

Extract the subsystem as specified by the gids for each frame in the given trajectory tr, and return a new trajectory for the subsystem. The original trajectory is not mutated in any way by this function. Inactive atoms in GCMC trajectory cannot be extracted.

Parameters:
  • tr (list of Frame) – Original trajectory
  • gids (list of `int`s) – A list of gids that specifies the subsystem.
Return type:

list

Returns:

A new trajectory for the subsystem