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



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

我可以发送一个初始f1。SDF示例包含9个复合图像,名称和微笑,每个复合行一个。

在Anaconda3中使用rdkit 2017.09.1与Python 3.6, 3.7或3.8,Jupyter笔记本和/或Python提示符,在Windows 8专业的2e7 64台计算机中,我正在寻找一个简单的Python代码来分割图像,将它们转换为200 x 200像素的png文件(carios),通过其相应的复合ID命名它们并将它们保存到不同的目录(。: images),准备测试

我尝试了许多不同的web代码和组合,但尽管进行了大量的测试,它们都不起作用:-(.

以下是一些我最好的(?)代码试验。

rdkit imports testing

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

你是对的!.

我执行了">conda install -c conda-forge rdkit"在新创建的Anaconda3环境中,大多数命令突然工作了!!非常感谢!!!!

我开发了下面的代码.....但是我停下来了,因为我找不到一种方法来传输每个相应的comp_id到编码美丽png图像的png文件的名称。什么好主意吗?谢谢! !

from rdkit import Chem

从rdkit。Chem import AllChem

从rdkit。Chem import Draw

从rdkit.Chem.Draw导入rdMolDraw2D

从rdkit.Chem.Draw。rdMolDraw2D导入MolDraw2DSVG

从rdkit.Chem.Draw。导入moldraw2d

从rdkit.Chem.Draw导入MolToFile

从rdkit。Chem import rddescriptor

从rdkit。Chem import molfrommiles

supply = Chem.SDMolSupplier('f1.sdf')

mol in supply:

print(mol.GetProp("comp_id"))

mools = [x for x in supply]

for m in modules:

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,但可以传输一些属性

。MolToFile(摩尔[1],"图像/"+"comp_id" a.png +" ')........# not get the idea

如果你的分子的名字在你的SDF文件的标题行是可用的,你可以用键'_Name'访问它作为一个属性。其他属性也可以使用相应的键从SDF中读取。以下面的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

睡觉后,我醒来时发现了另一个解决方案(见下文)。也许你的更好,因为它允许我定义要画的线的宽度。

我真的很感谢你的帮助!,现在我可以转换我的"黄金"了。文件来测试深度学习模型!!from rdkit import Chem

从rdkit。Chem import AllChem

从rdkit。Chem import Draw

supply = Chem.SDMolSupplier('f1.sdf')

mools = [x for x in supply]

x = 1

for m in modules:

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) 

print('ROWS convert TO IMAGES: ', x)

相关内容

  • 没有找到相关文章

最新更新