171

RDKit:化学信息学项目的事实标准工具

RDKit 是开源化学信息学的事实标准:读写分子、指纹、描述符、子结构、构象、绘图都靠它。这篇给出可直接运行的代码骨架、必须知道的坑(分子标准化、指纹参数、构象随机性),以及把它嵌进生产流程的方式。

RDKit 是开源化学信息学库,BSD 许可,2006 年由 Greg Landrum 开源,如今几乎是所有 AI 制药流程的地基:你用的 DeepChem、Chemprop、Datamol、REINVENT 底下都是 RDKit 在读分子、算指纹、做标准化。学会它,等于拿到化学信息学的通用语言。

安装

pip install rdkit            # 官方 wheel,最省事
conda install -c conda-forge rdkit   # 需要与 conda 生态混用时
python -c "from rdkit import Chem; print(Chem.__doc__ is not None)"

pip install rdkit 的 wheel 已包含编译好的 C++ 后端,不再需要历史上那套 rdkit-pypi 折腾。若要用 rdkit.Chem.Draw 出图,另需 Pillow;要在 Jupyter 里画分子,加 from rdkit.Chem.Draw import IPythonConsole

五个最常用的能力块

能力 入口 典型用途
读写 Chem.MolFromSmiles / SDMolSupplier / MolToSmiles SMILES、SDF、MOL2、PDB 互转
指纹 rdFingerprintGenerator 相似性检索、聚类、ML 特征
描述符 Descriptors / rdMolDescriptors MW、LogP、TPSA、HBD/HBA
子结构 Chem.MolFromSmarts + HasSubstructMatch PAINS / Brenk 过滤、骨架匹配
构象 AllChem.EmbedMultipleConfs 对接、3D 描述符、形状比较

能直接跑的骨架

from rdkit import Chem
from rdkit.Chem import Descriptors, rdFingerprintGenerator, DataStructs

smis = ["CC(=O)Oc1ccccc1C(=O)O", "CN1C=NC2=C1C(=O)N(C)C(=O)N2C", "bad_smiles"]
mols = [Chem.MolFromSmiles(s) for s in smis]
mols = [m for m in mols if m is not None]        # 解析失败返回 None,必须过滤

gen = rdFingerprintGenerator.GetMorganGenerator(radius=2, fpSize=2048)
fps = [gen.GetFingerprint(m) for m in mols]
print(DataStructs.TanimotoSimilarity(fps[0], fps[1]))

for m in mols:
    print(Chem.MolToSmiles(m), round(Descriptors.MolWt(m), 1),
          round(Descriptors.MolLogP(m), 2), round(Descriptors.TPSA(m), 1))

注意 radius=2 的 Morgan 指纹对应文献里的 ECFP4(直径 = 2×半径),这个换算几乎是新手必踩的一个坑。新代码请用 rdFingerprintGenerator,老接口 AllChem.GetMorganFingerprintAsBitVect 已被官方标记为 deprecated。

四个真实会咬人的坑

  • 解析失败静默返回 NoneMolFromSmiles 遇到非法 SMILES 不抛异常而是返回 None,不过滤会在下游炸得莫名其妙。批量处理时先统计失败率。
  • 不标准化就比不了:同一化合物的盐型、互变异构、电荷写法不同,指纹就不同。用 rdkit.Chem.MolStandardize.rdMolStandardizeCleanup / FragmentParent / Uncharger 先归一,再算相似性或喂模型。
  • 构象生成带随机性EmbedMultipleConfs 默认随机种子,同一分子两次跑出的坐标不同。做可复现实验必须显式传 randomSeed=0xf00d
  • LogP 是计算值不是实测值Descriptors.MolLogP 是 Crippen 方法的估算,与实测 LogD 常有 1 个 log 单位以上偏差,只适合排序和粗筛,不能当实验数据用。

工程化建议

  • 大库处理用 MultithreadedSDMolSupplier,或把标准化写成纯函数配 multiprocessing;RDKit 的 Mol 对象可以 pickle。
  • 把「标准化 → 去重 → 指纹」固化成一个内部函数库并锁死 RDKit 版本号:不同版本的标准化行为有过变化,会让历史模型的特征对不上。
  • 指纹入库存 bit 串或稀疏索引,不要每次重算;相似性检索量大时上 chemfp 或数据库侧的化学扩展。

上手提示

  • 先过一遍官方 Getting Started 建立 Mol / Atom / Bond 的对象模型概念,再用 Cookbook 按任务查代码,比通读文档快得多;
  • 把「解析 → 标准化 → 指纹 → 描述符」写成自己的一个模块,之后所有项目复用;
  • 记住 ECFP4 = radius=2,构象生成要固定随机种子,LogP 只是估算值;
  • RDKit 用熟,化学信息学的一半就通了——后面的框架都只是它的封装。

延伸资源