The outputs of reaction are a bit confusing.

Reactions can have multiple product templates so the output of RunReactants is 
a list of list of molecules.

For products in result:
  For molecule in products:
     Molecule.UpdatePropertyCache()

However, it looks like your reaction is generating non sensical molecules so 
you may want to draw with sanitizaton turned off so you can see the reaction 
output.

----
Brian Kelley

> On Jan 11, 2017, at 9:11 PM, Curt Fischer <curt.r.fisc...@gmail.com> wrote:
> 
> Hi all,
> 
> I recently wanted to use RDKit to model the famous copper-catalyzed 
> cycloaddition of alkynes and azides.
> 
> I eventually got things working, kind of, but had two questions.  First, I 
> was surprised to find that the products of RunReactants don't have update 
> property caches.  Is this something I should have expected, or is it a bug?  
> If the latter, is it any easy-to-fix bug or a hard-to-fix one?
> 
> Second, how can I modify my SMARTS reaction query to avoid duplication of 
> each product?
> 
> Here's some example code, also available at 
> https://github.com/tentrillion/ipython_notebooks/blob/master/rdkit_smarts_reactions_needs_updating.ipynb
> 
> # -------BEGIN CODE------ #
> # import rdkit components
> from rdkit import rdBase
> from rdkit import Chem
> from rdkit.Chem import AllChem
> from rdkit.Chem import Draw
> 
> # use IPythonConsole for pretty drawings
> from rdkit.Chem.Draw import IPythonConsole
> # IPythonConsole.ipython_useSVG=True  # leave out for github
> 
> # for flattening
> from itertools import chain
> 
> # define reactants
> diyne_smiles = 'C#CCC(O)C#C'
> azide_smiles = 'CCCN=[N+]=[N-]'
> 
> diyne = Chem.MolFromSmiles(diyne_smiles)
> azide = Chem.MolFromSmiles(azide_smiles)
> 
> # define reaction
> copper_click_smarts = 
> '[C:1]#[C:2].[N:3]=[N+:4]=[N-:5]>>[c:1]1[c:2][n-0:3][n-0:4][n-0:5]1'
> copper_click = AllChem.ReactionFromSmarts(copper_click_smarts)
> 
> # run reaction
> products_tuples = copper_click.RunReactants((diyne, azide))
> 
> # flatten product tuple of tuples into list
> products = list(chain(*products_tuples))
> 
> # FAILS: mol property caches are not updated
> try:
>     Draw.MolsToGridImage(products)
> except (RuntimeError, ValueError) as e:
>     print 'FAILED!'
>     my_error = e
> 
> # this works: force updating 
> for product in products:
>     product.UpdatePropertyCache()
> 
> Draw.MolsToGridImage(products)
> 
> my_error
> 
> products_tuples = copper_click.RunReactants((diyne, azide))
> products = list(chain(*products_tuples))
> # FAILS: mol property caches are not updated
> Draw.MolsToGridImage(products)
> 
> # -------END CODE------ #
> 
> The stacktrace is:
> 
> ---------------------------------------------------------------------------
> ValueError                                Traceback (most recent call last)
> <ipython-input-4-7962390107ec> in <module>()
>       2 products = list(chain(*products_tuples))
>       3 # FAILS: mol property caches are not updated
> ----> 4 Draw.MolsToGridImage(products)
> 
> /Users/curt/anaconda2/lib/python2.7/site-packages/rdkit/Chem/Draw/IPythonConsole.pyc
>  in ShowMols(mols, **kwargs)
>     198   else:
>     199     fn = Draw.MolsToGridImage
> --> 200   res = fn(mols, **kwargs)
>     201   if kwargs['useSVG']:
>     202     return SVG(res)
> 
> /Users/curt/anaconda2/lib/python2.7/site-packages/rdkit/Chem/Draw/__init__.pyc
>  in MolsToGridImage(mols, molsPerRow, subImgSize, legends, 
> highlightAtomLists, useSVG, **kwargs)
>     403   else:
>     404     return _MolsToGridImage(mols, molsPerRow=molsPerRow, 
> subImgSize=subImgSize, legends=legends,
> --> 405                             highlightAtomLists=highlightAtomLists, 
> **kwargs)
>     406 
>     407 
> 
> /Users/curt/anaconda2/lib/python2.7/site-packages/rdkit/Chem/Draw/__init__.pyc
>  in _MolsToGridImage(mols, molsPerRow, subImgSize, legends, 
> highlightAtomLists, **kwargs)
>     344       highlights = highlightAtomLists[i]
>     345     if mol is not None:
> --> 346       img = _moltoimg(mol, subImgSize, highlights, legends[i], 
> **kwargs)
>     347       res.paste(img, (col * subImgSize[0], row * subImgSize[1]))
>     348   return res
> 
> /Users/curt/anaconda2/lib/python2.7/site-packages/rdkit/Chem/Draw/__init__.pyc
>  in _moltoimg(mol, sz, highlights, legend, **kwargs)
>     309   from rdkit.Chem.Draw import rdMolDraw2D
>     310   if not hasattr(rdMolDraw2D, 'MolDraw2DCairo'):
> --> 311     img = MolToImage(mol, sz, legend=legend, 
> highlightAtoms=highlights, **kwargs)
>     312   else:
>     313     nmol = rdMolDraw2D.PrepareMolForDrawing(mol, 
> kekulize=kwargs.get('kekulize', True))
> 
> /Users/curt/anaconda2/lib/python2.7/site-packages/rdkit/Chem/Draw/__init__.pyc
>  in MolToImage(mol, size, kekulize, wedgeBonds, fitImage, options, canvas, 
> **kwargs)
>     112     from rdkit import Chem
>     113     mol = Chem.Mol(mol.ToBinary())
> --> 114     Chem.Kekulize(mol)
>     115 
>     116   if not mol.GetNumConformers():
> 
> ValueError: Sanitization error: Can't kekulize mol.  Unkekulized atoms: 3
> 
> ------------------------------------------------------------------------------
> 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

Reply via email to