I just want to share my script, which I use for enumeration of
stereoisomers. Enumeration of double bonds was added quite recently and
thus I didn't test it extensively.
I put it on github: https://github.com/DrrDom/rdk
It seems to work well on quite complex queries like
CC1CCC(CC1)C1CC=C(C\C(=C/I)C(=CF)C1C1C[C@@H](C)CC=C1)C1CC[C@H](O)C(Br)C1
to generate all possible stereoisomers:
gen_stereo_rdkit3.py -i input.smi -o output.smi -t -d
to discard compounds with more than 4 undefined centers/double bonds:
gen_stereo_rdkit3.py -i input.smi -o output.smi -t -d -u 4
Try it on your own risk :)
If you will find mistakes let me know.
Pavel.
On 12/10/2016 03:44 AM, Brian Cole wrote:
So I may need a little guidance on this one from someone with a little
more historical knowledge of RDKit.
I found the findPotentialStereoBonds function inside Chirality.cpp
that appears to do what we want, detect double bonds with unspecified
E/Z stereo chemistry. That's at least what the comment in the file
leads me to believe:
// Find bonds than can be cis/trans in a molecule and mark them as "any"
...
void findPotentialStereoBonds(ROMol &mol, bool cleanIt) {
But when you look at the code, it's not setting bonds to
Bond::STEREOANY, it's setting them to Bond::STEREONONE here:
...
// proceed only if we either want to clean the stereocode on
this bond
// or if none is set on it yet
if (cleanIt || dblBond->getStereo() == Bond::STEREONONE) {
dblBond->setStereo(Bond::STEREONONE);
...
Seems odd to me check that the stereo is Bond::STEREONONE, and then
set it to that value.
While findPotentialStereoBonds isn't exposed in Python, there is some
Java docs written for it in the Java wrappers:
%javamethodmodifiers RDKit::MolOps::findPotentialStereoBonds (
ROMol & mol, bool cleanIt = false )
"
/**
<p>
finds bonds that could be cis/trans in a molecule and mark them as
Bond::STEREONONE
<p>
So that documentation is actually correct. It does find bonds that
could be cis/trans and mark them as Bond::STEREONONE. That just isn't
very useful since all bonds are marked Bond::STEREONONE by default.
The only direct test case of findPotentialStereoBonds I can find is
the following:
MolOps::findPotentialStereoBonds(*m, false);
TEST_ASSERT(m->getNumAtoms() == 15);
TEST_ASSERT(m->getBondWithIdx(1)->getBondType() == Bond::DOUBLE);
TEST_ASSERT(m->getBondWithIdx(1)->getStereoAtoms().size() == 2);
TEST_ASSERT(m->getBondWithIdx(3)->getBondType() == Bond::DOUBLE);
TEST_ASSERT(m->getBondWithIdx(3)->getStereoAtoms().size() == 2);
That doesn't even test the getStereo() return value. Though it does
test getStereoAtoms() return value. So it looks like the proper thing
to do to detect unspecified bond stereo is to check for a non-empty
getStereoAtoms() vector?
So ideally, I would like to write an bond stereo enumerator that tests
if a double bond has unspecified stereo (testing the size of
getStereoAtoms() would work) and then sets the stereo, that is:
bond.SetStereo(Bond::STEREOE);
or
bond.SetStereo(Bond::STEREOZ);
And then hopefully the Chem.MolToSmiles will "do the right thing".
However, this commented out code in the wrapper has given me pause:
// this is no longer exposed because it requires that stereo atoms
// be set. This is a task that is tricky and "dangerous".
//.def("SetStereo",&Bond::setStereo,
// "Set the CIP-classification of the bond as a
BondStereo\n")
So apparently I shouldn't expose an "easy" way to do this. What is the
trickiness and dangerousness of this API? And could we make an easy
way to enumerate bond stereo?
Thanks!
On Fri, Dec 9, 2016 at 5:44 PM, Brian Cole <col...@gmail.com
<mailto:col...@gmail.com>> wrote:
This has me quite curious now, how do we detect unspecified bond
stereo chemistry in RDKit?
m = Chem.MolFromSmiles("FC=CF")
assert m.HasProp("_StereochemDone")
for bond in m.GetBonds():
print(bond.GetBondDir(), bond.GetStereo())
Yields:
(rdkit.Chem.rdchem.BondDir.NONE, rdkit.Chem.rdchem.BondStereo.STEREONONE)
(rdkit.Chem.rdchem.BondDir.NONE, rdkit.Chem.rdchem.BondStereo.STEREONONE)
(rdkit.Chem.rdchem.BondDir.NONE, rdkit.Chem.rdchem.BondStereo.STEREONONE)
Trying to force the issue:
Chem.AssignStereochemistry(m, cleanIt=True, force=True,
flagPossibleStereoCenters=True)
assert m.HasProp("_StereochemDone") for bond in m.GetBonds():
print(bond.GetBondDir(), bond.GetStereo())
Still yields:
(rdkit.Chem.rdchem.BondDir.NONE, rdkit.Chem.rdchem.BondStereo.STEREONONE)
(rdkit.Chem.rdchem.BondDir.NONE, rdkit.Chem.rdchem.BondStereo.STEREONONE)
(rdkit.Chem.rdchem.BondDir.NONE, rdkit.Chem.rdchem.BondStereo.STEREONONE)
I can see the setStereo(Bond::STEREOANY) in the code here:
if ((*bondIt)->getBondDir() == Bond::EITHERDOUBLE) {
(*bondIt)->setStereo(Bond::STEREOANY);
Guess I have to figure out how to detect EITHERDOUBLE?
-Brian
On Fri, Dec 9, 2016 at 5:03 PM, Andrew Dalke
<da...@dalkescientific.com <mailto:da...@dalkescientific.com>> wrote:
On Dec 9, 2016, at 9:50 PM, Brian Kelley wrote: > >>> from
rdkit import Chem > >>> m = Chem.MolFromSmiles("F/C=C/F") >
>>> for bond in m.GetBonds(): > ... print bond.GetStereo()
> ... > STEREONONE > STEREOE > STEREONONE > > However, setting
bond stereo doesn't appear to be exposed. I thought I knew a
way to change it, via GetBondDir()/SetBondDir() on the
directional bonds. It doesn't seem to work. First, get the
existing bond directions: >>> from rdkit import Chem >>> mol =
Chem.MolFromSmiles("F/C=C/F") >>> for bond in mol.GetBonds():
... print(bond.GetBondDir()) ... ENDUPRIGHT NONE ENDUPRIGHT
I'll change the first "/" to a "\" (That's "\\" when escaped
for a normal Python string.) >>> mol.GetBondWithIdx(0)
<rdkit.Chem.rdchem.Bond object at 0x10fe26600> >>>
mol.GetBondWithIdx(0).GetBondDir()
rdkit.Chem.rdchem.BondDir.ENDUPRIGHT >>>
mol.GetBondWithIdx(0).SetBondDir(Chem.BondDir.ENDDOWNRIGHT) If
I generate the SMILES I see the old "F/C=C/F" instead of the
new direction. I need to clear internal computed properties
when I make structure edits: >>> Chem.MolToSmiles(mol,
isomericSmiles=True) 'F/C=C/F' >>> mol.ClearComputedProps()
>>> Chem.MolToSmiles(mol, isomericSmiles=True) 'F/C=C\\F' I'll
set the directions to "NONE" and clear computed properties.
The SMILES is correct: >>>
mol.GetBondWithIdx(0).SetBondDir(Chem.BondDir.NONE) >>>
mol.GetBondWithIdx(2).SetBondDir(Chem.BondDir.NONE) >>>
mol.ClearComputedProps() >>> Chem.MolToSmiles(mol,
isomericSmiles=True) 'FC=CF' although the stereo setting is
unchanged: >>> for bond in mol.GetBonds(): ...
print(bond.GetStereo()) ... STEREONONE STEREOE STEREONONE I
expected it to give me all STEREONONEs, as if it were the same
as the following: >>> mol2 = Chem.MolFromSmiles("FC=CF") >>>
for bond in mol2.GetBonds(): ... print(bond.GetStereo()) ...
STEREONONE STEREONONE STEREONONE
Andrew da...@dalkescientific.com
<mailto:da...@dalkescientific.com>
------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors Access
to Intel Xeon Phi processor-based developer platforms. With
one year of Intel Parallel Studio XE. Training and support
from Colfax. Order your platform today.http://sdm.link/xeonphi
_______________________________________________ Rdkit-discuss
mailing list Rdkit-discuss@lists.sourceforge.net
<mailto:Rdkit-discuss@lists.sourceforge.net>
https://lists.sourceforge.net/lists/listinfo/rdkit-discuss
<https://lists.sourceforge.net/lists/listinfo/rdkit-discuss>
------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors
Access to Intel Xeon Phi processor-based developer platforms.
With one year of Intel Parallel Studio XE.
Training and support from Colfax.
Order your platform today.http://sdm.link/xeonphi
_______________________________________________
Rdkit-discuss mailing list
Rdkit-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rdkit-discuss
------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors
Access to Intel Xeon Phi processor-based developer platforms.
With one year of Intel Parallel Studio XE.
Training and support from Colfax.
Order your platform today.http://sdm.link/xeonphi
_______________________________________________
Rdkit-discuss mailing list
Rdkit-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rdkit-discuss