ProDy 是专注蛋白结构动力学的 Python 库。它的独特之处不在于跑模拟,而在于用远低于 MD 的成本估计蛋白的集体运动模式——弹性网络模型(ENM)只需一个结构、几秒钟计算,就能给出蛋白最可能的大尺度运动方向。
安装
pip install ProDy
# 可选:进一步分析与可视化
pip install nglview matplotlib
弹性网络模型:秒级估计蛋白运动
from prody import *
import numpy as np
structure = parsePDB("1ake")
calphas = structure.select("calpha")
# 各向异性网络模型(ANM):给出三维运动方向
anm = ANM("AK ANM")
anm.buildHessian(calphas, cutoff=15.0, gamma=1.0)
anm.calcModes(n_modes=20)
print(anm.getEigvals()[:5]) # 频率,越低越是大尺度运动
writeNMD("anm_modes.nmd", anm[:5], calphas) # 可在 VMD/NMWiz 里播放
# 高斯网络模型(GNM):只算涨落幅度,更简单
gnm = GNM("AK GNM")
gnm.buildKirchhoff(calphas, cutoff=7.3)
gnm.calcModes(n_modes=20)
fluct = calcSqFlucts(gnm[:10]) # 逐残基涨落,可与实验 B-factor 比对
ENM 的核心假设很简单:把蛋白看成弹簧连接的珠子网络,形状本身就决定了它能怎么动。这个近似粗糙,但在预测大尺度铰链运动、结构域开合上意外地有效,而且成本比 MD 低几个数量级。
用多个结构做 PCA
ensemble = parsePDB(["1ake", "4ake"], subset="calpha")
ens = buildPDBEnsemble(ensemble)
ens.iterpose() # 叠合
pca = PCA("AK ensemble")
pca.buildCovariance(ens)
pca.calcModes(n_modes=5)
print(calcFractVariance(pca[:3]).sum()) # 前 3 个主成分解释的方差比例
# ENM 预测的运动与实验观测到的构象变化是否一致
print(calcOverlap(pca[0], anm[0])) # 重叠度,接近 1 说明预测准确
calcOverlap 是很有说服力的一步:如果 ENM 的第一模式与晶体结构间实际观测到的构象变化高度重叠,说明这个粗粒化模型确实抓住了蛋白的功能运动。腺苷酸激酶(AK)是经典教科书例子。
在药物设计中的三个用途
- 识别柔性口袋与隐蔽位点:沿低频模式扰动结构,能让原本关闭的口袋打开,用于发现 cryptic pocket——这是别构药物设计的常用起点。
- 生成构象集合做集合对接:用 ENM 模式生成一系列构象,对接时覆盖受体柔性,比只用单一晶体结构更贴近现实。
- 别构通路分析:用
calcPerturbResponse等做扰动响应扫描,识别哪些残基对远端位点影响大,帮助定位别构位点。
# 沿第一模式生成一系列构象,用于集合对接
ensemble_conf = traverseMode(anm[0], calphas, n_steps=10, rmsd=2.0)
writePDB("mode1_traverse.pdb", ensemble_conf)
局限
- 只给方向,不给时间尺度:ENM 告诉你蛋白可能怎么动,不告诉你多快动、能垒多高。定量动力学仍需 MD 或增强采样。
- 粗粒化到 Cα:侧链细节、氢键网络的变化完全看不到。
- cutoff 参数敏感:ANM 常用 13~15 Å、GNM 常用 7~8 Å,取值影响结果,建议做敏感性检查。
- 适用于球状蛋白:对内在无序蛋白、高度伸展的结构,弹簧网络假设不成立。
上手提示
- ENM 用几秒钟估计蛋白大尺度运动,成本比 MD 低几个数量级;
- 用
calcOverlap验证预测模式与实验构象变化是否一致,再决定要不要信; - 沿低频模式生成构象做集合对接,是覆盖受体柔性的实用做法;
- 它只给运动方向,不给时间尺度与能垒,定量问题仍需 MD。
延伸资源
- 轨迹分析:205《MDAnalysis》、206《MDTraj》;模拟引擎:200《OpenMM》;
- 口袋与别构概念见「结构与模拟」模块;
- 结构处理基础:210《Biopython》。