def test_partial_bondorder(verbose=False): """Test setup of a molecule which activates partial bond order code.""" from openeye import oechem mol = oechem.OEMol() from openeye import oeiupac oeiupac.OEParseIUPACName(mol, 'benzene') positions = positions_from_oemol(mol) oechem.OETriposAtomNames(mol) topology = generateTopologyFromOEMol(mol) # Load forcefield from above ffxml = StringIO(ffxml_contents) ff = ForceField(ffxml) # Set up once using AM1BCC charges system = ff.createSystem(topology, [mol], chargeMethod='OECharges_AM1BCCSym', verbose=verbose) # Check that energy is what it ought to be -- the partial bond order # for benzene makes the energy a bit higher than it would be without it energy = get_energy(system, positions) if energy < 7.50 or energy > 7.60: raise Exception( "Partial bond order code seems to have issues, as energy for benzene is outside of tolerance in tests." ) # Set up once also without asking for charges system = ff.createSystem(topology, [mol], verbose=verbose) energy = get_energy(system, positions) # Energy is lower with user supplied charges (which in this case are zero) if energy < 4.00 or energy > 6.0: raise Exception( "Partial bond order code seems to have issues when run with user-provided charges, as energy for benzene is out of tolerance in tests." )
def check_system_creation_from_molecule(forcefield, mol, chargeMethod=None, verbose=False): """ Generate a System from the given OEMol and SMIRFF forcefield and check that its energy is finite. Parameters ---------- forcefield : smarty.ForceField SMIRFF forcefield mol : oechem.OEMol Molecule to test (need not have coordinates) chargeMethod : str, optional, default=None Charge method to use in creating system """ from smarty.forcefield import generateTopologyFromOEMol topology = generateTopologyFromOEMol(mol) system = forcefield.createSystem(topology, [mol], chargeMethod=chargeMethod, verbose=verbose) # Test energy computation. positions = positions_from_oemol(mol) check_energy_is_finite(system, positions)
def test_parameter_completeness_check(self): """Test that proper exceptions are raised if a force field fails to assign parameters to valence terms in a molecule.""" from openeye import oechem mol = oechem.OEMol() oechem.OEParseSmiles(mol, 'CCC') oechem.OEAddExplicitHydrogens(mol) oechem.OETriposAtomNames(mol) ff = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml')) topology = generateTopologyFromOEMol(mol) # Test nonbonded error checking by wiping out required LJ parameter params = ff.getParameter(paramID='n0001') params['smirks'] = '[#136:1]' ff.setParameter(paramID='n0001', params=params) ff.setParameter(paramID='n0002', params=params) with self.assertRaises(Exception): system = ff.createSystem(topology, [mol]) ff = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml')) # Test bond error checking by wiping out a required bond parameter params = ff.getParameter(paramID='b0001') params['smirks'] = '[#136:1]~[*:2]' ff.setParameter(paramID='b0001', params=params) with self.assertRaises(Exception): system = ff.createSystem(topology, [mol]) ff = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml')) # Test angle error checking by wiping out a required angle parameter params = ff.getParameter(paramID='a0001') params['smirks'] = '[#136:1]~[*:2]~[*:3]' ff.setParameter(paramID='a0001', params=params) with self.assertRaises(Exception): system = ff.createSystem(topology, [mol]) ff = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml')) # Test torsion error checking by wiping out a required torsion parameter params = ff.getParameter(paramID='t0001') params['smirks'] = '[#136:1]~[*:2]~[*:3]~[*:4]' ff.setParameter(paramID='t0001', params=params) ff.setParameter(paramID='t0004', params=params) with self.assertRaises(Exception): system = ff.createSystem(topology, [mol]) ff = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml'))
def test_change_parameters(verbose=False): """Test modification of forcefield parameters.""" from openeye import oechem # Load simple OEMol ifs = oechem.oemolistream( get_data_filename('molecules/AlkEthOH_c100.mol2')) mol = oechem.OEMol() flavor = oechem.OEIFlavor_Generic_Default | oechem.OEIFlavor_MOL2_Default | oechem.OEIFlavor_MOL2_Forcefield ifs.SetFlavor(oechem.OEFormat_MOL2, flavor) oechem.OEReadMolecule(ifs, mol) oechem.OETriposAtomNames(mol) # Load forcefield file ffxml = get_data_filename('forcefield/Frosst_AlkEtOH.ffxml') ff = ForceField(ffxml) from smarty.forcefield import generateTopologyFromOEMol topology = generateTopologyFromOEMol(mol) # Create initial system system = ff.createSystem(topology, [mol], verbose=verbose) # Get initial energy before parameter modification positions = positions_from_oemol(mol) old_energy = get_energy(system, positions) # Get params for an angle params = ff.getParameter(smirks='[a,A:1]-[#6X4:2]-[a,A:3]') # Modify params params['k'] = '0.0' ff.setParameter(params, smirks='[a,A:1]-[#6X4:2]-[a,A:3]') # Write params ff.writeFile(tempfile.TemporaryFile(suffix='.ffxml')) # Make sure params changed energy! (Test whether they get rebuilt on system creation) system = ff.createSystem(topology, [mol], verbose=verbose) energy = get_energy(system, positions) if verbose: print("New energy/old energy:", energy, old_energy) if np.abs(energy - old_energy) < 0.1: raise Exception("Error: Parameter modification did not change energy.")