3. 常用分子描述符计算工具介绍

做ADMET预测,分子描述符就是我们的“弹药”。弹药好不好,直接决定了模型的上限。我今天就跟你聊聊三个最常用的计算工具:RDKit、Mordred和PaDEL。这三个我都反复用过,各有各的脾气。

3.1 RDKit——开源社区的标配

RDKit,说白了就是化学信息学界的“瑞士军刀”。它不光是计算描述符,做分子编辑、子结构搜索、指纹生成,样样都行。我个人习惯把它当作主力工具,因为它跟Python生态结合得太紧密了。

安装很简单:

conda install -c conda-forge rdkit

或者

pip install rdkit-pypi

我个人更推荐用conda装,依赖处理得更干净。

RDKit能算的描述符种类很全,从基础的分子量、LogP,到复杂的电荷分布、拓扑极性表面积(TPSA),都支持。来看个最简单的例子:

from rdkit import Chem
from rdkit.Chem import Descriptors

smiles = "CC(=O)OC1=CC=CC=C1C(=O)O"
mol = Chem.MolFromSmiles(smiles)

mw = Descriptors.MolWt(mol)
logp = Descriptors.MolLogP(mol)
hbd = Descriptors.NumHDonors(mol)
hba = Descriptors.NumHAcceptors(mol)

print(f"分子量: {mw:.2f}")
print(f"LogP: {logp:.2f}")
print(f"氢键供体: {hbd}")
print(f"氢键受体: {hba}")

输出结果:

分子量: 180.16
LogP: 1.45
氢键供体: 1
氢键受体: 4

RDKit的核心优势——它背后有超过1000个描述符。大部分是2D描述符,也就是只依赖分子图结构和原子属性,不需要3D构象。

我的小技巧: 如果你想快速抓几百个描述符做初筛,直接用 Descriptors.descList 这个字典,里面列出了所有可用的描述符名称和对应的函数名,省去自己手打每个函数的麻烦。

我在项目中遇到过一个问题:RDKit对某些大型分子或带特殊元素的分子处理会报错。嗯,这时候可以先做一下分子合法性检查,或者用异常捕获跳过。

3.2 Mordred——更全面的“百科全书”

如果你觉得RDKit的200个描述符不够用,那Mordred就是答案。Mordred是基于RDKit开发的扩展包,它把描述符数量推到了1613个。这数字看着吓人,但其实里面有很多是不同配置下的变体。

安装:

pip install mordred

用法跟RDKit很像,不过返回的是一个专门的数据结构:

from rdkit import Chem
from mordred import Calculator, descriptors

smiles = "CC(=O)OC1=CC=CC=C1C(=O)O"
mol = Chem.MolFromSmiles(smiles)

calc = Calculator(descriptors, ignore_3D=True)
results = calc(mol)

# 转换数据框
import pandas as pd
df = results.to_dataframe()
print(df.iloc[:, :5])

Mordred的描述符分成好几个大类,我整理了个表格方便你对照:

类别 数量 用途举例
分子组成 ~50 原子数、键数、环数、分子量
拓扑指数 ~400 Wiener指数、Zagreb指数、Balaban指数
电性拓扑状态指数 ~140 EState指数、原子极性
分子性质 ~30 LogP、TPSA、折射率
指纹描述符 ~60 MACCS指纹、Morgan指纹位计数
3D构象描述符 ~500 惯性矩、分子体积、溶剂可及面积
注意: 上面表格里的3D构象描述符需要你提供分子的3D构象。我建议在做ADMET快速筛选时先关掉3D计算,也就是加 ignore_3D=True,不然计算量会暴涨。

Mordred有个很实用的功能——它能告诉你每个描述符的计算状态。有些描述符对特定分子可能算不出来,这时候Mordred会在那个位置标记为NaN。我曾经因为没注意到这一点,导致后面建模时报错,折腾了半天才发现。

3.3 PaDEL——Java生态的王者

PaDEL是新加坡国立大学开发的Java版描述符计算工具。它在药化领域很流行,尤其是跟其他Java工具配合的时候。PaDEL支持1875个1D/2D描述符和431个3D描述符。

PaDEL不是Python库,是一个独立的软件包。你用的时候需要通过命令行或者Python的子进程调用来跑。

命令行操作方式:

java -jar PaDEL-Descriptor.jar \
    -dir input.sdf \
    -descriptortypes descriptors.xml \
    -fingerprints \
    -retainorder \
    -removesalt \
    -standardizenitro \
    -detectaromaticity \
    -out output.csv

参数解释:

  • -dir:输入文件,可以是SDF或SMILES文件
  • -descriptortypes:描述符配置XML文件
  • -fingerprints:启用指纹计算
  • -retainorder:保持输入顺序
  • -removesalt:移除盐离子
  • -standardizenitro:标准化硝基
  • -detectaromaticity:自动检测芳香性

在Python里调用PaDEL,我习惯用subprocess包:

import subprocess
import os

padel_path = "/path/to/PaDEL-Descriptor.jar"
input_file = "molecules.sdf"
output_file = "descriptors.csv"

cmd = [
    "java", "-jar", padel_path,
    "-dir", input_file,
    "-descriptortypes", "PubchemFingerprint.xml",
    "-retainorder",
    "-removesalt",
    "-standardizenitro",
    "-detectaromaticity",
    "-out", output_file
]

subprocess.run(cmd, check=True)
print("PaDEL计算完成!")
经验之谈: PaDEL输出的CSV文件列名很长,有些甚至超过Excel的单列字符限制。我建议用Pandas直接读取,不要用Excel打开来编辑,不然列名会被截断。

3.4 三个工具的对比选择

你可能会问:这三个工具到底选哪个?我的建议是这样的:

工具 语言 描述符数量 适用场景
RDKit Python/C++ 200+ 快速原型、小规模项目、教学
Mordred Python 1600+ 高覆盖度筛选、研究性质强的项目
PaDEL Java 1800+ 标准化流程、Java生态、工业级应用

我个人在实际项目中的选择逻辑是这样的:

  1. 起步阶段:先用RDKit的几十个经典描述符,跑通流程
  2. 模型调优:换成Mordred,把描述符扩展到几百个,看看有没有额外的提升空间
  3. 最终验证:用PaDEL复算一遍,确保结果在不同工具间可复现
避坑指南: 不同工具对同一个描述符(比如MolLogP)的计算结果可能不完全一致,因为底层的原子参数和方法实现有差异。你千万不要在一个项目里混着用,要么统一用一个工具,要么在建模前对齐好描述符的计算方式。

下面这张图帮你快速理清三个工具的定位:

常用分子描述符计算工具全景 工具选型层 RDKit (Python) Mordred (Python) PaDEL (Java) 描述符数量 200+ 描述符数量 1600+ 描述符数量 1800+ 适用场景 快速原型 / 教学 / 小规模 适用场景 高覆盖度 / 研究性质 适用场景 工业级 / 标准化流程
我的实践总结: 如果你是新手上路,从RDKit开始学是最稳妥的。它的文档质量高,社区活跃,遇到问题你去Stack Overflow上搜,基本都有现成的答案。等你的管线稳定了,再考虑用Mordred做深度扩展。PaDEL适合做生产环境的最终复算,但不建议拿它做日常开发调试。