Ejemplo n.º 1
0
    def test_energy_complicated(self):
        """ Check equal energies for Gmx -> Amber conversion of complex FF """
        top = load_file(self.get_fn(os.path.join('12.DPPC', 'topol2.top')))
        gro = load_file(self.get_fn(os.path.join('12.DPPC', 'conf.gro')))
        parm = amber.AmberParm.from_structure(top)
        parm.write_parm(self.get_fn('dppc.parm7', written=True))
        parm = load_file(self.get_fn('dppc.parm7', written=True))

        sysg = top.createSystem()
        sysa = parm.createSystem()

        cong = mm.Context(sysg, mm.VerletIntegrator(0.001), CPU)
        cona = mm.Context(sysa, mm.VerletIntegrator(0.001), CPU)

        cong.setPositions(gro.positions)
        cona.setPositions(gro.positions)

        self.check_energies(top, cong, parm, cona)
Ejemplo n.º 2
0
    def test_opls(self):
        """ Tests geometric combining rules with OPLS/AA in Gromacs topology """
        top = load_file(os.path.join(get_fn('05.OPLS'), 'topol.top'),
                        xyz=os.path.join(get_fn('05.OPLS'), 'conf.gro'))
        self.assertEqual(top.combining_rule, 'geometric')

        # Create the system and context, then calculate the energy decomposition
        system = top.createSystem()
        context = mm.Context(system, mm.VerletIntegrator(0.001), CPU)
        context.setPositions(top.positions)
        energies = energy_decomposition(top,
                                        context,
                                        nrg=u.kilojoules_per_mole)

        # Compare with Gromacs energies
        self.assertAlmostEqual(energies['bond'], 332.178260935, places=4)
        self.assertAlmostEqual(energies['angle'], 29.2231806883, places=4)
        self.assertAlmostEqual(energies['dihedral'], 0.0057758656, places=4)
        self.assertAlmostEqual(energies['rb_torsion'], 55.603030624, places=4)
        self.assertRelativeEqual(energies['nonbonded'],
                                 327.954397827,
                                 places=4)
        # Now make sure it can be set with PME
        system = top.createSystem(nonbondedMethod=app.PME,
                                  nonbondedCutoff=8 * u.angstroms)
        n = 0
        for force in system.getForces():
            if isinstance(force, mm.NonbondedForce):
                self.assertAlmostEqualQuantities(force.getCutoffDistance(),
                                                 8 * u.angstroms)
                self.assertEqual(force.getNonbondedMethod(), force.PME)
                n += 1
            elif isinstance(force, mm.CustomNonbondedForce):
                self.assertAlmostEqualQuantities(force.getCutoffDistance(),
                                                 8 * u.angstroms)
                self.assertEqual(force.getNonbondedMethod(),
                                 force.CutoffPeriodic)
                n += 1
        self.assertEqual(n, 2)
        # Now try with non-periodic cutoff
        system = top.createSystem(nonbondedMethod=app.CutoffNonPeriodic,
                                  nonbondedCutoff=16 * u.angstroms,
                                  switchDistance=14 * u.angstroms)
        n = 0
        for force in system.getForces():
            if isinstance(force, mm.NonbondedForce) or isinstance(
                    force, mm.CustomNonbondedForce):
                self.assertAlmostEqualQuantities(force.getCutoffDistance(),
                                                 16 * u.angstroms)
                self.assertEqual(force.getNonbondedMethod(),
                                 force.CutoffNonPeriodic)
                self.assertTrue(force.getUseSwitchingFunction())
                self.assertAlmostEqualQuantities(force.getSwitchingDistance(),
                                                 14 * u.angstroms)
                n += 1
        self.assertEqual(n, 2)
Ejemplo n.º 3
0
 def test_round_trip(self):
     """ Test ParmEd -> OpenMM round trip with CHARMM gas phase """
     parm = charmm_gas
     system = parm.createSystem(param22)
     self.assertEqual(parm.combining_rule, 'lorentz')
     system2 = openmm.load_topology(parm.topology, system).createSystem()
     con1 = mm.Context(system, mm.VerletIntegrator(0.001), CPU)
     con2 = mm.Context(system2, mm.VerletIntegrator(0.001), CPU)
     con1.setPositions(charmm_gas_crds.positions)
     con2.setPositions(charmm_gas_crds.positions)
     energies = energy_decomposition(parm, con1)
     energies2 = energy_decomposition(parm, con2)
     self.assertAlmostEqual(energies['bond'], energies2['bond'])
     self.assertAlmostEqual(energies['angle'], energies2['angle'])
     self.assertAlmostEqual(energies['urey_bradley'], energies2['urey_bradley'])
     self.assertAlmostEqual(energies['dihedral'], energies2['dihedral'])
     self.assertAlmostEqual(energies['improper'], energies2['improper'])
     self.assertAlmostEqual(energies['cmap'], energies2['cmap'])
     self.assertRelativeEqual(energies['nonbonded'], energies2['nonbonded'])
Ejemplo n.º 4
0
    def test_rb_torsion_conversion3(self):
        """ Check equal energies for Gromacs -> Amber conversion of Amber FF """
        top = get_fn('2PPN_bulk.top')
        gro = get_fn('2PPN_bulk.gro')
        top = load_file(top, xyz=gro)

        parm = amber.AmberParm.from_structure(top)
        parm.save(get_fn('2PPN_bulk.prmtop', written=True))
        parm.save(get_fn('2PPN_bulk.rst7', written=True))

        sysg = top.createSystem()
        sysa = parm.createSystem()

        cong = mm.Context(sysg, mm.VerletIntegrator(0.001), CPU)
        cona = mm.Context(sysa, mm.VerletIntegrator(0.001), CPU)

        cong.setPositions(top.positions)
        cona.setPositions(top.positions)

        self.check_energies(top, cong, parm, cona)
Ejemplo n.º 5
0
    def test_rb_torsion_conversion2(self):
        """ Check equal energies for Gromacs -> Amber conversion of Amber FF """
        top = self.get_fn(os.path.join('05.OPLS', 'topol.top'))
        gro = self.get_fn(os.path.join('05.OPLS', 'conf.gro'))
        top = load_file(top, xyz=gro)

        parm = amber.AmberParm.from_structure(top)
        parm.save(self.get_fn('05opls.prmtop', written=True))
        parm.save(self.get_fn('05opls.rst7', written=True))

        sysg = top.createSystem()
        sysa = parm.createSystem()

        cong = mm.Context(sysg, mm.VerletIntegrator(0.001), CPU)
        cona = mm.Context(sysa, mm.VerletIntegrator(0.001), CPU)

        cong.setPositions(top.positions)
        cona.setPositions(top.positions)

        self.check_energies(top, cong, parm, cona)
Ejemplo n.º 6
0
 def test_chamber_energies(self):
     """ Tests converting Gromacs to Chamber parm calculated energies """
     # Now let's modify an exception parameter so that it needs type
     # expansion, and ensure that it is handled correctly
     top = load_file(get_fn('1aki.charmm27.solv.top'),
                     xyz=get_fn('1aki.charmm27.solv.gro'))
     gsystem = top.createSystem(nonbondedCutoff=8 * u.angstroms,
                                nonbondedMethod=app.PME)
     gcon = mm.Context(gsystem, mm.VerletIntegrator(1 * u.femtosecond), CPU)
     gcon.setPositions(top.positions)
     eg = gcon.getState(getEnergy=True).getPotentialEnergy()
     eg = eg.value_in_unit(u.kilocalories_per_mole)
     # Convert to chamber now
     parm = amber.ChamberParm.from_structure(top)
     asystem = parm.createSystem(nonbondedCutoff=8 * u.angstroms,
                                 nonbondedMethod=app.PME)
     acon = mm.Context(asystem, mm.VerletIntegrator(1 * u.femtosecond), CPU)
     acon.setPositions(top.positions)
     ea = acon.getState(getEnergy=True).getPotentialEnergy()
     ea = ea.value_in_unit(u.kilocalories_per_mole)
     self.assertLess(abs(eg - ea), 1e-2)
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
    def test_load_topology_use_atom_id_as_typename(self):
        """ Tests loading an OpenMM Topology and using Atom.id to name types """
        ommparm = load_file(get_fn('ash.parm7'), get_fn('ash.rst7'))
        parm = load_file(get_fn('ash.parm7'), get_fn('ash.rst7'))
        system = ommparm.createSystem(implicitSolvent=app.OBC1)

        for pmd_atom, omm_atom in zip(parm.atoms, ommparm.topology.atoms()):
            omm_atom.id = pmd_atom.type
        structure = openmm.load_topology(ommparm.topology, system,
                                         xyz=parm.positions)

        self.assertEqual(len(parm.atoms), len(structure.atoms))
        self.assertEqual([a.type for a in parm.atoms],
                         [a.type for a in structure.atoms])
        self.assertEqual(len(parm.residues), len(structure.residues))
        self.assertEqual(len(parm.bonds), len(structure.bonds))

        con1 = mm.Context(system, mm.VerletIntegrator(0.001), CPU)
        con2 = mm.Context(system, mm.VerletIntegrator(0.001), CPU)
        con1.setPositions(parm.positions)
        con2.setPositions(structure.positions)

        self.check_energies(parm, con1, structure, con2)
Ejemplo n.º 9
0
    def test_unconvertable_rb_torsion(self):
        """ Check equal energies for Gromacs -> Amber conversion of Amber FF """
        top = get_fn(os.path.join('gmxtops', 'unconvertable_rb_torsion.top'))
        gro = get_fn(os.path.join('gmxtops', 'rb_torsions.gro'))
        top = load_file(top, xyz=gro)

        # 4 types are defined but parmed adds entries to the dict for each
        # ordering of the bondingtypes and one dihedral is symmetric
        assert len(top.parameterset.rb_torsion_types) == 7

        parm = amber.AmberParm.from_structure(top)
        parm.save(get_fn('rb_torsions.prmtop', written=True))
        parm.save(get_fn('rb_torsions.rst7', written=True))

        sysg = top.createSystem()
        sysa = parm.createSystem()

        cong = mm.Context(sysg, mm.VerletIntegrator(0.001), CPU)
        cona = mm.Context(sysa, mm.VerletIntegrator(0.001), CPU)

        cong.setPositions(top.positions)
        cona.setPositions(top.positions)

        self.check_energies(top, cong, parm, cona)
Ejemplo n.º 10
0
    def test_tiny(self):
        """ Test tiny Gromacs system nrg and frc (no PBC) """
        # Load the top and gro files
        top = load_file(os.path.join(get_fn('01.1water'), 'topol.top'),
                        xyz=os.path.join(get_fn('01.1water'), 'conf.gro'))
        self.assertEqual(top.combining_rule, 'lorentz')

        # create the system and context, then calculate the energy decomposition
        system = top.createSystem(constraints=app.HBonds, rigidWater=True)
        context = mm.Context(system, mm.VerletIntegrator(0.001), CPU)
        context.setPositions(top.positions)
        energies = energy_decomposition(top,
                                        context,
                                        nrg=u.kilojoules_per_mole)

        # Make sure they match Lee-Ping's answers (both energies and forces)
        self.assertAlmostEqual(energies['bond'], 1.63805, places=4)
        self.assertAlmostEqual(energies['angle'], 0.014803, places=4)
        gmxfrc = get_forces_from_xvg(
            os.path.join(get_fn('01.1water'), 'force.xvg'))
        ommfrc = context.getState(getForces=True).getForces().value_in_unit(
            u.kilojoules_per_mole / u.nanometer)
        max_diff = get_max_diff(gmxfrc, ommfrc)
        self.assertLess(max_diff, 0.01)