Commit b7088b74 authored by peastman's avatar peastman Committed by Robert McGibbon
Browse files

Python 2/3 compatibility in single code base, plus python 3 testing on travis.

parent 4c00b312
import unittest import unittest
import numpy as np
from simtk.openmm import app from simtk.openmm import app
import simtk.openmm as mm import simtk.openmm as mm
from simtk import unit from simtk import unit
try:
import numpy as np
NUMPY_IMPORT_FAILED = False
except ImportError:
NUMPY_IMPORT_FAILED = True
@unittest.skipIf(NUMPY_IMPORT_FAILED, 'Numpy is not installed')
class TestNumpyCompatibility(unittest.TestCase): class TestNumpyCompatibility(unittest.TestCase):
def setUp(self): def setUp(self):
prmtop = app.AmberPrmtopFile('systems/water-box-216.prmtop') prmtop = app.AmberPrmtopFile('systems/water-box-216.prmtop')
system = prmtop.createSystem(nonbondedMethod=app.PME, system = prmtop.createSystem(nonbondedMethod=app.PME,
nonbondedCutoff=0.9*unit.nanometers, nonbondedCutoff=0.9*unit.nanometers,
constraints=app.HBonds, rigidWater=True, constraints=app.HBonds, rigidWater=True,
ewaldErrorTolerance=0.0005) ewaldErrorTolerance=0.0005)
integrator = mm.LangevinIntegrator(300*unit.kelvin, 1.0/unit.picoseconds, integrator = mm.LangevinIntegrator(300*unit.kelvin, 1.0/unit.picoseconds,
2.0*unit.femtoseconds) 2.0*unit.femtoseconds)
self.simulation = app.Simulation(prmtop.topology, system, integrator, self.simulation = app.Simulation(prmtop.topology, system, integrator,
mm.Platform.getPlatformByName('Reference')) mm.Platform.getPlatformByName('Reference'))
def test_setPositions(self): def test_setPositions(self):
n_particles = self.simulation.context.getSystem().getNumParticles() n_particles = self.simulation.context.getSystem().getNumParticles()
input = np.random.randn(n_particles, 3) input = np.random.randn(n_particles, 3)
self.simulation.context.setPositions(input) self.simulation.context.setPositions(input)
output = self.simulation.context.getState(getPositions=True).getPositions(asNumpy=True) output = self.simulation.context.getState(getPositions=True).getPositions(asNumpy=True)
np.testing.assert_array_almost_equal(input, output) np.testing.assert_array_almost_equal(input, output)
def test_setPositions_units(self): def test_setPositions_units(self):
n_particles = self.simulation.context.getSystem().getNumParticles() n_particles = self.simulation.context.getSystem().getNumParticles()
input = unit.Quantity(np.random.randn(n_particles, 3), unit.angstroms) input = unit.Quantity(np.random.randn(n_particles, 3), unit.angstroms)
self.simulation.context.setPositions(input) self.simulation.context.setPositions(input)
output = self.simulation.context.getState(getPositions=True).getPositions(asNumpy=True) output = self.simulation.context.getState(getPositions=True).getPositions(asNumpy=True)
np.testing.assert_array_almost_equal(input.value_in_unit(unit.nanometers), output.value_in_unit(unit.nanometers)) np.testing.assert_array_almost_equal(input.value_in_unit(unit.nanometers), output.value_in_unit(unit.nanometers))
def test_setVelocities(self): def test_setVelocities(self):
n_particles = self.simulation.context.getSystem().getNumParticles() n_particles = self.simulation.context.getSystem().getNumParticles()
input = np.random.randn(n_particles, 3) input = np.random.randn(n_particles, 3)
self.simulation.context.setVelocities(input) self.simulation.context.setVelocities(input)
output = self.simulation.context.getState(getVelocities=True).getVelocities(asNumpy=True) output = self.simulation.context.getState(getVelocities=True).getVelocities(asNumpy=True)
np.testing.assert_array_almost_equal(input, output) np.testing.assert_array_almost_equal(input, output)
def test_setVelocities_units(self): def test_setVelocities_units(self):
n_particles = self.simulation.context.getSystem().getNumParticles() n_particles = self.simulation.context.getSystem().getNumParticles()
input = unit.Quantity(np.random.randn(n_particles, 3), unit.angstroms / unit.femtoseconds) input = unit.Quantity(np.random.randn(n_particles, 3), unit.angstroms / unit.femtoseconds)
self.simulation.context.setVelocities(input) self.simulation.context.setVelocities(input)
output = self.simulation.context.getState(getVelocities=True).getVelocities(asNumpy=True) output = self.simulation.context.getState(getVelocities=True).getVelocities(asNumpy=True)
np.testing.assert_array_almost_equal(input.value_in_unit(unit.angstroms / unit.femtoseconds), np.testing.assert_array_almost_equal(input.value_in_unit(unit.angstroms / unit.femtoseconds),
output.value_in_unit(unit.angstroms / unit.femtoseconds)) output.value_in_unit(unit.angstroms / unit.femtoseconds))
def test_tabulatedFunction(self): def test_tabulatedFunction(self):
f = mm.CustomNonbondedForce('g(r)') f = mm.CustomNonbondedForce('g(r)')
r = np.linspace(0,10) r = np.linspace(0,10)
g_of_r = np.sin(r) g_of_r = np.sin(r)
indx = f.addFunction('g', g_of_r, np.min(r), np.max(r)) indx = f.addFunction('g', g_of_r, np.min(r), np.max(r))
name, g_of_r_out, min_r_out, max_r_out = f.getFunctionParameters(indx) name, g_of_r_out, min_r_out, max_r_out = f.getFunctionParameters(indx)
np.testing.assert_array_almost_equal(g_of_r, np.asarray(g_of_r_out)) np.testing.assert_array_almost_equal(g_of_r, np.asarray(g_of_r_out))
assert min_r_out == np.min(r) assert min_r_out == np.min(r)
assert max_r_out == np.max(r) assert max_r_out == np.max(r)
def test_CMAP(self): def test_CMAP(self):
f = mm.CMAPTorsionForce() f = mm.CMAPTorsionForce()
energy = np.random.randn(10*10) energy = np.random.randn(10*10)
...@@ -76,10 +81,12 @@ class TestNumpyCompatibility(unittest.TestCase): ...@@ -76,10 +81,12 @@ class TestNumpyCompatibility(unittest.TestCase):
size, energy_out = f.getMapParameters(0) size, energy_out = f.getMapParameters(0)
energy_out = energy_out.value_in_unit_system(unit.md_unit_system) energy_out = energy_out.value_in_unit_system(unit.md_unit_system)
self.assertEqual(size, 10) self.assertEqual(size, 10)
np.testing.assert_array_almost_equal(energy, np.asarray(energy_out)) np.testing.assert_array_almost_equal(energy, np.asarray(energy_out))
@unittest.skipIf(NUMPY_IMPORT_FAILED, 'Numpy is not installed')
class TestNumpyUnits(unittest.TestCase): class TestNumpyUnits(unittest.TestCase):
def setUp(self): def setUp(self):
......
import sys
import unittest import unittest
from simtk.openmm.app import * from simtk.openmm.app import *
from simtk.openmm import * from simtk.openmm import *
from simtk.unit import * from simtk.unit import *
import simtk.openmm.app.element as elem import simtk.openmm.app.element as elem
import cStringIO if sys.version_info >= (3, 0):
from io import StringIO
else:
from cStringIO import StringIO
class TestPdbFile(unittest.TestCase): class TestPdbFile(unittest.TestCase):
"""Test the PDB file parser""" """Test the PDB file parser"""
def test_Triclinic(self): def test_Triclinic(self):
"""Test parsing a file that describes a triclinic box.""" """Test parsing a file that describes a triclinic box."""
pdb = PDBFile('systems/triclinic.pdb') pdb = PDBFile('systems/triclinic.pdb')
...@@ -43,9 +48,9 @@ class TestPdbFile(unittest.TestCase): ...@@ -43,9 +48,9 @@ class TestPdbFile(unittest.TestCase):
def test_WriteFile(self): def test_WriteFile(self):
"""Write a file, read it back, and make sure it matches the original.""" """Write a file, read it back, and make sure it matches the original."""
pdb1 = PDBFile('systems/triclinic.pdb') pdb1 = PDBFile('systems/triclinic.pdb')
output = cStringIO.StringIO() output = StringIO()
PDBFile.writeFile(pdb1.topology, pdb1.positions, output) PDBFile.writeFile(pdb1.topology, pdb1.positions, output)
input = cStringIO.StringIO(output.getvalue()) input = StringIO(output.getvalue())
pdb2 = PDBFile(input) pdb2 = PDBFile(input)
output.close(); output.close();
input.close(); input.close();
......
...@@ -70,6 +70,7 @@ class TestPdbxFile(unittest.TestCase): ...@@ -70,6 +70,7 @@ class TestPdbxFile(unittest.TestCase):
# There should only be 10 frames (0 through 9) # There should only be 10 frames (0 through 9)
self.assertRaises(IndexError, lambda: pdb.getPositions(frame=10)) self.assertRaises(IndexError, lambda: pdb.getPositions(frame=10))
self.assertIs(pdb.topology.getPeriodicBoxVectors(), None) self.assertIs(pdb.topology.getPeriodicBoxVectors(), None)
del sim
os.unlink('test.cif') os.unlink('test.cif')
def assertAlmostEqualVec(self, vec1, vec2, *args, **kwargs): def assertAlmostEqualVec(self, vec1, vec2, *args, **kwargs):
...@@ -111,6 +112,7 @@ class TestPdbxFile(unittest.TestCase): ...@@ -111,6 +112,7 @@ class TestPdbxFile(unittest.TestCase):
self.assertAlmostEqualVec(parm.topology.getPeriodicBoxVectors()[2], self.assertAlmostEqualVec(parm.topology.getPeriodicBoxVectors()[2],
pdb.topology.getPeriodicBoxVectors()[2], pdb.topology.getPeriodicBoxVectors()[2],
places=5) places=5)
del sim
os.unlink('test.cif') os.unlink('test.cif')
if __name__ == '__main__': if __name__ == '__main__':
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment