100

Smina:AutoDock Vina 分支工具的实战价值

smina 是 Vina 的分支,提供自定义打分与更灵活的参数。这篇讲清它的独特能力与实战价值。

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 转换这个高频错误源。

延伸资源