Re: [Rdkit-discuss] permutations of symmetric atoms
Thank you, Greg, this is exactly what I was looking for. On Sat, 16 Apr 2022 at 20:54, Greg Landrum wrote: > Hi Diogo, > > The easiest way to do this is to use the substructure matching code with > "uniquify=False" to find all the automorphisms between a molecule and > itself: > In [8]: m1 = Chem.MolFromSmiles('Oc1c1') > > In [9]: list(m1.GetSubstructMatches(m1,uniquify=False)) > Out[9]: [(0, 1, 2, 3, 4, 5, 6), (0, 1, 6, 5, 4, 3, 2)] > > Here's another example: > In [10]: m = Chem.MolFromSmiles('Oc1ccc(c2ccc(Cl)cc2)cc1') > > In [11]: list(m.GetSubstructMatches(m,uniquify=False)) > Out[11]: > [(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13), > (0, 1, 2, 3, 4, 5, 11, 10, 8, 9, 7, 6, 12, 13), > (0, 1, 13, 12, 4, 5, 6, 7, 8, 9, 10, 11, 3, 2), > (0, 1, 13, 12, 4, 5, 11, 10, 8, 9, 7, 6, 3, 2)] > > > I hope this helps, > -greg > > > On Sat, Apr 16, 2022 at 1:46 AM Diogo Martins > wrote: > >> Hello, >> >> I'd like to enumerate all possible permutations of symmetric atoms. >> Consider the following code: >> >> phenol = Chem.MolFromSmiles("Oc1c1") >> equivalencies = list(Chem.CanonicalRankAtoms(mol, breakTies=False)) >> print(equivalencies) >> [0, 6, 4, 2, 1, 2, 4] >> >> Atoms that have the same value in list "equivalencies" are symmetric. For >> phenol, the equivalent atoms correspond to a 180 degree rotation of the >> aromatic ring over the axis containing the carbon-oxygen bond. The possible >> permutations, expressed as atom indices, are: >> [0, 1, 2, 3, 4, 5, 6] >> [0, 1, 6, 5, 4, 3, 2] >> >> By permutations, I mean that it is possible to replace the coordinates of >> the atoms and produce a realistic molecule. >> >> A brute force approach comes to mind, where one would enumerate all >> possible combinations, and exclude those that change the molecular graph. >> In the example above there are four possible combinations, because there >> are two groups of two symmetric atoms. An example of an "invalid" >> combination is swapping the third and seventh atoms without swapping the >> fourth and sixth atoms: >> [0, 1, 6, 3, 4, 5, 2] >> This would be excluded as it breaks the bond between the third and fourth >> atoms (among other bonds). >> >> Is there a method in the RDKit to enumerate the valid permutations? >> >> Thank you, >> Diogo >> >> ___ >> Rdkit-discuss mailing list >> Rdkit-discuss@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/rdkit-discuss >> > ___ Rdkit-discuss mailing list Rdkit-discuss@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rdkit-discuss
Re: [Rdkit-discuss] permutations of symmetric atoms
Hi Diogo, The easiest way to do this is to use the substructure matching code with "uniquify=False" to find all the automorphisms between a molecule and itself: In [8]: m1 = Chem.MolFromSmiles('Oc1c1') In [9]: list(m1.GetSubstructMatches(m1,uniquify=False)) Out[9]: [(0, 1, 2, 3, 4, 5, 6), (0, 1, 6, 5, 4, 3, 2)] Here's another example: In [10]: m = Chem.MolFromSmiles('Oc1ccc(c2ccc(Cl)cc2)cc1') In [11]: list(m.GetSubstructMatches(m,uniquify=False)) Out[11]: [(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13), (0, 1, 2, 3, 4, 5, 11, 10, 8, 9, 7, 6, 12, 13), (0, 1, 13, 12, 4, 5, 6, 7, 8, 9, 10, 11, 3, 2), (0, 1, 13, 12, 4, 5, 11, 10, 8, 9, 7, 6, 3, 2)] I hope this helps, -greg On Sat, Apr 16, 2022 at 1:46 AM Diogo Martins wrote: > Hello, > > I'd like to enumerate all possible permutations of symmetric atoms. > Consider the following code: > > phenol = Chem.MolFromSmiles("Oc1c1") > equivalencies = list(Chem.CanonicalRankAtoms(mol, breakTies=False)) > print(equivalencies) > [0, 6, 4, 2, 1, 2, 4] > > Atoms that have the same value in list "equivalencies" are symmetric. For > phenol, the equivalent atoms correspond to a 180 degree rotation of the > aromatic ring over the axis containing the carbon-oxygen bond. The possible > permutations, expressed as atom indices, are: > [0, 1, 2, 3, 4, 5, 6] > [0, 1, 6, 5, 4, 3, 2] > > By permutations, I mean that it is possible to replace the coordinates of > the atoms and produce a realistic molecule. > > A brute force approach comes to mind, where one would enumerate all > possible combinations, and exclude those that change the molecular graph. > In the example above there are four possible combinations, because there > are two groups of two symmetric atoms. An example of an "invalid" > combination is swapping the third and seventh atoms without swapping the > fourth and sixth atoms: > [0, 1, 6, 3, 4, 5, 2] > This would be excluded as it breaks the bond between the third and fourth > atoms (among other bonds). > > Is there a method in the RDKit to enumerate the valid permutations? > > Thank you, > Diogo > > ___ > Rdkit-discuss mailing list > Rdkit-discuss@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/rdkit-discuss > ___ Rdkit-discuss mailing list Rdkit-discuss@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rdkit-discuss
[Rdkit-discuss] permutations of symmetric atoms
Hello, I'd like to enumerate all possible permutations of symmetric atoms. Consider the following code: phenol = Chem.MolFromSmiles("Oc1c1") equivalencies = list(Chem.CanonicalRankAtoms(mol, breakTies=False)) print(equivalencies) [0, 6, 4, 2, 1, 2, 4] Atoms that have the same value in list "equivalencies" are symmetric. For phenol, the equivalent atoms correspond to a 180 degree rotation of the aromatic ring over the axis containing the carbon-oxygen bond. The possible permutations, expressed as atom indices, are: [0, 1, 2, 3, 4, 5, 6] [0, 1, 6, 5, 4, 3, 2] By permutations, I mean that it is possible to replace the coordinates of the atoms and produce a realistic molecule. A brute force approach comes to mind, where one would enumerate all possible combinations, and exclude those that change the molecular graph. In the example above there are four possible combinations, because there are two groups of two symmetric atoms. An example of an "invalid" combination is swapping the third and seventh atoms without swapping the fourth and sixth atoms: [0, 1, 6, 3, 4, 5, 2] This would be excluded as it breaks the bond between the third and fourth atoms (among other bonds). Is there a method in the RDKit to enumerate the valid permutations? Thank you, Diogo ___ Rdkit-discuss mailing list Rdkit-discuss@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rdkit-discuss