Exporting to other software

Interchange provides several methods to produce input data for other software. Note that none of these methods write out all the information stored in an Interchange; they support a design where the principle source of truth is the rich chemical information in the Interchange object, and exported files are tools to perform some operation.

Run control/config files

SMIRNOFF force fields include several parameters that many MD engines do not include as part of their topologies. These values are essential for accurately simulating output from Interchange, but they are configured in the same files that are used for general control of simulation runtime behavior. As a result, Interchange cannot simply provide complete versions of these files.

Instead, Interchange provides MDConfig, a class that writes stub versions of MD engine run input files. These files must be modified and completed before they can be used to run a simulation.

MDConfig can be constructed from an existing Interchange:

from openff.interchange import Interchange
from openff.interchange.components.mdconfig import MDConfig

interchange = Interchange.from_smirnoff(...)

mdconfig = MDConfig.from_interchange(interchange)

General purpose

An Interchange can be written out as the common PDB structure format with the Interchange.to_pdb() method:

interchange.to_pdb("out.pdb")

GROMACS

Once an Interchange object has been constructed, the .gro and .top files can be written using Interchange.to_top() and Interchange.to_gro():

interchange.to_gro("out.gro")
interchange.to_top("out.top")

A .MDP file can be written from an MDConfig object constructed from the interchange. The resulting file will run a single-point energy calculation and should be modified for the desired simulation:

mdconfig.write_mdp_file(mdp_file="auto_generated.mdp")

LAMMPS

An Interchange object can be written to a LAMMPS data file with Interchange.to_lammps()

interchange.to_lammps("data.lmp")

An input file can be written from an MDConfig object constructed from the interchange. The resulting file will run a single-point energy calculation and should be modified for the desired simulation:

mdconfig.write_lammps_input(input_file="auto_generated.in")

Note that LAMMPS does not seem to implement a switching function as commonly used by SMIRNOFF force fields.

OpenMM

An Interchange object can be converted to an openmm.System object with Interchange.to_openmm().

openmm_sys = interchange.to_openmm()

By default, this will separate non-bonded interactions into several different openmm.Force objects. To combine everything into a single openmm.NonbondedForce, use the combine_nonbonded_forces=True argument.

The accompanying OpenMM topology can be constructed with the Topology.to_openmm() method:

openmm_top = interchange.topology.to_openmm()

Recall that all unit-bearing attributes within Interchange objects are openff.units.Quantity objects, which can be converted out to openmm.unit.Quantity objects via their .to_openmm() method. For example:

openmm_positions: openmm.unit.Quantity = interchange.positions.to_openmm()
openmm_box: openmm.unit.Quantity = interchange.box.to_openmm()

Amber

An Interchange object can be written to Amber parameter/topology and coordinate files with Interchange.to_prmtop() and Interchange.to_inpcrd():

interchange.to_prmtop("out.prmtop")
interchange.to_inpcrd("out.inpcrd")

A run control file can be written from an MDConfig object constructed from the interchange. The resulting file will run a single-point energy calculation and should be modified for the desired simulation:

mdconfig.write_sander_input_file(input_file="auto_generated.in")

Note that Amber does not implement a switching function as commonly used by SMIRNOFF force fields.