RDkit:介绍smiles编码,smart编码及摩根指纹(ECFP)
在介紹這三種編碼之前,我們先來簡單介紹一下rdkit中可以識別并相互轉換的數據格式:.smi(即smiles編碼的形式),.mol(即分子圖的形式),.sdf(分子坐標的形式),……這幾種是比較常用的,如果遇到一些不常見的,可以參考rdkit源包中的Chem模塊。
SMILES編碼
SMILES編碼的全稱是:Simplified Molecular-Input Line-Entry System
碼如其名,其實smiles編碼就是一種用文本字符串定義分子的常用模式。SMILES字符串以對化學家來說既簡潔又直觀的方式描述了分子的原子和鍵。
與其他分子表述方法相比smiles編碼有兩個優勢:
1.唯一性:每個SMILES編碼對應唯一一個化學結構,同時每個化學結構對應的SMILES編碼也是唯一的,二者是一一對應的關系。
2.節省空間:SMILES的另一個重要特征是,與大多數其他表示結構的方法相比,它能節省存儲空間。SMILES占用的空間甚至比二進制表減少50%至70%,此外,SMILES的壓縮非常有效。通過Ziv-Lempel壓縮,可將相同數據庫存儲內存減少到其原始大小的27%。
smiles編碼的規則請參考下面這篇博文,在實際操作中,即使你不掌握編碼規則也沒有關系,只要會用rdkit就可以了。
SMILES:一種簡化的分子語言_xk6891的博客-CSDN博客_smile結構一.什么是SMILES SMILES,全稱是Simplified Molecular Input Line Entry System,是一種用于輸入和表示分子反應的線性符號,是一種ASCII編碼,下面看一些例子: SMILES包含的信息可能與一些擴展的源數據表相同,SMILES更適用的主要原因是它是一種語言結構,而不是計算機數據結構。 SMILES是一種真正的語言,雖然只有簡單的詞匯(原子和鍵符號)和少數語法規則。 SMILES結構表示可以反過來用作其他語...https://blog.csdn.net/xk6891/article/details/116380262?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-3-116380262-blog-124738689.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-3-116380262-blog-124738689.pc_relevant_paycolumn_v3&utm_relevant_index=6(注:smiles編碼是可以表示手性異構的)
在rdkit包的Chem模塊中,在擁有分子smiles編碼的前提下,可以通過smiles編碼得到分子的一些理化性質,具體過程見下面代碼展示:
import pandas as pd import rdkit from rdkit import Chem from rdkit import rdBase, Chem from rdkit.Chem import PandasTools, Descriptors, rdMolDescriptors, MolFromSmiles from rdkit.Chem import QED,Lipinski from moses.metrics import SA,mol_passes_filters# 此表格僅一列,為分子的smiles編碼,標題為0 df = pd.read_csv('smiles.csv')# 解析:計算其logP,MW,HBA+HBD,TPSA,NRB df['logP'] = df['0'].apply(lambda x: Descriptors.MolLogP(Chem.MolFromSmiles(x))) df['TPSA'] = df['0'].apply(lambda x: Descriptors.TPSA(Chem.MolFromSmiles(x))) df['MW'] = df['0'].apply(lambda x: Descriptors.MolWt(Chem.MolFromSmiles(x))) df['HBA'] = df['0'].apply(lambda x: rdMolDescriptors.CalcNumLipinskiHBA(Chem.MolFromSmiles(x))) df['HBD'] = df['0'].apply(lambda x: rdMolDescriptors.CalcNumLipinskiHBD(Chem.MolFromSmiles(x)))# 計算QED df['QED'] = df['0'].apply(lambda x:(QED.properties(Chem.MolFromSmiles(x))))# 計算SA df['SA'] = df['0'].apply(lambda x: SA(Chem.MolFromSmiles(x)))SMART編碼
SMART編碼是前面描述的SMILES語言的擴展,可以用來創建查詢。可以將SMART模式看作類似于用于搜索文本的正則表達式(換一種說法就是,smart編碼相當于對smiles編碼的一種模糊搜索)。
SMART編碼一般用于下面幾種情況:
搜索分子數據庫以識別包含特定子結構的分子;
將一組分子排列在一個共同的子結構上,以提高視覺效果;
突出顯示圖中子結構
在計算過程中約束子結構
對于SMART編碼的編碼規則參照其官網,與smiles編碼是一樣的,即使你不掌握編碼規則也沒有關系,只要會用rdkit就可以了。
Daylight>SMARTS Exampleshttps://www.daylight.com/dayhtml_tutorials/languages/smarts/smarts_examples.html#ES_AM下面代碼塊展示一個Smart編碼使用的小例子:
from rdkit import Chem from rdkit.Chem import ChemicalFeatures from rdkit import RDConfig from rdkit.Chem import Draw from rdkit.Chem import AllChem from rdkit.Chem.Pharm2D.SigFactory import SigFactory from rdkit.Chem.Pharm2D import Generate, Gobbi_Pharm2D import os import pandas as pd# 已知一些分子的smiles編碼,可通過rdkit處理得到其smart編碼——下面分別將咪唑和胍基轉換成smart格式 S1 = Chem.MolToSmarts(Chem.MolFromSmiles('C1NCNC1')) S2 = Chem.MolToSmarts(Chem.MolFromSmiles('NC(=N)N')) # 咪唑:[#6]1-[#7]-[#6]-[#7]-[#6]-1;胍基:[#7]-[#6](=[#7])-[#7]# 讀入數據 df = pd.read_csv("smiles_sorted.csv") # smile編碼形式,單列,列title為0 suppl_list = df[0].tolist() suppl_end = [Chem.MolFromSmiles(x) for x in suppl_list]# 篩選胍基及咪唑基的函數 def pharmacophore_smarts(m):'''傳入mol格式列表'''# 定義smartPosIonizable_Guanidine = '[#7]-[#6](=[#7])-[#7]'PosIonizable_Imidazole = '[#6]1-[#7]-[#6]-[#7]-[#6]-1'atomPharma = {}PosIonizable_1 = m.HasSubstructMatch(Chem.MolFromSmarts(PosIonizable_Guanidine)) PosIonizable_2 = m.HasSubstructMatch(Chem.MolFromSmarts(PosIonizable_Imidazole))return PosIonizable_1,PosIonizable_2# 篩選胍基及咪唑基——得到結果的DataFrame表格 result = pd.DataFrame([pharmacophore_smarts(m) for m in suppl_end],columns=['PosIonizable_1','PosIonizable_2'])# 去除不符合條件的數據 result_new = result.drop(result[result.PosIonizable_1 == False].index) result_new = result.drop(result[result.PosIonizable_2 == False].index) result_new.index# 畫出符合條件的分子結構 from rdkit.Chem import Draw draw = [suppl_list[i] for i in result_new.index] mols=[] for m in draw:mol = Chem.MolFromSmiles(m)mols.append(mol) img=Draw.MolsToGridImage(mols,molsPerRow=4,subImgSize=(300,300),legends=['' for x in mols],returnPNG=False) img.save('demo.png')摩根指紋(ECFP)
化學指紋是由1和0組成的向量,表示分子中特定的結構存在或不存在,摩根指紋又叫擴展——連接指紋是一類結合了幾個由用特征的特征化表示。它們可將任意大小的分子轉換成固定長度的向量。這很重要,這很重要,因為許多模型都要求輸入具有完全相同的大小。ECFPs可以接受許多不同大小的分子,并由相同模型使用。ECFPs也很容易比較。利用ECFPs編碼可以通過Tanimoto距離來計算分子相似性。
對摩根指紋的編碼形式及原理感興趣的,可以看下面這兩篇文獻(1.DOI:10.1021/ci9803381; 2.DOI:10.1021/ci100050t)
嘿嘿,我又來了,同樣的話反復啰嗦,即使你不掌握編碼規則也沒有關系,只要會用rdkit就可以了。
下面一部分代碼展示一個ECFP使用的小例子:
import pandas as pd import rdkit from rdkit.Chem import AllChem from rdkit import Chem,DataStructs import seaborn as sns from scipy import stats import matplotlib.pyplot as pltdata = pd.read_csv('moses_qed_props.csv') # 讀入數據為單列的smiles編碼形式 data_1 = data.SMILES.tolist()# 生成摩根指紋函數 def product_fps(data):"""傳入smiles編碼文件列表"""data = [x for x in data if x is not None]data_mols = [Chem.MolFromSmiles(s) for s in data]data_mols = [x for x in data_mols if x is not None]data_fps = [AllChem.GetMorganFingerprintAsBitVect(x,3,2048) for x in data_mols]return data_fps# 計算分子相似度函數 def similar(data):"""傳入smiles編碼文件列表"""fps = product_fps(data)similarity = []for i in range(len(fps)):sims = DataStructs.BulkTanimotoSimilarity(fps[i],fps[:i])similarity.extend(sims)return similarity# 函數調用并打印 fps = product_fps(data_1) print(f'fps:{fps[:20]}') similarity = similar(data_1) print(f'similarity:{similarity[:20]}')(注:與smiles編碼不同,ECFP不具有唯一性)
每周一篇rdkit相關小文章,總結不易,如果對您有幫助,希望能給個贊,多謝。
總結
以上是生活随笔為你收集整理的RDkit:介绍smiles编码,smart编码及摩根指纹(ECFP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux服务器 屏蔽国外IP访问及简单
- 下一篇: HBase常用命令(超全超详细)