diff --git a/autotst/reaction.py b/autotst/reaction.py index 0c8ba99..ad9cd8c 100644 --- a/autotst/reaction.py +++ b/autotst/reaction.py @@ -916,7 +916,7 @@ def rd_embed(self): """ num_conf_attempts = 10000 if (self.bm is None) or (self.atom_match is None): - rdkit.Chem.AllChem.EmbedMultipleConfs(self._rdkit_molecule, num_conf_attempts, randomSeed=1) + rdkit.Chem.AllChem.EmbedMultipleConfs(self._rdkit_molecule, num_conf_attempts, randomSeed=400) self._rdkit_molecule, minEid = self.optimize_rdkit_molecule() else: @@ -927,7 +927,7 @@ def rd_embed(self): self._rdkit_molecule.RemoveAllConformers() for i in range(0, num_conf_attempts): try: - rdkit.Chem.Pharm3D.EmbedLib.EmbedMol(self._rdkit_molecule, self.bm, atomMatch=self.atom_match) + rdkit.Chem.Pharm3D.EmbedLib.EmbedMol(self._rdkit_molecule, self.bm, atomMatch=self.atom_match, randomSeed=400) break except ValueError: logging.info( diff --git a/autotst/reaction_test.py b/autotst/reaction_test.py index 5170129..80698dc 100644 --- a/autotst/reaction_test.py +++ b/autotst/reaction_test.py @@ -30,6 +30,7 @@ import os, sys import unittest +import numpy as np import ase import rdkit.Chem.rdchem import rmgpy.reaction @@ -211,6 +212,16 @@ def test_reaction_families(self): _, family = reaction.get_labeled_reaction() self.assertEqual(family.lower(), "intra_H_migration".lower()) + def test_initial_ts_geometry_is_deterministic(self): + list_of_coords = [] + my_reaction_smiles = 'CCCC+[OH]_O+[CH2]CCC' + for i in range(3): + my_reaction = Reaction(label=my_reaction_smiles) + list_of_coords.append(my_reaction.ts['forward'][0].ase_molecule) + + for i in range(1, 3): + self.assertTrue(np.all(list_of_coords[i].positions == list_of_coords[0].positions)) + class TestTS(unittest.TestCase): def setUp(self): @@ -242,7 +253,7 @@ def test_rdkit_molecule(self): self.assertIsInstance(rdkit_molecule, rdkit.Chem.rdchem.Mol) self.assertEquals(len(rdkit_molecule.GetAtoms()), 11) self.assertEquals(len(rdkit_molecule.GetBonds()), 9) - + def test_pseudo_geometry(self): self.assertIsInstance(self.ts._pseudo_geometry, rdkit.Chem.rdchem.RWMol) self.assertEquals(len(self.ts._pseudo_geometry.GetBonds()), 10) diff --git a/autotst/species.py b/autotst/species.py index 7c0c440..b920c8e 100644 --- a/autotst/species.py +++ b/autotst/species.py @@ -278,7 +278,7 @@ def get_rdkit_mol(self): assert self.rmg_molecule, "Cannot create an RDKit geometry without an RMG molecule object" RDMol = self.rmg_molecule.to_rdkit_mol(remove_h=False) - rdkit.Chem.AllChem.EmbedMolecule(RDMol) + rdkit.Chem.AllChem.EmbedMolecule(RDMol, randomSeed=400) self._rdkit_molecule = RDMol mol_list = rdkit.Chem.AllChem.MolToMolBlock(self.rdkit_molecule).split('\n') @@ -1093,7 +1093,7 @@ def set_chirality(self, chiral_center_index, stero="R"): rdmol.GetAtomWithIdx(chiral_center.atom_index).SetChiralTag( centers_dict[stero.upper()]) - rdkit.Chem.rdDistGeom.EmbedMolecule(rdmol) + rdkit.Chem.rdDistGeom.EmbedMolecule(rdmol, randomSeed=400) old_torsions = self.torsions[:] + self.cistrans[:] diff --git a/autotst/species_test.py b/autotst/species_test.py index 73e4e9b..a2cd4da 100644 --- a/autotst/species_test.py +++ b/autotst/species_test.py @@ -45,6 +45,7 @@ class TestConformer(unittest.TestCase): def setUp(self): self.conformer = Conformer(smiles='CC') self.conformer_torsion_test = Conformer(smiles='CC#CC') + self.chiral_conformer = Conformer(smiles='ClC=C(C(Cl)N)O') def test_rmg_molecules(self): self.assertIsInstance(self.conformer.rmg_molecule,rmgpy.molecule.Molecule) def test_rdkit_mol(self): @@ -105,6 +106,18 @@ def test_get_xyz_block(self): positions = self.conformer.ase_molecule.arrays["positions"] for n in range(len(positions)): self.assertTrue((np.array([float(x) for x in xyz_block.split('\n')[n].split()[1:]]) == positions[n]).all()) + def test_chiral_determinism(self): + list_of_coords = [] + my_chiral_smiles = 'ClC=C(C(Cl)N)O' + for i in range(3): + my_chiral_conf = autotst.species.Conformer(smiles=my_chiral_smiles) + chiral_centers = my_chiral_conf.get_chiral_centers() + my_chiral_conf.set_chirality(chiral_centers[0].index, 'R') + list_of_coords.append(my_chiral_conf.get_ase_mol()) + for i in range(1, 3): + self.assertTrue(np.all(list_of_coords[i].positions == list_of_coords[0].positions)) + + class TestSpecies(unittest.TestCase): def setUp(self): @@ -112,6 +125,13 @@ def setUp(self): def test_generate_structures(self): self.assertIsInstance(self.species.generate_structures(),dict) self.assertIsInstance(list(self.species.generate_structures().values())[0][0],Conformer) + def test_initial_mol_is_deterministic(self): + list_of_coords = [] + for i in range(3): + new_sp = Species(smiles=["CCC"]) + list_of_coords.append(new_sp.conformers['CCC'][0].get_ase_mol()) + for i in range(1, 3): + self.assertTrue(np.all(list_of_coords[i].positions == list_of_coords[0].positions)) if __name__ == "__main__": unittest.main(testRunner=unittest.TextTestRunner(verbosity=2))