Loading and saving trajectories¶
sire
also supports loading and saving many popular trajectory
formats.
Simply pass a trajectory file into the list of files and it will be loaded.
>>> import sire as sr
>>> mols = sr.load(sr.expand(sr.tutorial_url, "ala.top", "ala.traj"))
You can find the number of frames that have been loaded using
the num_frames()
function.
>>> print(mols.num_frames())
500
You can load a particular frame using the load_frame()
function.
>>> print(mols.time())
0.2 ps
>>> mols.load_frame(100)
>>> print(mols.time())
20.2 ps
Note
The time()
function returns the simulation
time of a particular frame.
Joining multiple trajectories together¶
You can join load multiple trajectory files together and join them
into a single trajectory simply by passing them as additional files
in sire.load()
, e.g.
>>> mols = sr.load(sr.expand(sr.tutorial_url, "ala.top", "ala.traj", "ala.traj"))
>>> print(mols.num_frames())
1000
has loaded ala.traj
twice, joining it together into a single 1000 frame
trajectory.
Note
You can load as many trajectory files as you want. They can be a mixture of file formats, e.g. DCD, RST, TRR etc. The trajectory frames will be loaded in order, i.e. the frames from the second trajectory file in the list will be loaded after the frames in the first file.
Warning
The trajectory frames are streamed from the files. They are not read in one go, as typically trajectories are larger than available memory. Instead, the trajectory files are opened, with frames read dynamically as they are accessed. This means that you CANNOT change the trajectory files while they are open (e.g. renaming them, moving them, or adding or deleting data). Doing so will result in undefined behaviour.
Saving trajectories¶
You can save trajectories using sire.save()
. To do this, you
must pass in the sire.mol.TrajectoryIterator
that results
from calling the trajectory()
function
on a molecule (or set of molecules).
For example,
>>> f = sr.save(mols.trajectory(), "output", format=["RST"])
>>> print(f)
["output.rst"]
saves the trajectory in Amber RST format, returning the names of the files that were written.
You can save trajectories in any file supported by sire
, and
can even save to multiple trajectory formats at the same time, e.g.
>>> f = sr.save(mols.trajectory(), "output", format=["RST", "DCD", "TRR"])
>>> print(f)
["output.rst", "output.dcd", "output.trr"]
saves the trajectory in Amber RST, DCD and Gromacs TRR formats.
You can save only selected frames from the trajectory by slicing the
sire.mol.TrajectoryIterator
, e.g.
>>> f = sr.save(mols.trajectory()[0:10], "output", format=["XTC"])
>>> print(f)
["output.xtc"]
saves the first ten frames of the trajectory to a Gromacs XTC format
file called output.xtc
.
Similarly,
>>> f = sr.save(mols.trajectory()[::100], "output", format=["RST"])
>>> print(f)
["output.rst"]
saves every 100 frames from the trajectory to an Amber RST format file
called output.rst
.
You can even save trajectory from only certain molecules from the system.
>>> f = sr.save(mols[0].trajectory(), "output", format=["PRM", "DCD"])
>>> mol = sr.load(f)
>>> print(mol, mol.num_frames())
has saved the trajectory of only the first molecule to a DCD file called
output.dcd
, and also saved an Amber PRM file for that first molecule
to output.prm
. These files were immediately reloaded, showing
you that they contain just the first molecule, with 1000 frames of
trajectory.
Trajectories as frames¶
sire
also supports loading and saving trajectories as a sequence
of individual files. For example, here we will save the trajectory
of the first molecule as a sequence of PDB files.
>>> f = sr.save(mols[0].trajectory(), "output", format=["PRM", "PDB"])
>>> print(f)
["output.prm", "output.pdb"]
In this case, output.pdb
is a directory containing 1000 PDB files, one
for each trajectory frame.
>>> import os
>>> os.listdir("output.pdb")
['frame_143_28-8.pdb',
'frame_304_61.pdb',
'frame_006_1-4.pdb',
'frame_301_60-4.pdb',
'frame_220_44-2.pdb',
...
'frame_421_84-4.pdb',
'frame_196_39-4.pdb',
'frame_056_11-4.pdb',
'frame_428_85-8.pdb']
We can load these files as a trajectory simply by passing in the directory name, e.g.
>>> mol = sr.load("output.prm", "output.pdb")
>>> print(mol, mol.num_frames())
System( name=output num_molecules=1 num_residues=3 num_atoms=22 ) 1000
Note
The individual frame files are named using the frame number plus the time in picoseconds for that frame.
sire
has extensive support for trajectories. To learn more,
check out the detailed guide.