"plugins/vscode:/vscode.git/clone" did not exist on "9e66f0b1ec1fbc4d8dfe991dc67b6be1190d0f08"
TestNumpyCompatibility.py 4.96 KB
Newer Older
1
import unittest
2
3
4
from openmm import app
import openmm as mm
from openmm import unit
5
6
7
8
9
10
try:
    import numpy as np
    NUMPY_IMPORT_FAILED = False
except ImportError:
    NUMPY_IMPORT_FAILED = True

11

12
@unittest.skipIf(NUMPY_IMPORT_FAILED, 'Numpy is not installed')
13
class TestNumpyCompatibility(unittest.TestCase):
14

15
16
    def setUp(self):
        prmtop = app.AmberPrmtopFile('systems/water-box-216.prmtop')
17
18

        system = prmtop.createSystem(nonbondedMethod=app.PME,
Jason Swails's avatar
Jason Swails committed
19
20
21
                                     nonbondedCutoff=0.9*unit.nanometers,
                                     constraints=app.HBonds, rigidWater=True,
                                     ewaldErrorTolerance=0.0005)
22
        integrator = mm.LangevinIntegrator(300*unit.kelvin, 1.0/unit.picoseconds,
23
24
25
                                           2.0*unit.femtoseconds)
        self.simulation = app.Simulation(prmtop.topology, system, integrator,
                                    mm.Platform.getPlatformByName('Reference'))
26
27


28
29
30
31
32
    def test_setPositions(self):
        n_particles = self.simulation.context.getSystem().getNumParticles()
        input = np.random.randn(n_particles, 3)
        self.simulation.context.setPositions(input)
        output = self.simulation.context.getState(getPositions=True).getPositions(asNumpy=True)
33

34
        np.testing.assert_array_almost_equal(input, output)
35

36
37
38
39
40
    def test_setPositions_units(self):
        n_particles = self.simulation.context.getSystem().getNumParticles()
        input = unit.Quantity(np.random.randn(n_particles, 3), unit.angstroms)
        self.simulation.context.setPositions(input)
        output = self.simulation.context.getState(getPositions=True).getPositions(asNumpy=True)
41

42
        np.testing.assert_array_almost_equal(input.value_in_unit(unit.nanometers), output.value_in_unit(unit.nanometers))
43
44


45
46
47
48
49
    def test_setVelocities(self):
        n_particles = self.simulation.context.getSystem().getNumParticles()
        input = np.random.randn(n_particles, 3)
        self.simulation.context.setVelocities(input)
        output = self.simulation.context.getState(getVelocities=True).getVelocities(asNumpy=True)
50

51
        np.testing.assert_array_almost_equal(input, output)
52

53
54
55
56
57
    def test_setVelocities_units(self):
        n_particles = self.simulation.context.getSystem().getNumParticles()
        input = unit.Quantity(np.random.randn(n_particles, 3), unit.angstroms / unit.femtoseconds)
        self.simulation.context.setVelocities(input)
        output = self.simulation.context.getState(getVelocities=True).getVelocities(asNumpy=True)
58

59
60
        np.testing.assert_array_almost_equal(input.value_in_unit(unit.angstroms / unit.femtoseconds),
                                             output.value_in_unit(unit.angstroms / unit.femtoseconds))
61

62
63
64
65
66
67
    def test_periodicBoxVectors(self):
        output = self.simulation.context.getState(getVelocities=True).getPeriodicBoxVectors(asNumpy=True)
        systemBox = self.simulation.system.getDefaultPeriodicBoxVectors()
        for i in range(3):
            np.testing.assert_array_almost_equal(systemBox[i].value_in_unit(unit.nanometers), output[i].value_in_unit(unit.nanometers))

68

69
70
    def test_tabulatedFunction(self):
        f = mm.CustomNonbondedForce('g(r)')
71

72
73
        r = np.linspace(0,10)
        g_of_r = np.sin(r)
74
75
76

        indx = f.addFunction('g', g_of_r, np.min(r), np.max(r))

77
        name, g_of_r_out, min_r_out, max_r_out = f.getFunctionParameters(indx)
78

79
80
81
        np.testing.assert_array_almost_equal(g_of_r, np.asarray(g_of_r_out))
        assert min_r_out == np.min(r)
        assert max_r_out == np.max(r)
82

83
84
85
86
87
    def test_CMAP(self):
        f = mm.CMAPTorsionForce()
        energy = np.random.randn(10*10)
        f.addMap(10, energy)
        size, energy_out = f.getMapParameters(0)
88
89
        energy_out = energy_out.value_in_unit_system(unit.md_unit_system)

90

91
        self.assertEqual(size, 10)
92
93
        np.testing.assert_array_almost_equal(energy, np.asarray(energy_out))

94
95
96
97
98
99
    def test_int64(self):
        indices = np.array([0,1,2])
        sys = mm.System()
        sys.addParticle(2.0)
        assert sys.getParticleMass(indices[0]) == 2.0*unit.amu
        
100
101

@unittest.skipIf(NUMPY_IMPORT_FAILED, 'Numpy is not installed')
102
103
104
105
106
107
108
class TestNumpyUnits(unittest.TestCase):

    def setUp(self):
        self.data = unit.Quantity(np.arange(300), unit.nanometers)

    def testNumpyAttributes(self):
        d = self.data.reshape((100, 3))
109
        self.assertTrue(unit.is_quantity(d) and d.unit is unit.nanometers)
110
111
112
113
114
115
116
117
118
119
120
        self.assertTrue(unit.is_quantity(d.sum()))
        self.assertTrue(unit.is_quantity(d.sum(axis=0)))
        self.assertTrue(unit.is_quantity(d.std()))
        self.assertTrue(unit.is_quantity(d.std(axis=0)))
        self.assertTrue(unit.is_quantity(d.max()))
        self.assertTrue(unit.is_quantity(d.max(axis=1)))
        self.assertTrue(unit.is_quantity(d.min()))
        self.assertTrue(unit.is_quantity(d.min(axis=0)))
        self.assertTrue(unit.is_quantity(d.mean()))
        self.assertTrue(unit.is_quantity(d.mean(axis=1)))

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