目錄
- 一、簡(jiǎn)介
- 二、讀取分子
- 1.讀取SMILES/SMARTS
- 2.讀取.sdf
- 3.讀取.mol
- 4.讀取.mol2
- 5.讀取其他格式
- 三、輸出分子
- 1.輸出SMILES/SMARTS
- 2.輸出.sdf
- 3.輸出.mol
- 4.讀取其他格式
- 四、分子可視化
- 1.單個(gè)展示
- 2.批量展示
- 3.3D展示
一、簡(jiǎn)介
讓計(jì)算機(jī)識(shí)別分子結(jié)構(gòu)是計(jì)算化學(xué)碼農(nóng)的必備技能,也是對(duì)分子進(jìn)行后續(xù)操作的基礎(chǔ)。本文整理和總結(jié)了rdkit進(jìn)行讀取、輸出和可視化的一些方法,包含對(duì)SMILES、SDF、MOL、MOL2、CSV等文件的處理,以及分子的結(jié)構(gòu)展示。
二、讀取分子
2.1.讀SMILES/SMARTS
2.1.1.直接讀字符串
-
從SMILES/SMARTS直接讀取
很簡(jiǎn)單了,不必多說(shuō)
>>> 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.文本批量讀取
-
從文本批量讀?。篠milesMolSupplierFromText()
參數(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對(duì)象
smilesCol:SMILES所在列
molCol:新列名,將存放產(chǎn)生的rdkit mol對(duì)象
includeFingerprints:是否生成指紋 - 順便計(jì)算下分子量: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里批量讀?。篠DMolSupplier(fileName, sanitize, removeHs, strictParsing)
fileName:文件名
sanitize:檢查化合價(jià),計(jì)算芳香性、共軛、雜化、kekule,默認(rèn)True
removeHs:是否隱藏氫原子,默認(rèn)True
strictParsing:是否使用嚴(yán)格模式進(jì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里讀?。篗olFromMolFile(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時(shí):脂肪族碳用"C"表示(大寫(xiě)),芳香族用"c"表示(小寫(xiě))
isomericSmiles:默認(rèn)True,區(qū)分同分異構(gòu)體("@"表示手性,"\"和"/"表示順?lè)串悩?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ī)則的芳香體系中,通過(guò)使用雙鍵代替小寫(xiě)的碳原子來(lái)表示芳香性
4N+2規(guī)則:也叫Hueckel規(guī)則,在閉環(huán)共軛體系中,當(dāng)π電子數(shù)為4n+2時(shí),才具有芳香性
>>> 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個(gè)π電子,碳各提供1個(gè),總數(shù)為6,屬于芳香系統(tǒng)
3.1.3.設(shè)置立體參數(shù)
-
不區(qū)分同分異構(gòu)體
通過(guò)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:是否寫(xiě)入表頭,默認(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及屬性,通過(guò)以下函數(shù)進(jìn)行操作:
mol.GetPropNames(),查看分子屬性列表
mol.GetProp(),獲取相應(yīng)屬性
mol.SetProp(key, val),新增屬性名key、對(duì)應(yīng)屬性值val
writer.SetProps(),設(shè)置哪些屬性要輸出以輸出分子量和LogP為例
使用Descriptors計(jì)算屬性,并添加
>>> 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()
這個(gè)也不多說(shuō)了
>>> 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é)果:比較長(zhǎng),不展示了,需要的可以自取。
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對(duì)象
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.單個(gè)展示
-
從mol對(duì)象到圖片:MolToImage(mol, size, kekulize, wedgeBonds, fitImage, ...)
mol:mol對(duì)象
size:圖片尺寸,默認(rèn)(300, 300)
kekulize:是否展示kekule形式,默認(rèn)True(True:芳香系統(tǒng)用實(shí)線表示,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對(duì)象
column:rdkit mol對(duì)象所在列
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對(duì)象列表
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時(shí),為了得到靠譜的三維構(gòu)象,一般先加氫:AddHs(mol)
-
通過(guò)距離幾何算法計(jì)算3D坐標(biāo):EmbedMolecule(mol, randomSeed, ...)
mol:mol對(duì)象
randomSeed:隨機(jī)種子 - 轉(zhuǎn)換完后再進(jìn)行一步力場(chǎng)優(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))