Skip to content

Commit

Permalink
Merge pull request #873 from openforcefield/test-plugin-energy
Browse files Browse the repository at this point in the history
Improve energy testing with plugins
  • Loading branch information
mattwthompson committed Apr 30, 2024
2 parents c50450d + 4a58d41 commit da76d19
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 5 deletions.
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ repos:
hooks:
- id: add-trailing-comma
- repo: https://github.com/psf/black
rev: 24.4.0
rev: 24.4.2
hooks:
- id: black
files: ^openff|plugins|stubs
Expand Down Expand Up @@ -46,7 +46,7 @@ repos:
exclude: openff/interchange/_version.py|setup.py
args: ["--py310-plus"]
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.4.1
rev: v0.4.2
hooks:
- id: ruff
args: ["check", "--select", "NPY"]
Expand Down
91 changes: 88 additions & 3 deletions openff/interchange/_tests/unit_tests/drivers/test_openmm.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,35 @@
from copy import deepcopy

import pytest
from openff.utilities.utilities import has_package, requires_package
from openff.toolkit import ForceField, Quantity
from openff.utilities.utilities import has_package

from openff.interchange._tests import MoleculeWithConformer, get_test_file_path
from openff.interchange.constants import kj_mol
from openff.interchange.drivers.openmm import _process
from openff.interchange.drivers.openmm import _process, get_openmm_energies

if has_package("openmm"):
import openmm


@requires_package("openmm")
@pytest.fixture
def methane_dimer(sage):
molecule = MoleculeWithConformer.from_smiles("C")
topology = deepcopy(molecule).to_topology()

molecule._conformers[0] += Quantity([4, 0, 0], "angstrom")

topology.add_molecule(molecule)

interchange = sage.create_interchange(topology)
interchange.minimize()

return interchange


class TestProcess:
pytest.importorskip("openmm")

@pytest.fixture
def dummy_system(self):
system = openmm.System()
Expand Down Expand Up @@ -73,3 +93,68 @@ def test_split_forces(self, dummy_system_split):
assert processed["Electrostatics 1-4"].m_as(kj_mol) == -3
assert processed["vdW"].m_as(kj_mol) == -1
assert processed["vdW 1-4"].m_as(kj_mol) == -2


class TestReportWithPlugins:
pytest.importorskip("smirnoff_plugins")
pytest.importorskip("openeye")

@pytest.fixture
def ligand(self):
return MoleculeWithConformer.from_smiles("CC[C@@](/C=C\\[H])(C=C)O")

@pytest.fixture
def de_force_field(self) -> ForceField:
return ForceField(
get_test_file_path("de-force-1.0.1.offxml"),
load_plugins=True,
)

@pytest.mark.parametrize("detailed", [True, False])
def test_nonzero_vdw(self, ligand, de_force_field, detailed):
energies = get_openmm_energies(
de_force_field.create_interchange(ligand.to_topology()),
combine_nonbonded_forces=False,
detailed=detailed,
)

assert energies["vdW"].m != 0

if detailed:
assert energies["vdW 1-4"].m != 0

def test_detailed_same_total_energy(self, ligand, de_force_field):
assert get_openmm_energies(
de_force_field.create_interchange(ligand.to_topology()),
combine_nonbonded_forces=False,
detailed=True,
).total_energy.m == pytest.approx(
get_openmm_energies(
de_force_field.create_interchange(ligand.to_topology()),
combine_nonbonded_forces=False,
detailed=False,
).total_energy.m,
)

def test_intermolecular_plugin_vdw_energies_reported(
self,
de_force_field,
methane_dimer,
):
new_interchange = de_force_field.create_interchange(methane_dimer.topology)
new_interchange.positions = methane_dimer.positions

new_interchange.minimize(
engine="openmm",
force_tolerance=Quantity(0.01, "kilojoule_per_mole / nanometer"),
)

energies = get_openmm_energies(
new_interchange,
combine_nonbonded_forces=False,
detailed=True,
)

# vdW (non-LJ) interaction energy should be slightly negative; for comparison,
# sage number is -1.377 kJ/mol
assert -5 < energies["vdW"].m_as(kj_mol) < -1

0 comments on commit da76d19

Please sign in to comment.