Finding Stereoisomers of Molecules#

from rdkit import Chem

from stereomolgraph import StereoMolGraph
from stereomolgraph.experimental import generate_stereoisomers
from stereomolgraph.ipython import View2D

from IPython.core.interactiveshell import InteractiveShell

InteractiveShell.ast_node_interactivity = "all"

View2D.show_atom_numbers = True
View2D.show_h = False
View2D.generate_bond_orders = True  # bond orders are not used internally
rdmol = Chem.AddHs(
    Chem.MolFromSmiles("[CH]1([CH](C1C2[CH]([CH]2C(=O)O)C(=O)O)C(=O)O)C(=O)O")
)
smg = StereoMolGraph.from_rdmol(rdmol, stereo_complete=False)
smg
../_images/b0c6a49ecebba8a1ae98319f94fb2946e9e9baec3b620c5b71e7a7108a776f9c.svg

Construction from rdkit.Mol#

When constructing from an rdkit.Mol with stereo_complete=False, any atom without explicitly defined stereochemistry is treated as undefined.

Using generate_stereoisomers will enumerate all distinct stereoisomers without producing duplicates.

isomers = list(generate_stereoisomers(smg, enantiomers=False))
# enantiomes are removed
len(isomers)
10
for isomer in isomers:
    isomer
../_images/25261a28103360f7848e221ba821500b1ae97392ce351278bb4bc664c05fab0c.svg ../_images/ffecbdbd86b59db67d25fa3273f68841ed4984b08b965f114341d99635bdd069.svg ../_images/29d16b0ef11233f931eb0284680ef6b3c86df63b55ffba8e6509b30c3f1165bc.svg ../_images/7defbd1e1dd9cef110f27bd864d467cb3dcf2f011c012b2ddac4b1b4cf75f722.svg ../_images/349cd3408100336fd364428d692d7586234a27488b2daa874ecc5576f4acfb2b.svg ../_images/f96b7e8fb2f8d4a5743fe5e0f9c0e3dc7cb775de6cf67c8b99915d5e36430be6.svg ../_images/b84eb095b48dbd7a9c4d519f742d4dca9938d67c96ae61e3c1ef6eaca3ec98da.svg ../_images/dc75a88c83cbdf3756316be1bb91f1c11ef71e1364f00ab8158b1d2472693027.svg ../_images/eba4b5b61e703b3a1e8240673a47096886ade4b795a374e0b583bf4854b4628e.svg ../_images/915de969d56ac2e593edbc57ab0a28ac8265ec6b5c13b761aa76db5d7b8c8b2e.svg

Hide code cell content

all_isomers_stereo = []

for i in isomers:
    rdmol = i.to_rdmol(generate_bond_orders=True)

    stereocenters = Chem.FindMolChiralCenters(
        rdmol, includeUnassigned=False, force=True
    )

    isomer_stereo = []
    for atom_idx, stereo in stereocenters:
        atom = rdmol.GetAtomWithIdx(atom_idx)
        atom_idx = atom.GetIdx()
        isomer_stereo.append((atom_idx, stereo))

    isomer_stereo.sort()
    all_isomers_stereo.append(isomer_stereo)

all_isomers_stereo.sort()
all_isomers_stereo
[[(0, 'R'), (1, 'R'), (4, 'R'), (5, 'R')],
 [(0, 'R'), (1, 'R'), (4, 'S'), (5, 'S')],
 [(0, 'R'), (1, 'S'), (2, 'R'), (3, 'R'), (4, 'S'), (5, 'R')],
 [(0, 'R'), (1, 'S'), (2, 'R'), (3, 'S'), (4, 'R'), (5, 'S')],
 [(0, 'R'), (1, 'S'), (2, 'R'), (4, 'R'), (5, 'R')],
 [(0, 'R'), (1, 'S'), (2, 'S'), (3, 'S'), (4, 'R'), (5, 'S')],
 [(0, 'R'), (1, 'S'), (2, 'S'), (4, 'R'), (5, 'R')],
 [(0, 'S'), (1, 'R'), (2, 'R'), (4, 'S'), (5, 'S')],
 [(0, 'S'), (1, 'R'), (2, 'S'), (4, 'S'), (5, 'S')],
 [(0, 'S'), (1, 'S'), (4, 'S'), (5, 'S')]]