On-the-fly transformations¶
An on-the-fly transformation is a function that silently modifies the dynamic data contained in a trajectory Timestep
(typically coordinates) as it is loaded into memory. It is called for each current time step to transform data into your desired representation. A transformation function must also return the current Timestep
, as transformations are often chained together.
The MDAnalysis.transformations
module contains a collection of transformations. For example, fit_rot_trans()
can perform a mass-weighted alignment on an AtomGroup
to a reference.
Other implemented transformations include functions to translate
, rotate
, fit
an AtomGroup
to a reference, and wrap
or unwrap groups in the unit cell. (Please see the MDAnalysis on-the-fly transformations blog post contains a more complete introduction to these fitting and wrapping functions.)
Although you can only call add_transformations()
once, you can pass in multiple transformations in a list, which will be executed in order. For example, the below workflow:
makes all molecules whole (unwraps them over periodic boundary conditions)
centers the protein in the center of the box
wraps water back into the box
Please see the full tutorial for more information.
If your transformation does not depend on something within the Universe
(e.g. a chosen AtomGroup
), you can also create a Universe
directly with transformations. The code below translates coordinates 1 angstrom up on the z-axis:
If you need a different transformation, it is easy to implement your own.
Custom transformations¶
At its core, a transformation function must only take a Timestep
as its input and return the Timestep
as the output.
If your transformation needs other arguments, you will need to wrap your core transformation with a wrapper function that can accept the other arguments.
Alternatively, you can use functools.partial()
to substitute the other arguments.
On-the-fly transformation functions can be applied to any property of a Timestep, not just the atom positions. For example, to give each frame of a trajectory a box: