首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >您将如何将一个大的sdf化学化合物文件转换为包含分子图像的单个文件?

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

Stack Overflow用户
提问于 2021-01-21 08:37:51
回答 3查看 2K关注 0票数 0

一种新的基于图像的药物发现深入学习算法,需要将包含3000个化合物的文件分割成包含单个2D 200×200像素图像的png文件(.:SN00001400.png,SN00002805.png,SN00002441.png.)。不需要任何符合标准,也不需要任何其他3D信息。

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

在Anaconda3中使用rdkit 2017.09.1和Python3.6、3.7或3.8、木星笔记本和/或Python提示符,在Windows8专业人员的2台e7 64计算机中,我正在寻找一个简单的Python代码来拆分这些图像,将它们转换为200x200像素的png文件(carios),根据它们相应的复合ID命名它们,并将它们保存到一个不同的目录(.:images)中,可以进行测试。

我尝试了许多不同的网络代码和组合,但是尽管进行了大量的测试,它们还是没有起作用。

跟随一些我最好的(?)代码测试。

rdkit导入测试

代码语言:javascript
运行
复制
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

使用唯一微笑的最佳测试

代码语言:javascript
运行
复制
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)

,我尝试了不同的微笑,在这一行中也有相似的负面结果.

代码语言:javascript
运行
复制
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种化合物

代码语言:javascript
运行
复制
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) 

代码语言:javascript
运行
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-01-21 20:42:45

你是对的!

我在一个新创建的-c环境中执行了一个"conda安装Anaconda3 conda-forge rdkit“,而大多数命令都突然起作用了!非常感谢!

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

从rdkit进口化学

从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

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

对于补编中的mol:

代码语言:javascript
运行
复制
print(mol.GetProp("comp_id"))

补编中x的mols= x

以摩尔为单位:

代码语言:javascript
运行
复制
tmp=AllChem.Compute2DCoords(m)

Draw.MolToFile(mols,‘映像/3333.png’,size=(200,200),kekulize = True,wedgeBonds = False,imageType=None,fitImage=False,options=None) .......#did没有得到comp_id,但可以传递一些属性

Draw.MolToFile(mols1,‘图像/’+“comp_id”+‘a.png’)........#did不明白

票数 0
EN

Stack Overflow用户

发布于 2021-01-21 21:45:52

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

代码语言:javascript
运行
复制
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是rdkit分子,化合物的名称( mol )可以这样访问:

代码语言:javascript
运行
复制
mol_id = mol.GetProp('_Name')

其他属性的访问方式如下:

代码语言:javascript
运行
复制
property = mol.GetProp('SYNONYMS')

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

代码语言:javascript
运行
复制
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')

很明显,你可以根据你的需要来调整它。

票数 0
EN

Stack Overflow用户

发布于 2021-01-22 06:46:38

是的!!

它工作得很漂亮!

我会打电话给它: Oliver.py

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

我真的接受了你的帮助!,现在我可以转换我的“黄金”文件来测试深造模式!

从rdkit进口化学

从rdkit.Chem导入AllChem

从rdkit.Chem导入绘图

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

补编中的mols =x

x=-1

以摩尔为单位:

代码语言:javascript
运行
复制
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) 

打印(‘行转换成图像:',x)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65823691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档