def create_ffxml_simulation(molecule_name, gaff_mol2_filename, frcmod_filename): """Process a gaff mol2 file and frcmod file using the XML conversion, returning an OpenMM simulation. Parameters ---------- molecule_name : str The name of the molecule gaff_mol2_filename : str The name of the gaff mol2 file frcmod_filename : str The name of the gaff frcmod file Returns ------- simulation : openmm.app.Simulation A functional simulation object for simulating your molecule """ # Generate ffxml file. amber = import_("openmoltools.amber") GAFF_DAT_FILENAME = amber.find_gaff_dat() parser = amber_parser.AmberParser() parser.parse_filenames( [GAFF_DAT_FILENAME, gaff_mol2_filename, frcmod_filename]) ffxml_filename = molecule_name + '.ffxml' create_ffxml_file([gaff_mol2_filename], [frcmod_filename], ffxml_filename) traj = md.load(gaff_mol2_filename) # Read mol2 file. positions = traj.openmm_positions( 0 ) # Extract OpenMM-united positions of first (and only) trajectory frame topology = traj.top.to_openmm() # Create System object. forcefield = app.ForceField(ffxml_filename) system = forcefield.createSystem(topology, nonbondedMethod=app.NoCutoff, constraints=None, implicitSolvent=None) # Create integrator. timestep = 1.0 * units.femtoseconds integrator = simtk.openmm.VerletIntegrator(timestep) # Create simulation. platform = simtk.openmm.Platform.getPlatformByName("Reference") simulation = app.Simulation(topology, system, integrator, platform=platform) simulation.context.setPositions(positions) return simulation
def create_ffxml_file(gaff_mol2_filenames, frcmod_filenames, ffxml_filename=None, override_mol2_residue_name=None): """Process multiple gaff mol2 files and frcmod files using the XML conversion and write to an XML file. Parameters ---------- gaff_mol2_filenames : list of str The names of the gaff mol2 files frcmod_filenames : str The names of the gaff frcmod files ffxml_filename : str, optional, default=None Optional name of output ffxml file to generate. If None, no file will be generated. override_mol2_residue_name : str, default=None If given, use this name to override mol2 residue names. Returns ------- ffxml_stringio : str StringIO representation of ffxml file containing residue entries for each molecule. """ # Generate ffxml file. parser = amber_parser.AmberParser( override_mol2_residue_name=override_mol2_residue_name) amber = import_("openmoltools.amber") GAFF_DAT_FILENAME = amber.find_gaff_dat() filenames = [GAFF_DAT_FILENAME] filenames.extend([filename for filename in gaff_mol2_filenames]) filenames.extend([filename for filename in frcmod_filenames]) parser.parse_filenames(filenames) ffxml_stream = parser.generate_xml() if ffxml_filename is not None: outfile = open(ffxml_filename, 'w') outfile.write(ffxml_stream.read()) outfile.close() ffxml_stream.seek(0) return ffxml_stream
import sys from openmoltools import amber_parser if __name__ == "__main__": if len(sys.argv[1:]) <= 1: print( """Usage: processAmberForceField.py some_path/gaff.dat ligand_name.mol2 ligand_name.frcmod """) else: parser = amber_parser.AmberParser() parser.parse_filenames(sys.argv[1:]) stream = parser.generate_xml() print(stream.read())