首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >课前准备--蛋白-蛋白分子对接(二)

课前准备--蛋白-蛋白分子对接(二)

原创
作者头像
追风少年i
修改2026-08-19 09:14:32
修改2026-08-19 09:14:32
1150
举报
作者,Evil Genius

今天我们更新一下蛋白-蛋白分子对接
其实别以为这样的内容离我们很远,其实很近,我们日常使用的注射制剂,很多都是蛋白制剂,都是通过算法 + 临床得来的,其实蛋白蛋白分子对接常用的就是抗原抗体,由此还形成了一个很大的学科,那就是蛋白设计,根据靶向蛋白分子,独立设计蛋白抗体,并且加上一些特殊的结构,达到治疗的目的。
先来看看蛋白蛋白相互作用。
生物体的生理功能主要由细胞中的蛋白质控制和调节。其中,多数蛋白质是作为蛋白质复合物中的一部分参与细胞的代谢过程。因此,研究蛋白质间的相互作用是理解生命活动的基础。
通常来讲,蛋白蛋白分子对接的方法ZDOCK的运用最多,这列给大家一个蛋白结构,大家可以跟着做一下:
从PDB数据库下载得到2019-nCoV的spike蛋白6VXX和ACE2蛋白晶体结构1R42,模拟它们的相互作用
在Pymol软件中准备蛋白1R42和6VXX,spike蛋白6VXX为多聚体,只保留B链,优化后分别输出文件1r42_minimize.pdb和6vxx_minimize.pdb

例如文献中的运用

一、先理解:ZDOCK到底在做什么?

假设我们有:

  • 蛋白 A:PD-1
  • 蛋白 B:PD-L1

我们希望得到:

PD-1 + PD-L1 → 最可能的结合复合物结构

ZDOCK的基本思想是:

代码语言:javascript
复制
PD-1结构
   +
PD-L1结构
   ↓
ZDOCK刚性蛋白-蛋白对接
   ↓
产生大量候选复合物
   ↓
打分
   ↓
得到Top 10 / Top 20 / Top 100
   ↓
聚类
   ↓
人工分析结合界面
   ↓
得到候选PD-1/PD-L1复合物

和你之前做的 AutoDock Vina小分子对接相比,最大的区别是:

Vina

ZDOCK

对接对象

蛋白-小分子

蛋白-蛋白

配体

小分子

另一个蛋白

搜索空间

蛋白口袋

整个蛋白表面

柔性

有限

经典ZDOCK主要是刚性对接

输出

ligand poses

protein-protein complexes

核心问题

小分子如何进入口袋

两个蛋白如何贴合


二、实际案例:PD-1–PD-L1

我们假设:

Receptor:PD-1

Ligand:PD-L1

目标:

预测PD-1与PD-L1形成复合物时,两者的空间结合方式。

结构可以从 Protein Data Bank 获取。

例如可以搜索:

代码语言:javascript
复制
PD-1 PD-L1 complex PDB

经典PD-1/PD-L1复合物结构可以作为最终验证的参考结构

这里有一个非常重要的实验设计思想:

不要直接拿完整PD-1/PD-L1复合物做ZDOCK

如果目标是测试ZDOCK预测能力,应该:

代码语言:javascript
复制
已知PD-1/PD-L1复合物
        ↓
拆开
        ↓
PD-1单体
+
PD-L1单体
        ↓
ZDOCK
        ↓
预测复合物
        ↓
与原始实验复合物比较

这叫做 docking re-docking / blind docking validation


三、第一步:下载两个蛋白结构

例如得到:

代码语言:javascript
复制
PD1.pdb
PDL1.pdb

此时不要急着ZDOCK。

先检查PDB。

可以使用:

  • PyMOL
  • ChimeraX
  • Chimera
  • PDBFixer

例如PyMOL:

代码语言:javascript
复制
pymol PD1.pdb

观察:

代码语言:javascript
复制
PD-1
 ├── Chain A
 ├── ligand?
 ├── water?
 ├── antibody?
 └── other chains?

四、为什么PDB不能直接扔进ZDOCK?

这是蛋白对接最容易出问题的地方之一。

实验结构PDB往往不是:

代码语言:javascript
复制
一个干净的蛋白

而可能是:

代码语言:javascript
复制
Protein
+
Water
+
Ion
+
Ligand
+
Antibody
+
多个Chain
+
晶体添加剂

例如:

代码语言:javascript
复制
ATOM
ATOM
ATOM
HETATM ← ligand
HETATM ← water
ATOM
ATOM

ZDOCK真正需要的是:

代码语言:javascript
复制
纯蛋白结构

所以需要预处理。


五、第二步:清理PDB

例如PD-1:

代码语言:javascript
复制
PD1_original.pdb

处理以后:

代码语言:javascript
复制
PD1_clean.pdb

PD-L1:

代码语言:javascript
复制
PDL1_original.pdb
        ↓
PDL1_clean.pdb

通常需要处理:

1. 删除水

例如:

代码语言:javascript
复制
HOH

删除。


2. 删除无关配体

如果PDB里面存在:

代码语言:javascript
复制
HETATM

要判断是不是需要保留。

对于普通蛋白-蛋白对接,一般删除无关小分子。


3. 保留正确的蛋白链

例如:

代码语言:javascript
复制
PD-1:
Chain A

PD-L1:
Chain B

最后最好得到:

代码语言:javascript
复制
PD1_clean.pdb
PDL1_clean.pdb

六、第三步:检查缺失残基

这是非常重要的一步。

比如PDB可能是:

代码语言:javascript
复制
1 2 3 4 5 6 7
A B C D E F G

但实际上:

代码语言:javascript
复制
1 2 3 5 6 7
A B C   E F G

Residue 4缺失。

对于蛋白表面正好参与结合的位置,这可能严重影响对接。

可以使用:

  • PDBFixer
  • Modeller
  • ChimeraX
  • AlphaFold预测结构

补全。


七、第四步:准备ZDOCK输入

ZDOCK本质上需要两个蛋白:

代码语言:javascript
复制
Receptor
Ligand

例如:

代码语言:javascript
复制
Receptor = PD1_clean.pdb

Ligand = PDL1_clean.pdb

这里的“ligand”不是小分子意义上的ligand。

而是:

参与蛋白-蛋白对接的第二个蛋白。


八、ZDOCK的核心算法

ZDOCK不是简单地:

“把PD-L1放到PD-1表面随机旋转。”

它会进行大量空间搜索。

可以粗略理解成:

代码语言:javascript
复制
PD-L1
  ↓
旋转
↙ ↓ ↘
多个方向
  ↓
平移
  ↓
与PD-1碰撞检测
  ↓
计算score

数学上可以简单理解为:

不同版本/模式的具体打分组成有所不同。

其中最重要的几个概念:

Shape complementarity

两个蛋白表面是否互补。

类似:

代码语言:javascript
复制
蛋白A:

     /\__
 ___/    \___

蛋白B:

 ___      ___
    \____/

如果:

代码语言:javascript
复制
凸 → 凹
凹 → 凸

匹配得比较好。


Electrostatics

例如:

代码语言:javascript
复制
PD-1表面:++++
PD-L1表面:----

静电吸引有利。

反之:

代码语言:javascript
复制
++++
++++

通常不利。


九、第五步:开始ZDOCK

ZDOCK命令根据你安装的具体版本略有不同。

典型流程类似:

代码语言:javascript
复制
zdock -R PD1_clean.pdb -L PDL1_clean.pdb

或者使用ZDOCK提供的图形界面进行:

代码语言:javascript
复制
Receptor → PD1_clean.pdb
Ligand   → PDL1_clean.pdb

然后:

代码语言:javascript
复制
Run ZDOCK

十、ZDOCK到底产生多少结果?

假设:

代码语言:javascript
复制
ZDOCK
↓
2000 poses

也就是说:

代码语言:javascript
复制
Pose 1
Pose 2
Pose 3
...
Pose 2000

这些全部都是:

PD-1 + PD-L1的不同空间排列。

例如:

代码语言:javascript
复制
Pose 1

       PD-L1
      ███████
    ███████████
        │
        │
     ███████
    PD-1


Pose 2

███████
████████
     ███████
       ███████
          ███


Pose 3

       █████
     █████████
████████
██████

当然真实结构是三维的。


十一、这里千万不要犯一个错误

很多初学者会认为:

ZDOCK排名第一 = 正确答案。

不一定。

这是蛋白-蛋白对接非常重要的一点。

例如:

代码语言:javascript
复制
ZDOCK Rank 1
score = 1785

Rank 2
score = 1779

Rank 3
score = 1768

Rank 4
score = 1759

并不能简单认为:

代码语言:javascript
复制
Rank 1 = 正确

原因是:

蛋白-蛋白对接存在大量局部最优解。

所以后面必须:

聚类 + 界面分析 + 生物学信息 + 结构评价


十二、第六步:对ZDOCK结果进行聚类

假设ZDOCK产生:

代码语言:javascript
复制
2000 poses

很多pose实际上非常相似。

例如:

代码语言:javascript
复制
Pose 1
Pose 8
Pose 13
Pose 27
Pose 43
Pose 87

它们可能都属于同一个结合模式:

代码语言:javascript
复制
Cluster 1

另外:

代码语言:javascript
复制
Pose 2
Pose 9
Pose 18
Pose 25

属于:

代码语言:javascript
复制
Cluster 2

所以:

代码语言:javascript
复制
2000 poses
        ↓
聚类
        ↓
Cluster 1
Cluster 2
Cluster 3
...

这一步非常重要。

因为:

一个稳定出现的大cluster,往往比单独一个高分pose更值得关注。


十三、为什么要看Cluster?

举一个极端例子。

模式A

代码语言:javascript
复制
Pose数量:

Cluster A = 320
Cluster B = 15
Cluster C = 8

模式B

代码语言:javascript
复制
最高score:
Cluster B中的某一个pose

虽然:

代码语言:javascript
复制
Cluster B

有一个最高分,但:

代码语言:javascript
复制
Cluster A

有大量相似结构。

这说明:

A可能是一个更稳定的结合模式。

所以ZDOCK结果不能只看:

代码语言:javascript
复制
score

而应该综合:

代码语言:javascript
复制
score
+
cluster size
+
interface
+
biological information

十四、第七步:用PyMOL查看ZDOCK结果

假设得到:

代码语言:javascript
复制
complex1.pdb
complex2.pdb
complex3.pdb

打开:

代码语言:javascript
复制
pymol complex1.pdb

然后:

代码语言:javascript
复制
PD-1
PD-L1

分别设置不同representation。

例如:

代码语言:javascript
复制
PD-1 → cartoon
PD-L1 → cartoon

然后查看interface。

你会看到:

代码语言:javascript
复制
       PD-L1
    █████████
   ███████████
       ||
       || interface
       ||
    █████████
      PD-1

十五、第八步:重点分析Interface

这一步实际上比“看ZDOCK分数”更重要。

我们需要问:

PD-1和PD-L1到底哪些氨基酸发生了相互作用?

例如:

代码语言:javascript
复制
PD-1

Residue 50
Residue 53
Residue 56
Residue 58

        ↓

PD-L1

Residue 115
Residue 118
Residue 120
Residue 123

可以分析:

1. Hydrogen bonds

代码语言:javascript
复制
PD1 residue
     |
     | H-bond
     |
PDL1 residue

2. Salt bridges

例如:

代码语言:javascript
复制
Lys(+)
   |
   |
Asp(-)

3. Hydrophobic interaction

例如:

代码语言:javascript
复制
Leu
Ile
Val
Phe
Trp

形成疏水核心。


十六、可以进一步计算interface ΔG

例如使用:

Rosetta

或者:

  • PRODIGY
  • PISA
  • FoldX
  • Rosetta

来分析。

例如:

代码语言:javascript
复制
PD-1 + PD-L1

ΔGbinding = -12.4 kcal/mol

通常:

ΔG越负,预测结合越有利。

但注意:

不能简单把不同软件的ΔG直接横向比较。


十七、实际研究中我更推荐的流程

如果你不是为了学习,而是准备真正用于科研,我建议:

代码语言:javascript
复制
             PDB
              ↓
       蛋白结构预处理
              ↓
      ┌───────┴────────┐
      ↓                ↓
   Protein A         Protein B
      ↓                ↓
  去水/配体          去水/配体
      ↓                ↓
  补缺失残基         补缺失残基
      └───────┬────────┘
              ↓
            ZDOCK
              ↓
        2000 docking poses
              ↓
           Clustering
              ↓
       Top 10–20 clusters
              ↓
         界面分析
              ↓
       ┌──────┴──────┐
       ↓             ↓
  生物学信息       结构评分
       ↓             ↓
       └──────┬──────┘
              ↓
       Top 1–5 complexes
              ↓
          Rosetta优化
              ↓
       Molecular Dynamics
              ↓
       RMSD/RMSF/Rg
       H-bond/SASA
       MM/PBSA或MM/GBSA
              ↓
       最终候选复合物

十八、如果进一步结合你之前学习的PyRosetta

这个就非常有意思了。

你之前问过:

Vina对接以后为什么要用PyRosetta优化?

蛋白-蛋白对接也存在类似的问题。

ZDOCK本质上属于:

刚性对接

也就是:

代码语言:javascript
复制
PD-1结构不变
PD-L1结构不变

但是现实中的蛋白:

代码语言:javascript
复制
PD-1
 ↓
侧链可以转动
backbone也可能发生轻微变化

PD-L1
 ↓
侧链可以转动
backbone也可能发生轻微变化

所以ZDOCK得到的:

代码语言:javascript
复制
Rigid docking

可以继续:

代码语言:javascript
复制
ZDOCK
 ↓
PyRosetta local refinement
 ↓
Side-chain repacking
 ↓
Minimization
 ↓
Interface optimization

十九、ZDOCK + PyRosetta的完整思路

例如:

代码语言:javascript
复制
ZDOCK预测:

PD-1
████████
   ↓
████████ PD-L1

发现interface:

代码语言:javascript
复制
PD1-A52
PD1-Y56
PD1-M64

PDL1-L115
PDL1-F118
PDL1-Y123

然后PyRosetta进行:

① Side-chain repacking

重新寻找:

代码语言:javascript
复制
Rotamer

例如:

代码语言:javascript
复制
Tyr
 ↓
rotamer 1
rotamer 2
rotamer 3
rotamer 4

寻找更合适的侧链构象。


② Energy minimization

优化:

代码语言:javascript
复制
bond
angle
torsion
van der Waals
electrostatics

使interface更加合理。


③ Interface scoring

例如:

代码语言:javascript
复制
Before:

interface energy
= -25 REU

After:

interface energy
= -39 REU

说明局部优化后interface更加有利。


二十、再进一步做MD

如果你想做得更加完整:

代码语言:javascript
复制
ZDOCK
 ↓
Top 10 complexes
 ↓
PyRosetta refinement
 ↓
Top 3
 ↓
GROMACS
 ↓
100 ns MD

然后分析:

代码语言:javascript
复制
RMSD
RMSF
Radius of gyration
SASA
Hydrogen bonds
Salt bridges
Protein-protein contacts
MM/PBSA

例如:

代码语言:javascript
复制
             ZDOCK
                ↓
          2000 poses
                ↓
          Cluster分析
                ↓
          Top 10 poses
                ↓
        PyRosetta refinement
                ↓
            Top 3
                ↓
          100 ns MD
       ┌────────┼────────┐
       ↓        ↓        ↓
     RMSD      H-bond   MM/PBSA
       ↓        ↓        ↓
          最终候选模型

二十一、特别重要:如果已知结合位点,千万不要盲目Blind Docking

假如你已经知道:

代码语言:javascript
复制
PD-1的binding residues:
A50
Y56
M64

那么可以把这些信息加入对接约束。

因为:

Blind docking

代码语言:javascript
复制
整个蛋白表面
       ↓
寻找结合位置

计算空间非常大。

而:

Site-directed docking

代码语言:javascript
复制
PD-1
 ↓
指定binding region

PD-L1
 ↓
指定binding region

搜索空间明显缩小。


二十二、如果是抗体–抗原,更应该这样做

比如:

代码语言:javascript
复制
抗体
  +
HER2

如果已知:

代码语言:javascript
复制
CDR

那么应该重点关注:

代码语言:javascript
复制
CDR-H1
CDR-H2
CDR-H3
CDR-L1
CDR-L2
CDR-L3

而不是让抗体整个表面都参与随机对接。

流程:

代码语言:javascript
复制
Antibody
   +
Antigen
   ↓
ZDOCK
   ↓
Interface constraint
   ↓
Cluster
   ↓
CDR interface
   ↓
PyRosetta refinement

二十三、你需要特别理解ZDOCK和Vina的区别

你前面已经在学习Vina,这两个可以放在一起理解:

代码语言:javascript
复制
             分子对接
                │
       ┌────────┴────────┐
       │                 │
   小分子-蛋白         蛋白-蛋白
       │                 │
      Vina              ZDOCK
       │                 │
   ligand docking    protein docking
       │                 │
       ↓                 ↓
  binding pocket     protein interface
       │                 │
       ↓                 ↓
  PyRosetta          PyRosetta
       │                 │
       ↓                 ↓
       MD                MD

所以:

Vina解决的是“小分子怎么结合蛋白”,ZDOCK解决的是“两个蛋白怎么结合”。


二十四、如果你准备真正跑一次ZDOCK

建议不要一开始就拿自己的课题蛋白。

可以先做这个练习:

练习项目

PD-1 + PD-L1

完整跑:

代码语言:javascript
复制
1. 下载PDB
       ↓
2. 拆分两个蛋白
       ↓
3. 清理PDB
       ↓
4. ZDOCK
       ↓
5. 得到2000 poses
       ↓
6. Clustering
       ↓
7. 选Top 10
       ↓
8. PyMOL观察
       ↓
9. Interface分析
       ↓
10. 与实验PDB比较
       ↓
11. 计算RMSD
       ↓
12. 判断ZDOCK是否成功预测

其中最后一步特别关键:

假设实验结构是:

代码语言:javascript
复制
Experimental complex

ZDOCK预测:

代码语言:javascript
复制
Docking model

计算:

例如:

代码语言:javascript
复制
RMSD = 2.1 Å

那么说明预测结构和实验结构非常接近。

如果:

代码语言:javascript
复制
RMSD = 15 Å

则说明这个pose很可能不是正确的结合模式。


最后给一个科研上最实用的判断框架

以后你拿到ZDOCK结果,不要只问:

“哪个score最高?”

而应该依次问:

代码语言:javascript
复制
① ZDOCK score怎么样?
        ↓
② 是否属于大cluster?
        ↓
③ interface面积是否合理?
        ↓
④ 有没有明显clash?
        ↓
⑤ 是否形成合理H-bond / salt bridge?
        ↓
⑥ 是否符合已知binding site?
        ↓
⑦ PyRosetta优化后是否稳定?
        ↓
⑧ MD过程中interface是否稳定?
        ↓
⑨ MM/PBSA或MM/GBSA是否支持?
        ↓
⑩ 是否与实验结构/突变数据一致?

这才是一个完整的蛋白–蛋白分子对接分析,而不是简单地“跑一次ZDOCK”。

生活很好,有你更好。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、先理解:ZDOCK到底在做什么?
  • 二、实际案例:PD-1–PD-L1
    • 不要直接拿完整PD-1/PD-L1复合物做ZDOCK
  • 三、第一步:下载两个蛋白结构
  • 四、为什么PDB不能直接扔进ZDOCK?
  • 五、第二步:清理PDB
    • 1. 删除水
    • 2. 删除无关配体
    • 3. 保留正确的蛋白链
  • 六、第三步:检查缺失残基
  • 七、第四步:准备ZDOCK输入
  • 八、ZDOCK的核心算法
    • Shape complementarity
    • Electrostatics
  • 九、第五步:开始ZDOCK
  • 十、ZDOCK到底产生多少结果?
  • 十一、这里千万不要犯一个错误
  • 十二、第六步:对ZDOCK结果进行聚类
  • 十三、为什么要看Cluster?
    • 模式A
    • 模式B
  • 十四、第七步:用PyMOL查看ZDOCK结果
  • 十五、第八步:重点分析Interface
    • 1. Hydrogen bonds
    • 2. Salt bridges
    • 3. Hydrophobic interaction
  • 十六、可以进一步计算interface ΔG
  • 十七、实际研究中我更推荐的流程
  • 十八、如果进一步结合你之前学习的PyRosetta
  • 十九、ZDOCK + PyRosetta的完整思路
    • ① Side-chain repacking
    • ② Energy minimization
    • ③ Interface scoring
  • 二十、再进一步做MD
  • 二十一、特别重要:如果已知结合位点,千万不要盲目Blind Docking
    • Blind docking
    • Site-directed docking
  • 二十二、如果是抗体–抗原,更应该这样做
  • 二十三、你需要特别理解ZDOCK和Vina的区别
  • 二十四、如果你准备真正跑一次ZDOCK
    • 练习项目
    • 最后给一个科研上最实用的判断框架
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档