def test_ff_from_etree_iterable(self): ff_etrees = [ lxml.etree.parse(get_path('opls_charmm_buck.xml')), lxml.etree.parse(get_path('trimmed_charmm.xml')) ] ff = ForceField(ff_etrees) assert ff
def test_spce_xml(self): spce = ForceField(get_path('spce.xml')) assert len(spce.atom_types) == 2 assert len(spce.bond_types) == 1 assert len(spce.angle_types) == 1 assert len(spce.dihedral_types) == 0 # Store expected expressions in list ref_exprs = [sympy.sympify(expr) for expr in [ "4*epsilon*((sigma/r)**12 - (sigma/r)**6)", "0.5 * k * (r-r_eq)**2", "0.5 * k * (theta-theta_eq)**2", ] ] assert allclose(spce.atom_types['opls_116'].charge, -0.8476 * u.elementary_charge) assert allclose(spce.atom_types['opls_117'].charge, 0.4238 * u.elementary_charge) assert sympy.simplify(spce.atom_types['opls_116'].expression - ref_exprs[0]) == 0 assert sympy.simplify(spce.atom_types['opls_117'].expression - ref_exprs[0]) == 0 assert sympy.simplify(spce.bond_types['opls_116~opls_117'].expression - ref_exprs[1]) == 0 assert sympy.simplify(spce.angle_types['opls_117~opls_116~opls_117'].expression - ref_exprs[2]) == 0 assert allclose(spce.atom_types['opls_116'].parameters['sigma'], 0.316557 * u.nm) assert allclose(spce.atom_types['opls_116'].parameters['epsilon'], 0.650194 * u.Unit('kJ/mol')) assert allclose(spce.atom_types['opls_117'].parameters['sigma'], 0.1 * u.nm) assert allclose(spce.atom_types['opls_117'].parameters['epsilon'], 0.0 * u.Unit('kJ/mol')) assert allclose(spce.bond_types['opls_116~opls_117'].parameters['r_eq'], 0.1 * u.nm) assert allclose(spce.bond_types['opls_116~opls_117'].parameters['k'], 345000.0 * u.Unit('kJ/(mol*nm**2)')) assert allclose(spce.angle_types['opls_117~opls_116~opls_117'].parameters['theta_eq'], 109.47 * u.degree) assert allclose(spce.angle_types['opls_117~opls_116~opls_117'].parameters['k'], 383.0 * u.Unit('kJ/mol/rad**2'))
def test_ff_periodic_dihedrals_from_alphanumeric_symbols(self): ff = ForceField(get_path("opls_charmm_buck.xml")) assert "A" in ff.atom_types["buck_O"].parameters with pytest.raises(TypeError): assert len( ff.dihedral_types["opls_140~*~*~opls_140"].parameters["c0"]) assert len(ff.dihedral_types["NH2~CT1~C~O"].parameters["delta"]) == 1
def test_tip3p_force_field(self): water = ForceField(get_path('tip3p.xml')) assert len(water.atom_types) == 2 assert len(water.bond_types) == 1 assert len(water.angle_types) == 1 assert len(water.dihedral_types) == 0 # Store expected expressions in list ref_exprs = [sympy.sympify(expr) for expr in [ "4*epsilon*((sigma/r)**12 - (sigma/r)**6)", "0.5 * k * (r-r_eq)**2", "0.5 * k * (theta-theta_eq)**2", ] ] assert water.atom_types['opls_111'].charge.value == -0.834 assert water.atom_types['opls_112'].charge.value == 0.417 assert sympy.simplify(water.atom_types['opls_111'].expression - ref_exprs[0]) == 0 assert sympy.simplify(water.atom_types['opls_112'].expression - ref_exprs[0]) == 0 assert sympy.simplify(water.bond_types['opls_111~opls_112'].expression - ref_exprs[1]) == 0 assert sympy.simplify(water.angle_types['opls_112~opls_111~opls_112'].expression - ref_exprs[2]) == 0 assert allclose(water.atom_types['opls_111'].parameters['sigma'], 0.315061 * u.nm) assert allclose(water.atom_types['opls_111'].parameters['epsilon'], 0.636386 * u.Unit('kJ/mol')) assert allclose(water.atom_types['opls_112'].parameters['sigma'], 1.0 * u.nm) assert allclose(water.atom_types['opls_112'].parameters['epsilon'], 0.0 * u.Unit('kJ/mol')) assert allclose(water.bond_types['opls_111~opls_112'].parameters['r_eq'], 0.09572 * u.nm) assert allclose(water.bond_types['opls_111~opls_112'].parameters['k'], 502416.0 * u.Unit('kJ/(mol*nm**2)')) assert allclose(water.angle_types['opls_112~opls_111~opls_112'].parameters['theta_eq'], 1.824218134 * u.radian) assert allclose(water.angle_types['opls_112~opls_111~opls_112'].parameters['k'], 682.02 * u.Unit('kJ/(mol*rad**2)'))
def test_ff_periodic_dihedrals_from_alphanumeric_symbols(self): ff = ForceField(get_path('opls_charmm_buck.xml')) assert 'A' in ff.atom_types['buck_O'].parameters with pytest.raises(TypeError): assert len( ff.dihedral_types['opls_140~*~*~opls_140'].parameters['c0']) assert len(ff.dihedral_types['NH2~CT1~C~O'].parameters['delta']) == 1
def test_water_top(self, water_system): top = water_system ff = gmso.ForceField(get_path('tip3p.xml')) for site in top.sites: site.atom_type = ff.atom_types[site.name] top.update_sites() top.update_atom_types() for bond in top.bonds: bond.bond_type = bond.connection_type = ff.bond_types[ 'opls_111~opls_112'] top.update_bonds() top.update_bond_types() for subtop in top.subtops: angle = gmso.core.angle.Angle( connection_members=[site for site in subtop.sites], name="opls_112~opls_111~opls_112", connection_type=ff.angle_types["opls_112~opls_111~opls_112"]) top.add_connection(angle) top.update_angles() top.update_angle_types() write_top(top, 'water.top')
def test_read_epsilon(self, filename=get_path('data.lammps')): read = read_lammpsdata(filename) lj = [i.parameters for i in read.atom_types][0] assert_allclose_units(lj['epsilon'], u.unyt_array(0.0717, (u.kcal / u.mol)), rtol=1e-5, atol=1e-8)
def test_read_sigma(self, filename=get_path('data.lammps')): read = read_lammpsdata(filename) lj = [i.parameters for i in read.atom_types][0] assert_allclose_units(lj['sigma'], u.unyt_array(3, u.angstrom), rtol=1e-5, atol=1e-8)
def test_read_charge(self, filename=get_path('data.lammps')): read = read_lammpsdata(filename) charge = [i.charge for i in read.atom_types] assert_allclose_units(charge, u.unyt_array(0, u.C), rtol=1e-5, atol=1e-8)
def test_read_mass(self, filename=get_path('data.lammps')): read = read_lammpsdata(filename) masses = [i.mass for i in read.atom_types] assert_allclose_units(masses, u.unyt_array(1.0079, u.g), rtol=1e-5, atol=1e-8)
def water_system(self): water = mb.load(get_path('tip3p.mol2')) water.name = 'water' water[0].name = 'opls_111' water[1].name = water[2].name = 'opls_112' packed_system = mb.fill_box(compound=water, n_compounds=2, box=mb.Box([2, 2, 2])) return from_mbuild(packed_system)
def test_noble_mie_xml(self): ff = ForceField(get_path('noble_mie.xml')) templates = PotentialTemplateLibrary() ref_expr = templates['MiePotential'].expression assert len(ff.atom_types) == 4 assert len(ff.bond_types) == 0 assert len(ff.angle_types) == 0 assert len(ff.dihedral_types) == 0 for (name, atom_type) in ff.atom_types.items(): assert sympy.simplify(atom_type.expression - ref_expr) == 0 assert allclose(ff.atom_types['Ne'].parameters['epsilon'], 0.26855713 * u.Unit('kJ/mol')) assert allclose(ff.atom_types['Ne'].parameters['sigma'], 2.794 * u.Angstrom) assert allclose(ff.atom_types['Ne'].parameters['n'], 11 * u.dimensionless) assert allclose(ff.atom_types['Ne'].parameters['m'], 6 * u.dimensionless) assert ff.atom_types['Ne'].charge.value == 0 assert allclose(ff.atom_types['Ar'].parameters['epsilon'], 1.01519583 * u.Unit('kJ/mol')) assert allclose(ff.atom_types['Ar'].parameters['sigma'], 3.405 * u.Angstrom) assert allclose(ff.atom_types['Ar'].parameters['n'], 13 * u.dimensionless) assert allclose(ff.atom_types['Ar'].parameters['m'], 6 * u.dimensionless) assert ff.atom_types['Ar'].charge.value == 0 assert allclose(ff.atom_types['Kr'].parameters['epsilon'], 1.46417678 * u.Unit('kJ/mol')) assert allclose(ff.atom_types['Kr'].parameters['sigma'], 3.645 * u.Angstrom) assert allclose(ff.atom_types['Kr'].parameters['n'], 14 * u.dimensionless) assert allclose(ff.atom_types['Kr'].parameters['m'], 6 * u.dimensionless) assert ff.atom_types['Kr'].charge.value == 0 assert allclose(ff.atom_types['Xe'].parameters['epsilon'], 2.02706587 * u.Unit('kJ/mol')) assert allclose(ff.atom_types['Xe'].parameters['sigma'], 3.964 * u.Angstrom) assert allclose(ff.atom_types['Xe'].parameters['n'], 14 * u.dimensionless) assert allclose(ff.atom_types['Xe'].parameters['m'], 6 * u.dimensionless) assert ff.atom_types['Xe'].charge.value == 0
def test_carbon_force_field(self): carbon = ForceField(get_path('carbon.xml')) assert len(carbon.atom_types) == 1 assert len(carbon.bond_types) == 1 assert len(carbon.angle_types) == 1 assert len(carbon.dihedral_types) == 1 # Store expected expressions in list ref_exprs = [ sympy.sympify(expr) for expr in [ "4*epsilon*((sigma/r)**12 - (sigma/r)**6)", "0.5 * k * (r-r_eq)**2", "0.5 * k * (theta-theta_eq)**2", "k * (1 + cos(n * theta - theta_0))", ] ] assert carbon.atom_types['C'].charge.value == 0 assert sympy.simplify(carbon.atom_types['C'].expression - ref_exprs[0]) == 0 assert sympy.simplify(carbon.bond_types['C~C'].expression - ref_exprs[1]) == 0 assert sympy.simplify(carbon.angle_types['C~C~C'].expression - ref_exprs[2]) == 0 assert sympy.simplify(carbon.dihedral_types['*~C~C~*'].expression - ref_exprs[3]) == 0 assert allclose(carbon.atom_types['C'].parameters['sigma'], 0.339966950842 * u.nm) assert allclose(carbon.atom_types['C'].parameters['epsilon'], 0.359824 * u.Unit('kJ/mol')) assert allclose(carbon.bond_types['C~C'].parameters['r_eq'], 0.1324 * u.nm) assert allclose(carbon.bond_types['C~C'].parameters['k'], 493460.96 * u.Unit('kJ/(mol*nm**2)')) assert allclose(carbon.angle_types['C~C~C'].parameters['theta_eq'], 2.12598556185 * u.radian) assert allclose(carbon.angle_types['C~C~C'].parameters['k'], 584.42112 * u.Unit('kJ/(mol*rad**2)')) assert allclose(carbon.dihedral_types['*~C~C~*'].parameters['k'], 27.8236 * u.Unit('kJ/mol')) assert allclose(carbon.dihedral_types['*~C~C~*'].parameters['n'], 2 * u.dimensionless) assert allclose(carbon.dihedral_types['*~C~C~*'].parameters['theta_0'], np.pi * u.radian)
def test_ff_charmm_xml(self): charm_ff = ForceField(get_path('trimmed_charmm.xml')) assert charm_ff.name == 'topologyCharmm' assert "*~CS~SS~*" in charm_ff.dihedral_types # Test list of parameters assert isinstance( charm_ff.dihedral_types["*~CE1~CE1~*"].parameters['k'], list) # This ensures that even though the parameters is a list, they can be hashed (by equality checks) assert charm_ff.dihedral_types[ "*~CE1~CE1~*"] == charm_ff.dihedral_types["*~CE1~CE1~*"] assert len(charm_ff.dihedral_types["*~CE1~CE1~*"].parameters['k']) == 2 # Test Correct Parameter Values assert charm_ff.dihedral_types["*~CE1~CE1~*"].parameters['k'] == \ [u.unyt_quantity(0.6276, u.kJ), u.unyt_quantity(35.564, u.kJ)]
def _typed_topology(n_sites=1): xe = mb.Compound(name="Xe") packed_system = mb.fill_box( compound=xe, n_compounds=n_sites, box=mb.Box([3, 3, 3]), ) top = from_mbuild(packed_system) ff = ForceField(get_path("noble_mie.xml")) for site in top.sites: site.atom_type = ff.atom_types["Xe"] top.update_topology() return top
def typed_water_system(self, water_system): top = water_system ff = ForceField(get_path('tip3p.xml')) element_map = {"O": "opls_111", "H": "opls_112"} for atom in top.sites: atom.atom_type = ff.atom_types[atom.name] for bond in top.bonds: bond.connection_type = ff.bond_types["opls_111~opls_112"] for subtop in top.subtops: angle = Angle( connection_members=[site for site in subtop.sites], name="opls_112~opls_111~opls_112", connection_type=ff.angle_types["opls_112~opls_111~opls_112"]) top.add_connection(angle) top.update_topology() return top
def test_ethylene_forcefield(self): ethylene = ForceField(get_path('ethylene.xml')) assert len(ethylene.atom_types) == 2 assert len(ethylene.bond_types) == 2 assert len(ethylene.angle_types) == 2 assert len(ethylene.dihedral_types) == 1 # Store expected expressions in list ref_exprs = [sympy.sympify(expr) for expr in [ "4*epsilon*((sigma/r)**12 - (sigma/r)**6)", "0.5 * k * (r-r_eq)**2", "0.5 * k * (theta-theta_eq)**2", "c_0 + c_1 * cos(psi) + c_2 * cos(psi)**2 + c_3 * cos(psi)**3 + c_4 * cos(psi)**4 + c_5 * cos(psi)**5" ] ] assert allclose(ethylene.atom_types['opls_143'].charge, -0.23 * u.elementary_charge) assert allclose(ethylene.atom_types['opls_144'].charge, 0.115 * u.elementary_charge) assert sympy.simplify(ethylene.atom_types['opls_143'].expression - ref_exprs[0]) == 0 assert sympy.simplify(ethylene.atom_types['opls_144'].expression - ref_exprs[0]) == 0 assert sympy.simplify(ethylene.bond_types['opls_143~opls_144'].expression - ref_exprs[1]) == 0 assert sympy.simplify(ethylene.angle_types['opls_144~opls_143~opls_144'].expression - ref_exprs[2]) == 0 assert sympy.simplify(ethylene.dihedral_types['opls_144~opls_143~opls_143~opls_144'].expression - ref_exprs[3]) == 0 assert allclose(ethylene.atom_types['opls_143'].parameters['sigma'], 0.317984 * u.nm) assert allclose(ethylene.atom_types['opls_143'].parameters['epsilon'], 0.355 * u.Unit('kJ/mol')) assert allclose(ethylene.atom_types['opls_144'].parameters['sigma'], 0.12552 * u.nm) assert allclose(ethylene.atom_types['opls_144'].parameters['epsilon'], 0.242 * u.Unit('kJ/mol')) assert allclose(ethylene.bond_types['opls_143~opls_143'].parameters['r_eq'], 0.134 * u.nm) assert allclose(ethylene.bond_types['opls_143~opls_144'].parameters['k'], 284512.0 * u.Unit('kJ/(mol*nm**2)')) assert allclose(ethylene.angle_types['opls_143~opls_143~opls_144'].parameters['theta_eq'], 2.0943951 * u.rad) assert allclose(ethylene.angle_types['opls_144~opls_143~opls_144'].parameters['k'], 292.88 * u.Unit('kJ/mol/rad**2')) assert allclose(ethylene.dihedral_types['opls_144~opls_143~opls_143~opls_144'].parameters['c_0'], 58.576 * u.Unit('kJ/mol')) assert allclose(ethylene.dihedral_types['opls_144~opls_143~opls_143~opls_144'].parameters['c_2'], -58.576 * u.Unit('kJ/mol')) assert allclose(ethylene.dihedral_types['opls_144~opls_143~opls_143~opls_144'].parameters['c_5'], 0.0 * u.Unit('kJ/mol'))
def test_missing_params(self): with pytest.raises(ForceFieldParseError): ForceField(get_path('ff-example-missing-parameter.xml'))
def test_empty_foyer_atomtype(self): with pytest.raises(ForceFieldParseError): from_foyer_xml(get_path("empty_foyer.xml"))
def test_read_sites(self, filename=get_path('data.lammps')): read = read_lammpsdata(filename) assert read.box == Box(lengths=[1, 1, 1])
def test_read_lammps(self, filename=get_path('data.lammps')): read_lammpsdata(filename)
def opls_ethane_foyer(self): return ForceField( get_path(filename=get_path("oplsaa-ethane_foyer.xml")))
def test_forcefield_missing_atom_types_non_strict(self): ff = ForceField( get_path(filename=get_path('ff_missing_atom_types.xml')), strict=False)
def ff(self): return ForceField(get_path('ff-example0.xml'))
def test_forcefield_missing_atom_types(self): with pytest.raises(MissingAtomTypesError): ff = ForceField( get_path(filename=get_path('ff_missing_atom_types.xml')))
def test_ff_from_etree(self): ff_etree = lxml.etree.parse(get_path('opls_charmm_buck.xml')) ff = ForceField(ff_etree) assert ff
def named_groups_ff(self): return ForceField(get_path('ff-example1.xml'))
def test_non_unique_params(self): with pytest.raises(DocumentInvalid): ForceField(get_path('ff-example-nonunique-params.xml'))
def test_atomclass_groups_charm_buck_ff(self): ff = ForceField(get_path('opls_charmm_buck.xml')) assert len(ff.atom_class_groups['CT']) == 2
def test_tip3p_force_field(self): water = ForceField(get_path("tip3p.xml")) assert len(water.atom_types) == 2 assert len(water.bond_types) == 1 assert len(water.angle_types) == 1 assert len(water.dihedral_types) == 0 # Store expected expressions in list ref_exprs = [ sympy.sympify(expr) for expr in [ "4*epsilon*((sigma/r)**12 - (sigma/r)**6)", "0.5 * k * (r-r_eq)**2", "0.5 * k * (theta-theta_eq)**2", ] ] assert water.atom_types["opls_111"].charge.value == -0.834 assert water.atom_types["opls_112"].charge.value == 0.417 assert (sympy.simplify(water.atom_types["opls_111"].expression - ref_exprs[0]) == 0) assert (sympy.simplify(water.atom_types["opls_112"].expression - ref_exprs[0]) == 0) assert ( sympy.simplify(water.bond_types["opls_111~opls_112"].expression - ref_exprs[1]) == 0) assert (sympy.simplify( water.angle_types["opls_112~opls_111~opls_112"].expression - ref_exprs[2]) == 0) assert_allclose_units( water.atom_types["opls_111"].parameters["sigma"], 0.315061 * u.nm, rtol=1e-5, atol=1e-8, ) assert_allclose_units( water.atom_types["opls_111"].parameters["epsilon"], 0.636386 * u.Unit("kJ/mol"), rtol=1e-5, atol=1e-8, ) assert_allclose_units( water.atom_types["opls_112"].parameters["sigma"], 1.0 * u.nm, rtol=1e-5, atol=1e-8, ) assert_allclose_units( water.atom_types["opls_112"].parameters["epsilon"], 0.0 * u.Unit("kJ/mol"), rtol=1e-5, atol=1e-8, ) assert_allclose_units( water.bond_types["opls_111~opls_112"].parameters["r_eq"], 0.09572 * u.nm, rtol=1e-5, atol=1e-8, ) assert_allclose_units( water.bond_types["opls_111~opls_112"].parameters["k"], 502416.0 * u.Unit("kJ/(mol*nm**2)"), rtol=1e-5, atol=1e-8, ) assert_allclose_units( water.angle_types["opls_112~opls_111~opls_112"]. parameters["theta_eq"], 1.824218134 * u.radian, rtol=1e-5, atol=1e-8, ) assert_allclose_units( water.angle_types["opls_112~opls_111~opls_112"].parameters["k"], 682.02 * u.Unit("kJ/(mol*rad**2)"), rtol=1e-5, atol=1e-8, )