def test_smirff_energies_vs_parmatfrosst(verbose=False): """Test evaluation of energies from parm@frosst ffxml files versus energies of equivalent systems.""" from openeye import oechem prefix = 'AlkEthOH_' molecules = [ 'r118', 'r12', 'c1161', 'r0', 'c100', 'c38', 'c1266' ] # Loop over molecules, load OEMols and prep for comparison/do comparison for molnm in molecules: f_prefix = os.path.join('molecules', prefix+molnm ) mol2file = get_data_filename( f_prefix+'.mol2') prmtop = get_data_filename( f_prefix+'.top') crd = get_data_filename( f_prefix+'.crd') # Load special parm@frosst with parm99/parm@frosst bugs re-added for testing forcefield = ForceField( get_data_filename('forcefield/Frosst_AlkEtOH_parmAtFrosst.ffxml') ) # Load OEMol mol = oechem.OEGraphMol() ifs = oechem.oemolistream(mol2file) 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) # Do comparison results = compare_molecule_energies( prmtop, crd, forcefield, mol, verbose = verbose )
def test_merge_system(): """Test merging of a system created from AMBER and another created from SMIRFF.""" #Create System from AMBER prefix = os.path.join('systems', 'amber', 'cyclohexane_ethanol_0.4_0.6') prmtop = get_data_filename(prefix + '.prmtop') incrd = get_data_filename(prefix + '.inpcrd') topology0, system0, positions0 = create_system_from_amber(prmtop, incrd) 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 forcefield = ForceField( get_data_filename('forcefield/Frosst_AlkEtOH.ffxml')) topology1, system1, positions1 = create_system_from_molecule( forcefield, mol) merge_system(topology0, topology1, system0, system1, positions0, positions1, verbose=True)
def check_boxes(forcefield, description="", chargeMethod=None, verbose=False): """Test creation of System from boxes of mixed solvents. """ # Read monomers mols = list() monomers = ['cyclohexane', 'ethanol', 'propane', 'methane', 'butanol'] from openeye import oechem mol = oechem.OEGraphMol() for monomer in monomers: filename = get_data_filename(os.path.join('systems', 'monomers', monomer + '.sdf')) ifs = oechem.oemolistream(filename) while oechem.OEReadMolecule(ifs, mol): oechem.OETriposAtomNames(mol) mols.append( oechem.OEGraphMol(mol) ) if verbose: print('%d reference molecules loaded' % len(mols)) # Read systems. boxes = ['cyclohexane_ethanol_0.4_0.6.pdb', 'propane_methane_butanol_0.2_0.3_0.5.pdb'] from simtk.openmm.app import PDBFile for box in boxes: filename = get_data_filename(os.path.join('systems', 'packmol_boxes', box)) pdbfile = PDBFile(filename) f = partial(check_system_creation_from_topology, forcefield, pdbfile.topology, mols, pdbfile.positions, chargeMethod=chargeMethod, verbose=verbose) f.description = 'Test creation of System object from %s %s' % (box, description) yield f
def test_read_typelist(self): atomtypes = AtomTyper.read_typelist( get_data_filename('atomtypes/basetypes.smarts')) decorators = AtomTyper.read_typelist( get_data_filename('atomtypes/decorators.smarts')) replacements = AtomTyper.read_typelist( get_data_filename('atomtypes/replacements.smarts'))
def test_smirff_energies_vs_parmatfrosst(verbose=False): """Test evaluation of energies from parm@frosst ffxml files versus energies of equivalent systems.""" from openeye import oechem prefix = 'AlkEthOH_' molecules = ['r118', 'r12', 'c1161', 'r0', 'c100', 'c38', 'c1266'] # Loop over molecules, load OEMols and prep for comparison/do comparison for molnm in molecules: f_prefix = os.path.join('molecules', prefix + molnm) mol2file = get_data_filename(f_prefix + '.mol2') prmtop = get_data_filename(f_prefix + '.top') crd = get_data_filename(f_prefix + '.crd') # Load special parm@frosst with parm99/parm@frosst bugs re-added for testing forcefield = ForceField( get_data_filename('forcefield/Frosst_AlkEtOH_parmAtFrosst.ffxml')) # Load OEMol mol = oechem.OEGraphMol() ifs = oechem.oemolistream(mol2file) 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) # Do comparison results = compare_molecule_energies(prmtop, crd, forcefield, mol, verbose=verbose)
def test_improper(verbose=False): """Test implement of impropers on benzene.""" from openeye import oechem # Load benzene ifs = oechem.oemolistream(get_data_filename('molecules/benzene.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) ifs.close() # Load forcefield ffxml = get_data_filename('forcefield/benzene_minimal.ffxml') ff = ForceField(ffxml) # Load AMBER files and compare crd = get_data_filename('molecules/benzene.crd') top = get_data_filename('molecules/benzene.top') g0, g1, e0, e1 = compare_molecule_energies(top, crd, ff, mol, skip_assert=True) # Check that torsional energies the same to 1 in 10^6 rel_error = np.abs((g0['torsion'] - g1['torsion']) / g0['torsion']) if rel_error > 2e-5: #Note that this will not be tiny because we use six-fold impropers and they use a single improper raise Exception( "Improper torsion energy for benzene differs too much (relative error %.4g) between AMBER and SMIRFF." % rel_error)
def test_atomtyper(self): typetag = 'atomtype' atomtypes = AtomTyper.read_typelist(get_data_filename('atomtypes/basetypes.smarts')) replacements = AtomTyper.read_typelist(get_data_filename('atomtypes/replacements.smarts')) molecules = read_molecules('zinc-subset-tripos.mol2.gz', verbose=False) atomtyper = AtomTyper(atomtypes, typetag, replacements=replacements) for molecule in molecules: atomtyper.assignTypes(molecule)
def __init__(self, *args, **kwargs): """ Initialize TestCase including files used in all smarty tests """ unittest.TestCase.__init__(self, *args, **kwargs) self.basetypes = get_data_filename('atomtypes/basetypes.smarts') self.alkethoh_answers = get_data_filename( 'atomtypes/initial_AlkEthOH.smarts') self.simple_decs = get_data_filename('atomtypes/decorators.smarts') self.combine_decs = get_data_filename( 'atomtypes/new-decorators.smarts') self.replacements = get_data_filename('atomtypes/replacements.smarts') # import molecules self.mols_zinc = smarty.utils.read_molecules( get_data_filename('molecules/zinc-subset-tripos.mol2.gz'), verbose=False) self.mols_zinc_ref = smarty.utils.read_molecules( get_data_filename('molecules/[email protected]'), verbose=False) self.mols_alkethoh = smarty.utils.read_molecules( get_data_filename('molecules/AlkEthOH_test_filt1_tripos.mol2'), verbose=False) self.mols_alkethoh_ref = smarty.utils.read_molecules( get_data_filename('molecules/AlkEthOH_test_filt1_ff.mol2'), verbose=False)
def test_atomtyper(self): typetag = 'atomtype' atomtypes = AtomTyper.read_typelist( get_data_filename('atomtypes/basetypes.smarts')) replacements = AtomTyper.read_typelist( get_data_filename('atomtypes/replacements.smarts')) molecules = read_molecules('zinc-subset-tripos.mol2.gz', verbose=False) atomtyper = AtomTyper(atomtypes, typetag, replacements=replacements) for molecule in molecules: atomtyper.assignTypes(molecule)
def test_gromacs_roundtrip(): """Save a System (a mixture) to GROMACS, read back in, verify yields same energy and force terms.""" forcefield = ForceField( get_data_filename('forcefield/Frosst_AlkEtOH.ffxml')) filename = get_data_filename( os.path.join('systems', 'packmol_boxes', 'cyclohexane_ethanol_0.4_0.6.pdb')) from simtk.openmm.app import PDBFile pdbfile = PDBFile(filename) mol2files = [ get_data_filename(os.path.join('systems', 'monomers', 'ethanol.mol2')), get_data_filename( os.path.join('systems', 'monomers', 'cyclohexane.mol2')) ] flavor = oechem.OEIFlavor_Generic_Default | oechem.OEIFlavor_MOL2_Default | oechem.OEIFlavor_MOL2_Forcefield mols = [] mol = oechem.OEMol() for mol2file in mol2files: ifs = oechem.oemolistream(mol2file) ifs.SetFlavor(oechem.OEFormat_MOL2, flavor) mol = oechem.OEGraphMol() while oechem.OEReadMolecule(ifs, mol): oechem.OETriposAtomNames(mol) mols.append(oechem.OEGraphMol(mol)) # setup system system = forcefield.createSystem(pdbfile.topology, mols) # Create ParmEd structure, save to AMBER a, topfile = tempfile.mkstemp(suffix='.top') a, grofile = tempfile.mkstemp(suffix='.gro') save_system_to_gromacs(pdbfile.topology, system, pdbfile.positions, topfile, grofile) # Read back in and cross-check energies top = parmed.load_file(topfile) gro = parmed.load_file(grofile) gromacssys = top.createSystem(nonbondedMethod=app.NoCutoff, constraints=None, implicitSolvent=None) groups0, groups1, energy0, energy1 = compare_system_energies( pdbfile.topology, pdbfile.topology, gromacssys, system, pdbfile.positions, verbose=False) # Remove temp files os.remove(topfile) os.remove(grofile)
def test_create_system_molecules_parmatfrosst_gbsa(verbose=False): """Test creation of a System object from small molecules to test parm@frosst forcefield with GBSA support. """ forcefield = ForceField( get_data_filename('forcefield/Frosst_AlkEtOH_GBSA.ffxml')) for f in check_AlkEtOH(forcefield, "to test Parm@Frosst parameters", verbose=verbose): yield f
def test_create_system_boxes_parmatfrosst(verbose=False): """Test creation of a System object from some boxes of mixed solvents to test parm@frosst forcefield. """ forcefield = ForceField( get_data_filename('forcefield/Frosst_AlkEtOH.ffxml')) for f in check_boxes(forcefield, description="to test Parm@frosst parameters", verbose=verbose): yield f
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 check_AlkEtOH(forcefield, description="", chargeMethod=None, verbose=False): """Test creation of System from AlkEtOH small molecules. """ from openeye import oechem ifs = oechem.oemolistream(get_data_filename('molecules/AlkEtOH-tripos.mol2.gz')) mol = oechem.OEGraphMol() while oechem.OEReadMolecule(ifs, mol): args = { 'verbose' : verbose, 'chargeMethod' : chargeMethod } f = partial(check_system_creation_from_molecule, forcefield, mol, **args) f.description ='Testing creation of system object from small molecules (%s) %s' % (mol.GetTitle(), description) yield f
def test_atomtyper_AlkEthOH(self): # Test to make sure that AlkEthOH gets 100% at T=0 starting from correct # types basetypes_filename = get_data_filename('atomtypes/basetypes.smarts') initialtypes_filename = get_data_filename( 'atomtypes/initial_AlkEthOH.smarts') decorators_filename = get_data_filename( 'atomtypes/new-decorators.smarts') replacements_filename = get_data_filename( 'atomtypes/replacements.smarts') molecules = smarty.utils.read_molecules( get_data_filename('molecules/AlkEthOH_test_filt1_tripos.mol2'), verbose=False) reference_typed_molecules = smarty.utils.read_molecules( get_data_filename('molecules/AlkEthOH_test_filt1_ff.mol2'), verbose=False) # Construct atom type sampler. atomtype_sampler = smarty.AtomTypeSampler( molecules, basetypes_filename, initialtypes_filename, decorators_filename, replacements_filename=replacements_filename, reference_typed_molecules=reference_typed_molecules, verbose=False, temperature=0) # Start sampling atom types. fracfound = atomtype_sampler.run(2) # Ensure fraction found is 1.0 if fracfound < 1.0: raise Exception("Not finding 100% of AlkEthOH when starting from" " correct SMARTS.")
def test_atomtyper(self): basetypes_filename = get_data_filename('atomtypes/basetypes.smarts') initialtypes_filename = get_data_filename('atomtypes/basetypes.smarts') decorators_filename = get_data_filename('atomtypes/decorators.smarts') replacements_filename = get_data_filename( 'atomtypes/replacements.smarts') molecules = smarty.utils.read_molecules( get_data_filename('molecules/zinc-subset-tripos.mol2.gz'), verbose=False) reference_typed_molecules = smarty.utils.read_molecules( get_data_filename('molecules/[email protected]'), verbose=False) # Construct atom type sampler. atomtype_sampler = smarty.AtomTypeSampler( molecules, basetypes_filename, initialtypes_filename, decorators_filename, replacements_filename=replacements_filename, reference_typed_molecules=reference_typed_molecules, verbose=False, decorator_behavior='simple-decorators') # Start sampling atom types. atomtype_sampler.run(2)
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.")
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.")
def check_boxes(forcefield, description="", chargeMethod=None, verbose=False): """Test creation of System from boxes of mixed solvents. """ # Read monomers mols = list() monomers = ['cyclohexane', 'ethanol', 'propane', 'methane', 'butanol'] from openeye import oechem mol = oechem.OEGraphMol() for monomer in monomers: filename = get_data_filename( os.path.join('systems', 'monomers', monomer + '.sdf')) ifs = oechem.oemolistream(filename) while oechem.OEReadMolecule(ifs, mol): oechem.OETriposAtomNames(mol) mols.append(oechem.OEGraphMol(mol)) if verbose: print('%d reference molecules loaded' % len(mols)) # Read systems. boxes = [ 'cyclohexane_ethanol_0.4_0.6.pdb', 'propane_methane_butanol_0.2_0.3_0.5.pdb' ] from simtk.openmm.app import PDBFile for box in boxes: filename = get_data_filename( os.path.join('systems', 'packmol_boxes', box)) pdbfile = PDBFile(filename) f = partial(check_system_creation_from_topology, forcefield, pdbfile.topology, mols, pdbfile.positions, chargeMethod=chargeMethod, verbose=verbose) f.description = 'Test creation of System object from %s %s' % ( box, description) yield f
def read_typelist(cls, filename): """ Read an atomtype or decorator list from a file. Parameters ---------- filename : str The name of the file to be read Returns ------- typelist : list of tuples Typelist[i] is element i of the typelist in format [smarts, typename] """ if filename is None: return None if not os.path.exists(filename): built_in = utils.get_data_filename(filename) if not os.path.exists(built_in): raise Exception("File '%s' not found." % filename) filename = built_in typelist = list() ifs = open(filename) lines = ifs.readlines() used_typenames = list() for line in lines: # Strip trailing comments index = line.find('%') if index != -1: line = line[0:index] # Split into tokens. tokens = line.split() # Process if we have enough tokens if len(tokens) >= 2: smarts = tokens[0] typename = ' '.join(tokens[1:]) if typename not in used_typenames: typelist.append([smarts,typename]) used_typenames.append(typename) else: raise Exception("Error in file '%s' -- each entry must " "have a unique name." % filename ) ifs.close() return typelist
def check_AlkEtOH(forcefield, description="", chargeMethod=None, verbose=False): """Test creation of System from AlkEtOH small molecules. """ from openeye import oechem ifs = oechem.oemolistream( get_data_filename('molecules/AlkEtOH-tripos.mol2.gz')) mol = oechem.OEGraphMol() while oechem.OEReadMolecule(ifs, mol): args = {'verbose': verbose, 'chargeMethod': chargeMethod} f = partial(check_system_creation_from_molecule, forcefield, mol, **args) f.description = 'Testing creation of system object from small molecules (%s) %s' % ( mol.GetTitle(), description) yield f
def test_atomtyper(self): basetypes_filename = get_data_filename('atomtypes/basetypes.smarts') initialtypes_filename = get_data_filename('atomtypes/basetypes.smarts') decorators_filename = get_data_filename('atomtypes/decorators.smarts') replacements_filename = get_data_filename('atomtypes/replacements.smarts') molecules = smarty.utils.read_molecules(get_data_filename('molecules/zinc-subset-tripos.mol2.gz'), verbose=False) reference_typed_molecules = smarty.utils.read_molecules(get_data_filename('molecules/[email protected]'), verbose=False) # Construct atom type sampler. atomtype_sampler = smarty.AtomTypeSampler(molecules, basetypes_filename, initialtypes_filename, decorators_filename, replacements_filename=replacements_filename, reference_typed_molecules=reference_typed_molecules, verbose=False, decorator_behavior='simple-decorators') # Start sampling atom types. atomtype_sampler.run(2)
def test_molecule_labeling(verbose=False): """Test using labelMolecules to see which parameters applied to an oemol.""" from openeye import oechem mol = oechem.OEMol() oechem.OEParseSmiles(mol, 'CCC') oechem.OEAddExplicitHydrogens(mol) ff = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml')) labels = ff.labelMolecules([mol], verbose=verbose) # Check that force terms aren't empty print(labels[0].keys()) if not 'HarmonicBondGenerator' in labels[0].keys(): raise Exception("No force term assigned for harmonic bonds.") if not 'HarmonicAngleGenerator' in labels[0].keys(): raise Exception("No force term assigned for harmonic angles.") if not 'PeriodicTorsionGenerator' in labels[0].keys(): raise Exception("No force term assigned for periodic torsions.") if not 'NonbondedGenerator' in labels[0].keys(): raise Exception("No nonbonded force term assigned.")
def test_molecule_labeling(verbose = False): """Test using labelMolecules to see which parameters applied to an oemol.""" from openeye import oechem mol = oechem.OEMol() oechem.OEParseSmiles(mol, 'CCC') oechem.OEAddExplicitHydrogens(mol) ff = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml')) labels = ff.labelMolecules( [mol], verbose = verbose) # Check that force terms aren't empty print(labels[0].keys()) if not 'HarmonicBondGenerator' in labels[0].keys(): raise Exception("No force term assigned for harmonic bonds.") if not 'HarmonicAngleGenerator' in labels[0].keys(): raise Exception("No force term assigned for harmonic angles.") if not 'PeriodicTorsionGenerator' in labels[0].keys(): raise Exception("No force term assigned for periodic torsions.") if not 'NonbondedGenerator' in labels[0].keys(): raise Exception("No nonbonded force term assigned.")
def __init__(self, *args, **kwargs): """ Initialize TestCase and then read in odds from files in smarty/data """ unittest.TestCase.__init__(self,*args, **kwargs) self.atom_OR_bases = utils.parse_odds_file("odds_files/atom_OR_bases.smarts" , False) self.atom_OR_decors = utils.parse_odds_file("odds_files/atom_decorators.smarts", False) self.atom_AND_decors = utils.parse_odds_file("odds_files/atom_decorators.smarts", False) self.bond_OR_bases = utils.parse_odds_file("odds_files/bond_OR_bases.smarts", False) self.bond_AND_decors = utils.parse_odds_file("odds_files/bond_AND_decorators.smarts", False) self.atom_odds = utils.parse_odds_file("odds_files/atom_index_odds.smarts", False) self.bond_odds = utils.parse_odds_file("odds_files/bond_index_odds.smarts", False) self.molecules = utils.read_molecules("test_filt1_tripos.mol2", False) self.SMIRFF = "forcefield/Frosst_AlkEtOH.ffxml" self.outputFile = 'test_smirky' replacement_file = utils.get_data_filename("odds_files/substitutions.smarts") self.replacements = smarty.AtomTyper.read_typelist(replacement_file) self.replacements = [ [short, smarts] for [smarts, short] in self.replacements] self.correctDict = {'VdW': [ ["[#1:1]-[#6]", 'HC'], [ "[#1:1]-[#6]-[#7,#8,F,#16,Cl,Br]", 'H1'], [ "[#1:1]-[#6](-[#7,#8,F,#16,Cl,Br])-[#7,#8,F,#16,Cl,Br]", 'H2'], [ "[#1:1]-[#6](-[#7,#8,F,#16,Cl,Br])(-[#7,#8,F,#16,Cl,Br])-[#7,#8,F,#16,Cl,Br]", 'H3'], [ "[#1:1]-[#8]", 'HO'], [ "[#6X4:1]", 'CT'], [ "[#8X2:1]", 'OS'], [ "[#8X2+0:1]-[#1]", 'OH'] ], 'Bond': [ ["[#6X4:1]-[#6X4:2]", 'CT-CT'], [ "[#6X4:1]-[#1:2]", 'CT-H'], [ "[#8:1]~[#1:2]", 'O~H'], [ "[#6X4:1]-[#8;X2;H1:2]", "CT-OH"], [ "[#6X4:1]-[#8;X2;H0:2]", "CT-OS"] ], 'Angle': [ [ "[a,A:1]-[#6&X4:2]-[a,A:3]", 'any-CT-any'], [ "[#1:1]-[#6&X4:2]-[#1:3]", "H-CT-H"], [ "[#6&X4:1]-[#6&X4:2]-[#6&X4:3]", 'CT-CT-CT'], [ "[#8&X2:1]-[#6&X4:2]-[#8&X2:3]", 'O-CT-O'], [ "[#6&X4:1]-[#8&X2:2]-[#1:3]", 'CT-OH-HO'], [ "[#6X4:1]-[#8X2:2]-[#6X4:3]", 'CT-OS-CT'] ], 'Torsion': [["[a,A:1]-[#6&X4:2]-[#6&X4:3]-[a,A:4]", 'any-CT-CT-any'], [ "[a,A:1]-[#6&X4:2]-[#8&X2:3]-[#1:4]", 'any-CT-OH-HO'], [ "[a,A:1]-[#6&X4:2]-[#8&X2:3]-[!#1:4]", 'any-CT-OS-!H'], [ "[#1:1]-[#6&X4:2]-[#6&X4:3]-[#1:4]", 'H-CT-CT-H'], [ "[#1:1]-[#6&X4:2]-[#6&X4:3]-[#6&X4:4]", 'H-CT-CT-CT'], [ "[#6&X4:1]-[#6&X4:2]-[#8&X2:3]-[#1:4]", 'CT-CT-OH-HO'], [ "[#6&X4:1]-[#6&X4:2]-[#6&X4:3]-[#6&X4:4]", 'CT-CT-CT-CT'], [ "[#6&X4:1]-[#6&X4:2]-[#8&X2:3]-[#6&X4:4]", 'CT-CT-OS-CT'], [ "[#6&X4:1]-[#8&X2:2]-[#6&X4:3]-[O&X2&H0:4]", 'CT-OS-CT-OS'], [ "[#8&X2:1]-[#6&X4:2]-[#6&X4:3]-[#8&X2:4]", 'O-CT-CT-O'], [ "[#8&X2:1]-[#6&X4:2]-[#6&X4:3]-[#1:4]", 'O-CT-CT-H'], [ "[#1:1]-[#6&X4:2]-[#6&X4:3]-[O&X2:4]", 'H-CT-CT-O'] ]}
def __init__(self, *args, **kwargs): """ Initialize TestCase and then read in odds from files in smarty/data """ unittest.TestCase.__init__(self,*args, **kwargs) self.atom_OR_bases = utils.parse_odds_file("odds_files/atom_OR_bases.smarts" , False) self.atom_OR_decors = utils.parse_odds_file("odds_files/atom_decorators.smarts", False) self.atom_AND_decors = utils.parse_odds_file("odds_files/atom_decorators.smarts", False) self.bond_OR_bases = utils.parse_odds_file("odds_files/bond_OR_bases.smarts", False) self.bond_AND_decors = utils.parse_odds_file("odds_files/bond_AND_decorators.smarts", False) self.atom_odds = utils.parse_odds_file("odds_files/atom_index_odds.smarts", False) self.bond_odds = utils.parse_odds_file("odds_files/bond_index_odds.smarts", False) self.molecules = read_molecules("test_filt1_tripos.mol2", False) self.SMIRFF = "forcefield/Frosst_AlkEthOH.ffxml" self.outputFile = 'test_smirky' replacement_file = utils.get_data_filename("odds_files/substitutions.smarts") self.replacements = smarty.AtomTyper.read_typelist(replacement_file) self.replacements = [ [short, smarts] for [smarts, short] in self.replacements] self.correctDict = {'VdW': [ ["[#1:1]-[#6]", 'HC'], [ "[#1:1]-[#6]-[#7,#8,F,#16,Cl,Br]", 'H1'], [ "[#1:1]-[#6](-[#7,#8,F,#16,Cl,Br])-[#7,#8,F,#16,Cl,Br]", 'H2'], [ "[#1:1]-[#6](-[#7,#8,F,#16,Cl,Br])(-[#7,#8,F,#16,Cl,Br])-[#7,#8,F,#16,Cl,Br]", 'H3'], [ "[#1:1]-[#8]", 'HO'], [ "[#6X4:1]", 'CT'], [ "[#8X2:1]", 'OS'], [ "[#8X2+0:1]-[#1]", 'OH'] ], 'Bond': [ ["[#6X4:1]-[#6X4:2]", 'CT-CT'], [ "[#6X4:1]-[#1:2]", 'CT-H'], [ "[#8:1]~[#1:2]", 'O~H'], [ "[#6X4:1]-[#8;X2;H1:2]", "CT-OH"], [ "[#6X4:1]-[#8;X2;H0:2]", "CT-OS"] ], 'Angle': [ [ "[a,A:1]-[#6&X4:2]-[a,A:3]", 'any-CT-any'], [ "[#1:1]-[#6&X4:2]-[#1:3]", "H-CT-H"], [ "[#6&X4:1]-[#6&X4:2]-[#6&X4:3]", 'CT-CT-CT'], [ "[#8&X2:1]-[#6&X4:2]-[#8&X2:3]", 'O-CT-O'], [ "[#6&X4:1]-[#8&X2:2]-[#1:3]", 'CT-OH-HO'], [ "[#6X4:1]-[#8X2:2]-[#6X4:3]", 'CT-OS-CT'] ], 'Torsion': [["[a,A:1]-[#6&X4:2]-[#6&X4:3]-[a,A:4]", 'any-CT-CT-any'], [ "[a,A:1]-[#6&X4:2]-[#8&X2:3]-[#1:4]", 'any-CT-OH-HO'], [ "[a,A:1]-[#6&X4:2]-[#8&X2:3]-[!#1:4]", 'any-CT-OS-!H'], [ "[#1:1]-[#6&X4:2]-[#6&X4:3]-[#1:4]", 'H-CT-CT-H'], [ "[#1:1]-[#6&X4:2]-[#6&X4:3]-[#6&X4:4]", 'H-CT-CT-CT'], [ "[#6&X4:1]-[#6&X4:2]-[#8&X2:3]-[#1:4]", 'CT-CT-OH-HO'], [ "[#6&X4:1]-[#6&X4:2]-[#6&X4:3]-[#6&X4:4]", 'CT-CT-CT-CT'], [ "[#6&X4:1]-[#6&X4:2]-[#8&X2:3]-[#6&X4:4]", 'CT-CT-OS-CT'], [ "[#6&X4:1]-[#8&X2:2]-[#6&X4:3]-[O&X2&H0:4]", 'CT-OS-CT-OS'], [ "[#8&X2:1]-[#6&X4:2]-[#6&X4:3]-[#8&X2:4]", 'O-CT-CT-O'], [ "[#8&X2:1]-[#6&X4:2]-[#6&X4:3]-[#1:4]", 'O-CT-CT-H'], [ "[#1:1]-[#6&X4:2]-[#6&X4:3]-[O&X2:4]", 'H-CT-CT-O'] ]}
def test_atomtyper_AlkEthOH(self): # Test to make sure that AlkEthOH gets 100% at T=0 starting from correct # types basetypes_filename = get_data_filename('atomtypes/basetypes.smarts') initialtypes_filename = get_data_filename('atomtypes/initial_AlkEthOH.smarts') decorators_filename = get_data_filename('atomtypes/new-decorators.smarts') replacements_filename = get_data_filename('atomtypes/replacements.smarts') molecules = smarty.utils.read_molecules(get_data_filename('molecules/AlkEthOH_test_filt1_tripos.mol2'), verbose=False) reference_typed_molecules = smarty.utils.read_molecules(get_data_filename('molecules/AlkEthOH_test_filt1_ff.mol2'), verbose=False) # Construct atom type sampler. atomtype_sampler = smarty.AtomTypeSampler(molecules, basetypes_filename, initialtypes_filename, decorators_filename, replacements_filename=replacements_filename, reference_typed_molecules=reference_typed_molecules, verbose=False, temperature = 0) # Start sampling atom types. fracfound = atomtype_sampler.run(2) # Ensure fraction found is 1.0 if fracfound < 1.0: raise Exception("Not finding 100% of AlkEthOH when starting from" " correct SMARTS.")
#!/bin/env python from openeye.oechem import * from smarty.utils import get_data_filename from smarty.forcefield import * # Create an oemol mol = OEMol() OEParseSmiles(mol, 'CCC') OEAddExplicitHydrogens(mol) ff = ForceField( get_data_filename('forcefield/Frosst_AlkEtOH.ffxml') ) labels= ff.labelMolecules( [mol], verbose = True ) print labels for mol_entry in range(len(labels)): for force in labels[mol_entry].keys(): print("\n%s:" % force) for (atom_indices, pid, smirks) in labels[mol_entry][force]: atomstr='' for idx in atom_indices: atomstr += '%6s' % idx print("%s : %s \t smirks %s" % (atomstr, pid, smirks) )
def test_read_ffxml_gbsa(): """Test reading of ffxml files with GBSA support. """ forcefield = ForceField( get_data_filename('forcefield/Frosst_AlkEtOH_GBSA.ffxml'))
def test_read_ffxml(): """Test reading of ffxml files. """ forcefield = ForceField( get_data_filename('forcefield/Frosst_AlkEtOH.ffxml'))
def test_label_molecules(verbose=False): """Test labeling/getting stats on labeling molecules""" molecules = smarty.utils.read_molecules( get_data_filename('molecules/AlkEtOH-tripos.mol2.gz'), verbose=verbose) ffxml = get_data_filename('forcefield/Frosst_AlkEtOH.ffxml') get_molecule_parameterIDs(molecules, ffxml)
def test_label_molecules(verbose=False): """Test labeling/getting stats on labeling molecules""" molecules = smarty.utils.read_molecules(get_data_filename('molecules/AlkEtOH-tripos.mol2.gz'), verbose=verbose) ffxml = get_data_filename('forcefield/Frosst_AlkEtOH.ffxml') get_molecule_parameterIDs( molecules, ffxml)
def test_component_combination(): """Test that a system still yields the same energy after building it again out of its components.""" # We've had issues where subsequent instances of a molecule might have zero charges # Here we'll try to catch this (and also explicitly check the charges) by re-building # a system out of its components forcefield = ForceField( get_data_filename('forcefield/Frosst_AlkEtOH.ffxml')) filename = get_data_filename( os.path.join('systems', 'packmol_boxes', 'cyclohexane_ethanol_0.4_0.6.pdb')) from simtk.openmm.app import PDBFile pdbfile = PDBFile(filename) mol2files = [ get_data_filename(os.path.join('systems', 'monomers', 'ethanol.mol2')), get_data_filename( os.path.join('systems', 'monomers', 'cyclohexane.mol2')) ] flavor = oechem.OEIFlavor_Generic_Default | oechem.OEIFlavor_MOL2_Default | oechem.OEIFlavor_MOL2_Forcefield mols = [] mol = oechem.OEMol() for mol2file in mol2files: ifs = oechem.oemolistream(mol2file) ifs.SetFlavor(oechem.OEFormat_MOL2, flavor) mol = oechem.OEGraphMol() while oechem.OEReadMolecule(ifs, mol): oechem.OETriposAtomNames(mol) mols.append(oechem.OEGraphMol(mol)) # setup system system = forcefield.createSystem(pdbfile.topology, mols, chargeMethod='OECharges_AM1BCCSym') # Make parmed structure structure = parmed.openmm.topsystem.load_topology(pdbfile.topology, system, pdbfile.positions) # Split the system, then re-compose it out of its components tmp = structure.split() strs, nums = [], [] for s, n in tmp: strs.append(s) nums.append(n) nums = [len(n) for n in nums] # Re-compose system from components new_structure = strs[0] * nums[0] for idx in range(1, len(nums)): new_structure += strs[idx] * nums[idx] # Swap in coordinates again new_structure.positions = structure.positions # Create System newsys = new_structure.createSystem(nonbondedMethod=app.NoCutoff, constraints=None, implicitSolvent=None) # Cross check energies groups0, groups1, energy0, energy1 = compare_system_energies( pdbfile.topology, pdbfile.topology, system, newsys, pdbfile.positions, verbose=False) # Also check that that the number of components is equal to the number I expect if not len(nums) == 2: print("Error: Test system has incorrect number of components.") raise Exception( 'Incorrect number of components in cyclohexane/ethanol test system.' ) # Also check that none of residues have zero charge for resnr in range(len(structure.residues)): abscharges = [ abs(structure.residues[resnr].atoms[idx].charge) for idx in range(len(structure.residues[resnr].atoms)) ] if sum(abscharges) == 0: raise Exception( 'Error: Residue %s in cyclohexane-ethanol test system has a charge of zero, which is incorrect.' % resnr)
def test_create_system_boxes_parmatfrosst(verbose=False): """Test creation of a System object from some boxes of mixed solvents to test parm@frosst forcefield. """ forcefield = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml')) for f in check_boxes(forcefield, description="to test Parm@frosst parameters", verbose=verbose): yield f
def test_create_system_molecules_parmatfrosst(verbose=False): """Test creation of a System object from small molecules to test parm@frosst forcefield. """ forcefield = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml')) for f in check_AlkEtOH(forcefield, "to test Parm@Frosst parameters", verbose=verbose): yield f
def test_read_molecules(self): molecules = smarty.utils.read_molecules(get_data_filename('molecules/zinc-subset-tripos.mol2.gz'), verbose=False)
def test_read_ffxml(): """Test reading of ffxml files. """ forcefield = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml'))
def test_read_typelist(self): atomtypes = AtomTyper.read_typelist(get_data_filename('atomtypes/basetypes.smarts')) decorators = AtomTyper.read_typelist(get_data_filename('atomtypes/decorators.smarts')) replacements = AtomTyper.read_typelist(get_data_filename('atomtypes/replacements.smarts'))
def test_read_molecules(self): molecules = smarty.utils.read_molecules( get_data_filename('molecules/zinc-subset-tripos.mol2.gz'), verbose=False)