第3章:描述符计算工具上手

做ADMET分析,第一步永远是算描述符。没有描述符,后面PCA、建模全是空中楼阁。

这一章,我带你搞定四个主流工具:RDKit、OpenBabel、Mordred、PaDEL-Descriptor。这几个工具,我一个一个用过很多年,有顺手的地方,也有踩过的坑。咱们不整那些花里胡哨的,直接说怎么装、怎么用。

本章核心纲要:描述符计算工具选型与实操。
重点关注:安装避坑、命令行用法、Python接口调取、输出格式统一。

3.1 RDKit —— 我第一个信任的描述符引擎

RDKit,C++底层,Python接口,工业级稳定。我个人习惯把所有分子标准化操作都丢给它做。

3.1.1 安装

推荐用conda安装,省心。pip版本依赖太乱,我曾经卡在Boost版本冲突上卡了一下午。

conda create -n rdkit-env python=3.9
conda activate rdkit-env
conda install -c conda-forge rdkit

安装完验证一下:

python -c "from rdkit import Chem; print(Chem.MolFromSmiles('CCO').GetNumAtoms())"

能输出3就没问题。

3.1.2 基本使用

读分子、写分子、算描述符。三步走。

from rdkit import Chem
from rdkit.Chem import Descriptors

mol = Chem.MolFromSmiles('c1ccccc1')
# 算logP
logp = Descriptors.MolLogP(mol)
# 算分子量
mw = Descriptors.MolWt(mol)
print(logp, mw)
小技巧:RDKit内置了200多个描述符,用Descriptors.descList可以列出全部。我用它批量建过一万个分子的特征矩阵,速度很快。

3.2 OpenBabel —— 处理格式转换的老兵

OpenBabel不是专门算描述符的,它是格式转换神器。但我做ADMET管线时,经常用它做中间环节。

3.2.1 安装

Linux下直接apt或者conda:

conda install -c conda-forge openbabel

或者从源码编译:

git clone https://github.com/openbabel/openbabel.git
cd openbabel
cmake -B build -DCMAKE_INSTALL_PREFIX=/usr/local
cmake --build build -j4
sudo cmake --install build
注意:编译时记得开启Python绑定,否则只能命令行用。我刚开始编译时忘了开-DPYTHON_BINDINGS=ON,又重编了一次。

3.2.2 基本使用

命令行转格式是最常见的:

obabel input.sdf -O output.smi
obabel input.smi -O output.mol2 --gen3d

Python接口算个简单描述符:

import openbabel
from openbabel import OBDescriptor, OBMol

mol = OBMol()
mol.ParseSmiles('CCO')
desc = OBDescriptor.FindType('logP')
print(desc.Predict(mol))

嗯,OpenBabel的描述符数量不如RDKit多,但胜在格式兼容性好。SDF、MOL2、PDB,它都能吃。

3.3 Mordred —— 一个极快的Python描述符库

Mordred,纯Python实现,但速度不慢。它继承了RDKit的分子对象,但算描述符时更快。为什么?因为它用了向量化计算。

3.3.1 安装

pip install mordred

就这么简单。但注意它依赖RDKit,所以RDKit要先装好。

3.3.2 基本使用

from rdkit import Chem
from mordred import Calculator, descriptors

calc = Calculator(descriptors)
mol = Chem.MolFromSmiles('c1ccccc1')
result = calc(mol)

# 转成pandas DataFrame
df = result.as_dataframe()
print(df.head())

Mordred能算1800多个描述符,输出直接就是DataFrame格式,做PCA前几乎不用再处理。

推荐场景:当你需要大量二维描述符(如2000个分子、1800维特征)时,Mordred是首选。我去年做的一个化合物库筛选,就是用Mordred三分钟算完了全部描述符。

3.4 PaDEL-Descriptor —— 历史悠久的Java工具

PaDEL-Descriptor是新加坡国立大学开发的,Java写的,图形界面和命令行都有。它支持1875个描述符,包含1D、2D、3D。

3.4.1 下载与运行

需要Java Runtime Environment 8以上。

# 从官网下载PaDEL-Descriptor.jar
java -jar PaDEL-Descriptor.jar

你会看到一个GUI界面。

命令行模式适合批量处理:

java -jar PaDEL-Descriptor.jar -dir ./input_sdf -file ./output.csv 
     -descriptortypes ./descriptor_list.xml -retainorder -removesalt
     -standardizenitro -detectaromaticity
个人建议:用-descriptortypes参数指定描述符子集,可以控制输出列数,避免生成太大的CSV。

3.4.2 描述符类型选择

PaDEL支持按类别筛选。我通常只选“全部2D描述符”,因为3D描述符需要构象搜索,太慢。

它的输出CSV长这样:

Name,MW,ALogP,AMR,nAcid,nBase,...
mol1,180.16,2.56,54.32,1,2,...
mol2,160.21,1.98,48.76,0,1,...

第一列是分子名,之后全是描述符。这个格式跟RDKit的DataFrame可以直接合并。

3.5 四个工具该怎么选?

工具 语言 安装难度 描述符数量 输出能力 计算效率
RDKit C++/Python 低(conda) ~200 Python对象/CSV ★★★★
OpenBabel C++/Python/CLI 中(需编译) ~50 SDF/SMILES/MOL2 ★★★
Mordred Python 低(pip) ~1800 DataFrame ★★★★★
PaDEL Java 低(JRE) ~1875 CSV/SDF ★★★

说白了,看场景:

  • 快速脚本实验:RDKit。200个描述符够用了。
  • 格式转换为主:OpenBabel。尤其是处理供应商提供的SDF。
  • 大规模二维描述符:Mordred。1800维,速度还快。
  • 需要标准化描述符:PaDEL。它的输出在文献中被广泛引用。

3.6 整体工具选型逻辑

这一章的内容,说白了就一句话:选对工具,少踩坑。

我画了个图,帮你理清思路。

描述符计算工具选型流程图 输入分子文件 是否需要格式转换? OpenBabel 直接计算描述符 描述符计算工具选择 RDKit Mordred PaDEL 提示:多工具联合使用效果最好。 例如:OpenBabel转格式 → Mordred算描述符 → RDKit做可视化。

你可以把这个图当作参考。说实话,我现在的日常工作流程里,这四个工具都用得到。

3.7 工具联合使用的实战建议

我自己有一个用了两年的脚本,把这四个工具串在了一起。核心逻辑是这样的:

  1. 用OpenBabel把异源格式(MOL2、PDB)转成规范的SDF。
  2. 用RDKit做分子标准化(去盐、加氢、芳香化)。
  3. 用Mordred批量算1800维描述符,输出DataFrame。
  4. 用PaDEL算一些Mordred没有的指纹描述符,最后合并。

为什么要合并?因为不同工具的描述符家族不一样,互补性强。

避坑:千万别直接合并列名相同的描述符。不同工具对同一个描述符的定义可能不一样,比如logP。我建议对每个工具的列名加前缀,比如RDKit_LogP、Mordred_LogP、PaDEL_ALogP。不然PCA时你会发现同一个描述符被重复计算了。

好了,这一章的核心就是这四个工具的安装和使用。先别急着跑PCA,先把描述符算利索了。下一阶段我们开始聊数据清洗和标准化,那是PCA之前的关键一步。