def test_amber_binary_mixture(): sustiva_filename = utils.get_data_filename("chemicals/etoh/etoh.mol2") etoh_filename = utils.get_data_filename("chemicals/etoh/etoh_renamed.mol2") trj0, trj1 = md.load(sustiva_filename), md.load(etoh_filename) # Hack to assign unique residue names that are consistent with contents of mol2 files trj0.top.residue(0).name = "LIG" trj1.top.residue(0).name = "LI2" trj_list = [trj0, trj1] with utils.enter_temp_directory(): # Prevents creating tons of GAFF files everywhere. box_filename = "./box.pdb" box_trj = packmol.pack_box(trj_list, [25, 50]) box_trj.save(box_filename) gaff_mol2_filename0, frcmod_filename0 = utils.run_antechamber("sustiva", sustiva_filename, charge_method=None) gaff_mol2_filename1, frcmod_filename1 = utils.run_antechamber("etoh", etoh_filename, charge_method=None) mol2_filenames = [gaff_mol2_filename0, gaff_mol2_filename1] frcmod_filenames = [frcmod_filename0, frcmod_filename1] prmtop_filename = "./out.prmtop" inpcrd_filename = "./out.inpcrd" tleap_cmd = amber.build_mixture_prmtop(mol2_filenames, frcmod_filenames, box_filename, prmtop_filename, inpcrd_filename) print(tleap_cmd)
def test_run_antechamber_charges(): molecule_name = "acetate" input_filename = utils.get_data_filename("chemicals/acetate/acetate.mol2") with utils.enter_temp_directory(): # Prevents creating tons of GAFF files everywhere. gaff_mol2_filename, frcmod_filename = utils.run_antechamber( molecule_name, input_filename, charge_method=None, net_charge=-1 )
def test_acpype_conversion(): molecule_name = 'sustiva' input_filename = utils.get_data_filename("chemicals/sustiva/sustiva.mol2") with utils.enter_temp_directory(): # Prevents creating tons of GAFF files everywhere. gaff_mol2_filename, frcmod_filename = utils.run_antechamber(molecule_name, input_filename, charge_method=None) prmtop, inpcrd = utils.run_tleap(molecule_name, gaff_mol2_filename, frcmod_filename) out_top, out_gro = utils.convert_via_acpype( molecule_name, prmtop, inpcrd )
def oemols_to_ffxml(molecules, base_molecule_name="lig"): """Generate an OpenMM ffxml object and MDTraj trajectories from multiple OEMols Parameters ---------- molecules : list(OEMole) Molecules WITH CHARGES. Each can have multiple conformations. WILL GIVE UNDEFINED RESULTS IF NOT CHARGED. base_molecule_name : str, optional, default='lig' Base name of molecule to use inside parameter files. Returns ------- trajectories : list(mdtraj.Trajectory) List of MDTraj Trajectories for molecule. May contain multiple frames ffxml : StringIO StringIO representation of ffxml file. Notes ----- We allow multiple different molecules at once so that they can all be included in a single ffxml file, which is currently the only recommended way to simulate multiple GAFF molecules in a single simulation. For most applications, you will have just a single molecule: e.g. molecules = [my_oemol] The resulting ffxml StringIO object can be directly input to OpenMM e.g. `forcefield = app.ForceField(ffxml)` This will generate a lot of temporary files, so you may want to use utils.enter_temp_directory() to avoid clutter. """ all_trajectories = [] gaff_mol2_filenames = [] frcmod_filenames = [] print(os.getcwd()) for i, molecule in enumerate(molecules): trajectories = [] for j in range(molecule.NumConfs()): molecule_name = "%s-%d-%d" % (base_molecule_name, i, j) mol2_filename = "./%s.mol2" % molecule_name _unused = molecule_to_mol2(molecule, mol2_filename, conformer=j) gaff_mol2_filename, frcmod_filename = run_antechamber( molecule_name, mol2_filename, charge_method=None ) # It's redundant to run antechamber on each frame, fix me later. traj = md.load(gaff_mol2_filename) trajectories.append(traj) if j == 0: # Only need 1 frame of forcefield files gaff_mol2_filenames.append(gaff_mol2_filename) frcmod_filenames.append(frcmod_filename) # Create a trajectory with all frames of the current molecule traj = trajectories[0].join(trajectories[1:]) all_trajectories.append(traj) ffxml = create_ffxml_file(gaff_mol2_filenames, frcmod_filenames, override_mol2_residue_name=base_molecule_name) return all_trajectories, ffxml
def smiles_to_antechamber(smiles_string, gaff_mol2_filename, frcmod_filename, residue_name="MOL", strictStereo=False): """Build a molecule from a smiles string and run antechamber, generating GAFF mol2 and frcmod files from a smiles string. Charges will be generated using the OpenEye QuacPac AM1-BCC implementation. Parameters ---------- smiles_string : str Smiles string of molecule to construct and charge gaff_mol2_filename : str Filename of mol2 file output of antechamber, with charges created from openeye frcmod_filename : str Filename of frcmod file output of antechamber. Most likely this file will be almost empty, at least for typical molecules. residue_name : str, optional, default="MOL" OpenEye writes mol2 files with <0> as the residue / ligand name. This chokes many mol2 parsers, so we replace it with a string of your choosing. This might be useful for downstream applications if the residue names are required to be unique. strictStereo : bool, optional, default=False If False, permits smiles strings with unspecified stereochemistry. See https://docs.eyesopen.com/omega/usage.html """ oechem = import_("openeye.oechem") if not oechem.OEChemIsLicensed(): raise (ImportError("Need License for oechem!")) # Get the absolute path so we can find these filenames from inside a temporary directory. gaff_mol2_filename = os.path.abspath(gaff_mol2_filename) frcmod_filename = os.path.abspath(frcmod_filename) m = smiles_to_oemol(smiles_string) m = get_charges(m, strictStereo=strictStereo, keep_confs=1) with enter_temp_directory( ): # Avoid dumping 50 antechamber files in local directory. _unused = molecule_to_mol2(m, "./tmp.mol2", residue_name=residue_name) net_charge = oechem.OENetCharge(m) tmp_gaff_mol2_filename, tmp_frcmod_filename = run_antechamber( "tmp", "./tmp.mol2", charge_method=None, net_charge=net_charge) # USE OE AM1BCC charges! shutil.copy(tmp_gaff_mol2_filename, gaff_mol2_filename) shutil.copy(tmp_frcmod_filename, frcmod_filename)
def smiles_to_antechamber(smiles_string, gaff_mol2_filename, frcmod_filename, residue_name="MOL", strictStereo=False): """Build a molecule from a smiles string and run antechamber, generating GAFF mol2 and frcmod files from a smiles string. Charges will be generated using the OpenEye QuacPac AM1-BCC implementation. Parameters ---------- smiles_string : str Smiles string of molecule to construct and charge gaff_mol2_filename : str Filename of mol2 file output of antechamber, with charges created from openeye frcmod_filename : str Filename of frcmod file output of antechamber. Most likely this file will be almost empty, at least for typical molecules. residue_name : str, optional, default="MOL" OpenEye writes mol2 files with <0> as the residue / ligand name. This chokes many mol2 parsers, so we replace it with a string of your choosing. This might be useful for downstream applications if the residue names are required to be unique. strictStereo : bool, optional, default=False If False, permits smiles strings with unspecified stereochemistry. See https://docs.eyesopen.com/omega/usage.html """ oechem = import_("openeye.oechem") if not oechem.OEChemIsLicensed(): raise (ImportError("Need License for oechem!")) # Get the absolute path so we can find these filenames from inside a temporary directory. gaff_mol2_filename = os.path.abspath(gaff_mol2_filename) frcmod_filename = os.path.abspath(frcmod_filename) m = smiles_to_oemol(smiles_string) m = get_charges(m, strictStereo=strictStereo, keep_confs=1) with enter_temp_directory(): # Avoid dumping 50 antechamber files in local directory. _unused = molecule_to_mol2(m, "./tmp.mol2", residue_name=residue_name) net_charge = oechem.OENetCharge(m) tmp_gaff_mol2_filename, tmp_frcmod_filename = run_antechamber( "tmp", "./tmp.mol2", charge_method=None, net_charge=net_charge ) # USE OE AM1BCC charges! shutil.copy(tmp_gaff_mol2_filename, gaff_mol2_filename) shutil.copy(tmp_frcmod_filename, frcmod_filename)
def test_amber_box(): etoh_filename = utils.get_data_filename("chemicals/etoh/etoh.mol2") trj_list = [md.load(etoh_filename)] with utils.enter_temp_directory(): # Prevents creating tons of GAFF files everywhere. box_filename = "./box.pdb" box_trj = packmol.pack_box(trj_list, [50]) box_trj.save(box_filename) gaff_mol2_filename1, frcmod_filename1 = utils.run_antechamber("etoh", etoh_filename, charge_method=None) mol2_filenames = [gaff_mol2_filename1] frcmod_filenames = [frcmod_filename1] prmtop_filename = "./out.prmtop" inpcrd_filename = "./out.inpcrd" tleap_cmd = amber.build_mixture_prmtop(mol2_filenames, frcmod_filenames, box_filename, prmtop_filename, inpcrd_filename) print(tleap_cmd)
def test_run_tleap(): molecule_name = "sustiva" input_filename = utils.get_data_filename("chemicals/sustiva/sustiva.mol2") with utils.enter_temp_directory(): # Prevents creating tons of GAFF files everywhere. gaff_mol2_filename, frcmod_filename = utils.run_antechamber(molecule_name, input_filename, charge_method=None) prmtop, inpcrd = utils.run_tleap(molecule_name, gaff_mol2_filename, frcmod_filename)
#!/usr/bin/env python import sys from openmoltools.utils import run_antechamber if __name__ == "__main__": if len(sys.argv) <= 1: print("""Usage: generate_example_data.py ligand_name Note: this should be run in the openmoltools/chemicals/ligand_name directory. """) else: molecule_name, mol2_filename = sys.argv[1:] run_antechamber(molecule_name, mol2_filename, charge_method="bcc")