Convert RKF Trajectory to DCD Format

Convert an AMS MD trajectory (ams.rkf file) to DCD format while wrapping atoms back into molecular entities before writing frames.

Downloads: Notebook | Script ?

Requires: AMS2026 or later

Related examples
Related documentation

Convert RKF Trajectory to DCD Format

This example converts ams.rkf to DCD and PSF, mapping atoms back into molecules in each frame before writing. A short MD run is included first to produce the RKF input file.

Initial Imports

from pathlib import Path

from scm.flexmd import PSFTopology, pdb_from_plamsmol
from scm.plams import (
    DCDTrajectoryFile,
    RKFTrajectoryFile,
    AMSJob,
    Settings,
    from_smiles,
    packmol,
    view,
)

Run MD Simulation

Run a short toy MD simulation to generate an ams.rkf trajectory.

water_box = packmol(from_smiles("O"), n_molecules=8, density=1.0)
view(water_box, direction="tilt_z", width=300, height=300)
image generated from notebook
md_settings = Settings()
md_settings.input.ams.Task = "MolecularDynamics"
md_settings.input.ReaxFF.ForceField = "Water2017.ff"
md_settings.input.ams.MolecularDynamics.NSteps = 30
md_settings.input.ams.MolecularDynamics.TimeStep = 0.5
md_settings.input.ams.MolecularDynamics.Trajectory.SamplingFreq = 1
md_settings.input.ams.MolecularDynamics.InitialVelocities.Temperature = 300
md_settings.runscript.nproc = 1
md_settings.runscript.preamble_lines = ["export OMP_NUM_THREADS=1"]

md_job = AMSJob(name="md_for_dcd", molecule=water_box, settings=md_settings)
md_results = md_job.run()

rkf_path = Path(md_results.rkfpath())
[01.04|15:07:41] JOB md_for_dcd STARTED
[01.04|15:07:41] JOB md_for_dcd RUNNING
[01.04|15:07:42] JOB md_for_dcd FINISHED
[01.04|15:07:42] JOB md_for_dcd SUCCESSFUL

Convert Frames

Convert RKF frames to DCD while remapping atoms into molecular entities.

rkf = RKFTrajectoryFile(str(rkf_path))
mol = rkf.get_plamsmol()
print(f"NSteps: {len(rkf)}")

pdb = pdb_from_plamsmol(mol)
psf = PSFTopology(pdb=pdb)
psf.write_psf("ams.psf")

dcd = DCDTrajectoryFile("ams.dcd", mode="wb")
for i in range(len(rkf)):
    coords, cell = rkf.read_frame(i)
    mol.from_array(coords)
    mol.map_atoms_to_bonds()
    dcd.write_next(coords=mol.as_array(), cell=cell)

print("Created files 'ams.dcd' and 'ams.psf'")
NSteps: 31
Created files 'ams.dcd' and 'ams.psf'

See also

Python Script

#!/usr/bin/env python
# coding: utf-8

# ## Convert RKF Trajectory to DCD Format
#
# This example converts `ams.rkf` to DCD and PSF, mapping atoms back into molecules in each frame before writing.
# A short MD run is included first to produce the RKF input file.
#

# ### Initial Imports

from pathlib import Path

from scm.flexmd import PSFTopology, pdb_from_plamsmol
from scm.plams import (
    DCDTrajectoryFile,
    RKFTrajectoryFile,
    AMSJob,
    Settings,
    from_smiles,
    packmol,
    view,
)


# ### Run MD Simulation

# Run a short toy MD simulation to generate an `ams.rkf` trajectory.
#

water_box = packmol(from_smiles("O"), n_molecules=8, density=1.0)
view(water_box, direction="tilt_z", width=300, height=300, picture_path="picture1.png")


md_settings = Settings()
md_settings.input.ams.Task = "MolecularDynamics"
md_settings.input.ReaxFF.ForceField = "Water2017.ff"
md_settings.input.ams.MolecularDynamics.NSteps = 30
md_settings.input.ams.MolecularDynamics.TimeStep = 0.5
md_settings.input.ams.MolecularDynamics.Trajectory.SamplingFreq = 1
md_settings.input.ams.MolecularDynamics.InitialVelocities.Temperature = 300
md_settings.runscript.nproc = 1
md_settings.runscript.preamble_lines = ["export OMP_NUM_THREADS=1"]

md_job = AMSJob(name="md_for_dcd", molecule=water_box, settings=md_settings)
md_results = md_job.run()

rkf_path = Path(md_results.rkfpath())


# ### Convert Frames

# Convert RKF frames to DCD while remapping atoms into molecular entities.
#

rkf = RKFTrajectoryFile(str(rkf_path))
mol = rkf.get_plamsmol()
print(f"NSteps: {len(rkf)}")

pdb = pdb_from_plamsmol(mol)
psf = PSFTopology(pdb=pdb)
psf.write_psf("ams.psf")

dcd = DCDTrajectoryFile("ams.dcd", mode="wb")
for i in range(len(rkf)):
    coords, cell = rkf.read_frame(i)
    mol.from_array(coords)
    mol.map_atoms_to_bonds()
    dcd.write_next(coords=mol.as_array(), cell=cell)

print("Created files 'ams.dcd' and 'ams.psf'")