Saving prmtop files from espaloma parameterization
mmagithub opened this issue · 4 comments
Hello,
I am wondering how can we save the espaloma FF parameters (bonded and non-bonded) files, to use in standalone amber simulations, for example, what I need to do after this step:
openmm_system = esp.graphs.deploy.openmm_system_from_graph(molecule_graph,charge_method='am1-bcc')
In order to save ligand.prmtop, ligand.inpcrd, or ligand.off or ligand.frcmod files ?
This is not clear from the documentations.
Thanks,
Marawan
This is a good question, I will have to double-check to see if we support the openff topology object because if we do, we could use https://github.com/openforcefield/openff-interchange to convert to any MD engine that interchange supports
this would be awesome, thanks
Any update on this request?
I am also trying to do this.
I tried using interchange with the following script.
import os
import torch
import espaloma as esp
from openff.toolkit.topology import Molecule
from openmm.app import *
from openmm import *
from openmm.unit import *
from sys import stdout
from openmm.app import Modeller
from simtk import unit
from openmmforcefields.generators import EspalomaTemplateGenerator
from openff.interchange import Interchange
from openff.units.openmm import ensure_quantity
#Load the molecules
molecule = Molecule.from_file("molecule.mol")
## create an Espaloma Graph object to represent the molecule of interest
molecule_graph = esp.Graph(molecule)
# load pretrained model
espaloma_model = esp.get_model("latest")
espaloma_model(molecule_graph.heterograph)
openmm_system = esp.graphs.deploy.openmm_system_from_graph(molecule_graph)
#Load Amber Force Fields
amber_forcefields = ['amber/protein.ff14SB.xml', 'amber14/tip3pfb.xml']
forcefield = ForceField(*amber_forcefields)
espaloma_generator = EspalomaTemplateGenerator(molecules=molecule, forcefield='espaloma-0.3.1')
openmm_topology = molecule.to_topology().to_openmm()
openmm_positions = molecule.conformers[0].to_openmm()
#Register Force Field
forcefield.registerTemplateGenerator(espaloma_generator.generator)
#Add water and Ions
modeller = Modeller(openmm_topology, openmm_positions)
modeller.addSolvent(forcefield, model='tip3p', padding=1*nanometer,boxShape='octahedron',ionicStrength=0.15*molar)
system = forcefield.createSystem(modeller.topology, nonbondedMethod=PME,nonbondedCutoff=1.0*nanometer, constraints=HBonds,hydrogenMass=4*amu)
out = Interchange.from_openmm(topology=modeller.topology,system=system, positions=modeller.positions)
# or write to GROMACS files
out.to_gro("out.gro")
out.to_top("out.top")
But, I get an error
File "/home/amin/mambaforge/envs/espaloma0.3.1/lib/python3.10/site-packages/openff/interchange/components/interchange.py", line 351, in to_gro
system=_convert(self),
File "/home/amin/mambaforge/envs/espaloma0.3.1/lib/python3.10/site-packages/openff/interchange/smirnoff/_gromacs.py", line 203, in _convert
_convert_bonds(molecule, unique_molecule, interchange)
File "/home/amin/mambaforge/envs/espaloma0.3.1/lib/python3.10/site-packages/openff/interchange/smirnoff/_gromacs.py", line 258, in _convert_bonds
raise MissingBondError(
openff.interchange.exceptions.MissingBondError: Failed to find parameters for bond with topology indices (2, 3)
I tried using parmed instead using the following script
various imports
import parmed as pmd
#Load the molecules
molecule = Molecule.from_file("Cys-TTZ.mol")
#molecule = pmd.load_rdkit('Cys-TTZ.mol')
## create an Espaloma Graph object to represent the molecule of interest
molecule_graph = esp.Graph(molecule)
# load pretrained model
espaloma_model = esp.get_model("latest")
espaloma_model(molecule_graph.heterograph)
openmm_system = esp.graphs.deploy.openmm_system_from_graph(molecule_graph)
amber_forcefields = ['amber/protein.ff14SB.xml', 'amber14/tip3pfb.xml']
forcefield = ForceField(*amber_forcefields)
espaloma_generator = EspalomaTemplateGenerator(molecules=molecule, forcefield='espaloma-0.3.1')
openmm_topology = molecule.to_topology().to_openmm()
openmm_positions = molecule.conformers[0].to_openmm()
forcefield.registerTemplateGenerator(espaloma_generator.generator)
modeller = Modeller(openmm_topology, openmm_positions)
modeller.addSolvent(forcefield, model='tip3p', padding=1*nanometer,boxShape='octahedron',ionicStrength=0.15*molar)
#system = forcefield.createSystem(modeller.topology, nonbondedMethod=PME,nonbondedCutoff=1.0*nanometer, constraints=HBonds,hydrogenMass=4*amu)
system = forcefield.createSystem(modeller.topology, nonbondedMethod=PME,nonbondedCutoff=1.0*nanometer, constraints=None, rigidWater=False)
#out = Interchange.from_openmm(topology=modeller.topology,system=system)
# or write to GROMACS files
#out.to_gro("out.gro")
#out.to_top("out.top")
parmed_structure = pmd.openmm.load_topology(modeller.topology, system=system, xyz=modeller.positions)
#Save Gromacs Files
parmed_structure.save('system.top', overwrite=True)
parmed_structure.save('system.gro', overwrite=True)
#Save amber files
parmed_structure.save('system.parm7', format='amber')
parmed_structure.save('system.rst7', format='rst7')
This allows me to save both gromacs and amber files.
I can run the simulations using the generated files with gromacs, but I am not sure if this is the correct way of doing this.
It would be great to have the opinion of the experts.
Best,
Amin.