在介绍这三种编码之前,让我们简要介绍一下rdkit数据格式可以的数据格式:.smi(即smiles编码形式),.mol(即分子图的形式),.sdf(分子坐标形式),……这些更常用,如果遇到一些不常见的,可以参考rdkit源包中的Chem模块。
SMILES编码全称为:Simplified Molecular-Input Line-Entry System
代码如其名,其实smiles编码是用文字字符串定义分子的常用模式。SMILES字符串以简洁直观的方式描述了化学家分子的原子和键。
与其他分子表达方法相比smiles编码有两个优点:
:每个SMILES编码对应于每个化学结构对应的唯一化学结构SMILES编码也是唯一的,两者是一对应的。
:SMILES另一个重要特点是,与大多数其他表达结构的方法相比,它可以节省存储空间。SMILES此外,占用的空间甚至比二进制表减少50%到70%,SMILES压缩非常有效。Ziv-Lempel压缩可将相同数据库的存储内存降低到原始尺寸的27%。
smiles编码规则请参考以下博客。在实践中,即使你不掌握编码规则,也没关系,只要你能使用它rdkit就可以了。
在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前面描述了编码SMILES语言扩展可用于创建查询。SMART模型被视为类似于搜索文本的正则表达式(换句话说,smart编码相当于对smiles模糊搜索编码)。
SMART编码一般用于以下情况:
搜索包含特定子结构的分子数据库;
在共同的子结构上排列一组分子,以提高视觉效果;
突出显示图中子结构
约束子结构
对于SMART编码规则参照其官方网站smiles编码是一样的,即使不掌握编码规则也没关系,只要能用rdkit就可以了。
化学指纹是由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 plt
data = 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相关小文章,总结不易,如果对您有帮助,希望能给个赞,多谢。