您如何将一个大的化合物 sdf 文件转换为包含分子图像的单个文件?

How would you convert a large sdf file of chemical compounds into individual files containing molecular images?

一种新的基于图像的药物发现深度学习算法,需要在包含单个 2D 200 x 200 像素图像的 png 文件中拆分包含约 3000 种化合物的文件 (.: SN00001400.png, SN00002805.png, SN00002441.png........).不需要任何构造器,也不需要任何其他 3D 信息。

我可以发送一个包含 9 个复合图像、姓名和微笑的初始 f1.sdf 示例,每个复合行一个。

使用 rdkit 2017.09.1 in Anaconda3 with Python 3.6, 3.7 or 3.8, Jupyter notebooks and/or Python prompt, in 2 e7 64 computers within Windows 8专业人士,我正在寻找一个简单的 Python 代码来分割图像,将它们转换为 200 x 200 像素的 png 文件 (carios),用相应的复合 ID 命名它们并将它们保存到不同的目录中 (.:图片),准备进行测试。

我尝试了许多不同的网络代码和组合,但尽管进行了密集的测试,但它们都不起作用:-(。

遵循我的一些最佳(?)代码试验。

rdkit 导入测试

from rdkit import Chem
from rdkit.Chem import AllChem 
from rdkit.Chem import Draw
from rdkit.Chem.Draw import rdMolDraw2D    
from rdkit.Chem.Draw.rdMolDraw2D import MolDraw2DSVG    
from rdkit.Chem.Draw.rdMolDraw2D import MolDraw2DCairo  # cannot import 
from rdkit.Chem.Draw import IPythonConsole  
from IPython.display import SVG # IPython not in module 
from rdkit.Chem import rdDepictor 
from rdkit.Chem import MolFromSmiles

使用独特笑容的最佳测试

IPythonConsole.molSize = (200, 200)  
IPythonConsole.ipython_useSVG = True  #I would rather use Cairo but I could not make it to work!
mol = Chem.MolFromSmiles('N#Cc1cccc(-c2nc(-c3cccnc3)no2)c1')
display(mol)  # not working
AllChem.Compute2DCoords(mol)

我尝试了不同的微笑,但结果却相似....

IMG_SIZE = 200
smiles="CCCC"
mol = Chem.MolFromSmiles(smiles)
drawer = rdMolDraw2D.MolDraw2DSVG(IMG_SIZE, IMG_SIZE)  #MolDraw2D has no attribute MolDraw2DCairo despite cairo being installed!   
drawer.drawOptions().bondLineWith = 1
drawer.DrawMolecule(mol)  # bad conformer id (?????)
drawer.FinishDrawing()
drawer.WriteDrawingText('comp_id.png')

在 f1.sdf

中使用 9 种化合物的最佳尝试
suppl=Chem.SDMolSupplier('f1.sdf')
for mol in suppl:
    print(mol.GetName()) # AttributeError: 'Mol' object has no attribute 'GetMolecule_Name'
mols=[x for x in suppl]
Name(mols) 

suppl = Chem.SDMolSupplier('f1.sdf')
ms= [x for x in suppl if x is not None]
for m in ms: 
    tmp=AllChem.Compute2DCoords(m)

Draw.MolToFile(ms[0], 'images/mol1.png') cairo.IOError: error while writing to output stream
Draw.MolToFile(ms[1], 'images/mol2.png')

................................................ .....................

希望得到一些帮助! 感谢您的关注,真诚的 胡里奥

juliocollm@gmail.com

你是对的!.

我在新创建的 Anaconda3 环境中执行了“conda install -c conda-forge rdkit”,大多数命令突然生效了!!!。 非常感谢!!!!

我开发了下面的代码.....但我被阻止了,因为我找不到一种方法将每个相应的 comp_id 传输到为漂亮的 png 图像编码的 png 文件的名称. 有任何想法吗? 谢谢!!!

从 rdkit 导入 Chem

从 rdkit.Chem 进口 AllChem

来自 rdkit.Chem 导入绘图

来自 rdkit.Chem.Draw 导入 rdMolDraw2D

来自 rdkit.Chem.Draw.rdMolDraw2D 导入 MolDraw2DSVG

来自 rdkit.Chem.Draw.rdMolDraw2D 导入 MolDraw2DCairo

来自 rdkit.Chem.Draw 导入 MolToFile

从 rdkit.Chem 导入 rdDepictor

来自 rdkit.Chem 导入 MolFromSmiles

供应 = Chem.SDMolSupplier('f1.sdf')

供应中的摩尔数:

print(mol.GetProp("comp_id"))

mols= [x 用于供应中的 x]

对于以摩尔为单位的 m:

tmp=AllChem.Compute2DCoords(m)

Draw.MolToFile(mols[0],'images/3333.png', size=(200,200), kekulize = True, wedgeBonds = False,imageType=None, fitImage=False, options= None) .......#没有得到comp_id但可以传递一些属性

Draw.MolToFile(mols[1], 'images/'+"comp_id"+'a.png').......#没看懂

如果您的分子名称在 SDF 文件的标题行中可用,您可以使用键“_Name”作为 属性 访问它。也可以使用相应的键从 SDF 中读取其他属性。以下面的自卫队为例:

CHEMBL1308
                    3D
 Structure written by MMmdl.
 12 12  0  0  1  0            999 V2000
   -0.0127    0.0114   -0.0000 C   0  0  0  0  0  0
    1.4966    0.0081   -0.0000 C   0  0  0  0  0  0
    2.3688   -1.0939    0.0000 C   0  0  0  0  0  0
    3.6409   -0.7653    0.0000 N   0  0  0  0  0  0
    3.6278    0.5682   -0.0000 N   0  0  0  0  0  0
    2.3638    1.0896   -0.0000 C   0  0  0  0  0  0
   -0.4346    1.0168    0.0000 H   0  0  0  0  0  0
   -0.4074   -0.5191   -0.8666 H   0  0  0  0  0  0
   -0.4074   -0.5191    0.8666 H   0  0  0  0  0  0
    2.0644   -2.1303    0.0000 H   0  0  0  0  0  0
    4.4779    1.1136   -0.0000 H   0  0  0  0  0  0
    2.2002    2.1571   -0.0000 H   0  0  0  0  0  0
  1  2  1  0  0  0
  1  7  1  0  0  0
  1  8  1  0  0  0
  1  9  1  0  0  0
  2  3  1  0  0  0
  2  6  2  0  0  0
  3  4  2  0  0  0
  3 10  1  0  0  0
  4  5  1  0  0  0
  5  6  1  0  0  0
  5 11  1  0  0  0
  6 12  1  0  0  0
M  END
> <SYNONYMS>
Fomepizole (BAN, FDA, INN, USAN)

> <USAN_STEM>
nan

$$$$

化合物的名称 (CHEMBL1308) 可以像这样访问,假设 mol 是一个 rdkit 分子:

mol_id = mol.GetProp('_Name')

其他属性可以这样访问:

property = mol.GetProp('SYNONYMS')

因此,生成所需图像的简单方法如下:

from rdkit.Chem.Draw import rdMolDraw2D
from rdkit.Chem import AllChem
from rdkit import Chem


img_size = (200, 200)
supplier = Chem.SDMolSupplier('mols.sdf')
for mol in supplier:
    AllChem.Compute2DCoords(mol)
    mol_id = mol.GetProp('_Name')
    d = rdMolDraw2D.MolDraw2DCairo(*img_size)
    d.DrawMolecule(mol)
    d.FinishDrawing()
    d.WriteDrawingText(f'images/{mol_id}.png')

显然,您可以根据需要调整它

是!!
效果非常好!!!

我会叫它:Oliver.py

睡觉后,我刚醒来还有另一种解决方案(见下文)。也许你的更好,因为它允许我定义要绘制的线条的宽度。

非常感谢您的帮助!现在我可以转换我的“黄金”文件来测试深度学习模型了!!!

从 rdkit 导入化学

从 rdkit.Chem 进口 AllChem

来自 rdkit.Chem 导入绘图

补充 = Chem.SDMolSupplier('f1.sdf')

mols = [x 用于供应中的 x]

x=-1

m 的摩尔数:

x=x+1

nombre=m.GetProp("comp_id")

tmp=AllChem.Compute2DCoords(m)

Draw.MolToFile(mols[x],'images/'+ nombre +'.png', size=(200,200), kekulize = True, wedgeBonds = False,imageType=None, fitImage=False, options=None) 

打印('ROWS CONVERTED TO IMAGES: ', x)