"platforms/vscode:/vscode.git/clone" did not exist on "6e29cb3ff86226d83700dccd09c2aedb770a2e5c"
TestAmberInpcrdFile.py 3.89 KB
Newer Older
1
2
3
4
5
6
import unittest
from validateConstraints import *
from simtk.openmm.app import *
from simtk.openmm import *
from simtk.unit import *
import simtk.openmm.app.element as elem
7
8
9
10
11
12
try:
    from scipy.io import netcdf
    SCIPY_IMPORT_FAILED = False
except:
    SCIPY_IMPORT_FAILED = True

13

14
15
16
17
def compareByElement(array1, array2, cmp):
    for x, y in zip(array1, array2):
        cmp(x, y)

18

19
20
class TestAmberInpcrdFile(unittest.TestCase):
    """Test the Amber inpcrd file parser"""
21

22
23
    def test_CrdVelBox(self):
        """ Test parsing ASCII restarts with crds, vels, and box """
24
        cmp = self.assertAlmostEqual
25
        inpcrd = AmberInpcrdFile('systems/crds_vels_box.rst7')
26
27
28
29
30
31
32
        self.assertEqual(len(inpcrd.positions), 2101)
        compareByElement(inpcrd.positions[-1].value_in_unit(angstroms),
                         [3.5958082, 8.4176792, -8.2954064], cmp)
        compareByElement(inpcrd.velocities[-1].value_in_unit(angstroms/picoseconds),
                         [0.3091332*20.455, 0.7355925*20.455, -0.1206961*20.455], cmp)
        compareByElement(inpcrd.boxVectors[0].value_in_unit(angstroms),
                         [30.2642725, 0.0, 0.0], cmp)
33

34
    @unittest.skipIf(SCIPY_IMPORT_FAILED, "Scipy is not installed")
35
36
    def test_NetCDF(self):
        """ Test NetCDF restart file parsing """
37
        cmp = self.assertAlmostEqual
38
39
40
41
42
43
44
45
46
47
48

        inpcrd = AmberInpcrdFile('systems/amber.ncrst')
        self.assertEqual(len(inpcrd.positions), 2101)
        compareByElement(inpcrd.positions[0].value_in_unit(angstroms),
                         [6.82122492718229, 6.6276250662042, -8.51668999892245],
                         cmp)
        compareByElement(inpcrd.velocities[-1].value_in_unit(angstroms/picosecond),
                         [0.349702202733541*20.455, 0.391525333168534*20.455,
                          0.417941679767662*20.455], cmp)
        self.assertAlmostEqual(inpcrd.boxVectors[0][0].value_in_unit(angstroms),
                               30.2642725, places=6)
49
50
51
52

    def test_CrdBox(self):
        """ Test parsing ASCII restarts with only crds and box """
        inpcrd = AmberInpcrdFile('systems/crds_box.rst7')
53
        self.assertEqual(len(inpcrd.positions), 18660)
54
55
56
57
58
59
60
61
62
63
64
65
66
        self.assertTrue(inpcrd.velocities is None)
        self.assertTrue(inpcrd.boxVectors is not None)

    def test_CrdVel(self):
        inpcrd = AmberInpcrdFile('systems/crds_vels.rst7')
        self.assertTrue(inpcrd.boxVectors is None)
        self.assertTrue(inpcrd.velocities is not None)

    def test_CrdOnly(self):
        inpcrd = AmberInpcrdFile('systems/crdsonly.rst7')
        self.assertTrue(inpcrd.boxVectors is None)
        self.assertTrue(inpcrd.velocities is None)

67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
    def test_CrdBoxTruncoct(self):
        # Check that the box vectors come out correct.
        inpcrd = AmberInpcrdFile('systems/tz2.truncoct.rst7')
        ac = Vec3(42.4388485, 0.0, 0.0) * angstroms
        bc = Vec3(-14.146281691908937, 40.011730483685835, 0.0) * angstroms
        cc = Vec3(-14.146281691908937, -20.0058628205162, 34.651176446201672) * angstroms
        a, b, c = inpcrd.getBoxVectors()
        diffa = ac - a
        diffb = bc - b
        diffc = cc - c
        self.assertAlmostEqual(norm(diffa)/angstroms, 0)
        self.assertAlmostEqual(norm(diffb)/angstroms, 0)
        self.assertAlmostEqual(norm(diffc)/angstroms, 0)
        # Make sure angles and lengths come out about right
        la = norm(a).in_units_of(angstroms)
        lb = norm(b).in_units_of(angstroms)
        lc = norm(c).in_units_of(angstroms)
        self.assertAlmostEqual(la/angstroms, 42.4388485, 6)
        self.assertAlmostEqual(lb/angstroms, 42.4388485, 6)
        self.assertAlmostEqual(lc/angstroms, 42.4388485, 6)
        self.assertAlmostEqual(dot(a,b)/la/lb, cos(109.4712190*degrees), 6)
        self.assertAlmostEqual(dot(a,c)/la/lc, cos(109.4712190*degrees), 6)
        self.assertAlmostEqual(dot(b,c)/lc/lb, cos(109.4712190*degrees), 6)

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