# 第9章：分子对接与可视化

> 本章是网络药理学的"物理验证"——用计算机模拟药物分子与靶蛋白的结合，预测结合亲和力和结合模式。学完本章，你将拥有3D分子对接图，这是论文中最吸引眼球的图之一。

---

## 9.1 分子对接是什么？

### 1.1 基本概念

```
分子对接 = 模拟两个分子（药物 + 蛋白）在三维空间中的相互作用

原理：
- 药物分子（小分子，称为"配体" ligand）
- 靶蛋白（大分子，称为"受体" receptor）
- 对接 = 在蛋白的活性口袋中，找到药物的最佳结合姿态
- 结合能（Binding Energy）越低 = 结合越稳定

类比：
- 蛋白 = 锁
- 药物 = 钥匙
- 对接 = 找到钥匙在锁孔中的最佳位置
- 结合能 = 钥匙和锁的匹配程度
```

### 1.2 常用软件

| 软件 | 类型 | 特点 | 适用 |
|------|------|------|------|
| **AutoDock Vina** | 免费开源 | 速度快、准确、易用 | 批量筛选 |
| **AutoDock 4** | 免费开源 | 经典、参数可调 | 精细研究 |
| **GOLD** | 商业 | 准确度高 | 药物设计 |
| **Glide** | 商业 | 集成在Maestro中 | 商业研究 |
| **LeDock** | 免费 | 速度快 | 大规模筛选 |
| **CB-Dock** | 在线 | 无需安装 | 快速验证 |
| ** SwissDock** | 在线 | 自动识别结合位点 | 初学者 |

**本课程使用 AutoDock Vina + PyMOL**（完全免费）

---

## 9.2 准备受体（靶蛋白）

### 2.1 从PDB下载蛋白结构

```
访问：https://www.rcsb.org/

搜索核心基因对应的蛋白：
- IL6 → 搜索 "Interleukin-6"
- TNF → 搜索 "Tumor Necrosis Factor"

选择结构的标准：
① 物种：优先选Homo sapiens（人）
② 分辨率：越低越好（< 3Å为优，< 2Å极好）
③ 结构完整：不要有大的缺失区域
④ 结合口袋：最好有配体结合的结构（有共晶配体）
⑤ 日期：越新越好（但不要太纠结）

如果没有人的结构：
- 选同源性 > 90% 的物种（如Mouse, Rat）
- 或用AlphaFold预测结构
```

### 2.2 蛋白结构预处理

```bash
# 需要安装 AutoDock Tools 和 MGLTools
# 下载地址：http://mgltools.scripps.edu/

# 预处理步骤（用AutoDock Tools）：
# 1. 打开AutoDock Tools
# 2. File → Read Molecule → 选择 .pdb 文件
# 3. Edit → Hydrogens → Add → Polar only
# 4. Edit → Charges → Add Kollman Charges
# 5. Grid → Macromolecule → Choose → 选择蛋白 → 保存为 .pdbqt
```

---

## 9.3 准备配体（药物分子）

### 3.1 获取小分子结构

```bash
# 从PubChem下载
# https://pubchem.ncbi.nlm.nih.gov/
# 搜索药物名称 → 3D Conformer → Download → SDF格式

# 用OpenBabel转换格式
# 安装：brew install open-babel （Mac）

# SDF → PDBQT
obabel input.sdf -O output.pdbqt -p 7.4
# -p 7.4 = pH 7.4下加氢

# 或直接下载SMILES，用OpenBabel生成3D结构
echo "SMILES_string" | obabel -ismi -opdbqt -O output.pdbqt --gen3d -p 7.4
```

---

## 9.4 AutoDock Vina对接

### 4.1 对接流程

```bash
# 1. 创建配置文件 config.txt

receptor = protein.pdbqt
ligand = drug.pdbqt

# 对接盒子（以蛋白活性口袋为中心）
# 可以用PyMOL或AutoDock Tools确定
center_x = 10.0
center_y = 15.0
center_z = 20.0
size_x = 60
size_y = 60
size_z = 60

# 输出
out = output.pdbqt
log = log.txt

# 2. 运行对接
vina --config config.txt

# 3. 查看结果
cat log.txt
```

### 4.2 结果解读

```
输出示例：

mode |   affinity | dist from best mode
     | (kcal/mol) | rmsd l.b.| rmsd u.b.
-----+------------+----------+----------
   1       -9.3      0.000      0.000
   2       -8.7      2.145      5.321
   3       -8.1      3.876      7.982
   4       -7.5      4.123      8.456
   5       -7.2      5.678      9.012

解读：
- Mode 1: 结合能 -9.3 kcal/mol → 最强的结合姿态
- Mode 2-5: 其他可能的结合姿态

结合能判断标准：
< -9.0 kcal/mol   → 强结合（非常可能有效）
-7.0 ~ -9.0      → 中等结合（可能有效）
-5.0 ~ -7.0      → 弱结合（可能有一定作用）
> -5.0           → 极弱（不太可能结合）
```

---

## 9.5 R语言批量对接分析

```r
# ============================================================
# 分子对接结果整理与分析
# ============================================================

library(tidyverse)

# 假设已完成多个药物-靶蛋白的对接
# 结果保存在 docking_results/ 目录下

# 手动整理结果（实际应批量解析log文件）
docking_results <- data.frame(
    Drug = c("Quercetin", "Quercetin", 
             "Resveratrol", "Resveratrol",
             "Curcumin", "Curcumin",
             "Metformin", "Metformin",
             "Berberine", "Berberine"),
    Target = c("IL6", "TNF",
               "SIRT1", "AMPK",
               "TNF", "IL6",
               "SIRT1", "AMPK",
               "TNF", "IL6"),
    Binding_Energy = c(-8.5, -7.8,
                       -9.2, -7.5,
                       -8.9, -8.1,
                       -6.8, -6.2,
                       -8.3, -7.6),
    Ki_uM = c(0.58, 1.82,
              0.18, 3.12,
              0.29, 1.12,
              9.85, 28.4,
              0.78, 2.45),
    stringsAsFactors = FALSE
)

# Ki计算（从结合能估算）
# ΔG = RTln(Ki)
# Ki = exp(ΔG / RT)
# R = 1.987 cal/(mol·K), T = 298K
# ΔG (kcal/mol) → Ki (M)

docking_results <- docking_results %>%
    mutate(
        Binding_Strength = case_when(
            Binding_Energy < -9.0 ~ "Strong",
            Binding_Energy < -7.0 ~ "Moderate",
            Binding_Energy < -5.0 ~ "Weak",
            TRUE ~ "Very Weak"
        ),
        Binding_Strength = factor(Binding_Strength, 
                                   levels = c("Strong", "Moderate", "Weak", "Very Weak"))
    )

# 可视化
ggplot(docking_results, aes(x = Target, y = Drug, fill = Binding_Energy)) +
    geom_tile(color = "white") +
    geom_text(aes(label = round(Binding_Energy, 1)), color = "white", size = 3) +
    scale_fill_gradient2(
        low = "darkgreen",    # 强结合（低能量）
        mid = "yellow",
        high = "red",         # 弱结合（高能量）
        midpoint = -7.5,
        name = "Binding Energy\n(kcal/mol)"
    ) +
    labs(x = "靶蛋白", y = "候选药物", 
         title = "分子对接热图") +
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))

ggsave("output/22_docking_heatmap.png", width = 10, height = 6)

# 综合评分
docking_summary <- docking_results %>%
    group_by(Drug) %>%
    summarise(
        Avg_Binding = mean(Binding_Energy),
        Best_Binding = min(Binding_Energy),
        Target_Count = n(),
        .groups = "drop"
    ) %>%
    arrange(Avg_Binding)

print(docking_summary)
```

---

## 9.6 PyMOL可视化

### 6.1 基础操作

```bash
# 打开PyMOL
pymol

# 加载蛋白和对接结果
load protein.pdb
load output.pdbqt, ligand

# 显示设置
show cartoon, protein
color skyblue, protein

show sticks, ligand
color magenta, ligand

# 显示活性口袋附近的残基
select pocket, byres protein within 5 of ligand
show sticks, pocket
color yellow, pocket

# 显示氢键
distance hbond1, protein////ND2, ligand////O1
distance hbond2, protein////OG1, ligand////N1

# 保存图片
ray 2400, 2400
png docking_result.png, dpi=300

# 保存会话
save docking_session.pse
```

### 6.2 美化图片

```bash
# 高质量图片设置
set ray_trace_mode, 1
set antialias, 2
set ray_shadows, off
set ambient, 0.4
set reflect, 0.5

# 背景透明
set bg_rgb, [1, 1, 1]
set ray_opaque_background, off

# 标签
label pocket////CA, resn + resi
```

---

## 9.7 本章作业

1. ✅ 为你的1个核心基因和2个候选药物做分子对接
2. ✅ 记录结合能，判断结合强度
3. ✅ 用PyMOL生成至少1张高质量的对接3D图
4. ✅ 分析氢键和疏水相互作用
5. ✅ 思考题：分子对接的结合能是"绝对值"还是"相对值"？Ki和IC50有什么区别？

---

## 9.8 答案参考

### 作业5答案

```
结合能的性质：
- 分子对接的结合能是"相对值"
- 用于比较同一靶点不同药物的结合强弱
- 不用于比较不同靶点之间的结合能
- 因为不同蛋白的口袋性质不同，绝对值意义有限

Ki vs IC50：
- Ki：抑制常数，药物与靶点的平衡解离常数
  → 理论值，反映结合亲和力
  → Ki越小，结合越强

- IC50：半数抑制浓度，抑制50%酶活性所需的药物浓度
  → 实验值，反映功能抑制能力
  → 受实验条件影响（酶浓度、底物浓度等）

关系：
  竞争性抑制：Ki = IC50 / (1 + [S]/Km)
  非竞争性抑制：Ki = IC50

分子对接预测的是Ki级别的结合能力，不是IC50。
```

---

> 📌 **核心要点**：分子对接是"预测"不是"证明"。一个-9.0 kcal/mol的对接结果说明"很可能结合"，但最终的证据来自SPR、ITC等实验测定。在论文中，分子对接应表述为"computational prediction"或"in silico validation"。
