Skip to content

Commit 9ca3018

Browse files
committed
somewhat functional librarychargehandler
1 parent b3c492f commit 9ca3018

File tree

2 files changed

+271
-103
lines changed

2 files changed

+271
-103
lines changed

openforcefield/tests/test_forcefield.py

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@
163163
<SMIRNOFF version="0.3" aromaticity_model="OEAroModel_MDL">
164164
<LibraryCharges version="0.3">
165165
<!-- TIP3P water oxygen with charge override -->
166-
<LibraryCharge name="TIP3P" smirks="[#1:1]-[#8X2H2+0:2]-[#1:3]" charge1="+0.417*elementary_charge" charge2="-0.834*elementary_charge" charge3="+0.417*elementary_charge"/>
166+
<LibraryCharge name="TIP3P" smirks="[#1:1]-[#8X2H2+0:2]-[#1:3]" charge1="0.417*elementary_charge" charge2="-0.834*elementary_charge" charge3="0.417*elementary_charge"/>
167167
</LibraryCharges>
168168
</SMIRNOFF>
169169
'''
@@ -955,22 +955,56 @@ def test_library_charges_to_single_water(self):
955955
"""Test assigning charges to one water molecule using library charges"""
956956
from simtk.openmm import NonbondedForce
957957

958-
ff = ForceField(simple_xml_ff, xml_tip3p_library_charges_ff)
958+
ff = ForceField('test_forcefields/smirnoff99Frosst.offxml', xml_tip3p_library_charges_ff)
959959
mol = Molecule.from_smiles('O')
960960
omm_system = ff.create_openmm_system(mol.to_topology())
961961
nonbondedForce = [f for f in omm_system.getForces() if type(f) == NonbondedForce][0]
962962
expected_charges = [-0.834, 0.417, 0.417] * unit.elementary_charge
963-
for particle_index, expected_charge in expected_charges:
963+
for particle_index, expected_charge in enumerate(expected_charges):
964964
q, sigma, epsilon = nonbondedForce.getParticleParameters(particle_index)
965965
assert q == expected_charge
966966

967967
def test_library_charges_to_two_waters(self):
968968
"""Test assigning charges to two water molecules using library charges"""
969-
pass
969+
from simtk.openmm import NonbondedForce
970+
971+
ff = ForceField('test_forcefields/smirnoff99Frosst.offxml', xml_tip3p_library_charges_ff)
972+
mol = Molecule.from_smiles('O')
973+
top = Topology.from_molecules([mol, mol])
974+
omm_system = ff.create_openmm_system(top)
975+
nonbondedForce = [f for f in omm_system.getForces() if type(f) == NonbondedForce][0]
976+
expected_charges = [-0.834, 0.417, 0.417, -0.834, 0.417, 0.417] * unit.elementary_charge
977+
for particle_index, expected_charge in enumerate(expected_charges):
978+
q, sigma, epsilon = nonbondedForce.getParticleParameters(particle_index)
979+
assert q == expected_charge
970980

971981
def test_library_charges_to_two_ethanols_different_atom_ordering(self):
972982
"""Test assigning charges to two ethanols with different atom orderings"""
973-
pass
983+
from simtk.openmm import NonbondedForce
984+
985+
xml_ethanol_library_charges_ff = '''
986+
<SMIRNOFF version="0.3" aromaticity_model="OEAroModel_MDL">
987+
<LibraryCharges version="0.3">
988+
<!-- TIP3P water oxygen with charge override -->
989+
<LibraryCharge smirks="[#1:1]-[#6:2](-[#1:3])(-[#1:4])-[#6:5](-[#1:6])(-[#1:7])-[#8:8]-[#1:9]" charge1="-0.4*elementary_charge" charge2="-0.3*elementary_charge" charge3="-0.2*elementary_charge" charge4="-0.1*elementary_charge" charge5="0.*elementary_charge" charge6="0.1*elementary_charge" charge7="0.2*elementary_charge" charge8="0.3*elementary_charge" charge9="0.4*elementary_charge" />
990+
</LibraryCharges>
991+
</SMIRNOFF>
992+
'''
993+
ff = ForceField('test_forcefields/smirnoff99Frosst.offxml', xml_ethanol_library_charges_ff)
994+
995+
molecules = [Molecule.from_file(get_data_file_path('molecules/ethanol.sdf')),
996+
Molecule.from_file(get_data_file_path('molecules/ethanol_reordered.sdf'))]
997+
top = Topology.from_molecules(molecules)
998+
omm_system = ff.create_openmm_system(top)
999+
nonbondedForce = [f for f in omm_system.getForces() if type(f) == NonbondedForce][0]
1000+
#expected_charges = [-0.834, 0.417, 0.417, -0.834, 0.417, 0.417] * unit.elementary_charge
1001+
charges = []
1002+
for particle_index, expected_charge in enumerate(range(18)):
1003+
q, sigma, epsilon = nonbondedForce.getParticleParameters(particle_index)
1004+
charges.append(q / unit.elementary_charge)
1005+
1006+
#assert q == expected_charge
1007+
raise Exception(charges)
9741008

9751009
def test_library_charges_to_only_some_molecules(self):
9761010
"""Test assigning charges to a topology in which some molecules are covered by library charges
@@ -989,9 +1023,8 @@ def test_library_charges_dont_parameterize_molecule_because_of_incomplete_covera
9891023
"""Fail to assign charges to a molecule becau\se not all atoms can be assigned"""
9901024
pass
9911025

992-
def library_charges_overridden_by_charge_from_molecules(self):
993-
"""Skip assigning charges to a molecule because it has already had charges assigned
994-
using charge_from_molecules"""
1026+
def test_charge_method_hierarchy(self):
1027+
"""Ensure that molecules are parameterized by charge_from_molecules first, then library charges if not applicable, then """
9951028
pass
9961029

9971030

0 commit comments

Comments
 (0)