mirror of
https://github.com/openmm/openmm
synced 2026-06-03 06:39:48 +09:00
* Can use getPlatform() instead of getPlatformByName() * More concise arguments for getState()
123 lines
5.0 KiB
Python
123 lines
5.0 KiB
Python
import unittest
|
|
from openmm import app
|
|
import openmm as mm
|
|
from openmm 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):
|
|
|
|
def setUp(self):
|
|
prmtop = app.AmberPrmtopFile('systems/water-box-216.prmtop')
|
|
|
|
system = prmtop.createSystem(nonbondedMethod=app.PME,
|
|
nonbondedCutoff=0.9*unit.nanometers,
|
|
constraints=app.HBonds, rigidWater=True,
|
|
ewaldErrorTolerance=0.0005)
|
|
integrator = mm.LangevinIntegrator(300*unit.kelvin, 1.0/unit.picoseconds,
|
|
2.0*unit.femtoseconds)
|
|
self.simulation = app.Simulation(prmtop.topology, system, integrator,
|
|
mm.Platform.getPlatform('Reference'))
|
|
|
|
|
|
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)
|
|
|
|
np.testing.assert_array_almost_equal(input, output)
|
|
|
|
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)
|
|
|
|
np.testing.assert_array_almost_equal(input.value_in_unit(unit.nanometers), output.value_in_unit(unit.nanometers))
|
|
|
|
|
|
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)
|
|
|
|
np.testing.assert_array_almost_equal(input, output)
|
|
|
|
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)
|
|
|
|
np.testing.assert_array_almost_equal(input.value_in_unit(unit.angstroms / unit.femtoseconds),
|
|
output.value_in_unit(unit.angstroms / unit.femtoseconds))
|
|
|
|
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))
|
|
|
|
|
|
def test_tabulatedFunction(self):
|
|
f = mm.CustomNonbondedForce('g(r)')
|
|
|
|
r = np.linspace(0,10)
|
|
g_of_r = np.sin(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)
|
|
|
|
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)
|
|
|
|
def test_CMAP(self):
|
|
f = mm.CMAPTorsionForce()
|
|
energy = np.random.randn(10*10)
|
|
f.addMap(10, energy)
|
|
size, energy_out = f.getMapParameters(0)
|
|
energy_out = energy_out.value_in_unit_system(unit.md_unit_system)
|
|
|
|
|
|
self.assertEqual(size, 10)
|
|
np.testing.assert_array_almost_equal(energy, np.asarray(energy_out))
|
|
|
|
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
|
|
|
|
|
|
@unittest.skipIf(NUMPY_IMPORT_FAILED, 'Numpy is not installed')
|
|
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))
|
|
self.assertTrue(unit.is_quantity(d) and d.unit is unit.nanometers)
|
|
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)))
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|