【问题标题】:How to highlight the substructure of a molecule with thick red lines in RDKit as SVG (high res)如何在 RDKit 中将带有粗红线的分子的子结构突出显示为 SVG(高分辨率)
【发布时间】:2021-10-29 02:05:10
【问题描述】:

我有以下代码:

from rdkit import Chem
from rdkit.Chem.Draw import IPythonConsole
from rdkit.Chem import rdDepictor
from rdkit.Chem.Draw import rdMolDraw2D
from IPython.display import SVG


m = Chem.MolFromSmiles('c1cc(C(=O)O)c(OC(=O)C)cc1')
substructure = Chem.MolFromSmarts('C(=O)O')
print(m.GetSubstructMatches(substructure))
m

这会产生以下情节。

但是,上面的代码不会生成高分辨率图像。 我想要SVG。 我试过这个:

drawer = rdMolDraw2D.MolDraw2DSVG(400,200)
drawer.DrawMolecule(m,highlightAtoms=m.GetSubstructMatch(Chem.MolFromSmarts('C(=O)O')))
drawer.FinishDrawing()
svg = drawer.GetDrawingText().replace('svg:','')
SVG(svg)

但我明白了:

正确的做法是什么?

代码可以在我的Google Colab测试。

【问题讨论】:

  • @mnis 谢谢。完整的语法是什么?我试过drawer.DrawMolecule(m,highlightAtoms=m.GetSubstructMatches(Chem.MolFromSmarts('C(=O)O')))但失败了
  • 我添加了一个正确的答案。见下文。

标签: python rdkit


【解决方案1】:

GetSubstructMatch 仅返回第一个匹配项。使用GetSubstructMatches。根据您安装的 rdkit 版本,这里有多种方案。在最新的 rdkit 版本(2021.09.2)中,以下代码应该可以工作。

from rdkit import Chem
from rdkit.Chem.Draw import IPythonConsole
from rdkit.Chem import rdDepictor
from rdkit.Chem.Draw import rdMolDraw2D
from IPython.display import SVG
from copy import deepcopy


def increase_resolution(mol, substructure, size=(400, 200)):
    mol = deepcopy(mol)
    substructure = deepcopy(substructure)
    drawer = rdMolDraw2D.MolDraw2DSVG(size[0], size[1])
    
    # highlightAtoms expects only one tuple, not tuple of tuples. So it needs to be merged into a single tuple
    matches = sum(mol.GetSubstructMatches(substructure), ())
    drawer.DrawMolecule(mol, highlightAtoms=matches)
    
    drawer.FinishDrawing()
    svg = drawer.GetDrawingText()
    
    return svg.replace('svg:','')


mol = Chem.MolFromSmiles('c1cc(C(=O)O)c(OC(=O)C)cc1')
substructure = Chem.MolFromSmarts('C(=O)O')
SVG(increase_resolution(mol, substructure))

如果您收到 Value Error: Bad Conformer id 错误,请将 rdkit 包更新到最新版本或尝试以下操作:

from rdkit import Chem
from rdkit.Chem.Draw import IPythonConsole
from rdkit.Chem import rdDepictor
from rdkit.Chem.Draw import rdMolDraw2D
from IPython.display import SVG
from copy import deepcopy


def increase_resolution(mol, substructure, size=(400, 200), kekulize=True):
    mol = deepcopy(mol)
    substructure = deepcopy(substructure)
    rdDepictor.Compute2DCoords(mol)
    if kekulize:
        Chem.Kekulize(mol) # Localize the benzene ring bonds
        
    drawer = rdMolDraw2D.MolDraw2DSVG(size[0], size[1])
    
    # highlightAtoms expects only one tuple, not tuple of tuples. So it needs to be merged into a single tuple
    matches = sum(mol.GetSubstructMatches(substructure), ())
    drawer.DrawMolecule(mol, highlightAtoms=matches)
    
    drawer.FinishDrawing()
    svg = drawer.GetDrawingText()
    return svg.replace('svg:','')


mol = Chem.MolFromSmiles('c1cc(C(=O)O)c(OC(=O)C)cc1')
substructure = Chem.MolFromSmarts('C(=O)O')
SVG(increase_resolution(mol, substructure, kekulize=True))

如果在某些情况下,例如将手性结构作为 SMILES 字符串的一部分引入其中,它可能无法工作。对于这种情况,请设置kekulize=False

【讨论】:

  • 谢谢一百万。一个轻微的问题。 RDKit 提供来自分子的Fragment 标识。具有看起来像 rdkit.Chem.Fragments.fr_Al_COO() 的功能。有没有办法使用您的方法突出显示模式?
  • 我想不出一种直接的方法,但我可以建议一种间接的方法。上面的代码需要一个用于模式匹配的子结构。因此,您只需要为每个片段找到 SMARTS 字符串,然后通过调用上述代码对其进行迭代。现在,要获取这些片段的 SMARTS,您可以编写一个简单的 python 函数来解析以下文件以提取值github.com/rdkit/rdkit/blob/master/Data/FragmentDescriptors.csv
  • 我在我的分子 [H]N[C@@H](CCCCN)C(=O)N[C@@H](CCCCN)C(=O)N[C@@H](C)C(=O)N[C@@H](CC1=CNC2=C1C=CC=C2)C(O)=O 上使用 Benzene SMARTS (c1ccccc1) 再次尝试了您的代码。它不起作用。请看我的GoogleColab。它是可编辑的。
  • 查看我的更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 2021-05-16
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多