TestAmberInpcrdFile.py 3.89 KB
Newer Older
1
2
import unittest
from validateConstraints import *
3
4
5
6
from openmm.app import *
from openmm import *
from openmm.unit import *
import openmm.app.element as elem
7
try:
8
    from scipy.io import netcdf_file
9
    SCIPY_IMPORT_FAILED = False
10
except ImportError:
11
    SCIPY_IMPORT_FAILED = True
12

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

17

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

21
22
    def test_CrdVelBox(self):
        """ Test parsing ASCII restarts with crds, vels, and box """
23
        cmp = self.assertAlmostEqual
24
        inpcrd = AmberInpcrdFile('systems/crds_vels_box.rst7')
25
26
27
28
29
30
31
        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)
32

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

        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)
48
49
50
51

    def test_CrdBox(self):
        """ Test parsing ASCII restarts with only crds and box """
        inpcrd = AmberInpcrdFile('systems/crds_box.rst7')
52
        self.assertEqual(len(inpcrd.positions), 18660)
53
54
55
56
57
58
59
60
61
62
63
64
65
        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)

66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
    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)

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