TestAmberPrmtopFile.py 6.34 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import unittest
from validateConstraints import *
from simtk.openmm.app import *
from simtk.openmm import *
from simtk.unit import *

class TestAmberPrmtopFile(unittest.TestCase):

    """Test the AmberPrmtopFile.createSystem() method."""
 
    def setUp(self):
        """Set up the tests by loading the input files."""

        # alanine dipeptide with explicit water
        self.prmtop1 = AmberPrmtopFile('systems/alanine-dipeptide-explicit.prmtop')
        # alanine dipeptide with implicit water
        self.prmtop2 = AmberPrmtopFile('systems/alanine-dipeptide-implicit.prmtop')

    def test_NonbondedMethod(self):
        """Test all five options for the nonbondedMethod parameter."""

        methodMap = {NoCutoff:NonbondedForce.NoCutoff, 
                     CutoffNonPeriodic:NonbondedForce.CutoffNonPeriodic, 
                     CutoffPeriodic:NonbondedForce.CutoffPeriodic, 
                     Ewald:NonbondedForce.Ewald, PME: NonbondedForce.PME}
        for method in methodMap:
            system = self.prmtop1.createSystem(nonbondedMethod=method)
            forces = system.getForces()
            self.assertTrue(any(isinstance(f, NonbondedForce) and 
                                f.getNonbondedMethod()==methodMap[method] 
                                for f in forces))

    def test_Cutoff(self):
        """Test to make sure the nonbondedCutoff parameter is passed correctly."""

        for method in [CutoffNonPeriodic, CutoffPeriodic, Ewald, PME]:
            system = self.prmtop1.createSystem(nonbondedMethod=method, 
                                               nonbondedCutoff=2*nanometer, 
                                               constraints=HBonds)
            cutoff_distance = 0.0*nanometer
            cutoff_check = 2.0*nanometer
            for force in system.getForces():
                if isinstance(force, NonbondedForce):
                    cutoff_distance = force.getCutoffDistance()
            self.assertEqual(cutoff_distance, cutoff_check)

    def test_EwaldErrorTolerance(self):
        """Test to make sure the ewaldErrorTolerance parameter is passed correctly."""

        for method in [Ewald, PME]:
            system = self.prmtop1.createSystem(nonbondedMethod=method, 
                                               ewaldErrorTolerance=1e-6, 
                                               constraints=HBonds)
            tolerance = 0
            tolerance_check = 1e-6
            for force in system.getForces():
                if isinstance(force, NonbondedForce):
                    tolerance = force.getEwaldErrorTolerance()
            self.assertEqual(tolerance, tolerance_check)

    def test_RemoveCMMotion(self):
        """Test both options (True and False) for the removeCMMotion parameter."""

        for b in [True, False]:
            system = self.prmtop1.createSystem(removeCMMotion=b)
            forces = system.getForces()
            self.assertEqual(any(isinstance(f, CMMotionRemover) for f in forces), b)

    def test_RigidWaterAndConstraints(self):
        """Test all eight options for the constraints and rigidWater parameters."""

        topology = self.prmtop1.topology
        for constraints_value in [None, HBonds, AllBonds, HAngles]:
            for rigidWater_value in [True, False]:
                system = self.prmtop1.createSystem(constraints=constraints_value, 
                                                   rigidWater=rigidWater_value)
                validateConstraints(self, topology, system, 
                                    constraints_value, rigidWater_value)

    def test_ImplicitSolvent(self):
        """Test the four types of implicit solvents using the implicitSolvent 
        parameter.

        """
        for implicitSolvent_value in [HCT, OBC1, OBC2, GBn]:
            system = self.prmtop2.createSystem(implicitSolvent=implicitSolvent_value)
            forces = system.getForces()
            if implicitSolvent_value in set([HCT, OBC1, GBn]):
                force_type = CustomGBForce
            else:
                force_type = GBSAOBCForce
            
            self.assertTrue(any(isinstance(f, force_type) for f in forces))

    def test_ImplicitSolventParameters(self):
        """Test that solventDielectric and soluteDielectric are passed correctly 
        for the different types of implicit solvent.

        """
        for implicitSolvent_value in [HCT, OBC1, OBC2, GBn]:
            system = self.prmtop2.createSystem(implicitSolvent=implicitSolvent_value, 
                                               solventDielectric=50.0, 
                                               soluteDielectric = 0.9)
            found_matching_solvent_dielectric=False
            found_matching_solute_dielectric=False
            if implicitSolvent_value in set([HCT, OBC1, GBn]):
                for force in system.getForces():
                    if isinstance(force, CustomGBForce):
                        for j in range(force.getNumGlobalParameters()):
                            if (force.getGlobalParameterName(j) == 'solventDielectric' and
                               force.getGlobalParameterDefaultValue(j) == 50.0):
                                found_matching_solvent_dielectric = True
                            if (force.getGlobalParameterName(j) == 'soluteDielectric' and
                               force.getGlobalParameterDefaultValue(j) == 0.9):
                                found_matching_solute_dielectric = True
                    if isinstance(force, NonbondedForce):
                        self.assertEqual(force.getReactionFieldDielectric(), 1.0)
                self.assertTrue(found_matching_solvent_dielectric and 
                                found_matching_solute_dielectric)
            else:
                for force in system.getForces():
                    if isinstance(force, GBSAOBCForce):
                        if force.getSolventDielectric() == 50.0:
                            found_matching_solvent_dielectric = True
                        if force.getSoluteDielectric() == 0.9:
                            found_matching_solute_dielectric = True
                    if isinstance(force, NonbondedForce):
                        self.assertEqual(force.getReactionFieldDielectric(), 1.0)
                self.assertTrue(found_matching_solvent_dielectric and 
                                found_matching_solute_dielectric)

if __name__ == '__main__':
    unittest.main()