def test_version(self): """Test version""" for forcefield in SMIRNOFFTemplateGenerator.INSTALLED_FORCEFIELDS: generator = SMIRNOFFTemplateGenerator(forcefield=forcefield) assert generator.forcefield == forcefield assert generator.smirnoff_filename.endswith(forcefield + '.offxml') assert os.path.exists(generator.smirnoff_filename)
def test_energies(self): """Test potential energies match between openforcefield and OpenMM ForceField""" # DEBUG from openforcefield.topology import Molecule molecule = Molecule.from_smiles('C=O') molecule.generate_conformers(n_conformers=1) from simtk import unit molecule.conformers[0][0, 0] += 0.1 * unit.angstroms self.molecules.insert(0, molecule) # Test all supported SMIRNOFF force fields for small_molecule_forcefield in SMIRNOFFTemplateGenerator.INSTALLED_FORCEFIELDS: print(f'Testing energies for {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 = SMIRNOFFTemplateGenerator( molecules=self.molecules, forcefield=small_molecule_forcefield) # Create a ForceField import simtk openmm_forcefield = simtk.openmm.app.ForceField() # Register the template generator openmm_forcefield.registerTemplateGenerator(generator.generator) # Parameterize some molecules for molecule in self.molecules: # Create OpenMM System using OpenMM app from simtk.openmm.app import NoCutoff openmm_system = openmm_forcefield.createSystem( molecule.to_topology().to_openmm(), removeCMMotion=False, onbondedMethod=NoCutoff) # Retrieve System generated by the SMIRNOFF typing engine smirnoff_system = generator.get_openmm_system(molecule) # Compare energies and forces self.compare_energies(molecule, openmm_system, smirnoff_system) # Run some dynamics molecule = self.propagate_dynamics(molecule, smirnoff_system) # Compare energies again self.compare_energies(molecule, openmm_system, smirnoff_system)
def test_partial_charges_are_none(self): """Test parameterizing a small molecule with `partial_charges=None` instead of zeros (happens frequently in OFFTK>=0.7.0)""" from openforcefield.topology import Molecule molecule = Molecule.from_smiles('C=O') molecule.generate_conformers(n_conformers=1) #molecule._partial_charges = None assert (molecule.partial_charges is None) or np.all(molecule.partial_charges / unit.elementary_charge == 0) # Test all supported SMIRNOFF force fields for small_molecule_forcefield in SMIRNOFFTemplateGenerator.INSTALLED_FORCEFIELDS: print(f'Testing energies for {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 = SMIRNOFFTemplateGenerator(molecules=[molecule], forcefield=small_molecule_forcefield) # Create a ForceField import simtk openmm_forcefield = simtk.openmm.app.ForceField() # Register the template generator openmm_forcefield.registerTemplateGenerator(generator.generator) # Create OpenMM System using OpenMM app from simtk.openmm.app import NoCutoff openmm_system = openmm_forcefield.createSystem(molecule.to_topology().to_openmm(), removeCMMotion=False, onbondedMethod=NoCutoff) smirnoff_system = generator.get_openmm_system(molecule)