def test_Disulfides(self): """Test that various force fields handle disulfides correctly.""" pdb = PDBFile('systems/bpti.pdb') for ff in [ 'amber99sb.xml', 'amber14-all.xml', 'charmm36.xml', 'amberfb15.xml', 'amoeba2013.xml' ]: forcefield = ForceField(ff) system = forcefield.createSystem(pdb.topology)
def test_Forces(self): """Compute forces and compare them to ones generated with a previous version of OpenMM to ensure they haven't changed.""" pdb = PDBFile('systems/alanine-dipeptide-implicit.pdb') forcefield = ForceField('amoeba2013.xml', 'amoeba2013_gk.xml') system = forcefield.createSystem(pdb.topology, polarization='direct') integrator = VerletIntegrator(0.001) context = Context(system, integrator) context.setPositions(pdb.positions) state1 = context.getState(getForces=True) with open('systems/alanine-dipeptide-amoeba-forces.xml') as input: state2 = XmlSerializer.deserialize(input.read()) for f1, f2, in zip(state1.getForces().value_in_unit(kilojoules_per_mole/nanometer), state2.getForces().value_in_unit(kilojoules_per_mole/nanometer)): diff = norm(f1-f2) self.assertTrue(diff < 0.1 or diff/norm(f1) < 1e-3)
def _create_system(self): """ Create the OpenMM System object. """ # Create file-like objects from ffxml contents because ForceField cannot yet read strings. from StringIO import StringIO ffxml_streams = list() for ffxml in self._ffxmls: ffxml_streams.append(StringIO(ffxml)) # Create ForceField. forcefield = app.ForceField(ffxml_streams) # Create System from topology. self._system = forcefield.createSystem(self._topology, **self.system_creation_parameters) return
def _create_system(self): """ Create the OpenMM System object. """ # Create file-like objects from ffxml contents because ForceField cannot yet read strings. from StringIO import StringIO ffxml_streams = list() for ffxml in self._ffxmls: ffxml_streams.append(StringIO(ffxml)) # Create ForceField. forcefield = app.ForceField(*ffxml_streams) # Create System from topology. self._system = forcefield.createSystem(self._topology, **self.system_creation_parameters) return
def test_ggenerateTemplatesForUnmatchedResidues(self): """Test generation of blank forcefield residue templates for unmatched residues.""" # # Test where we generate parameters for only a ligand. # # Load the PDB file. pdb = PDBFile(os.path.join('systems', 'nacl-water.pdb')) # Create a ForceField object. forcefield = ForceField('tip3p.xml') # Get list of unmatched residues. unmatched_residues = forcefield.getUnmatchedResidues(pdb.topology) [templates, residues] = forcefield.generateTemplatesForUnmatchedResidues(pdb.topology) # Check results. self.assertEqual(len(unmatched_residues), 24) self.assertEqual(len(residues), 2) self.assertEqual(len(templates), 2) unique_names = set([ residue.name for residue in residues ]) self.assertTrue('HOH' not in unique_names) self.assertTrue('NA' in unique_names) self.assertTrue('CL' in unique_names) template_names = set([ template.name for template in templates ]) self.assertTrue('HOH' not in template_names) self.assertTrue('NA' in template_names) self.assertTrue('CL' in template_names) # Define forcefield parameters using returned templates. # NOTE: This parameter definition file will currently only work for residues that either have # no external bonds or external bonds to other residues parameterized by the simpleTemplateGenerator. simple_ffxml_contents = """ <ForceField> <AtomTypes> <Type name="XXX" class="XXX" element="C" mass="12.0"/> </AtomTypes> <HarmonicBondForce> <Bond type1="XXX" type2="XXX" length="0.1409" k="392459.2"/> </HarmonicBondForce> <HarmonicAngleForce> <Angle type1="XXX" type2="XXX" type3="XXX" angle="2.09439510239" k="527.184"/> </HarmonicAngleForce> <NonbondedForce coulomb14scale="0.833333" lj14scale="0.5"> <Atom type="XXX" charge="0.000" sigma="0.315" epsilon="0.635"/> </NonbondedForce> </ForceField>""" # # Test the pre-geenration of missing residue template for a ligand. # # Load the PDB file. pdb = PDBFile(os.path.join('systems', 'T4-lysozyme-L99A-p-xylene-implicit.pdb')) # Create a ForceField object. forcefield = ForceField('amber99sb.xml', 'tip3p.xml', StringIO(simple_ffxml_contents)) # Get list of unique unmatched residues. [templates, residues] = forcefield.generateTemplatesForUnmatchedResidues(pdb.topology) # Add residue templates to forcefield. for template in templates: # Replace atom types. for atom in template.atoms: atom.type = 'XXX' # Register the template. forcefield.registerResidueTemplate(template) # Parameterize system. system = forcefield.createSystem(pdb.topology, nonbondedMethod=NoCutoff)
def test_residueTemplateGenerator(self): """Test the ability to add residue template generators to parameterize unmatched residues.""" def simpleTemplateGenerator(forcefield, residue): """\ Simple residue template generator. This implementation uses the programmatic API to define residue templates. NOTE: We presume we have already loaded the force definitions into ForceField. """ # Generate a unique prefix name for generating parameters. from uuid import uuid4 template_name = uuid4() # Create residue template. from simtk.openmm.app.forcefield import _createResidueTemplate template = _createResidueTemplate(residue) # use helper function template.name = template_name # replace template name for (template_atom, residue_atom) in zip(template.atoms, residue.atoms()): template_atom.type = 'XXX' # replace atom type # Register the template. forcefield.registerResidueTemplate(template) # Signal that we have successfully parameterized the residue. return True # Define forcefield parameters used by simpleTemplateGenerator. # NOTE: This parameter definition file will currently only work for residues that either have # no external bonds or external bonds to other residues parameterized by the simpleTemplateGenerator. simple_ffxml_contents = """ <ForceField> <AtomTypes> <Type name="XXX" class="XXX" element="C" mass="12.0"/> </AtomTypes> <HarmonicBondForce> <Bond type1="XXX" type2="XXX" length="0.1409" k="392459.2"/> </HarmonicBondForce> <HarmonicAngleForce> <Angle type1="XXX" type2="XXX" type3="XXX" angle="2.09439510239" k="527.184"/> </HarmonicAngleForce> <NonbondedForce coulomb14scale="0.833333" lj14scale="0.5"> <Atom type="XXX" charge="0.000" sigma="0.315" epsilon="0.635"/> </NonbondedForce> </ForceField>""" # # Test where we generate parameters for only a ligand. # # Load the PDB file. pdb = PDBFile(os.path.join('systems', 'T4-lysozyme-L99A-p-xylene-implicit.pdb')) # Create a ForceField object. forcefield = ForceField('amber99sb.xml', 'tip3p.xml', StringIO(simple_ffxml_contents)) # Add the residue template generator. forcefield.registerTemplateGenerator(simpleTemplateGenerator) # Parameterize system. system = forcefield.createSystem(pdb.topology, nonbondedMethod=NoCutoff) # TODO: Test energies are finite? # # Test for a few systems where we generate all parameters. # tests = [ { 'pdb_filename' : 'alanine-dipeptide-implicit.pdb', 'nonbondedMethod' : NoCutoff }, { 'pdb_filename' : 'lysozyme-implicit.pdb', 'nonbondedMethod' : NoCutoff }, { 'pdb_filename' : 'alanine-dipeptide-explicit.pdb', 'nonbondedMethod' : CutoffPeriodic }, ] # Test all systems with separate ForceField objects. for test in tests: # Load the PDB file. pdb = PDBFile(os.path.join('systems', test['pdb_filename'])) # Create a ForceField object. forcefield = ForceField(StringIO(simple_ffxml_contents)) # Add the residue template generator. forcefield.registerTemplateGenerator(simpleTemplateGenerator) # Parameterize system. system = forcefield.createSystem(pdb.topology, nonbondedMethod=test['nonbondedMethod']) # TODO: Test energies are finite? # Now test all systems with a single ForceField object. # Create a ForceField object. forcefield = ForceField(StringIO(simple_ffxml_contents)) # Add the residue template generator. forcefield.registerTemplateGenerator(simpleTemplateGenerator) for test in tests: # Load the PDB file. pdb = PDBFile(os.path.join('systems', test['pdb_filename'])) # Parameterize system. system = forcefield.createSystem(pdb.topology, nonbondedMethod=test['nonbondedMethod'])
def test_ggenerateTemplatesForUnmatchedResidues(self): """Test generation of blank forcefield residue templates for unmatched residues.""" # # Test where we generate parameters for only a ligand. # # Load the PDB file. pdb = PDBFile(os.path.join('systems', 'nacl-water.pdb')) # Create a ForceField object. forcefield = ForceField('tip3p.xml') # Get list of unmatched residues. unmatched_residues = forcefield.getUnmatchedResidues(pdb.topology) [templates, residues ] = forcefield.generateTemplatesForUnmatchedResidues(pdb.topology) # Check results. self.assertEqual(len(unmatched_residues), 24) self.assertEqual(len(residues), 2) self.assertEqual(len(templates), 2) unique_names = set([residue.name for residue in residues]) self.assertTrue('HOH' not in unique_names) self.assertTrue('NA' in unique_names) self.assertTrue('CL' in unique_names) template_names = set([template.name for template in templates]) self.assertTrue('HOH' not in template_names) self.assertTrue('NA' in template_names) self.assertTrue('CL' in template_names) # Define forcefield parameters using returned templates. # NOTE: This parameter definition file will currently only work for residues that either have # no external bonds or external bonds to other residues parameterized by the simpleTemplateGenerator. simple_ffxml_contents = """ <ForceField> <AtomTypes> <Type name="XXX" class="XXX" element="C" mass="12.0"/> </AtomTypes> <HarmonicBondForce> <Bond type1="XXX" type2="XXX" length="0.1409" k="392459.2"/> </HarmonicBondForce> <HarmonicAngleForce> <Angle type1="XXX" type2="XXX" type3="XXX" angle="2.09439510239" k="527.184"/> </HarmonicAngleForce> <NonbondedForce coulomb14scale="0.833333" lj14scale="0.5"> <Atom type="XXX" charge="0.000" sigma="0.315" epsilon="0.635"/> </NonbondedForce> </ForceField>""" # # Test the pre-geenration of missing residue template for a ligand. # # Load the PDB file. pdb = PDBFile( os.path.join('systems', 'T4-lysozyme-L99A-p-xylene-implicit.pdb')) # Create a ForceField object. forcefield = ForceField('amber99sb.xml', 'tip3p.xml', StringIO(simple_ffxml_contents)) # Get list of unique unmatched residues. [templates, residues ] = forcefield.generateTemplatesForUnmatchedResidues(pdb.topology) # Add residue templates to forcefield. for template in templates: # Replace atom types. for atom in template.atoms: atom.type = 'XXX' # Register the template. forcefield.registerResidueTemplate(template) # Parameterize system. system = forcefield.createSystem(pdb.topology, nonbondedMethod=NoCutoff)
def test_residueTemplateGenerator(self): """Test the ability to add residue template generators to parameterize unmatched residues.""" def simpleTemplateGenerator(forcefield, residue): """\ Simple residue template generator. This implementation uses the programmatic API to define residue templates. NOTE: We presume we have already loaded the force definitions into ForceField. """ # Generate a unique prefix name for generating parameters. from uuid import uuid4 template_name = uuid4() # Create residue template. from simtk.openmm.app.forcefield import _createResidueTemplate template = _createResidueTemplate(residue) # use helper function template.name = template_name # replace template name for (template_atom, residue_atom) in zip(template.atoms, residue.atoms()): template_atom.type = 'XXX' # replace atom type # Register the template. forcefield.registerResidueTemplate(template) # Signal that we have successfully parameterized the residue. return True # Define forcefield parameters used by simpleTemplateGenerator. # NOTE: This parameter definition file will currently only work for residues that either have # no external bonds or external bonds to other residues parameterized by the simpleTemplateGenerator. simple_ffxml_contents = """ <ForceField> <AtomTypes> <Type name="XXX" class="XXX" element="C" mass="12.0"/> </AtomTypes> <HarmonicBondForce> <Bond type1="XXX" type2="XXX" length="0.1409" k="392459.2"/> </HarmonicBondForce> <HarmonicAngleForce> <Angle type1="XXX" type2="XXX" type3="XXX" angle="2.09439510239" k="527.184"/> </HarmonicAngleForce> <NonbondedForce coulomb14scale="0.833333" lj14scale="0.5"> <Atom type="XXX" charge="0.000" sigma="0.315" epsilon="0.635"/> </NonbondedForce> </ForceField>""" # # Test where we generate parameters for only a ligand. # # Load the PDB file. pdb = PDBFile( os.path.join('systems', 'T4-lysozyme-L99A-p-xylene-implicit.pdb')) # Create a ForceField object. forcefield = ForceField('amber99sb.xml', 'tip3p.xml', StringIO(simple_ffxml_contents)) # Add the residue template generator. forcefield.registerTemplateGenerator(simpleTemplateGenerator) # Parameterize system. system = forcefield.createSystem(pdb.topology, nonbondedMethod=NoCutoff) # TODO: Test energies are finite? # # Test for a few systems where we generate all parameters. # tests = [ { 'pdb_filename': 'alanine-dipeptide-implicit.pdb', 'nonbondedMethod': NoCutoff }, { 'pdb_filename': 'lysozyme-implicit.pdb', 'nonbondedMethod': NoCutoff }, { 'pdb_filename': 'alanine-dipeptide-explicit.pdb', 'nonbondedMethod': CutoffPeriodic }, ] # Test all systems with separate ForceField objects. for test in tests: # Load the PDB file. pdb = PDBFile(os.path.join('systems', test['pdb_filename'])) # Create a ForceField object. forcefield = ForceField(StringIO(simple_ffxml_contents)) # Add the residue template generator. forcefield.registerTemplateGenerator(simpleTemplateGenerator) # Parameterize system. system = forcefield.createSystem( pdb.topology, nonbondedMethod=test['nonbondedMethod']) # TODO: Test energies are finite? # Now test all systems with a single ForceField object. # Create a ForceField object. forcefield = ForceField(StringIO(simple_ffxml_contents)) # Add the residue template generator. forcefield.registerTemplateGenerator(simpleTemplateGenerator) for test in tests: # Load the PDB file. pdb = PDBFile(os.path.join('systems', test['pdb_filename'])) # Parameterize system. system = forcefield.createSystem( pdb.topology, nonbondedMethod=test['nonbondedMethod'])
def test_Disulfides(self): """Test that various force fields handle disulfides correctly.""" pdb = PDBFile('systems/bpti.pdb') for ff in ['amber99sb.xml', 'amber14-all.xml', 'charmm36.xml', 'amberfb15.xml', 'amoeba2013.xml']: forcefield = ForceField(ff) system = forcefield.createSystem(pdb.topology)
def test_residueTemplateGenerator(self): """Test the ability to add residue template generators to parameterize unmatched residues.""" def simpleTemplateGenerator(forcefield, residue): """\ Simple residue template generator. This implementation uses the programmatic API to define residue templates. NOTE: We presume we have already loaded the force definitions into ForceField. """ # Generate a unique prefix name for generating parameters. from uuid import uuid4 template_name = uuid4() # Create residue template. template = ForceField._TemplateData(template_name) for atom in residue.atoms(): typename = "XXX" atom_template = ForceField._TemplateAtomData(atom.name, typename, atom.element) template.atoms.append(atom_template) for (atom1, atom2) in residue.internal_bonds(): template.addBondByName(atom1.name, atom2.name) residue_atoms = [atom for atom in residue.atoms()] for (atom1, atom2) in residue.external_bonds(): if atom1 in residue_atoms: template.addExternalBondByName(atom1.name) elif atom2 in residue_atoms: template.addExternalBondByName(atom2.name) # Register the template. forcefield.registerResidueTemplate(template) # Signal that we have successfully parameterized the residue. return True # Define forcefield parameters used by simpleTemplateGenerator. # NOTE: This parameter definition file will currently only work for residues that either have # no external bonds or external bonds to other residues parameterized by the simpleTemplateGenerator. simple_ffxml_contents = """ <ForceField> <AtomTypes> <Type name="XXX" class="XXX" element="C" mass="12.0"/> </AtomTypes> <HarmonicBondForce> <Bond type1="XXX" type2="XXX" length="0.1409" k="392459.2"/> </HarmonicBondForce> <HarmonicAngleForce> <Angle type1="XXX" type2="XXX" type3="XXX" angle="2.09439510239" k="527.184"/> </HarmonicAngleForce> <NonbondedForce coulomb14scale="0.833333" lj14scale="0.5"> <Atom type="XXX" charge="0.000" sigma="0.315" epsilon="0.635"/> </NonbondedForce> </ForceField>""" # # Test where we generate parameters for only a ligand. # # Load the PDB file. pdb = PDBFile(os.path.join("systems", "T4-lysozyme-L99A-p-xylene-implicit.pdb")) # Create a ForceField object. forcefield = ForceField("amber99sb.xml", "tip3p.xml", StringIO(simple_ffxml_contents)) # Add the residue template generator. forcefield.registerTemplateGenerator(simpleTemplateGenerator) # Parameterize system. system = forcefield.createSystem(pdb.topology, nonbondedMethod=NoCutoff) # TODO: Test energies are finite? # # Test for a few systems where we generate all parameters. # tests = [ {"pdb_filename": "alanine-dipeptide-implicit.pdb", "nonbondedMethod": NoCutoff}, {"pdb_filename": "lysozyme-implicit.pdb", "nonbondedMethod": NoCutoff}, {"pdb_filename": "alanine-dipeptide-explicit.pdb", "nonbondedMethod": CutoffPeriodic}, ] # Test all systems with separate ForceField objects. for test in tests: # Load the PDB file. pdb = PDBFile(os.path.join("systems", test["pdb_filename"])) # Create a ForceField object. forcefield = ForceField(StringIO(simple_ffxml_contents)) # Add the residue template generator. forcefield.registerTemplateGenerator(simpleTemplateGenerator) # Parameterize system. system = forcefield.createSystem(pdb.topology, nonbondedMethod=test["nonbondedMethod"]) # TODO: Test energies are finite? # Now test all systems with a single ForceField object. # Create a ForceField object. forcefield = ForceField(StringIO(simple_ffxml_contents)) # Add the residue template generator. forcefield.registerTemplateGenerator(simpleTemplateGenerator) for test in tests: # Load the PDB file. pdb = PDBFile(os.path.join("systems", test["pdb_filename"])) # Parameterize system. system = forcefield.createSystem(pdb.topology, nonbondedMethod=test["nonbondedMethod"])
from simtk.openmm.app import * from simtk.openmm import * from simtk.unit import * import simtk.openmm.app.element as elem import simtk.openmm.app.forcefield as forcefield from sys import stdout, argv import mpidplugin import numpy as np pdb = PDBFile('mpidwater.pdb') forcefield = ForceField('mpidwater.xml') system = forcefield.createSystem(pdb.topology, nonbondedMethod=LJPME, nonbondedCutoff=8 * angstrom, constraints=HBonds) integrator = LangevinIntegrator(300 * kelvin, 1 / picosecond, 2 * femtoseconds) #integrator = VerletIntegrator(1*femtoseconds) # Make sure all the forces we expect are present for force in range(system.getNumForces()): print(system.getForce(force)) try: myplatform = Platform.getPlatformByName('CUDA') # Figure out which GPU to run on, i.e. did the user tell us? deviceid = argv[1] if len(argv) > 1 else '0' myproperties = {'DeviceIndex': deviceid, 'Precision': 'mixed'} except: print("CUDA NOT FOUND!!!!!!!!!!") myplatform = None deviceid = "N/A"