Coverage for ufedmm/tests/test_ufedmm.py: 100%
102 statements
« prev ^ index » next coverage.py v7.4.1, created at 2024-02-02 04:20 +0000
« prev ^ index » next coverage.py v7.4.1, created at 2024-02-02 04:20 +0000
1"""
2Unit and regression test for the ufedmm package.
3"""
5# Import package, test suite, and other packages as needed
6import io
7import sys
8from copy import deepcopy
10import numpy as np
11import openmm
12import pytest
13from openmm import unit
15import ufedmm
18def ufed_model(
19 temp=300 * unit.kelvin,
20 mass=50 * unit.dalton * (unit.nanometer / unit.radians) ** 2,
21 Ks=1000 * unit.kilojoules_per_mole / unit.radians**2,
22 Ts=1500 * unit.kelvin,
23 limit=180 * unit.degrees,
24 sigma=18 * unit.degrees,
25 height=0.0,
26 frequency=10,
27 bias_factor=None,
28 enforce_gridless=False,
29 constraints=openmm.app.HBonds,
30):
31 model = ufedmm.AlanineDipeptideModel(constraints=constraints)
32 s_phi = ufedmm.DynamicalVariable(
33 "s_phi", -limit, limit, mass, Ts, model.phi, Ks, sigma=sigma
34 )
35 s_psi = ufedmm.DynamicalVariable(
36 "s_psi", -limit, limit, mass, Ts, model.psi, Ks, sigma=sigma
37 )
38 return model, ufedmm.UnifiedFreeEnergyDynamics(
39 [s_phi, s_psi],
40 temp,
41 height,
42 frequency,
43 bias_factor,
44 enforce_gridless=enforce_gridless,
45 )
48def test_ufedmm_imported():
49 """Sample test, will always pass so long as import statement worked"""
50 assert "ufedmm" in sys.modules
53def test_serialization():
54 model, old = ufed_model()
55 pipe = io.StringIO()
56 ufedmm.serialize(old, pipe)
57 pipe.seek(0)
58 new = ufedmm.deserialize(pipe)
59 assert new.__repr__() == old.__repr__()
60 for var1, var2 in zip(old.variables, new.variables):
61 assert var1.__repr__() == var2.__repr__()
64def test_variables():
65 model, ufed = ufed_model(constraints=None)
66 integrator = ufedmm.MiddleMassiveNHCIntegrator(
67 300 * unit.kelvin, 10 * unit.femtoseconds, 1 * unit.femtoseconds
68 )
69 platform = openmm.Platform.getPlatformByName("Reference")
70 simulation = ufed.simulation(model.topology, model.system, integrator, platform)
71 simulation.context.setPositions(model.positions)
72 simulation.context.setVelocitiesToTemperature(300 * unit.kelvin, 11234)
73 simulation.step(20)
74 cvs = [
75 value
76 for force in simulation.context.driving_forces
77 for value in force.getCollectiveVariableValues(simulation.context)
78 ]
79 xvars = simulation.context.getState(getPositions=True).getDynamicalVariables()
80 assert cvs[0] == pytest.approx(xvars[0])
81 assert cvs[2] == pytest.approx(xvars[1])
82 state = simulation.context.getState(getPositions=True)
83 print(type(state.getPositions(asNumpy=False)))
84 simulation.context.setPositions(*state.getPositions(extended=True))
85 xvars = simulation.context.getState(getPositions=True).getDynamicalVariables()
86 assert cvs[0] == pytest.approx(xvars[0])
87 assert cvs[2] == pytest.approx(xvars[1])
90def test_NHC_integrator():
91 model, ufed = ufed_model(constraints=None)
92 nonbonded = next(
93 filter(lambda f: isinstance(f, openmm.NonbondedForce), model.system.getForces())
94 )
95 nonbonded.setForceGroup(1)
96 integrator = ufedmm.MiddleMassiveNHCIntegrator(
97 300 * unit.kelvin,
98 10 * unit.femtoseconds,
99 1 * unit.femtoseconds,
100 respa_loops=[5, 1],
101 )
102 platform = openmm.Platform.getPlatformByName("Reference")
103 simulation = ufed.simulation(model.topology, model.system, integrator, platform)
104 simulation.context.setPositions(model.positions)
105 simulation.context.setVelocitiesToTemperature(300 * unit.kelvin, 1234)
106 simulation.step(100)
107 energy = simulation.context.getState(getEnergy=True).getPotentialEnergy()
108 assert energy / energy.unit == pytest.approx(6.18, abs=0.2)
111def test_GGMT_integrator():
112 model, ufed = ufed_model(constraints=None)
113 nonbonded = next(
114 filter(lambda f: isinstance(f, openmm.NonbondedForce), model.system.getForces())
115 )
116 nonbonded.setForceGroup(1)
117 integrator = ufedmm.MiddleMassiveGGMTIntegrator(
118 300 * unit.kelvin,
119 10 * unit.femtoseconds,
120 1 * unit.femtoseconds,
121 respa_loops=[5, 1],
122 )
123 platform = openmm.Platform.getPlatformByName("Reference")
124 simulation = ufed.simulation(model.topology, model.system, integrator, platform)
125 simulation.context.setPositions(model.positions)
126 simulation.context.setVelocitiesToTemperature(300 * unit.kelvin, 1234)
127 simulation.step(100)
128 energy = simulation.context.getState(getEnergy=True).getPotentialEnergy()
129 assert energy / energy.unit == pytest.approx(-17.78, abs=0.2)
132def test_gridded_metadynamics():
133 model, ufed = ufed_model(height=2.0 * unit.kilocalorie_per_mole, constraints=None)
134 integrator = ufedmm.MiddleMassiveNHCIntegrator(
135 300 * unit.kelvin, 10 * unit.femtoseconds, 1 * unit.femtoseconds
136 )
137 platform = openmm.Platform.getPlatformByName("Reference")
138 simulation = ufed.simulation(model.topology, model.system, integrator, platform)
139 simulation.context.setPositions(model.positions)
140 simulation.context.setVelocitiesToTemperature(300 * unit.kelvin, 1234)
141 simulation.step(100)
142 energy = simulation.context.getState(getEnergy=True).getPotentialEnergy()
143 assert energy / energy.unit == pytest.approx(695.95, abs=0.1)
146# def test_gridless_metadynamics():
147# model, ufed = ufed_model(
148# height=2.0*unit.kilocalorie_per_mole, enforce_gridless=True
149# )
150# integrator = ufedmm.MiddleMassiveNHCIntegrator(
151# 300*unit.kelvin, 10*unit.femtoseconds, 1*unit.femtoseconds
152# )
153# platform = openmm.Platform.getPlatformByName('Reference')
154# simulation = ufed.simulation(model.topology, model.system, integrator, platform)
155# simulation.context.setPositions(model.positions)
156# simulation.context.setVelocitiesToTemperature(300*unit.kelvin, 1234)
157# simulation.step(100)
158# energy = simulation.context.getState(getEnergy=True).getPotentialEnergy()
159# assert energy/energy.unit == pytest.approx(59.74040)
162def test_well_tempered_metadynamics():
163 model, ufed = ufed_model(
164 height=2.0 * unit.kilocalorie_per_mole, bias_factor=10, constraints=None
165 )
166 integrator = ufedmm.MiddleMassiveNHCIntegrator(
167 300 * unit.kelvin, 10 * unit.femtoseconds, 1 * unit.femtoseconds
168 )
169 platform = openmm.Platform.getPlatformByName("Reference")
170 simulation = ufed.simulation(model.topology, model.system, integrator, platform)
171 simulation.context.setPositions(model.positions)
172 simulation.context.setVelocitiesToTemperature(300 * unit.kelvin, 1234)
173 simulation.step(100)
174 energy = simulation.context.getState(getEnergy=True).getPotentialEnergy()
175 assert energy / energy.unit == pytest.approx(153.17, abs=0.1)
178def test_rmsd_forces():
179 model, ufed = ufed_model(constraints=None)
180 rmsd = openmm.RMSDForce( # Level 1
181 model.positions, np.arange(model.system.getNumParticles())
182 )
183 cvforce = openmm.CustomCVForce("rmsd + cvforce")
184 cvforce.addCollectiveVariable("rmsd", deepcopy(rmsd)) # Level 2
185 inner_cvforce = openmm.CustomCVForce("rmsd")
186 inner_cvforce.addCollectiveVariable("rmsd", deepcopy(rmsd)) # Level 3
187 cvforce.addCollectiveVariable("cvforce", inner_cvforce)
188 model.system.addForce(rmsd)
189 model.system.addForce(cvforce)
190 integrator = ufedmm.MiddleMassiveNHCIntegrator(
191 300 * unit.kelvin, 10 * unit.femtoseconds, 1 * unit.femtoseconds
192 )
193 platform = openmm.Platform.getPlatformByName("Reference")
194 simulation = ufed.simulation(model.topology, model.system, integrator, platform)
195 simulation.context.setPositions(model.positions)
196 simulation.context.setVelocitiesToTemperature(300 * unit.kelvin, 1234)
197 simulation.step(1)