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