参考:https://github.com/Tangcyu/Gen-COMPAS
核心:扩散模型 + 迭代增强采样(committor 引导)找 A↔B 过渡态 / 反应路径
背景:体系两个稳定态 A、B(两个复合物结构)。A、B 是势能面上两个极小点,中间过渡态 TS 是鞍点,属于稀有事件;
普通 MD 甚至常规增强采样很难直接采到,因为势垒高,自发穿越概率极低。
这套方法核心思路:扩散模型用来生成候选中间构象(猜测路径),再用 MD+committor 函数筛选、修正、更新模型,迭代收敛到真实反应通道和自由能面 FEL
Gen-COMPAS 简要解析
定位 :面向蛋白质稀有事件(构象转变、折叠等)的生成式提交概率(committor)引导路径采样模块化管线 ,把扩散模型 + VCN变分提交网络 + MD模拟 + RiteWeight重加权整合在一起,用于采样跃迁路径、计算自由能面FEL。
用途:蛋白质稀有构象转变路径采样工具,用来解决分子动力学(MD)很难采样到的蛋白构象跃迁(A 态↔B 态),用扩散模型生成蛋白中间构象 + VCN 变分承诺网络学习反应坐标,迭代生成过渡路径、做分子模拟、计算自由能面。
核心思想
稀有事件模拟难点:直接MD很难采样两个稳态A↔B之间的过渡态区域。
- 扩散模型:生成大量蛋白质中间构象候选;
- VCN(Variational Committor Network) :学习反应坐标,预测每个构象的提交概率committor q(从该结构最终流向状态B的概率,q≈0.5就是过渡区);
- 迭代闭环 :用VCN筛选靠近q=0.5过渡区的生成构象,作为TMD(靶向分子动力学)的目标;跑TMD+无偏MD得到新轨迹;用RiteWeight对轨迹做统计重加权,得到可靠自由能景观;新数据回流,下一轮训练扩散和VCN,迭代提升采样。
两轮迭代流程(关键区别)
- Iteration 0(bootstrap启动轮,无VCN)
训练扩散 → 采样构象 → kmeans聚类选代表结构 → PDB加氢/设置占有率 → NAMD跑TMD+无偏MD → RiteWeight权重计算 → FEL自由能估计
只用初始A/B盆地的无偏MD轨迹训练扩散,做第一轮采样。
- Iteration ≥1(committor引导轮,核心)
训练扩散 → 训练VCN → 采样构象 → committor_slice:只保留q在0.5±VCN.q_variance附近的过渡区构象作为候选 → PDB处理 → NAMD模拟 → RiteWeight → FEL
用上一轮RiteWeight输出的数据训练VCN;只筛选过渡态附近结构,聚焦稀有跃迁路径。
主要模块(YAML统一配置管理)
- Generative:扩散模型,SchNet+注意力,生成蛋白构象;可逐轮调整噪声scale、训练epoch,前期高噪声提升构象多样性,后期降低噪声。
- VCN:学习committor概率;
q_variance控制过渡区筛选窗口;tau滞后时间在较宽范围结果稳健。 - Clustering:仅第0轮使用,对生成构象聚类提取代表结构。
- Occupancy:给PDB补氢、设置原子占有率,适配后续TMD可视化/模拟。
- NAMD:调用NAMD+Colvars,执行靶向MD(TMD)后接无偏MD;TMD力常数是重点调参项,不能过大造成结构畸变。
- RiteWeight:核心重加权算法(PNAS配套方法),计算轨迹统计权重,输出VCN训练数据;区分
transition_weight(VCN训练)与fel_weight(自由能面,时间对称)。 - FEL_estimate:由RiteWeight权重投影得到一维/二维加权自由能景观。
运行控制特点
- 主命令:
gen-compas,基于yaml配置;支持--dry-run预校验、--resume断点续跑、--stepwise分步暂停人工检查、单独执行/重跑单个步骤。 - 迭代由用户指定轮次,代码没有自动收敛判据,需要人工检查committor切片、TMD轨迹、FEL判断是否停止。
- 输出目录按迭代组织;
workflow_manifest.json记录各步骤状态,作为断点恢复依据;附带GUI工具gen-compas-config辅助编写/校验yaml配置。
依赖与环境
- Python/PyTorch做AI模型;MDTraj/MDAnalysis处理轨迹;
- 外部依赖NAMD(≥3.0.2,内置Colvars),NAMD不通过pip安装,需要单独部署。
- 提供Trp-cage蛋白demo,可复现论文算例。
核心调参要点
- TMD力常数:平衡RMSD收敛和结构稳定性;
- 扩散采样噪声:迭代早期大噪声扩构象多样性,后期小噪声精细化采样;
- VCN的τ滞后时间:不要极端过小/过大,中间区间结果不敏感;
评估指标不能只看生成模型loss,必须看下游MD诊断:TMD收敛性、committor双向一致性、多次独立运行可复现性。
迭代闭环在哪?
一句话总结:Gen-COMPAS构建迭代自增强闭环,用扩散模型生成候选构象,VCN锁定过渡态区域,结合NAMD分子动力学+RiteWeight统计重加权,高效采样蛋白构象跃迁稀有事件并估计自由能面。
A,B稳态初始MD轨迹
↓
【Iter0 Bootstrap】
train_diffusion → sample_diffusion → clustering → occupancy → NAMD(TMD+MD) → RiteWeight → FEL
↓(RiteWeight输出新轨迹,进入闭环)
【Iter≥1 Committor闭环】
train_diffusion → train_committor(VCN) → sample_diffusion → committor_slice(筛选q≈0.5) → occupancy → NAMD → RiteWeight → FEL
↑───────────────────────────────────────────────────────────────┘
(RiteWeight输出回流,开启新一轮迭代)
#mermaid-svg-aYemOL19fXcNPTAH{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-aYemOL19fXcNPTAH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-aYemOL19fXcNPTAH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-aYemOL19fXcNPTAH .error-icon{fill:#552222;}#mermaid-svg-aYemOL19fXcNPTAH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-aYemOL19fXcNPTAH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-aYemOL19fXcNPTAH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-aYemOL19fXcNPTAH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-aYemOL19fXcNPTAH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-aYemOL19fXcNPTAH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-aYemOL19fXcNPTAH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-aYemOL19fXcNPTAH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-aYemOL19fXcNPTAH .marker.cross{stroke:#333333;}#mermaid-svg-aYemOL19fXcNPTAH svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-aYemOL19fXcNPTAH p{margin:0;}#mermaid-svg-aYemOL19fXcNPTAH .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-aYemOL19fXcNPTAH .cluster-label text{fill:#333;}#mermaid-svg-aYemOL19fXcNPTAH .cluster-label span{color:#333;}#mermaid-svg-aYemOL19fXcNPTAH .cluster-label span p{background-color:transparent;}#mermaid-svg-aYemOL19fXcNPTAH .label text,#mermaid-svg-aYemOL19fXcNPTAH span{fill:#333;color:#333;}#mermaid-svg-aYemOL19fXcNPTAH .node rect,#mermaid-svg-aYemOL19fXcNPTAH .node circle,#mermaid-svg-aYemOL19fXcNPTAH .node ellipse,#mermaid-svg-aYemOL19fXcNPTAH .node polygon,#mermaid-svg-aYemOL19fXcNPTAH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-aYemOL19fXcNPTAH .rough-node .label text,#mermaid-svg-aYemOL19fXcNPTAH .node .label text,#mermaid-svg-aYemOL19fXcNPTAH .image-shape .label,#mermaid-svg-aYemOL19fXcNPTAH .icon-shape .label{text-anchor:middle;}#mermaid-svg-aYemOL19fXcNPTAH .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-aYemOL19fXcNPTAH .rough-node .label,#mermaid-svg-aYemOL19fXcNPTAH .node .label,#mermaid-svg-aYemOL19fXcNPTAH .image-shape .label,#mermaid-svg-aYemOL19fXcNPTAH .icon-shape .label{text-align:center;}#mermaid-svg-aYemOL19fXcNPTAH .node.clickable{cursor:pointer;}#mermaid-svg-aYemOL19fXcNPTAH .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-aYemOL19fXcNPTAH .arrowheadPath{fill:#333333;}#mermaid-svg-aYemOL19fXcNPTAH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-aYemOL19fXcNPTAH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-aYemOL19fXcNPTAH .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aYemOL19fXcNPTAH .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-aYemOL19fXcNPTAH .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aYemOL19fXcNPTAH .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-aYemOL19fXcNPTAH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-aYemOL19fXcNPTAH .cluster text{fill:#333;}#mermaid-svg-aYemOL19fXcNPTAH .cluster span{color:#333;}#mermaid-svg-aYemOL19fXcNPTAH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-aYemOL19fXcNPTAH .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-aYemOL19fXcNPTAH rect.text{fill:none;stroke-width:0;}#mermaid-svg-aYemOL19fXcNPTAH .icon-shape,#mermaid-svg-aYemOL19fXcNPTAH .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aYemOL19fXcNPTAH .icon-shape p,#mermaid-svg-aYemOL19fXcNPTAH .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-aYemOL19fXcNPTAH .icon-shape .label rect,#mermaid-svg-aYemOL19fXcNPTAH .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aYemOL19fXcNPTAH .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-aYemOL19fXcNPTAH .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-aYemOL19fXcNPTAH :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Iteration 0(Bootstrap)
输出新轨迹数据,进入Iteration ≥1 闭环
新数据回流,下一轮迭代
初始数据:A/B态无偏MD轨迹
train_diffusion
训练扩散模型
sample_diffusion
生成蛋白构象
clustering
聚类提取代表构象
occupancy
PDB补氢+原子占有率
namd
TMD靶向MD + 无偏MD模拟
riteweight
RiteWeight轨迹统计重加权
fel_estimate
加权自由能面FEL
train_diffusion
热启动训练扩散
train_committor
训练VCN变分提交网络
sample_diffusion
扩散采样构象
committor_slice
筛选 q≈0.5 过渡区构象
occupancy
PDB补氢+原子占有率
namd
TMD + 无偏MD模拟
riteweight
RiteWeight重加权
fel_estimate
加权自由能面FEL


这里有一个非常有意思的概念以及idea:committor函数,0.5概率值与鞍点区域 有某种对应

这个idea可以借鉴,比如说同样是蛋白质互作,可以用commitor去生成一个位于两个状态之间的过渡态构象(条件生成,至于两个状态如何设置看你自己定义,你自己定义状态A和B,数据如何获取)

