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)