探究
实验室
计算
公开
RDKit使用例子合集
化学信息学与智能产品工程
化学信息学与智能产品工程
张磊
更新于 2025-04-15
推荐镜像 :leiz-dlut:chem
推荐机型 :c2_m4_cpu
赞 2
1
安装RDKit(注释掉了)
1. 对分子SMILES正则化
2. 计算分子指纹
(1)RDKit (Topological) Fingerprints
(2)MACCS Fingerprints
(3) Morgan Fingerprints
3. 计算分子相似性
4. 分子的读写操作及绘制
5. 获得分子结构信息
6. 子结构搜索
7. 子结构操作
8. 计算分子性质
总结

需要加入以下项目:bohrium.dp.tech/projects/share/455831

镜像:自定义镜像->leiz-dlut:chem

这段代码展示了使用 RDKit(一个用于化学信息学和分子建模的开源工具包)进行分子操作的常见功能,包括 SMILES 正则化、指纹计算、相似性分析、结构读写、结构信息提取、子结构搜索、子结构操作和分子性质计算。

安装RDKit(注释掉了)

代码
文本
[16]
#!pip install rdkit
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: rdkit in /opt/mamba/lib/python3.10/site-packages (2024.9.6)
Requirement already satisfied: numpy in /opt/mamba/lib/python3.10/site-packages (from rdkit) (1.24.2)
Requirement already satisfied: Pillow in /opt/mamba/lib/python3.10/site-packages (from rdkit) (10.4.0)
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
代码
文本
[17]
from rdkit import Chem
代码
文本

1. 对分子SMILES正则化

功能:将分子结构转换为规范的SMILES字符串

输出SMILES:MolToSmiles(mol, isomericSmiles, kekuleSmiles, canonical, ...)

  • kekuleSmiles:默认False,不使用kekule时:脂肪族碳用"C"表示,芳香族用"c"表示
  • isomericSmiles:默认True,区分同分异构体("@"表示手性,""和"/"表示顺反异构)
  • canonical:默认True,输出正则化SMILES
代码
文本
[18]
m = Chem.MolFromSmiles('C1=CC=CC=C1CO')
print(Chem.MolToSmiles(m, kekuleSmiles = False, canonical = True))
OCc1ccccc1
代码
文本

2. 计算分子指纹

分子指纹用于将分子结构转换为数值向量,便于后续的相似性计算或机器学习建模。

(1)RDKit (Topological) Fingerprints

特点:基于分子的拓扑结构(原子类型、键类型、环等)生成二进制指纹。

代码
文本
[19]
ms = [Chem.MolFromSmiles('CCOC'), Chem.MolFromSmiles('CCO'), Chem.MolFromSmiles('COC')]
fps = [Chem.RDKFingerprint(x) for x in ms]
print(fps)
[<rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7f50d2f8cac0>, <rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7f50d2f8cb30>, <rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7f50d2f8cba0>]
代码
文本

(2)MACCS Fingerprints

特点:预定义的 166 个特征,用于标记特定子结构的存在(如苯环、羟基等)。

代码
文本
[20]
from rdkit.Chem import MACCSkeys

fps = [MACCSkeys.GenMACCSKeys(x) for x in ms]
print(fps)
[<rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7f50d2f8f840>, <rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7f50d0033370>, <rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7f50d0031700>]
代码
文本

(3) Morgan Fingerprints

特点:基于原子周围的局部结构(半径控制范围),常用于分子相似性分析。

代码
文本
[21]
from rdkit.Chem import AllChem

m1 = Chem.MolFromSmiles('Cc1ccccc1')
fp1 = AllChem.GetMorganFingerprint(m1, 2)
print(fp1)
<rdkit.DataStructs.cDataStructs.UIntSparseIntVect object at 0x7f50d0031850>
[12:56:16] DEPRECATION WARNING: please use MorganGenerator
代码
文本

3. 计算分子相似性

使用 谷本系数(Tanimoto Similarity)衡量两个指纹的相似性(范围0-1,1表示完全相同)。

谷本相似度(参考https://blog.csdn.net/weixin_52812620/article/details/126692248)

代码
文本
[22]
from rdkit import DataStructs

fpgen = AllChem.GetRDKitFPGenerator()
fps = [fpgen.GetFingerprint(x) for x in ms]
print(DataStructs.TanimotoSimilarity(fps[0], fps[1]))
print(DataStructs.TanimotoSimilarity(fps[0], fps[2]))
print(DataStructs.TanimotoSimilarity(fps[1], fps[2]))
0.6
0.4
0.25
代码
文本

绘制相似性地图(https://greglandrum.github.io/rdkit-blog/posts/2020-01-03-similarity-maps-with-new-drawing-code.html)

可视化两个分子中对相似性贡献最大的子结构(颜色越深表示贡献越大)。

代码
文本
[23]
from rdkit.Chem import Draw
from rdkit.Chem.Draw import SimilarityMaps
import io
from PIL import Image

def show_png(data):
bio = io.BytesIO(data)
img = Image.open(bio)
return img

d = Draw.MolDraw2DCairo(400, 400)
_, maxWeight = SimilarityMaps.GetSimilarityMapForFingerprint(ms[2], ms[0],
lambda m, i: SimilarityMaps.GetMorganFingerprint(m, i, radius=2, fpType='bv'),
draw2d=d)
d.FinishDrawing()
show_png(d.GetDrawingText())
[12:56:16] DEPRECATION WARNING: please use MorganGenerator
[12:56:16] DEPRECATION WARNING: please use MorganGenerator
代码
文本

4. 分子的读写操作及绘制

代码
文本
[24]
molecule1 = Chem.MolFromSmiles('CC(C)OC(=O)C(C)NP(=O)(OCC1C(C(C(O1)N2C=CC(=O)NC2=O)(C)F)O)OC3=CC=CC=C3')
molecule2 = Chem.MolFromInchi('InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12)')
Draw.MolToImage(molecule1, size=(300,300), kekulize=True)
代码
文本
[25]
SMILES = Chem.MolToSmiles(molecule2)
print(SMILES)
CC(=O)Oc1ccccc1C(=O)O
代码
文本
[26]
INCHI = Chem.MolToInchi(molecule1)
print(INCHI)
InChI=1S/C22H29FN3O9P/c1-13(2)33-19(29)14(3)25-36(31,35-15-8-6-5-7-9-15)32-12-16-18(28)22(4,23)20(34-16)26-11-10-17(27)24-21(26)30/h5-11,13-14,16,18,20,28H,12H2,1-4H3,(H,25,31)(H,24,27,30)
[12:56:16] WARNING: Omitted undefined stereo

代码
文本
[27]
MOL = Chem.MolToMolBlock(molecule1)
print(MOL)
代码
文本

5. 获得分子结构信息

功能:遍历分子中的原子和键,获取基本结构信息(用于结构分析或自定义算法)。

代码
文本
[ ]
smi = 'CC(C)OC(=O)C(C)NP(=O)(OCC1C(C(C(O1)N2C=CC(=O)NC2=O)(C)F)O)OC3=CC=CC=C3'
mol = Chem.MolFromSmiles(smi)
atoms = mol.GetAtoms()

print(type(atoms))
for atom in atoms:
print(atom.GetSymbol())
代码
文本
[ ]
bonds = mol.GetBonds()
print(type(bonds))
for bond in bonds:
print(bond.GetBondType())
代码
文本

6. 子结构搜索

代码
文本
[ ]
m = Chem.MolFromSmiles('c1ccccc1OC')
patt = Chem.MolFromSmarts('OC')
flag = m.HasSubstructMatch(patt)
if flag:
print('molecule m contains group -OCH3')
else:
print('molecule m doesn\'t contain group -OCH3')

from rdkit.Chem.Draw import rdMolDraw2D

d = rdMolDraw2D.MolDraw2DCairo(250, 200)
d.drawOptions().addAtomIndices = True
d.DrawMolecule(m)
d.FinishDrawing()
show_png(d.GetDrawingText())
代码
文本
[ ]
m = Chem.MolFromSmiles('c1ccc(OC)cc1OC')
patt = Chem.MolFromSmarts('OC')
flag = m.HasSubstructMatch(patt)
if flag:
atomids = m.GetSubstructMatches(patt)
print('matched atom id: ', atomids)
else:
print('molecule m doesn\'t contain group -OCH3')

d = rdMolDraw2D.MolDraw2DCairo(250, 200)
d.drawOptions().addAtomIndices = True
d.DrawMolecule(m)
d.FinishDrawing()
show_png(d.GetDrawingText())
代码
文本

7. 子结构操作

删除子结构

代码
文本
[ ]
m = Chem.MolFromSmiles('c1ccccc1OC')
patt = Chem.MolFromSmarts('OC')
m2 = AllChem.DeleteSubstructs(m, patt)
mols = [m, m2]

from IPython.display import SVG

d = rdMolDraw2D.MolDraw2DSVG(600, 150, 300, 150)
d.DrawMolecules(mols)
d.FinishDrawing()
SVG(d.GetDrawingText())
代码
文本

替换子结构

代码
文本
[ ]
m = Chem.MolFromSmiles('COc1c(Br)cccc1OC')
patt = Chem.MolFromSmarts('OC')
repsmis = ['F', 'Cl', 'Br', 'O']
mols = []
mols.append(m)
for r in repsmis:
rep = Chem.MolFromSmarts(r)
res = AllChem.ReplaceSubstructs(m, patt, rep)
mols.extend(res)
smis = [Chem.MolToSmiles(mol) for mol in mols]

d = rdMolDraw2D.MolDraw2DSVG(300, 300, 100, 100)
d.DrawMolecules(mols, legends=smis)
d.FinishDrawing()
SVG(d.GetDrawingText())
代码
文本

8. 计算分子性质

代码
文本
[ ]
from rdkit.Chem import Descriptors

m = Chem.MolFromSmiles('c1ccccc1C(=O)O')
tpsa_m = Descriptors.TPSA(m)
logp_m = Descriptors.MolLogP(m)
AllChem.ComputeGasteigerCharges(m)
charge_atm0 = float(m.GetAtomWithIdx(0).GetProp('_GasteigerCharge'))

print('the TPSA of m is: ', tpsa_m)
print('the logP of m is: ', logp_m)
print('the gasteigerCharge of the first atom: ', charge_atm0)
代码
文本

常用描述符:用于 ADMET 预测、QSAR 建模等,帮助理解分子的物理化学性质。

代码
文本

总结

这段代码涵盖了 RDKit 的核心功能,从分子表示(SMILES/InChI)到结构分析(指纹、子结构搜索)、性质计算,适用于化学信息学中的基础任务(如分子相似性筛选、结构修饰、性质预测)。RDKit 的灵活性和丰富的 API 使其成为计算化学和药物发现的重要工具。

代码
文本
化学信息学与智能产品工程
化学信息学与智能产品工程
已赞2