def __init__(self, targets=None, forcefields=('amber99sbildn.xml', ), auto_parametrize=None, parameters=None, platform=None, *args, **kwargs): if kwargs.get('precision', 6) < 6: kwargs['precision'] = 6 ObjectiveProvider.__init__(self, **kwargs) self.auto_parametrize = auto_parametrize self._targets = targets self._parameters = parameters self.platform = platform self.topology = None self._simulation = None additional_ffxml = [] if parameters: additional_ffxml.append(create_ffxml_file(*zip(*parameters))) if auto_parametrize: filenames = [ g.path for m in auto_parametrize for g in self.environment.cfg.genes if g.name == m ] additional_ffxml.append(self._gaff2xml(*filenames)) self._forcefields = tuple(forcefields) + tuple(additional_ffxml) self.forcefield = openmm_app.ForceField(*self._forcefields)
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 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 process_forcefield(*forcefields): """ Given a list of filenames, check which ones are `frcmods`. If so, convert them to ffxml. Else, just return them. """ for forcefield in forcefields: if forcefield.endswith('.frcmod'): yield create_ffxml_file(forcefield) else: yield forcefield
def process_forcefield(*forcefields): """ Given a list of filenames, check which ones are `frcmods`. If so, convert them to ffxml. Else, just return them. """ for forcefield in forcefields: if forcefield.endswith('.frcmod'): gaffmol2 = os.path.splitext(forcefield)[0] + '.gaff.mol2' yield create_ffxml_file([gaffmol2], [forcefield]) else: yield forcefield
def _gaff2xml(*filenames, **kwargs): """ Use OpenMolTools wrapper to run antechamber programatically and auto parametrize requested molecules. Parameters ---------- filenames: list of str List of the filenames of the molecules to parametrize Returns ------- ffxmls : StringIO Compiled ffxml file produced by antechamber and openmoltools converter """ frcmods, gaffmol2s = [], [] for filename in filenames: name = '.'.join(filename.split('.')[:-1]) gaffmol2, frcmod = run_antechamber(name, filename, **kwargs) frcmods.append(frcmod) gaffmol2s.append(gaffmol2) return create_ffxml_file(gaffmol2s, frcmods)
def _process_forcefield(forcefield): if forcefield.endswith('.frcmod'): return create_ffxml_file(forcefield) return forcefield