Just to include other thoughts on the topic... can this issue come
from the Chem.AddHs(mol) step that is performed pre-embed for 2D->3D
generation?
Since the conformers of a single starting 2D structure don't all see
flipping of stereochemistry when a single structure has Hs added and
is sent to be embeded, I am assuming AddHs is not the problem. Here
are additional example stats on how varied the stereochemistry is lost:
481809_atom_4 has 90.00 % correct with 10 conformers
482080_atom_4 has 25.00 % correct with 4 conformers
475598_atom_2 has 0.00 % correct with 6 conformers
476397_atom_1 has 40.00 % correct with 10 conformers
482629_atom_0 has 20.00 % correct with 10 conformers
475620_atom_4 has 16.67 % correct with 6 conformers
476459_atom_3 has 83.33 % correct with 6 conformers
484276_atom_0 has 10.00 % correct with 10 conformers
483000_atom_1 has 8.33 % correct with 12 conformers
483696_atom_0 has 0.00 % correct with 14 conformers
483370_atom_1 has 11.11 % correct with 18 conformers
The 6-digit code is the MOL_ID. "correct" is considered a match
between the results of calling GetChiralTag() on the same atom of the
2D and 3D versions of a molecule.
-Marshall
On Apr 13, 2009, at 7:12 PM, Marshall Levesque wrote:
Greg-
Looping over the atoms of 1000 molecules with
mol.GetAtomWithIdx(i).GetChiralTag() gave me the statistic of ~58%
stereocenters being preserved after the molecules were embedded (2D-
>3D), creating multiple conformers (about 2 conformers per rotatable
bond) and UFFOptimized. So my questions are:
A) Does RDKit's embedding process preserve stereochemistry?
B) If not, is the best way to do preserve the stereochemistry by
looping over the atoms in each 3D conformation produced and checking/
comparing to the original 2D structure with GetChiralTag()?
Here's the code for whoever wants to try it out:
#### chiraltest.py ####
suppl = Chem.SDMolSupplier(infilename)
for j,mol in enumerate(suppl):
if mol is None:
continue
else:
molname = mol.GetProp(' MOLECULE_ID ')
for i in range(mol.GetNumAtoms()):
val = mol.GetAtomWithIdx(i).GetChiralTag()
if val != Chem.rdchem.ChiralType.CHI_UNSPECIFIED:
print 'Atom: ',i, 'on ', molname, 'is ', val
##################
Thanks!
-Marshall