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 | 惯性矩、分子体积、溶剂可及面积 |
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计算完成!")
3.4 三个工具的对比选择
你可能会问:这三个工具到底选哪个?我的建议是这样的:
| 工具 | 语言 | 描述符数量 | 适用场景 |
|---|---|---|---|
| RDKit | Python/C++ | 200+ | 快速原型、小规模项目、教学 |
| Mordred | Python | 1600+ | 高覆盖度筛选、研究性质强的项目 |
| PaDEL | Java | 1800+ | 标准化流程、Java生态、工业级应用 |
我个人在实际项目中的选择逻辑是这样的:
- 起步阶段:先用RDKit的几十个经典描述符,跑通流程
- 模型调优:换成Mordred,把描述符扩展到几百个,看看有没有额外的提升空间
- 最终验证:用PaDEL复算一遍,确保结果在不同工具间可复现
下面这张图帮你快速理清三个工具的定位: