def test_write_xml_parameters_amber_write_unused(self): """Test the write_unused argument in writing XML files""" params = openmm.OpenMMParameterSet.from_parameterset( pmd.amber.AmberParameterSet(get_fn('amino12.lib'), os.path.join(get_fn('parm'), 'parm10.dat'), os.path.join(get_fn('parm'), 'frcmod.ff14SB')) ) ffxml = StringIO() params.write(ffxml) ffxml.seek(0) self.assertEqual(len(ffxml.readlines()), 2178) ffxml = StringIO() params.write(ffxml, write_unused=False) ffxml.seek(0) self.assertEqual(len(ffxml.readlines()), 1646) ffxml.seek(0) forcefield = app.ForceField(ffxml) params = openmm.OpenMMParameterSet.from_parameterset( pmd.amber.AmberParameterSet(get_fn('atomic_ions.lib'), os.path.join(get_fn('parm'), 'frcmod.ionsjc_tip3p')) ) ffxml = StringIO() warnings.filterwarnings('ignore', category=exceptions.ParameterWarning) params.write(ffxml) ffxml.seek(0) self.assertEqual(len(ffxml.readlines()), 222) ffxml = StringIO() params.write(ffxml, write_unused=False) ffxml.seek(0) self.assertEqual(len(ffxml.readlines()), 57) ffxml.seek(0) forcefield = app.ForceField(ffxml)
def test_write_xml_parameters_charmm_multisite_waters(self): """ Test writing XML parameter files from Charmm multisite water parameter files and reading them back into OpenMM ForceField """ params = openmm.OpenMMParameterSet.from_parameterset( pmd.charmm.CharmmParameterSet( get_fn('toppar_water_ions_tip5p.str'))) ffxml_filename = get_fn('charmm_conv.xml', written=True) params.write(ffxml_filename, provenance=dict( OriginalFile='toppar_water_ions_tip5p.str', Reference='MacKerrell')) forcefield = app.ForceField(ffxml_filename) # Check that water has the right number of bonds assert len( params.residues['TIP5'].bonds ) == 2, "TIP5P should only have two bonds, but instead has {}".format( params.residues['TIP5'].bonds) # Parameterize water box pdbfile = app.PDBFile(get_fn('waterbox.pdb')) modeller = app.Modeller(pdbfile.topology, pdbfile.positions) modeller.addExtraParticles(forcefield) system = forcefield.createSystem(modeller.topology, nonbondedMethod=app.NoCutoff) # Parameterize water box pdbfile = app.PDBFile(get_fn('waterbox-tip3p.pdb')) modeller = app.Modeller(pdbfile.topology, pdbfile.positions) modeller.addExtraParticles(forcefield) system = forcefield.createSystem(modeller.topology, nonbondedMethod=app.PME)
def test_write_xml_small_amber(self): """ Test writing small XML modifications """ params = openmm.OpenMMParameterSet.from_parameterset( load_file(os.path.join(get_fn('parm'), 'frcmod.constph'))) ffxml_filename = get_fn('test.xml', written=True) params.write(ffxml_filename) forcefield = app.ForceField(ffxml_filename)
def test_write_xml_parameters_methanol_ions_energy(self): """ Test writing XML parameter files from Charmm parameter files, reading them back into OpenMM ForceField, and computing energy of methanol and NaCl """ params = openmm.OpenMMParameterSet.from_parameterset( pmd.charmm.CharmmParameterSet(get_fn('par_all36_cgenff.prm'), get_fn('top_all36_cgenff.rtf'), get_fn('toppar_water_ions.str')) # WARNING: contains duplicate water templates ) del params.residues['TP3M'] # Delete to avoid duplicate water template topologies ffxml_filename = get_fn('charmm_conv.xml', written=True) params.write(ffxml_filename, provenance=dict( OriginalFile='par_all36_cgenff.prm, top_all36_cgenff.rtf, toppar_water_ions.str', Reference='MacKerrell' ) ) forcefield = app.ForceField(ffxml_filename) # Parameterize methanol and ions in vacuum pdbfile = app.PDBFile(get_fn('methanol_ions.pdb')) system = forcefield.createSystem(pdbfile.topology, nonbondedMethod=app.NoCutoff) integrator = mm.VerletIntegrator(1.0*u.femtoseconds) context = mm.Context(system, integrator, CPU) context.setPositions(pdbfile.positions) ffxml_potential = context.getState(getEnergy=True).getPotentialEnergy() / u.kilocalories_per_mole del context, integrator # Compute energy via ParmEd reader psf = CharmmPsfFile(get_fn('methanol_ions.psf')) system = psf.createSystem(params) integrator = mm.VerletIntegrator(1.0*u.femtoseconds) context = mm.Context(system, integrator, CPU) context.setPositions(pdbfile.positions) parmed_potential = context.getState(getEnergy=True).getPotentialEnergy() / u.kilocalories_per_mole del context, integrator # Ensure potentials are almost equal self.assertAlmostEqual(ffxml_potential, parmed_potential)
def test_write_xml_parameters_charmm(self): """ Test writing XML parameter files from Charmm parameter files and reading them back into OpenMM ForceField """ params = openmm.OpenMMParameterSet.from_parameterset( pmd.charmm.CharmmParameterSet(get_fn('par_all36_prot.prm'), get_fn('top_all36_prot.rtf'), get_fn('toppar_water_ions.str')) # WARNING: contains duplicate water templates ) del params.residues['TP3M'] # Delete to avoid duplicate water template topologies ffxml_filename = get_fn('charmm_conv.xml', written=True) params.write(ffxml_filename, provenance=dict( OriginalFile='par_all36_prot.prm, top_all36_prot.rtf', Reference='MacKerrell' ) ) forcefield = app.ForceField(ffxml_filename) # Check that water has the right number of bonds assert len(params.residues['TIP3'].bonds) == 2, "TIP3P should only have two bonds" # Parameterize alanine tripeptide in vacuum pdbfile = app.PDBFile(get_fn('ala_ala_ala.pdb')) system = forcefield.createSystem(pdbfile.topology, nonbondedMethod=app.NoCutoff) # Parameterize ACE-NME in water pdbfile = app.PDBFile(get_fn('2igd_924wat.pdb')) system = forcefield.createSystem(pdbfile.topology, nonbondedMethod=app.PME)
def test_write_xml_parameters_charmm(self): """ Test writing XML parameter files from Charmm parameter files and reading them back into OpenMM ForceField """ params = openmm.OpenMMParameterSet.from_parameterset( pmd.charmm.CharmmParameterSet(get_fn('par_all36_prot.prm'), get_fn('top_all36_prot.rtf'), get_fn('toppar_water_ions.str'))) ffxml_filename = get_fn('charmm_conv.xml', written=True) params.write(ffxml_filename, provenance=dict( OriginalFile='par_all36_prot.prm, top_all36_prot.rtf', Reference='MacKerrell')) forcefield = app.ForceField(ffxml_filename)
def test_write_xml_parameters_amber_write_unused(self): """Test the write_unused argument in writing XML files""" params = openmm.OpenMMParameterSet.from_parameterset( pmd.amber.AmberParameterSet( get_fn('amino12.lib'), os.path.join(get_fn('parm'), 'parm10.dat'), os.path.join(get_fn('parm'), 'frcmod.ff14SB'))) ffxml = StringIO() params.write(ffxml) ffxml.seek(0) self.assertEqual(len(ffxml.readlines()), 2179) ffxml = StringIO() params.write(ffxml, write_unused=False) ffxml.seek(0) self.assertEqual(len(ffxml.readlines()), 1647) ffxml.seek(0) forcefield = app.ForceField(ffxml) params = openmm.OpenMMParameterSet.from_parameterset( pmd.amber.AmberParameterSet( get_fn('atomic_ions.lib'), os.path.join(get_fn('parm'), 'frcmod.ionsjc_tip3p'))) ffxml = StringIO() warnings.filterwarnings('ignore', category=exceptions.ParameterWarning) params.write(ffxml, write_unused=True) ffxml.seek(0) self.assertEqual(len(ffxml.readlines()), 222) ffxml = StringIO() params.write(ffxml, write_unused=False) ffxml.seek(0) self.assertEqual(len(ffxml.readlines()), 57) ffxml.seek(0) forcefield = app.ForceField(ffxml) # Load TIP3P water box to ensure there are no duplicate ion parameters pdbfile = app.PDBFile(get_fn('ionsjc.pdb')) system = forcefield.createSystem(pdbfile.topology)
def test_explicit_improper(self): """ Test writing out the improper explicitly and reading it back into OpenMM ForceField """ warnings.filterwarnings('ignore', category=ParameterWarning) params = openmm.OpenMMParameterSet.from_parameterset( pmd.charmm.CharmmParameterSet(get_fn('par_all36_prot.prm'), get_fn('top_all36_prot.rtf'))) ffxml_filename = get_fn('charmm.xml', written=True) params.write( ffxml_filename, provenance=dict( OriginalFiles='par_all36_prot.prm & top_all36_prot.rtf', Reference='MacKerrel'), charmm_imp=True) forcefield = app.ForceField(ffxml_filename)
def test_write_xml_parameters_gaff(self): """ Test writing XML parameters loaded from Amber GAFF parameter files """ leaprc = StringIO("""\ parm10 = loadamberparams gaff.dat """) params = openmm.OpenMMParameterSet.from_parameterset( pmd.amber.AmberParameterSet.from_leaprc(leaprc)) citations = """\ Wang, J., Wang, W., Kollman P. A.; Case, D. A. "Automatic atom type and bond type perception in molecular mechanical calculations". Journal of Molecular Graphics and Modelling , 25, 2006, 247260. Wang, J., Wolf, R. M.; Caldwell, J. W.;Kollman, P. A.; Case, D. A. "Development and testing of a general AMBER force field". Journal of Computational Chemistry, 25, 2004, 1157-1174. """ ffxml_filename = get_fn('gaff.xml', written=True) params.write(ffxml_filename, provenance=dict(OriginalFile='gaff.dat', Reference=citations)) forcefield = app.ForceField(ffxml_filename)
def test_write_xml_parameters_antechamber(self): """ Test writing XML residue definition from Antechamber mol2 """ leaprc = "molecule = loadmol2 %s\n" % get_fn('molecule.mol2') leaprc += "loadamberparams %s\n" % get_fn('molecule.frcmod') leaprc = StringIO(leaprc) params = openmm.OpenMMParameterSet.from_parameterset( pmd.amber.AmberParameterSet.from_leaprc(leaprc), remediate_residues=False) ffxml_filename = get_fn('residue.xml', written=True) params.write(ffxml_filename) try: forcefield = app.ForceField(ffxml_filename) except KeyError: # A KeyError is expected pass else: assert False, "app.ForceField() should fail with a KeyError when residue templates without parameters are not removed, but it did not."
def test_ljforce_charmm(self): """ Test writing LennardJonesForce without NBFIX from Charmm parameter files and reading them back into OpenMM ForceField """ charmm_params = pmd.charmm.CharmmParameterSet( get_fn('par_all36_prot.prm'), get_fn('top_all36_prot.rtf')) openmm_params = openmm.OpenMMParameterSet.from_parameterset( charmm_params) #openmm_params.write(get_fn('charmm.xml', written=True), ffxml_filename = get_fn('charmm36.xml') openmm_params.write( ffxml_filename, provenance=dict( OriginalFile='par_all36_prot.prm & top_all36_prot.rtf', Reference='MacKerrell'), separate_ljforce=True) forcefield = app.ForceField(ffxml_filename)
def test_ljforce_charmm(self): """ Test writing LennardJonesForce without NBFIX from Charmm parameter files and reading them back into OpenMM ForceField """ charmm_params = pmd.charmm.CharmmParameterSet(get_fn('par_all36_prot.prm'), get_fn('top_all36_prot.rtf')) openmm_params = openmm.OpenMMParameterSet.from_parameterset(charmm_params) #openmm_params.write(get_fn('charmm.xml', written=True), ffxml_filename = get_fn('charmm36.xml') openmm_params.write(ffxml_filename, provenance=dict( OriginalFile='par_all36_prot.prm & top_all36_prot.rtf', Reference='MacKerrell' ), separate_ljforce=True ) forcefield = app.ForceField(ffxml_filename) # Parameterize alanine tripeptide in vacuum pdbfile = app.PDBFile(get_fn('ala_ala_ala.pdb')) system = forcefield.createSystem(pdbfile.topology, nonbondedMethod=app.NoCutoff)
def test_write_xml_parameters_charmm(self): """ Test writing XML parameter files from Charmm parameter files and reading them back into OpenMM ForceField """ params = openmm.OpenMMParameterSet.from_parameterset( pmd.charmm.CharmmParameterSet(get_fn('par_all36_prot.prm'), get_fn('top_all36_prot.rtf'), get_fn('toppar_water_ions.str'))) ffxml_filename = get_fn('charmm_conv.xml', written=True) params.write(ffxml_filename, provenance=dict( OriginalFile='par_all36_prot.prm, top_all36_prot.rtf', Reference='MacKerrell')) forcefield = app.ForceField(ffxml_filename) # Parameterize alanine tripeptide in vacuum pdbfile = app.PDBFile(get_fn('ala_ala_ala.pdb')) system = forcefield.createSystem(pdbfile.topology, nonbondedMethod=app.NoCutoff) # Parameterize ACE-NME in water pdbfile = app.PDBFile(get_fn('2igd_924wat.pdb')) system = forcefield.createSystem(pdbfile.topology, nonbondedMethod=app.PME)
def test_write_xml_parameters(self): """ Test writing XML parameters loaded from Amber files """ leaprc = StringIO("""\ logFile leap.log # # ----- leaprc for loading the ff14SB force field # ----- NOTE: this is designed for PDB format 3! # Uses frcmod.ff14SB for proteins; ff99bsc0 for DNA; ff99bsc0_chiOL3 for RNA # # load atom type hybridizations # addAtomTypes { { "H" "H" "sp3" } { "HO" "H" "sp3" } { "HS" "H" "sp3" } { "H1" "H" "sp3" } { "H2" "H" "sp3" } { "H3" "H" "sp3" } { "H4" "H" "sp3" } { "H5" "H" "sp3" } { "HW" "H" "sp3" } { "HC" "H" "sp3" } { "HA" "H" "sp3" } { "HP" "H" "sp3" } { "HZ" "H" "sp3" } { "OH" "O" "sp3" } { "OS" "O" "sp3" } { "O" "O" "sp2" } { "O2" "O" "sp2" } { "OP" "O" "sp2" } { "OW" "O" "sp3" } { "CT" "C" "sp3" } { "CX" "C" "sp3" } { "C8" "C" "sp3" } { "2C" "C" "sp3" } { "3C" "C" "sp3" } { "CH" "C" "sp3" } { "CS" "C" "sp2" } { "C" "C" "sp2" } { "CO" "C" "sp2" } { "C*" "C" "sp2" } { "CA" "C" "sp2" } { "CB" "C" "sp2" } { "CC" "C" "sp2" } { "CN" "C" "sp2" } { "CM" "C" "sp2" } { "CK" "C" "sp2" } { "CQ" "C" "sp2" } { "CD" "C" "sp2" } { "C5" "C" "sp2" } { "C4" "C" "sp2" } { "CP" "C" "sp2" } { "CI" "C" "sp3" } { "CJ" "C" "sp2" } { "CW" "C" "sp2" } { "CV" "C" "sp2" } { "CR" "C" "sp2" } { "CA" "C" "sp2" } { "CY" "C" "sp2" } { "C0" "Ca" "sp3" } { "MG" "Mg" "sp3" } { "N" "N" "sp2" } { "NA" "N" "sp2" } { "N2" "N" "sp2" } { "N*" "N" "sp2" } { "NP" "N" "sp2" } { "NQ" "N" "sp2" } { "NB" "N" "sp2" } { "NC" "N" "sp2" } { "NT" "N" "sp3" } { "NY" "N" "sp2" } { "N3" "N" "sp3" } { "S" "S" "sp3" } { "SH" "S" "sp3" } { "P" "P" "sp3" } { "LP" "" "sp3" } { "EP" "" "sp3" } { "F" "F" "sp3" } { "Cl" "Cl" "sp3" } { "Br" "Br" "sp3" } { "I" "I" "sp3" } { "F-" "F" "sp3" } { "Cl-" "Cl" "sp3" } { "Br-" "Br" "sp3" } { "I-" "I" "sp3" } { "Li+" "Li" "sp3" } { "Na+" "Na" "sp3" } { "K+" "K" "sp3" } { "Rb+" "Rb" "sp3" } { "Cs+" "Cs" "sp3" } { "Mg+" "Mg" "sp3" } # glycam { "OG" "O" "sp3" } { "OL" "O" "sp3" } { "AC" "C" "sp3" } { "EC" "C" "sp3" } } # # Load the main parameter set. # parm10 = loadamberparams parm10.dat frcmod14SB = loadamberparams frcmod.ff14SB # # Load main chain and terminating amino acid libraries, nucleic acids # loadOff amino12.lib loadOff aminoct12.lib loadOff aminont12.lib loadOff nucleic12.lib # # Load water and ions # #loadOff atomic_ions.lib #loadOff solvents.lib #HOH = TP3 #WAT = TP3 # # Define the PDB name map for the amino acids and nucleic acids # addPdbResMap { { 0 "HYP" "NHYP" } { 1 "HYP" "CHYP" } { 0 "ALA" "NALA" } { 1 "ALA" "CALA" } { 0 "ARG" "NARG" } { 1 "ARG" "CARG" } { 0 "ASN" "NASN" } { 1 "ASN" "CASN" } { 0 "ASP" "NASP" } { 1 "ASP" "CASP" } { 0 "CYS" "NCYS" } { 1 "CYS" "CCYS" } { 0 "CYX" "NCYX" } { 1 "CYX" "CCYX" } { 0 "GLN" "NGLN" } { 1 "GLN" "CGLN" } { 0 "GLU" "NGLU" } { 1 "GLU" "CGLU" } { 0 "GLY" "NGLY" } { 1 "GLY" "CGLY" } { 0 "HID" "NHID" } { 1 "HID" "CHID" } { 0 "HIE" "NHIE" } { 1 "HIE" "CHIE" } { 0 "HIP" "NHIP" } { 1 "HIP" "CHIP" } { 0 "ILE" "NILE" } { 1 "ILE" "CILE" } { 0 "LEU" "NLEU" } { 1 "LEU" "CLEU" } { 0 "LYS" "NLYS" } { 1 "LYS" "CLYS" } { 0 "MET" "NMET" } { 1 "MET" "CMET" } { 0 "PHE" "NPHE" } { 1 "PHE" "CPHE" } { 0 "PRO" "NPRO" } { 1 "PRO" "CPRO" } { 0 "SER" "NSER" } { 1 "SER" "CSER" } { 0 "THR" "NTHR" } { 1 "THR" "CTHR" } { 0 "TRP" "NTRP" } { 1 "TRP" "CTRP" } { 0 "TYR" "NTYR" } { 1 "TYR" "CTYR" } { 0 "VAL" "NVAL" } { 1 "VAL" "CVAL" } { 0 "HIS" "NHIS" } { 1 "HIS" "CHIS" } { 0 "G" "G5" } { 1 "G" "G3" } { 0 "A" "A5" } { 1 "A" "A3" } { 0 "C" "C5" } { 1 "C" "C3" } { 0 "U" "U5" } { 1 "U" "U3" } { 0 "DG" "DG5" } { 1 "DG" "DG3" } { 0 "DA" "DA5" } { 1 "DA" "DA3" } { 0 "DC" "DC5" } { 1 "DC" "DC3" } { 0 "DT" "DT5" } { 1 "DT" "DT3" } # some old Amber residue names for RNA: { 0 "RA5" "A5" } { 1 "RA3" "A3"} {"RA" "A" } { 0 "RC5" "C5" } { 1 "RC3" "C3"} {"RC" "C" } { 0 "RG5" "G5" } { 1 "RG3" "G3"} {"RG" "G" } { 0 "RU5" "U5" } { 1 "RU3" "U3"} {"RU" "U" } # some really old Amber residue names, assuming DNA: { 0 "GUA" "DG5" } { 1 "GUA" "DG3" } { "GUA" "DG" } { 0 "ADE" "DA5" } { 1 "ADE" "DA3" } { "ADE" "DA" } { 0 "CYT" "DC5" } { 1 "CYT" "DC3" } { "CYT" "DC" } { 0 "THY" "DT5" } { 1 "THY" "DT3" } { "THY" "DT" } # uncomment out the following if you have this old style RNA files: # { 0 "GUA" "G5" } { 1 "GUA" "G3" } { "GUA" "G" } # { 0 "ADE" "A5" } { 1 "ADE" "A3" } { "ADE" "A" } # { 0 "CYT" "C5" } { 1 "CYT" "C3" } { "CYT" "C" } # { 0 "URA" "R5" } { 1 "URA" "R3" } { "URA" "R" } } # try to be good about reading in really old atom names as well: addPdbAtomMap { { "O5*" "O5'" } { "C5*" "C5'" } { "C4*" "C4'" } { "O4*" "O4'" } { "C3*" "C3'" } { "O3*" "O3'" } { "C2*" "C2'" } { "O2*" "O2'" } { "C1*" "C1'" } { "C5M" "C7" } { "H1*" "H1'" } { "H2*1" "H2'" } { "H2*2" "H2''" } { "H2'1" "H2'" } { "H2'2" "H2''" } { "H3*" "H3'" } { "H4*" "H4'" } { "H5*1" "H5'" } { "H5*2" "H5''" } { "H5'1" "H5'" } { "H5'2" "H5''" } { "HO'2" "HO2'" } { "H5T" "HO5'" } { "H3T" "HO3'" } { "O1'" "O4'" } { "OA" "OP1" } { "OB" "OP2" } { "O1P" "OP1" } { "O2P" "OP2" } } # # assume that most often proteins use HIE # NHIS = NHIE HIS = HIE CHIS = CHIE """) params = openmm.OpenMMParameterSet.from_parameterset( pmd.amber.AmberParameterSet.from_leaprc(leaprc)) ffxml_filename = get_fn('amber_conv.xml', written=True) params.write(ffxml_filename, provenance=dict(OriginalFile='leaprc.ff14SB', Reference=[ 'Maier and Simmerling', 'Simmerling and Maier' ], Source=dict(Source='leaprc.ff14SB', sourcePackage='AmberTools', sourcePackageVersion='15'))) forcefield = app.ForceField(ffxml_filename) # Make sure the forcefield can handle proteins with disulfide bonds pdbfile = app.PDBFile(get_fn('3qyt_fix.pdb')) forcefield.createSystem(pdbfile.topology, nonbondedMethod=app.NoCutoff)