[英]How would you convert a large sdf file of chemical compounds into individual files containing molecular images?
一種新的基於圖像的葯物發現深度學習算法,需要將包含約 3000 種化合物的文件拆分為包含單個 2D 200 x 200 像素圖像的 png 文件(.: SN00001400.png、SN00002805.png、SN00002441.png.. ......)。 不需要任何conformers,也不需要任何其他 3D 信息。
我可以發送一個包含 9 個復合圖像、名稱和微笑的初始 f1.sdf 示例,每個復合行一個。
Using 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 professional, I am looking for a simple Python code to split the images, convert them to a 200 x 200 像素的 png 文件 (carios),通過其對應的復合 ID 命名它們並將它們保存到不同的目錄 (.: images) 中,以供測試。
我嘗試了許多不同的 web 代碼和組合,但盡管進行了密集測試,但它們不起作用:-(。
遵循我最好的(?)代碼試驗。
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 進口化學
從 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 in suppl:
print(mol.GetProp("comp_id"))
mols= [x for x in suppl]
以摩爾為單位的 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 中讀取。 以下面的 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
$$$$
假設mol
是一個 rdkit 分子,可以像這樣訪問化合物的名稱 (CHEMBL1308):
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
睡覺后,我剛醒來,又找到了另一種解決方案(見下文)。 也許你的更好,因為它允許我定義要繪制的線條的寬度。
我真的很感謝您的幫助,現在我可以轉換我的“黃金”文件來測試深度學習 model !!!
從 rdkit 進口化學
從 rdkit.Chem 導入 AllChem
從 rdkit.Chem 導入繪圖
suppl = Chem.SDMolSupplier('f1.sdf')
mols = [x for x in suppl]
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)
print('行轉換為圖像:', x)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.