RDKit|一站式搞定分子讀取、輸出叫惊、可視化

目錄

  • 一款青、簡介
  • 二、讀取分子
    • 1.讀取SMILES/SMARTS
    • 2.讀取.sdf
    • 3.讀取.mol
    • 4.讀取.mol2
    • 5.讀取其他格式
  • 三霍狰、輸出分子
    • 1.輸出SMILES/SMARTS
    • 2.輸出.sdf
    • 3.輸出.mol
    • 4.讀取其他格式
  • 四抡草、分子可視化
    • 1.單個展示
    • 2.批量展示
    • 3.3D展示

一、簡介

讓計算機識別分子結(jié)構(gòu)是計算化學(xué)碼農(nóng)的必備技能蔗坯,也是對分子進行后續(xù)操作的基礎(chǔ)康震。本文整理和總結(jié)了rdkit進行讀取、輸出和可視化的一些方法宾濒,包含對SMILES腿短、SDF、MOL绘梦、MOL2橘忱、CSV等文件的處理,以及分子的結(jié)構(gòu)展示卸奉。

二钝诚、讀取分子

2.1.讀SMILES/SMARTS

2.1.1.直接讀字符串

  • 從SMILES/SMARTS直接讀取
    很簡單了,不必多說
>>> from rdkit import Chem
>>> m = Chem.MolFromSmiles('C[C@H](O)c1ccccc1')
>>> m = Chem.MolFromSmarts('Cc1ccccc1')

2.1.2.文件批量讀取

文件類似這樣(格式化的就行):

SMILES Name
C1=CC=CC=CC=C1 0
c1ccccc1 1
c1cocc1 2
  • 從.smi批量讀乳谩:SmilesMolSupplier(data, delimiter, smilesColumn, nameColumn, titleLine, sanitize)
    data:數(shù)據(jù)文件
    delimiter:分隔符敲长,默認(rèn)為' '
    smilesColumn:SMILES所在列,默認(rèn)為0
    nameColumn:SMILES名稱所在列秉继,默認(rèn)為1
    titleLine:是否含有標(biāo)題行祈噪,默認(rèn)True
    sanitize:是否檢查正確性,默認(rèn)True
>>> suppl = Chem.SmilesMolSupplier('data/batch_smiles.smi', delimiter='\t')
>>> mols = [Chem.MolToSmiles(mol) for mol in suppl]
>>> print(mols)
['C1=CC=CC=CC=C1', 'c1ccccc1', 'c1ccoc1']

2.1.3.文本批量讀取

  • 從文本批量讀壬屑:SmilesMolSupplierFromText()
    參數(shù)基本同上
>>> with open('data/batch_smiles.smi', 'r') as f:
>>>     mols_text = f.read()
>>> suppl = Chem.SmilesMolSupplierFromText(mols_text, delimiter='\t')
>>> mols = [Chem.MolToSmiles(mol) for mol in suppl]
>>> print(mols)
['C1=CC=CC=CC=C1', 'c1ccccc1', 'c1ccoc1']

2.1.4.DataFrame批量讀取

  • 讀取DataFrame中的SMILES:AddMoleculeColumnToFrame(frame, smilesCol, molCol, includeFingerprints)
    frame:DataFrame對象
    smilesCol:SMILES所在列
    molCol:新列名辑鲤,將存放產(chǎn)生的rdkit mol對象
    includeFingerprints:是否生成指紋
  • 順便計算下分子量:Descriptors.MolWt()
>>> import pandas as pd
>>> from rdkit.Chem import Descriptors
>>> from rdkit.Chem import PandasTools
>>> df = pd.read_csv('data/smiles_df.csv')
>>> PandasTools.AddMoleculeColumnToFrame(df,'SMILES','mol',includeFingerprints=True)
>>> df['MW'] = df['mol'].apply(Descriptors.MolWt)
>>> df.head(2)

           Name                 SMILES                         mol         MW  
0    Lanreotide     c1(c2c(cccc2)[nH...   <img data-content="rd...   1096.347  
1  Lansoprazole     Cc1c(OCC(F)(F)F)...   <img data-content="rd...    369.368 

2.2.讀.sdf

2.2.1.文件批量讀取

  • 從.sdf里批量讀取:SDMolSupplier(fileName, sanitize, removeHs, strictParsing)
    fileName:文件名
    sanitize:檢查化合價杠茬,計算芳香性月褥、共軛弛随、雜化、kekule宁赤,默認(rèn)True
    removeHs:是否隱藏氫原子舀透,默認(rèn)True
    strictParsing:是否使用嚴(yán)格模式進行解析,默認(rèn)True
>>> suppl = Chem.SDMolSupplier('data/batch.sdf')
>>> mols = [Chem.MolToSmiles(mol) for mol in suppl if mol]
>>> print(mols)
['C1=C\\C=C/C=C\\C=C/1', 'c1ccccc1', 'c1ccoc1']

2.2.2.壓縮包批量讀取

  • 從file object/.gz里讀取
>>> import gzip
>>> gz_file = gzip.open('data/batch.sdf.gz', 'r')
>>> suppl = Chem.ForwardSDMolSupplier(gz_file)
>>> mols = [Chem.MolToSmiles(mol) for mol in suppl if mol]
>>> print(mols)
>>> f.close()
['C1=C\\C=C/C=C\\C=C/1', 'c1ccccc1', 'c1ccoc1']

2.3.讀.mol

  • 從.mol里讀染鲎蟆:MolFromMolFile(fileName, sanitize, removeHs, strictParsing)
    參數(shù)同上
>>> m = Chem.MolFromMolFile('data/output.mol')
>>> print(Chem.MolToSmiles(mol))
c1cocc1

2.4.讀.mol2

  • 不推薦愕够,容易出bug:MolFromMol2File(...)
    參數(shù)同上
>>> m = Chem.MolFromMol2File('data/output.mol2')
>>> print(Chem.MolToSmiles(mol))
c1cocc1

2.5.讀其他格式:pdb, fasta, peptide, ...

  • 其他格式大同小異,不再贅述了佛猛,方法如下惑芭,感興趣可自己嘗試
# PDB
>>> Chem.MolFromPDBFile()
>>> Chem.MolFromPDBBlock()
# FASTA
>>> Chem.MolFromFASTA()
# peptide
>>> Chem.MolFromSequence()

三、輸出分子

3.1.輸出SMILES/SMARTS

3.1.1.輸出默認(rèn)式

  • 輸出SMILES:MolToSmiles(mol, isomericSmiles, kekuleSmiles, canonical, ...)
    kekuleSmiles:默認(rèn)False继找,不使用kekule時:脂肪族碳用"C"表示(大寫)遂跟,芳香族用"c"表示(小寫)
    isomericSmiles:默認(rèn)True,區(qū)分同分異構(gòu)體("@"表示手性婴渡,"\"和"/"表示順反異構(gòu))
    canonical:默認(rèn)True幻锁,輸出標(biāo)準(zhǔn)SMILES
>>> m1 = Chem.MolFromSmiles('C1=CC=CC=CC=C1')
>>> m2 = Chem.MolFromSmiles('C1=CC=CC=C1')
>>> m3 = Chem.MolFromSmiles('C1=COC=C1')
>>> mols = [m1, m2, m3]
>>> print([Chem.MolToSmiles(mol) for mol in mols])
['C1=CC=CC=CC=C1', 'c1ccccc1', 'c1ccoc1']

3.1.2.輸出kekule式

  • 輸出kekule形式
    kekule形式:在符合4N+2規(guī)則的芳香體系中,通過使用雙鍵代替小寫的碳原子來表示芳香性
    4N+2規(guī)則:也叫Hueckel規(guī)則边臼,在閉環(huán)共軛體系中越败,當(dāng)π電子數(shù)為4n+2時,才具有芳香性
>>> for mol in mols:
>>>     Chem.Kekulize(mol)
>>> print([Chem.MolToSmiles(mol, kekuleSmiles=True) for mol in mols])
['C1=CC=CC=CC=C1', 'C1=CC=CC=C1', 'C1=COC=C1']
  • :m1有共軛結(jié)構(gòu)硼瓣,但不屬于芳香系統(tǒng)究飞。m3中氧提供了2個π電子,碳各提供1個堂鲤,總數(shù)為6亿傅,屬于芳香系統(tǒng)

3.1.3.設(shè)置立體參數(shù)

  • 不區(qū)分同分異構(gòu)體
    通過isomericSmiles控制
>>> m4 = Chem.MolFromSmiles('C[C@H](O)c1ccccc1')
>>> print(Chem.MolToSmiles(m4))
C[C@H](O)c1ccccc1
>>> print(Chem.MolToSmiles(m4, isomericSmiles=False))
CC(O)c1ccccc1

3.1.4.批量輸出SMILES

  • 批量輸出SMILES:SmilesWriter(fileName, delimiter, includeHeader, nameHeader, isomericSmiles, kekuleSmiles)
    fileName:輸出文件名
    delimiter:分隔符,默認(rèn)為空格' '
    includeHeader:是否寫入表頭瘟栖,默認(rèn)True
    nameHeader:分子名一列的列名葵擎,默認(rèn)'Name'
    isomericSmiles:立體信息,默認(rèn)True
    kekuleSmiles:kekule形式半哟,默認(rèn)False
>>> writer = Chem.SmilesWriter('data/batch.smi', delimiter='\t')
>>> for i, mol in enumerate(mols):
>>>     writer.write(mol)
>>> writer.close()
  • 輸出結(jié)果:就是2.1.2.表格中的樣子

3.1.5.批量輸出SMILES和屬性

  • 批量輸出SMILES及屬性酬滤,通過以下函數(shù)進行操作:
    mol.GetPropNames(),查看分子屬性列表
    mol.GetProp()寓涨,獲取相應(yīng)屬性
    mol.SetProp(key, val)盯串,新增屬性名key、對應(yīng)屬性值val
    writer.SetProps()戒良,設(shè)置哪些屬性要輸出

  • 以輸出分子量和LogP為例
    使用Descriptors計算屬性体捏,并添加

>>> writer = Chem.SmilesWriter('data/batch_smiles.smi', delimiter='\t', nameHeader='mol_id')
>>> writer.SetProps(['LOGP', 'MW'])
>>> for i, mol in enumerate(mols):
>>>     mw = Descriptors.ExactMolWt(mol)
>>>     logp = Descriptors.MolLogP(mol)
>>>     mol.SetProp('MW', '%.2f' %(mw))
>>>     mol.SetProp('LOGP', '%.2f' %(logp))
>>>     mol.SetProp('_Name', 'No_%s' %(i))
>>>     writer.write(mol)
>>> writer.close()
>>> print('number of mols:', writer.NumMols())
number of mols: 3
>>> print('mol properties:', [i for i in mol.GetPropNames()])
mol properties: ['MW', 'LOGP']
  • 輸出結(jié)果:在2.1.2.表格中,多了“MW”和“LOGP“兩列,不在這里展示了几缭,想要代碼和源文件的可以看這里河泳。

3.1.6.輸出SMARTS

  • 輸出SMARTS:MolToSmarts()
    這個也不多說了
>>> Chem.MolToSmarts(m3, isomericSmiles=True)
'[#6]1:[#6]:[#8]:[#6]:[#6]:1'

3.2.輸出.sdf

3.2.1.批量輸出到.sdf

  • 批量輸出到文件:SDWriter()
    使用方法類似于SMILES的批量輸出
    可以像3.1.5.一樣自定義屬性信息,并記錄在.sdf文件中
>>> writer = Chem.SDWriter('data/batch.sdf')
>>> writer.SetProps(['LOGP', 'MW'])
>>> for i, mol in enumerate(mols):
>>>     mw = Descriptors.ExactMolWt(mol)
>>>     logp = Descriptors.MolLogP(mol)
>>>     mol.SetProp('MW', '%.2f' %(mw))
>>>     mol.SetProp('LOGP', '%.2f' %(logp))
>>>     mol.SetProp('_Name', 'No_%s' %(i))
>>>     writer.write(mol)
>>> writer.close()
  • 輸出結(jié)果:比較長年栓,不展示了拆挥,需要的可以自取

3.2.2.批量輸出到.gz

  • 批量輸出到.gz
>>> outf = gzip.open('data/batch.sdf.gz','wt+')
>>> writer = Chem.SDWriter(outf)
>>> for mol in mols:
>>>     writer.write(mol)
>>> writer.close()
>>> outf.close()

3.3.輸出.mol

3.3.1輸出連接表

  • 直接輸出:MolToMolBlock()
>>> m1 = Chem.MolFromSmiles('C1CCC1')
>>> print(Chem.MolToMolBlock(m1))

     RDKit          2D

  4  4  0  0  0  0  0  0  0  0999 V2000
    1.0607    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
...
  4  1  1  0
M  END

3.3.2.輸出到.mol

  • 輸出到文件:MolToMolFile(mol, filename, includeStereo, ...)
    mol:mol對象
    filename:文件名
    includeStereo:立體信息某抓,默認(rèn)True
>>> m1.SetProp('_Name', 'cyclobutane')
>>> Chem.MolToMolFile(m1, 'data/output.mol')

3.4.輸出其他格式:pdb, fasta, xyz...

  • 其他格式大同小異纸兔,不再贅述了,方法如下搪缨,感興趣可自己嘗試
# PDB
>>> Chem.MolToPDBBlock()
>>> Chem.MolToPDBFile()
>>> Chem.PDBWriter()
# FASTA
>>> Chem.MolToFASTA()
# XYZ
>>> Chem.MolToXYZBlock()
>>> Chem.MolToXYZFile()

四食拜、分子可視化

該部分只介紹方法鸵熟,不貼圖了副编,代碼源文件可自行查看

4.1.單個展示

  • 從mol對象到圖片:MolToImage(mol, size, kekulize, wedgeBonds, fitImage, ...)
    mol:mol對象
    size:圖片尺寸流强,默認(rèn)(300, 300)
    kekulize:是否展示kekule形式痹届,默認(rèn)True(True:芳香系統(tǒng)用實線表示,F(xiàn)alse:虛線表示)
    wedgeBonds:是否展示楔形鍵打月,即立體構(gòu)型队腐,默認(rèn)True
>>> from rdkit.Chem import Draw
>>> mol = Chem.MolFromSmiles('C[C@H](O)c1ccccc1')
>>> Draw.MolToImage(mol, size=(150,150), kekulize=True)
  • 在新窗口中展示圖片:ShowMol()
    參數(shù)基本同上
>>> Draw.ShowMol(mol, size=(150,150), kekulize=False)
  • 保存圖片MolToFile(mol, filename, size, kekulize, wedgeBonds, ...)
    參數(shù)基本同上
>>> Draw.MolToFile(mol, 'data/output.png', size=(150, 150))

4.2.批量展示

4.2.1.從DataFrame中展示

  • 從df中展示:FrameToGridImage(frame, column, molsPerRow, subImgSize, legendsCol, ...)
    frame:DataFrame對象
    column:rdkit mol對象所在列
    molsPerRow,:每行顯示的分子數(shù)
    subImgSize:圖片大小
    legendsCol:標(biāo)題所在列
>>> df = pd.read_csv('data/smiles_df.csv')
>>> PandasTools.AddMoleculeColumnToFrame(df,'SMILES','mol',includeFingerprints=True)
>>> PandasTools.FrameToGridImage(df, column='mol', molsPerRow=5, subImgSize=(200,200), legendsCol='Name')

4.2.2.從mol列表中展示

  • 從列表生成分子結(jié)構(gòu):MolsToGridImage(mols, maxMols, molsPerRow, subImgSize, legends, ...)
    部分參數(shù)和上面的一致
    mols:mol對象列表
    maxMols:最多顯示的分子數(shù)
    molsPerRow,:每行顯示的分子數(shù)
    subImgSize:圖片大小
    legends:圖題
>>> mols = df.mol.tolist()
>>> legends = df.Name.tolist()
>>> Draw.MolsToGridImage(mols, maxMols=2, molsPerRow=2, subImgSize=(300,300), legends=legends)  

4.3. 3D展示

  • 轉(zhuǎn)換3D時,為了得到靠譜的三維構(gòu)象奏篙,一般先加氫:AddHs(mol)
  • 通過距離幾何算法計算3D坐標(biāo):EmbedMolecule(mol, randomSeed, ...)
    mol:mol對象
    randomSeed:隨機種子
  • 轉(zhuǎn)換完后再進行一步力場優(yōu)化柴淘,比如MMFF94:MMFFOptimizeMolecule(mol)
>>> m3d = Chem.MolFromSmiles('CNC(=O)N(N(CCCl)S(C)(=O)=O)S(C)(=O)=O')
>>> m3d = Chem.AddHs(m3d)
>>> AllChem.EmbedMolecule(m3d, randomSeed=3)
>>> AllChem.MMFFOptimizeMolecule(m3d)
>>> Draw.MolToImage(m3d, size=(250,250))

本文參考自rdkit官方文檔
代碼及源文件在這里秘通。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末为严,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肺稀,更是在濱河造成了極大的恐慌第股,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件话原,死亡現(xiàn)場離奇詭異夕吻,居然都是意外死亡,警方通過查閱死者的電腦和手機繁仁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門涉馅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人黄虱,你說我怎么就攤上這事控漠。” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵盐捷,是天一觀的道長偶翅。 經(jīng)常有香客問我,道長碉渡,這世上最難降的妖魔是什么聚谁? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮滞诺,結(jié)果婚禮上形导,老公的妹妹穿的比我還像新娘。我一直安慰自己习霹,他們只是感情好朵耕,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淋叶,像睡著了一般阎曹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上煞檩,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天处嫌,我揣著相機與錄音,去河邊找鬼斟湃。 笑死熏迹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凝赛。 我是一名探鬼主播注暗,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼墓猎!你這毒婦竟也來了捆昏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤陶衅,失蹤者是張志新(化名)和其女友劉穎屡立,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搀军,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡膨俐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了罩句。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焚刺。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖门烂,靈堂內(nèi)的尸體忽然破棺而出乳愉,到底是詐尸還是另有隱情兄淫,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布蔓姚,位于F島的核電站捕虽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏坡脐。R本人自食惡果不足惜泄私,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望备闲。 院中可真熱鬧晌端,春花似錦、人聲如沸恬砂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泻骤。三九已至漆羔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞪讼,已是汗流浹背钧椰。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工粹断, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留符欠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓瓶埋,卻偏偏與公主長得像希柿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子养筒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容