def test_parameterize(self): """Test parameterizing molecules with template generator for all supported force fields""" # Test all supported small molecule force fields for small_molecule_forcefield in self.TEMPLATE_GENERATOR.INSTALLED_FORCEFIELDS: print(f'Testing {small_molecule_forcefield}') # Create a generator that knows about a few molecules # TODO: Should the generator also load the appropriate force field files into the ForceField object? generator = self.TEMPLATE_GENERATOR(molecules=self.molecules, forcefield=small_molecule_forcefield) # Check that we have loaded the right force field assert generator.forcefield == small_molecule_forcefield # Create a ForceField with the appropriate small molecule force field from simtk.openmm.app import ForceField forcefield = ForceField() # Register the template generator forcefield.registerTemplateGenerator(generator.generator) # Parameterize some molecules from simtk.openmm.app import NoCutoff from openmmforcefields.utils import Timer for molecule in self.molecules: openmm_topology = molecule.to_topology().to_openmm() with Timer() as t1: system = forcefield.createSystem(openmm_topology, nonbondedMethod=NoCutoff) assert system.getNumParticles() == molecule.n_atoms # Molecule should now be cached with Timer() as t2: system = forcefield.createSystem(openmm_topology, nonbondedMethod=NoCutoff) assert system.getNumParticles() == molecule.n_atoms assert (t2.interval() < t1.interval())
def test_parameterize_molecules_from_creation(self): """Test that SystemGenerator can parameterize pre-specified molecules in vacuum""" from openmmforcefields.generators import SystemGenerator for name, testsystem in self.testsystems.items(): print(testsystem) molecules = testsystem['molecules'] for small_molecule_forcefield in SystemGenerator.SMALL_MOLECULE_FORCEFIELDS: # Create a SystemGenerator for this force field generator = SystemGenerator(forcefields=self.amber_forcefields, small_molecule_forcefield=small_molecule_forcefield, molecules=molecules) # Parameterize molecules from openmmforcefields.utils import Timer for molecule in molecules: openmm_topology = molecule.to_topology().to_openmm() with Timer() as t1: system = generator.create_system(openmm_topology) assert system.getNumParticles() == molecule.n_atoms # Molecule should now be cached with Timer() as t2: system = generator.create_system(openmm_topology) assert system.getNumParticles() == molecule.n_atoms assert (t2.interval() < t1.interval())
def test_add_molecules(self): """Test that Molecules can be added to SystemGenerator later""" from openmmforcefields.generators import SystemGenerator for small_molecule_forcefield in SystemGenerator.SMALL_MOLECULE_FORCEFIELDS: # Create a SystemGenerator for this force field generator = SystemGenerator(forcefields=self.amber_forcefields, small_molecule_forcefield=small_molecule_forcefield) # Add molecules for each test system separately for name, testsystem in self.testsystems.items(): molecules = testsystem['molecules'] # Add molecules generator.add_molecules(molecules) # Parameterize molecules from openmmforcefields.utils import Timer for molecule in molecules: openmm_topology = molecule.to_topology().to_openmm() with Timer() as t1: system = generator.create_system(openmm_topology) assert system.getNumParticles() == molecule.n_atoms # Molecule should now be cached with Timer() as t2: system = generator.create_system(openmm_topology) assert system.getNumParticles() == molecule.n_atoms assert (t2.interval() < t1.interval())
def test_cache(self): """Test that SystemGenerator correctly manages a cache""" from openmmforcefields.generators import SystemGenerator from openmmforcefields.utils import Timer timing = dict( ) # timing[(small_molecule_forcefield, smiles)] is the time (in seconds) to parameterize molecule the first time with tempfile.TemporaryDirectory() as tmpdirname: # Create a single shared cache for all force fields cache = os.path.join(tmpdirname, 'db.json') # Test that we can parameterize all molecules for all test systems SMALL_MOLECULE_FORCEFIELDS = SystemGenerator.SMALL_MOLECULE_FORCEFIELDS if not CI else [ 'gaff-2.11', 'openff-1.1.0' ] for small_molecule_forcefield in SMALL_MOLECULE_FORCEFIELDS: # Create a SystemGenerator generator = SystemGenerator( forcefields=self.amber_forcefields, small_molecule_forcefield=small_molecule_forcefield, cache=cache) # Add molecules for each test system separately for name, testsystem in self.testsystems.items(): molecules = testsystem['molecules'] # Add molecules generator.add_molecules(molecules) # Parameterize molecules for molecule in molecules: openmm_topology = molecule.to_topology().to_openmm() with Timer() as timer: system = generator.create_system(openmm_topology) assert system.getNumParticles() == molecule.n_atoms # Record time timing[(small_molecule_forcefield, molecule.to_smiles())] = timer.interval() # Molecules should now be cached; test timing is faster the second time # Test that we can parameterize all molecules for all test systems SMALL_MOLECULE_FORCEFIELDS = SystemGenerator.SMALL_MOLECULE_FORCEFIELDS if not CI else [ 'gaff-2.11', 'openff-1.1.0' ] for small_molecule_forcefield in SMALL_MOLECULE_FORCEFIELDS: # Create a SystemGenerator generator = SystemGenerator( forcefields=self.amber_forcefields, small_molecule_forcefield=small_molecule_forcefield, cache=cache) # Add molecules for each test system separately for name, testsystem in self.testsystems.items(): molecules = testsystem['molecules'] # We don't need to add molecules that are already defined in the cache # Parameterize molecules for molecule in molecules: openmm_topology = molecule.to_topology().to_openmm() with Timer() as timer: system = generator.create_system(openmm_topology) assert system.getNumParticles() == molecule.n_atoms