smina 是 AutoDock Vina 的一个分支(fork),由 Koes 组维护。它保留了 Vina 的核心算法,但大幅增强了灵活性——尤其是自定义打分函数与更精细的参数控制。它也是 GNINA(见 099《GNINA 论文精读》)的基础。
相对 Vina 的关键增强
| 能力 | 说明 |
|---|---|
| 自定义打分函数 | 可指定各能量项的权重,或完全自定义 |
| 直接读常见格式 | SDF、MOL2、PDB,不必转 PDBQT |
--autobox_ligand |
用参考配体自动定盒子 |
| 能量项分解输出 | 看到每一项的具体贡献 |
--minimize / --score_only |
只做局部优化或只打分,不搜索 |
| 柔性侧链 | 更方便的指定方式 |
| 批量处理 | 多分子 SDF 直接输入输出 |
三个最实用的功能
# 1) --score_only:只对已有姿势打分,不搜索
# 用途:
# - 给外部方法(DiffDock、Boltz)生成的姿势打分
# - 快速比较不同来源的姿势
# - 计算共晶配体的「基线分数」作为参照
smina -r receptor.pdb -l external_pose.sdf --score_only
# 2) --minimize:只做局部优化
# 用途:
# - 修正深度学习方法生成的物理不合理姿势(见 101)
# - 在保持大致位置的前提下优化几何
smina -r receptor.pdb -l diffdock_pose.sdf \
--minimize --minimize_iters 1000 -o minimized.sdf
# 3) --autobox_ligand:自动定盒子
smina -r receptor.pdb -l ligands.sdf \
--autobox_ligand reference.sdf --autobox_add 6 \
--exhaustiveness 16 --seed 42 -o out.sdf
# 这三个功能组合起来,让 smina 成为
# 「姿势后处理与评估」的通用工具
自定义打分函数
# 查看默认的打分项与权重
smina --print_terms
# 输出类似:
# gauss(o=0,_w=0.5,_c=8)
# gauss(o=3,_w=2,_c=8)
# repulsion(o=0,_c=8)
# hydrophobic(g=0.5,_b=1.5,_c=8)
# non_dir_h_bond(g=-0.7,_b=0,_c=8)
# num_tors_div
# 用自定义权重文件
# custom_scoring.txt:
# -0.035579 gauss(o=0,_w=0.5,_c=8)
# -0.005156 gauss(o=3,_w=2,_c=8)
# 0.840245 repulsion(o=0,_c=8)
# -0.035069 hydrophobic(g=0.5,_b=1.5,_c=8)
# -0.587439 non_dir_h_bond(g=-0.7,_b=0,_c=8)
# 1.923 num_tors_div
smina -r rec.pdb -l lig.sdf --custom_scoring custom_scoring.txt
# 实际用途:
# 1) 针对特定靶点重新拟合权重
# 用该靶点的已知活性数据,优化各项权重
# → 靶点特异的打分函数,富集能力可能显著提升
#
# 2) 强调某类相互作用
# 如果知道该体系氢键特别重要,可以加大氢键项权重
#
# 3) 研究打分函数的行为
# 逐项调整,看哪一项对结果影响最大
「针对特定靶点重新拟合权重」是 smina 最有价值也最少被利用的能力:通用打分函数是对所有靶点的折中,而如果你有该靶点的一批活性数据,重新拟合权重往往能显著提高富集能力。
能量项分解的用途
smina -r receptor.pdb -l ligands.sdf \
--autobox_ligand ref.sdf \
--score_only --atom_terms atom_terms.txt
# 输出每个原子对能量的贡献
# 用途:
# - 识别哪些原子贡献了主要结合能 → 保住它们
# - 识别哪些原子有排斥贡献 → 改造机会
# - 类似 HYDE 的原子级分解思路(见 304)
# 也可以输出各能量项的总和:
# Affinity: -8.32 (kcal/mol)
# Term values, before weighting:
# gauss(o=0...): 85.2
# gauss(o=3...): 1240.5
# repulsion: 1.8
# hydrophobic: 42.3
# non_dir_h_bond: 2.1
#
# 诊断:
# hydrophobic 项占绝对主导 + h_bond 很低
# → 结合几乎全靠疏水,特异性可能不足
# → 与低 LLE 是同一件事的两种表现(见 072)
在流程中的定位
| 任务 | 推荐工具 |
|---|---|
| 标准大规模对接 | Vina(速度最优) |
| 给外部姿势打分 | smina --score_only |
| 优化不合理姿势 | smina --minimize |
| 自定义/靶点特异打分 | smina |
| 能量分解分析 | smina --atom_terms |
| CNN 重打分 | GNINA(见 099《GNINA 论文精读》) |
| 约束对接(片段生长) | smina + 位置约束 |
约束对接:片段生长的实用做法
# 场景:已知片段的结合姿势,想设计生长后的分子
# 需求:保持片段部分的位置不变
#
# 方法一:用 autobox 限制搜索范围
smina -r receptor.pdb -l grown_molecules.sdf \
--autobox_ligand fragment.sdf --autobox_add 5 \
--exhaustiveness 32 -o out.sdf
# → 盒子以片段为中心,限制了搜索空间
# 方法二:RDKit 约束嵌入 + smina 优化
from rdkit import Chem
from rdkit.Chem import AllChem
core = Chem.MolFromMolFile("fragment.sdf") # 已知姿势
mol = Chem.AddHs(Chem.MolFromSmiles(grown_smiles))
AllChem.ConstrainedEmbed(mol, core, randomseed=0xf00d)
Chem.MolToMolFile(mol, "constrained.sdf")
# 再用 smina 局部优化
# smina -r receptor.pdb -l constrained.sdf --minimize -o refined.sdf
#
# 这个组合保证了片段位置不变,只优化新增部分
关键要点
--score_only与--minimize让 smina 成为姿势后处理的通用工具;- 针对特定靶点重新拟合打分权重,是它最有价值也最少被利用的能力;
- 能量项分解可诊断「结合全靠疏水」的情况;
- 直接读 SDF/PDB、自动定盒子,避免了 PDBQT 转换这个高频错误源。
延伸资源
- Vina:097《AutoDock Vina 论文精读》、098《AutoDock Vina 1.2》;GNINA:099《GNINA 论文精读》;
- 姿势判断:096《Binding Pose》;打分函数:095《Docking Score》。