本模块从 data/cadd-tutorial-inputs 里的 TeachOpenCADD 输入出发,实际完成两个 EGFR 复合物的
重对接、相互作用指纹分析与结构展示,并对"预测位姿 vs 晶体位姿"做诚实对照。
4efdbd36723b5d07960142e15df393d7c6df2ba1inputs/(输入与中间输入)、scripts/(可复用代码)、outputs/(阶段结果)、
figures/(图组与图版)、logs/(运行日志)、run_module05.sh(复用入口)| 上游教程(参考) | 本次实际执行 | |
|---|---|---|
| 2ITO / gefitinib | T015:Smina + Open Babel 重对接,box = 坐标极值中点,边长 = max−min+5 Å,10 poses / exhaustiveness 8 | Vina 1.2.7 + Meeko 0.8.0 重对接;沿用同一 box 约定与 10 poses / exhaustiveness 8 |
| 3POZ / TAK-285 | T016:PLIP 相互作用分析(不是对接) | PLIP 3.0.1 相互作用分析 + 重对接(扩展,原教程无此项) |
这不是数值复现。 引擎与配体准备都不同(Vina/Meeko ≠ Smina/Open Babel), 相同的打分名与相同的搜索设置不能让两者在数值上等价。因此本报告不引用上游的具体分值, 也不声称与教程逐数值一致;凡涉及 3POZ 重对接的结论,均标记为本课程的扩展。
为透明度,教程未固定的 Vina 随机种子在此固定为 seed 42,并在 outputs/*/screen/summary.json 中记录。
| 复合物 | 构造 | 配体 | 链 / 残基 | 关键位点 |
|---|---|---|---|---|
| 2ITO | EGFR 激酶域 G719S 突变体(P00533) | IRE = Iressa / gefitinib,C22H24ClFN4O3,31 重原子 | A / 696–1019(晶体学) | 719 = SER(即 G719S)、790 = THR、858 = LEU |
| 3POZ | EGFR 激酶域 野生型 | 03P = TAK-285,C26H25ClF3N5O3,38 重原子 | A / 701–1017 | 719 = GLY(野生型)、790 = THR、858 = LEU |
两个案例不是同一蛋白构造(一个是 G719S 突变体,一个是野生型),所以它们的口袋与结合模式
不能当作"同一体系换配体"来直接比较。配体的键级/芳香性取自 mmCIF 的化学组分字典
(_chem_comp_atom / _chem_comp_bond),不是从对接程序反推。
本地包中的 T016/data/3poz.pdb 头部写的是 MDANALYSIS FRAME 0,因此先验证再使用:
与 RCSB 3POZ 沉积按残基号配对、不做叠合比较后——
即:本地文件保留了晶体坐标,只是被 MDAnalysis 重新序列化过(链名改为 X)。
记录见 inputs/provenance_3poz.json。
引擎 Vina 1.2.7(Python 引擎)/ 受体与配体准备 Meeko 0.8.0
打分函数 vina
种子 42 (T015 未固定种子;此处固定并记录)
位姿 10 个 exhaustiveness 8 (沿用 T015 设置)
搜索盒 参考配体重原子包围盒,每侧 padding 2.5 Å
≡ 边长 = max−min+5 Å,即 T015 约定
受体 晶体坐标系;去水去硫酸根;Meeko 依模板补氢并赋 Gasteiger 电荷
配体输入 由化学式独立生成 3D 构象(seed 42),与参考位姿无关
受体准备中的一处真实取舍:2ITO 的 988 与 1004 号残基因晶体学无序(激活环/C 端,
990–1001 完全缺失,988/1004 侧链被截断)无法匹配模板,被 Meeko 的 --allow_bad_res 剔除
(logs/ 中保留完整输出)。这两个残基距配体 19 Å 与 15 Å,不在 ATP 口袋内,剔除不影响结合位点;
该事实已在结果中记录而不是隐去。
| 案例 | 对接最佳 RMSD(不叠合) | 对称性感知叠合 | 排名第一的 RMSD | 结论 |
|---|---|---|---|---|
| 2ITO / gefitinib | 3.16 Å | 2.62 Å | 3.16 Å | 未找回 |
| 3POZ / TAK-285 | 0.98 Å | 0.90 Å | 0.98 Å | 找回 |
两种 RMSD 约定必须分开引用:direct 是图匹配后直接算偏差(redock-rmsd 的约定,不做配体叠合),
best_fit 是对称性感知叠合后的偏差,回答的是另一个问题。
给初学者的说明:对接是在口袋里"试摆"分子;打分是排序规则,不是亲和力。RMSD 是与某个参考 位姿的几何偏差。找回一个晶体位姿只能检验"这一套本地设置",不能证明亲和力、富集能力或换一个靶点也有效。
图组 1(figures/fig1_pose_recovery.png):10 个采样位姿各自的 RMSD 阶梯。
用同一套受体与格点给实验位姿本身打分(坐标未改动,已核验最近邻偏差 0.000 Å):
| 2ITO / gefitinib | 3POZ / TAK-285 | |
|---|---|---|
| 排名第一的对接位姿 | −8.10 | −10.73 |
| 晶体位姿(原始坐标) | −6.85 | −10.29 |
| 晶体位姿(局部最小化后) | −7.33 | −10.52 |
outputs/<case>/localmin-export/poses_bondorder.sdf
(模板感知导出,见 §6)。本次局部优化只把晶体位姿移动 0.22 / 0.23 Å。
注意:单次局部优化不足以证明晶体位姿是打分函数的局部极小点;这里只报告本次优化及其位移。图组 2(figures/fig2_score_vs_geometry.png)。经验打分不是亲和力实测值。
对晶体位姿与对接位姿各跑 PLIP 3.0.1。两类输入的配体化学身份核验一致
(InChIKey 与分子量相同,见 outputs/plip_identity.csv),这排除了"配体身份不同"这一项;
但指纹差异同时受位姿几何与准备条件(质子化、水与离子、受体坐标)影响,
不能只归因于构象。
| 案例 | 构象 | 疏水 | 氢键 | 卤键 | 盐桥 |
|---|---|---|---|---|---|
| 2ITO | 晶体 | 2 | 1(Met793) | 1(Leu788) | 1(Asp800) |
| 2ITO | 对接 | 3 | 1(Met793) | 1(Leu788) | 0 |
| 3POZ | 晶体 | 5 | 2(Met793、Asn842) | 3 | 0 |
| 3POZ | 对接 | 8 | 2(Met793、Asp855) | 3 | 0 |
相互作用表的原子是按角色解析的:氢键用 protisdon 决定供/受体归属(例如 Met793 的 749 号是
蛋白供体 N,2438 号才是配体受体),卤键用 don_idx/acc_idx,盐桥用嵌套的 idx 列表。
见 outputs/plip_interactions.csv(含原子编号、类型、距离、角度、坐标)。
图组 3(figures/fig3_plip_fingerprint.png)、图组 4(figures/fig4_residue_contacts.png)。
交互场景(原生 Molecule Viewer,属于本任务的检查环节,不改坐标):
inputs/prepared/2ito_viewer_overlay.pdb 与 3poz_viewer_overlay.pdb 各含
受体(链 A)+晶体配体(IRE/03P)+对接位姿(链 L),三者共用同一受体坐标系。
当前 2ITO 场景已载入(2481 原子 / 2 链 / 2 个 HET 配体);可交互的口袋与距离命令见本次回复正文的
PyMOL 代码块,由前端在当前会话结束后应用,应用后的画面由使用者复核。
离线渲染用 PyMOL 3.2(scripts/10_render_structural_figures.py),每个案例拆成
A 全局 / B 口袋+距离 / C 位姿叠合三个焦点,标签尽量少,长说明放进图注:
figures/structural_raw/{2ito,3poz}_A_global.png 整体与 ATP 位点位置figures/structural_raw/{2ito,3poz}_B_pocket.png 口袋放大 + 三处实测距离figures/structural_raw/{2ito,3poz}_C_overlay.png 晶体位姿 vs 对接位姿叠合物理解释与表示一致:晶体配体为 sticks + spheres(真正的球棍),对接位姿为 licorice
(细棍);两者同时用颜色与表示区分,不只依赖颜色。PyMOL 没有 ball+stick 这个表示名,
早期脚本里的 show ball+stick 曾静默失败——已修正并保留每次渲染的 stdout/stderr
(logs/10_render_*.log,当前无 Error)。
图中距离已用 PyMOL 独立复测核对(2ITO:2.916 / 3.285 / 3.487 Å;3POZ:2.963 / 3.549 / 3.230 Å), 与 PLIP 报告的 2.92 / 3.29 / 3.49 与 2.96 / 3.55 / 3.23 一致。
图版:figures/plate_structure_2ito/plate.png、figures/plate_structure_3poz/plate.png、
figures/plate_quantitative/plate.png(各含 plate.pdf 与 caption.md;打包 CLI 的合成结果作为中间产物
保留在 figures/packaged_plates/)。
第一轮 PLIP 分析把对接配体连显式氢一起写进复合物 PDB。PLIP 随后感知到的是另一个分子: 自由基 SMILES、分子量 422.71(而非 446.90)、InChIKey 不同。那样的对接指纹不是同一配体只换位姿的比较。
outputs/plip_round1_defect/(含 README),不进入最终对比图。同类问题也出现在第一版"局部最小化位姿"的导出上(用 obabel 直接做 PDBQT→SDF 丢了氢计数,
得到 [C] 自由基)。修正为模板感知的 pose-export,以晶体配体自身的化学图作模板
(键长几何偏差降到 0.0008 Å),并在导出后核验规范 SMILES / 分子式 / 电荷 / 自由基数 / 手性一致,
才用它计算 RMSD。检查项见 outputs/<case>/score_control_*.json 的 minimised_pose_identity_matches_reference: true。
direct 与 best_fit 两个约定不可互换引用。./run_module05.sh verify-fresh # 在新目录、新进程中跑一个小步骤(已验证通过)
./run_module05.sh figures # 重新生成 fig1–fig4(CJK 字体在运行期解析)
./run_module05.sh all # 完整链路
可配置项(避免只能在当前机器运行):
| 变量 | 含义 | 默认 |
|---|---|---|
CADD_PY |
具备 rdkit/vina/meeko/gemmi/plip/pymol 的解释器 | CADD profile venv |
CADD_SKILL |
cadd-discovery-workflow 技能目录(含 scripts/run.py) |
工作区 skills/ |
CADD_MODULE |
工作/输出目录 | 脚本所在的 module-05 目录 |
CADD_CJK_FONT |
中文字体文件路径(可选,供独立进程重绘用) | 自动探测 msyh/simhei/wqy |
已在全新目录、全新进程验证(run_module05.sh verify-fresh):
inputs → prepare → receptors → (provenance) → pipeline/scores(逐案例)→ complexes → viewer → plip → figures → render → plates。
受体 PDBQT 在对接之前生成;复合物与 Viewer 叠加文件在 pose-export 之后组装
(因此不会读到尚不存在的位姿,也不会在旧目录里先组装旧位姿)。03_run_pipeline.sh、06_run_plip.sh 与全部 Python 子步骤
均读取 CADD_PY / CADD_SKILL / CADD_MODULE / CADD_BIN,不再写死解释器与技能路径;
缺少前置产物时会给出明确报错(例如提示先运行 receptors 或 complexes)。CADD_SRC_INPUTS,缺失时再从 RCSB 取),
不依赖旧阶段输出。verify 不再删除用户配置的目录,只写入一个新的 verify_box_<时间戳>/ 子目录。该次新目录运行的实测结果:
| 步骤 | 结果 |
|---|---|
inputs |
复制 2ito.cif / 3poz_rcsb.cif / 3poz_t016_local.pdb |
prepare |
配体身份与会话一致(C22H24ClFN4O3、C26H25ClF3N5O3;303 / 293 残基) |
receptors |
两个受体 PDBQT 与会话结果 SHA-256 逐字节一致(e2090408…、a37829fb…);参考配体 SDF 亦一致 |
chart-smoke |
仅用已准备输入跑出真实位点图 site_view.png(146 KB,status=completed) |
verify |
box 返回 center=[-48.508, -0.753, -21.855]、size=[15.102, 13.226, 18.559],与会话一致 |
已验证范围仅限上表:准备、受体准备、图表路径与 box 步骤在新目录可复跑。
完整的重对接没有在新目录重跑;本模块报告的对接、打分对照与 PLIP 结果来自本会话的运行
(outputs/),不能把上述小检查等同于"整个入口的对接链路已在新环境验证"。
统计图组也已在新进程中独立重绘:scripts/12_make_stat_figures.py 不依赖交互式内核,
自行从阶段产物重建四张面板的数据表并输出 PNG + PDF + 同名 CSV;
CJK 字体在运行期按 CADD_CJK_FONT → 常见系统字体顺序解析(本次解析为 Microsoft YaHei)。
每张图版的 plate.png / plate.pdf / plate.svg 均由同一次渲染产出,保证三份格式对应同一版本;
旧版式遗留的 SVG/清单已移入 figures/deprecated_debug/。
| 路径 | 内容 |
|---|---|
inputs/2ito.cif, inputs/3poz_rcsb.cif |
RCSB 沉积(身份与坐标核对用) |
inputs/3poz_t016_local.pdb |
本地教程文件(哈希与 manifest 一致) |
inputs/prepared/* |
受体、参考配体(含键级 SDF)、配体 CSV、复合物、Viewer 叠加文件 |
scripts/01..11_*.py, 03,06_*.sh |
可复用代码(准备 / 对接 / 打分对照 / PLIP / 作图 / 渲染 / 合成) |
outputs/2ito/, outputs/3poz/ |
box → 配体准备 → 对接 → 位姿导出 → RMSD → 打分对照 |
outputs/plip/* |
6 次 PLIP 运行(晶体/无水晶体/对接 × 2 案例)的 XML/TXT |
outputs/plip_interactions.csv |
角色解析后的相互作用长表 |
outputs/plip_runs.csv, plip_identity.csv |
每次运行的状态、计数与配体身份核验 |
outputs/plip_round1_defect/ |
失败轮证据(不进入最终对比图) |
figures/fig1..fig4_*.png/.csv |
定量图组与同名面板数据 |
figures/plate_*/ |
三张交付图版(PNG/PDF/caption.md) |
logs/ |
各阶段完整 stdout/stderr |
TeachOpenCADD 教学材料:Volkamer Lab 及各章作者与贡献者,固定提交
4efdbd36723b5d07960142e15df393d7c6df2ba1,CC BY 4.0。
ChEMBL / PubChem / PDB 数据保留各自数据库条款。本模块的新计算与中文解读为本次会话产出;
底层第三方数据不因本仓库许可而重新授权。