分子片段(molecular fragments)是一组可能具有相关功能的相连的原子组成的。RDKit中包含了大量把分子分解成片段的方法和处理片段的工具。
一、引入所需库
#! /usr/bin/python
# coding: utf-8
import os
from rdkit import Chem
from rdkit import RDConfig
from rdkit.Chem import Draw
from rdkit.Chem import FragmentCatalog
from rdkit.Chem import rdRGroupDecomposition as rdRGD
# from rdkit.Chem.Pharm2D.SigFactory import SigFactory
# from rdkit.Chem.Pharm2D import Generate, Gobbi_Pharm2D
from rdkit.ML import InfoTheory
二、分子片段(molecular fragments)
2.1 分子片段获取
# 获取官能团库
fName = os.path.join(
RDConfig.RDDataDir,
'/Users/zeoy/st/drug_development/st_rdcit/data/FunctionalGroups.txt'
)
# 根据官能团库实例化一个参数器
fparams = FragmentCatalog.FragCatParams(1, 6, fName)
# 查看官能团库中包含的官能团数量
fparams_num = fparams.GetNumFuncGroups()
mols = []
# 查看每个官能团对应的集团
for i in range(fparams_num):
mols.append(fparams.GetFuncGroup(i))
# 可视化官能团库
img = Draw.MolsToGridImage(mols, molsPerRow=8)
img.save(
'/Users/zeoy/st/drug_development/st_rdcit/img/mol39.jpg'
)
根据这份官能团列表,我们就可以分析分子在有多少个官能团
# 传入参数器,创建一个片段存储器,产生的分子片段都会存储在该对象中
fcat = FragmentCatalog.FragCatalog(fparams)
# 创建一个片段生成器,通过该对象生成片段
fcgen = FragmentCatalog.FragCatGenerator()
m = Chem.MolFromSmiles('OCC=CC(=O)O')
# 计算分子片段
fcgen.AddFragsFromMol(m, fcat)
# 查看分子片段数量
num_entries = fcat.GetNumEntries()
# 通过存储器查看片段
print(fcat.GetEntryDescription(0))
print(fcat.GetEntryDescription(1))
# C<-O>C
# C=C<-C(=O)O>
注 :尖括号中的内容 : 表示与片段相连的官能团 , 以上面的结果为例
第0号片段中 , 对应着一个乙基片段 , 该乙基片段与一个羟基相连
第1号片段中 , 对应着一个乙烯片段 , 该乙烯片段与一个羧基相连
关于官能团的详细信息 , 可以通过下述方法获取 :
# 向存储器传入分子片段id , 获取片段中所包含的官能团标号 : GetEntryFuncGroupIds
entries_group_ids = fcat.GetEntryFuncGroupIds(num_entries-1)
print('matched the function group ids is', list(entries_group_ids))
# matched the function group ids is [34, 1]
# 向参数器传入官能团编号,获取官能团对应的mol对象
fg1 = fparams.GetFuncGroup(1)
fg34 = fparams.GetFuncGroup(34)
print(fg1) # <rdkit.Chem.rdchem.Mol object at 0x112b1b8f0>
print('name of group 1', fg1.GetProp('_Name')) # name of group 1 -C(=O)O
print('name of group 34', fg34.GetProp('_Name')) # name of group 34 -O
# 可视化官能团
mols = [fg1, fg34]
img = Draw.MolsToGridImage(mols, molsPerRow=2)
img.save(
'/Users/zeoy/st/drug_development/st_rdcit/img/mol40.jpg'
)
用该方法提取到的片段是层级结构 , 小片段在最底层 , 逐渐合并形成大片段 。