化学信息学工具:RDKit 安装与基本操作
说实话,在GNN分子特征构建这条路上,RDKit就是你的瑞士军刀。
没有它,后面所有的图构建、特征提取都是空中楼阁。
我早期做分子性质预测时,折腾过各种商业化库,最后还是老老实实回到RDKit。
为啥?开源、社区活跃、功能全,关键还免费。
这一章,我们把它装好,再跑通最基础的分子读写和可视化流程。
别小看这一步,越基础的东西,后面出问题越能救命。
2.1 环境准备:先把RDKit请进你的电脑
安装RDKit,我强烈推荐用conda。
为什么?
RDKit的C++核心和Python接口绑定非常紧,
用pip安装偶尔会踩二进制兼容的坑。
conda直接帮你把所有依赖安好,省心省力。
如果你刚开始,直接在conda里新建一个环境,专门给GNN课程用。
后面装PyTorch Geometric什么的也方便。
好,我们来一步步操作。
第一步:创建并激活conda环境
conda create -n gnn_mol python=3.9
conda activate gnn_mol
第二步:安装RDKit
conda install -c conda-forge rdkit
嗯,这里要注意:conda-forge通道的更新频率很高。
我习惯指定版本,比如:
conda install -c conda-forge rdkit=2023.09.1
第三步:验证是否安装成功
python -c "from rdkit import Chem; print(Chem.__version__)"
如果看到类似 2023.09.1 的输出,恭喜你,安装成功。
我早期调包时最怕conda环境冲突。如果你装的包太多,建议先跑
conda list | grep rdkit 看看。万一版本不对,别硬搞,删环境重来最快。
2.2 分子文件读取:从硬盘到内存
RDKit支持十几种分子文件格式。
我们最常用的就两种:SDF 和 SMILES。
SDF是结构数据文件,里面存的是原子坐标、键信息、甚至自定义属性。
SMILES呢?就是一串字符,比如 CCO 代表乙醇。
别看它短,信息量一点不少。
我在项目中做高通量虚拟筛选时,SDF文件用来存分子的3D构象,SMILES则用来快速获取分子图拓扑。两者配合,效果最好。
2.2.1 从SMILES读取分子
这是入门第一行代码,我打赌你以后天天用:
from rdkit import Chem
mol = Chem.MolFromSmiles('CCO')
print(mol.GetNumAtoms()) # 输出 3
print(mol.GetNumBonds()) # 输出 2
是不是很简单?
但有个坑:MolFromSmiles 如果遇到非法SMILES,会返回 None。
我建议你养成习惯,加个判断:
mol = Chem.MolFromSmiles('这不是合法SMILES')
if mol is None:
print('解析失败,检查SMILES字符串')
2.2.2 从SDF文件读取分子
SDF文件可以存储多个分子,称为一个 SD Mol Supplier。
from rdkit import Chem
supplier = Chem.SDMolSupplier('molecules.sdf')
for mol in supplier:
if mol is not None:
print(mol.GetNumAtoms())
嗯,这里我吃过亏。
有时候SDF文件里某些分子损坏了,supplier 会返回 None。
所以遍历时一定要判空,不然程序直接崩。
2.3 分子写入:从内存到硬盘
读取没问题了,我们再来看看怎么写出去。
2.3.1 写入SMILES
from rdkit import Chem
mol = Chem.MolFromSmiles('CCO')
smiles = Chem.MolToSmiles(mol)
print(smiles) # 输出: CCO
注意:MolToSmiles 可以接受参数,比如 canonical=True 来生成标准SMILES。
我习惯对分子做标准化,方便后面去重。
2.3.2 写入SDF文件
from rdkit import Chem
from rdkit.Chem import AllChem
mol = Chem.MolFromSmiles('CCO')
mol = Chem.AddHs(mol)
AllChem.EmbedMolecule(mol, AllChem.ETKDG())
AllChem.UFFOptimizeMolecule(mol)
writer = Chem.SDWriter('ethanol.sdf')
writer.write(mol)
writer.close()
这段代码做了三件事:加氢、生成3D构象、力场优化。
最后把优化后的分子写进SDF文件。
你打开文件看看,里面会有原子坐标和键信息。
| 文件格式 | 读取方法 | 写入方法 | 主要用途 |
|---|---|---|---|
| SMILES (.smi) | Chem.MolFromSmiles() | Chem.MolToSmiles() | 快速交换、数据库存储 |
| SDF (.sdf) | Chem.SDMolSupplier() | Chem.SDWriter() | 3D构象、属性附加 |
| MOL (.mol) | Chem.MolFromMolFile() | Chem.MolToMolFile() | 单个分子结构数据 |
| PDB (.pdb) | Chem.MolFromPDBFile() | Chem.MolToPDBFile() | 蛋白质-配体复合物 |
2.4 分子可视化:看看分子长什么样
读写了半天,总得看看分子长啥样吧?
RDKit自带的可视化能力很强,而且不需要Jupyter也能生成图像。
2.4.1 2D结构绘制
生成2D图是最常用的操作:
from rdkit import Chem
from rdkit.Chem import Draw
mol = Chem.MolFromSmiles('CCO')
img = Draw.MolToImage(mol, size=(300, 200))
img.save('ethanol_2d.png')
画出来的图像是PNG格式,清晰度不错。
但如果你要做网页展示,我更推荐用SVG:
svg = Draw.MolToSVG(mol, size=(300, 200))
with open('ethanol_2d.svg', 'w') as f:
f.write(svg)
批量生成分子结构图时,我会把SVG直接嵌入HTML页面,这样拿浏览器打开就能看到所有分子的结构,非常直观。
而且SVG是矢量图,缩放不失真。
2.4.2 3D结构展示
3D可视化需要额外安装 py3Dmol 或者 nglview。
但RDKit自身也能导出3D坐标的XML格式:
from rdkit.Chem import AllChem
mol = Chem.MolFromSmiles('CCO')
mol = Chem.AddHs(mol)
AllChem.EmbedMolecule(mol, AllChem.ETKDG())
AllChem.UFFOptimizeMolecule(mol)
# 导出为MolBlock,可被其他可视化工具读取
mb = Chem.MolToMolBlock(mol)
print(mb[:300]) # 打印前300个字符看看
说实话,3D可视化在GNN中不是必须的。
你构建的分子图,本质上用的是原子连接关系和3D距离,不需要你肉眼去看。
不过,调试阶段可视化一下,能帮你快速确认构象是否合理。
2.5 本章小结
我们做了几件很具体的事:
- 装好了RDKit,确保环境没问题
- 从SMILES和SDF读取了分子
- 把分子写回SMILES和SDF文件
- 生成2D结构图,保存为PNG和SVG
这些操作,看起来基础,却是后续所有GNN特征构建的基石。
我当年第一次跑通分子可视化时,看着乙醇的结构图,心里还挺激动的。
嗯,别笑,做分子的人,这点仪式感还是得有。
-
Chem.MolFromSmiles() 是万能入口- 读取文件时务必判空
- SVG可视化适合批量展示,PNG适合报告插图
- 3D构象要加氢+嵌入+优化三步