作者,Evil Genius
有人老问我失业了怎么办,我都失业了很久了,太原的公司都快倒闭了,很久没发工资了,老板都跑路了,东西全部打包好没人要。
首先我们需要分析一个问题,蛋白质的高分辨率和低分辨率的质心模式的区别与运用
核心概念总结
简单来说,这是计算精度与计算速度之间的权衡。
高分辨率(全原子)模式:精确但缓慢。将蛋白质中的每个原子(包括氢原子)都明确表示出来。
低分辨率(质心)模式:快速但近似。将每个残基的侧链简化成一个单一的“质心”伪原子。
详细区别对比
特性 | 高分辨率(全原子)模式 | 低分辨率(质心)模式 |
---|---|---|
表示方法 | 明确表示蛋白质中的所有原子(主链原子 + 详细侧链原子 + 氢原子)。 | 每个残基仅由几个关键点表示: 1. 主链原子(N, CA, C, O)。 2. 侧链由一个位于其几何中心的“质心”伪原子代表。 |
残基类型 | fa_standard | centroid |
能量函数 | 复杂的评分函数,包含大量精确的物理项和统计项,如: - 范德华力(fa_atr, fa_rep) - 氢键(hbond_sc, hbond_bb) - 溶剂化效应(fa_sol) - 静电(fa_elec) - 扭转角偏好(rama)等。 |
简化的评分函数(如 score3 或 score4),包含: - 基于环境的原子对势能(模拟范德华力和溶剂化效应)。 - 氢键(主要是主链-主链氢键)。 - 扭转角偏好(rama)。 |
计算速度 | 慢。因为需要计算成千上万个原子对之间的相互作用。 | 极快。原子数量大幅减少,相互作用计算简化。 |
精度与细节 | 高。能够精确描述侧链的堆积、特异的氢键网络、原子级别的相互作用。是进行精细设计和预测所必需的。 | 低。无法描述侧链的细节和方向性,只能捕捉蛋白质折叠的全局特征,如二级结构的形成、蛋白质的大致拓扑结构。 |
一个残基的原子数 | 例如,亮氨酸(Leu)在全原子模式下有~19个原子。 | 在质心模式下,所有残基类型都只有~5-6个原子(主链原子 + 质心伪原子)。 |
运用场景(工作流程)
这两种模式通常不是二选一,而是在一个典型的Rosetta从头折叠或设计工作流中协同工作,形成一种“分阶段”的策略,以兼顾效率和精度。
典型工作流:先质心,后全原子
阶段一:低分辨率全局搜索(质心模式)
目标:在广阔的构象空间中快速寻找接近正确折叠的“粗略”结构。
操作:
将蛋白质序列转换为质心表示(SwitchResidueTypeSetMover("centroid"))。
使用蒙特卡罗等采样算法,结合片段插入,在质心模式下进行大规模构象变化。
由于计算速度快,可以在短时间内探索成千上万个不同的折叠方式。
好比:雕塑家先用粗泥塑出一个大致的形状和轮廓。
阶段二:高分辨率精细优化(全原子模式)
目标:对质心阶段找到的优秀“粗略”结构进行精修,得到原子级别精确的模型。
操作:
将最优的质心模型转换回全原子表示(SwitchResidueTypeSetMover("fa_standard"))。此时,侧链会根据主构象被“放置”回去。
使用全原子能量函数进行进一步的能量最小化和蒙特卡罗采样,优化侧链旋转异构体、消除原子碰撞、优化氢键网络。
好比:雕塑家再在粗坯上精心雕刻细节,使其光滑、逼真。
其他运用场景
仅使用全原子模式:
侧链设计:需要精确考虑侧链堆积和相互作用。
点突变效应预测:需要评估原子级别的能量变化。
蛋白-小分子对接:需要精确描述结合口袋的细节。
对已有结构的局部优化(如松弛)。
仅使用质心模式:
快速评估大量构象,进行初步筛选。
研究非常大的系统(如蛋白质复合物),其中全原子计算成本过高。
某些专注于主链拓扑结构的研究。
今天我们继续分子对接。
!pip install pyrosettacolabsetup
import pyrosettacolabsetup; pyrosettacolabsetup.install_pyrosetta()
import pyrosetta; pyrosetta.init()
from pyrosetta import *
from pyrosetta.teaching import *
init()
低分辨率(质心)评分
Rosetta可采用低分辨率表示法对蛋白质构象进行评分。这将加快能量计算速度。
### BEGIN SOLUTION
pose = pyrosetta.pose_from_pdb("inputs/6Q21_A.pdb")
sfxn = pyrosetta.get_score_function()
sfxn(pose)
### END SOLUTION
1215.729069796814
显示第5号残基。记录该残基的原子数量和坐标信息。
### BEGIN SOLUTION
print(pose.residue(5))
### END SOLUTION
Residue 5: LYS (LYS, K):
Base: LYS
Properties: POLYMER PROTEIN CANONICAL_AA POLAR CHARGED POSITIVE_CHARGE METALBINDING SIDECHAIN_AMINE ALPHA_AA L_AA
Variant types:
Main-chain atoms: N CA C
Backbone atoms: N CA C O H HA
Side-chain atoms: CB CG CD CE NZ 1HB 2HB 1HG 2HG 1HD 2HD 1HE 2HE 1HZ 2HZ 3HZ
Atom Coordinates:
N : 20.315, 43.835, 78.015
CA : 20.418, 42.863, 79.118
C : 19.697, 43.46, 80.329
O : 20.096, 44.486, 80.897
CB : 21.858, 42.487, 79.491
CG : 22.791, 42.176, 78.316
CD : 22.406, 40.943, 77.485
CE : 23.009, 40.932, 76.075
NZ : 22.748, 42.169, 75.307
H : 21.0493, 44.5172, 77.8902
HA : 19.9193, 41.9417, 78.815
1HB : 22.3125, 43.3019, 80.0551
2HB : 21.8492, 41.6078, 80.1356
1HG : 22.8124, 43.0262, 77.6332
2HG : 23.8008, 42.0064, 78.6884
1HD : 22.7418, 40.0399, 77.9965
2HD : 21.3219, 40.8985, 77.3807
1HE : 24.088, 40.801, 76.1421
2HE : 22.5982, 40.0953, 75.5101
1HZ : 23.1708, 42.0938, 74.3926
2HZ : 21.751, 42.2999, 75.2069
3HZ : 23.1434, 42.9592, 75.7961
Mirrored relative to coordinates in ResidueType: FALSE
SwitchResidueTypeSetMover
现在,通过使用SwitchResidueTypeSetMover对象及其apply方法将pose转换为质心形式:
switch = SwitchResidueTypeSetMover("centroid")
switch.apply(pose)
print(pose.residue(5))
core.chemical.GlobalResidueTypeSet: Finished initializing centroid residue type set. Created 62 residue types
core.chemical.GlobalResidueTypeSet: Total time to initialize 0.058948 seconds.
Residue 5: LYS (LYS, K):
Base: LYS
Properties: POLYMER PROTEIN CANONICAL_AA POLAR CHARGED POSITIVE_CHARGE SIDECHAIN_AMINE ALPHA_AA L_AA
Variant types:
Main-chain atoms: N CA C
Backbone atoms: N CA C O H
Side-chain atoms: CB CEN
Atom Coordinates:
N : 20.315, 43.835, 78.015
CA : 20.418, 42.863, 79.118
C : 19.697, 43.46, 80.329
O : 20.096, 44.486, 80.897
CB : 21.8754, 42.543, 79.454
CEN: 23.4957, 41.1851, 79.3707
H : 21.0493, 44.5172, 77.8902
Mirrored relative to coordinates in ResidueType: FALSE
通过创建并使用标准质心评分函数"score3",对新的基于质心的pose进行评分。
### BEGIN SOLUTION
cen_sfxn = pyrosetta.create_score_function("score3")
cen_sfxn(pose)
### END SOLUTION
-4.509358254597608
使用另一个转换对象SwitchResidueTypeSetMover("fa_standard")将pose切换回全原子形式:
### BEGIN SOLUTION
fa_switch = SwitchResidueTypeSetMover("fa_standard")
fa_switch.apply(pose)
print(pose.residue(5))
### END SOLUTION
Residue 5: LYS (LYS, K):
Base: LYS
Properties: POLYMER PROTEIN CANONICAL_AA POLAR CHARGED POSITIVE_CHARGE METALBINDING SIDECHAIN_AMINE ALPHA_AA L_AA
Variant types:
Main-chain atoms: N CA C
Backbone atoms: N CA C O H HA
Side-chain atoms: CB CG CD CE NZ 1HB 2HB 1HG 2HG 1HD 2HD 1HE 2HE 1HZ 2HZ 3HZ
Atom Coordinates:
N : 20.315, 43.835, 78.015
CA : 20.418, 42.863, 79.118
C : 19.697, 43.46, 80.329
O : 20.096, 44.486, 80.897
CB : 21.8754, 42.5429, 79.4539
CG : 22.8944, 43.244, 78.5655
CD : 22.2113, 44.1202, 77.5262
CE : 20.6967, 44.0574, 77.6573
NZ : 20.2706, 43.1587, 78.7642
H : 21.0493, 44.5172, 77.8902
HA : 19.9306, 41.9373, 78.8101
1HB : 22.0814, 42.8255, 80.4867
2HB : 22.0409, 41.4686, 79.3693
1HG : 23.5468, 43.8654, 79.1801
2HG : 23.5056, 42.4999, 78.0558
1HD : 22.5361, 45.154, 77.6512
2HD : 22.4937, 43.7874, 76.5274
1HE : 20.3065, 45.0564, 77.8461
2HE : 20.2655, 43.6934, 76.7248
1HZ : 19.2619, 43.1443, 78.8176
2HZ : 20.6116, 42.2236, 78.5898
3HZ : 20.6485, 43.497, 79.6375
Mirrored relative to coordinates in ResidueType: FALSE
确保原子与原来保持一致。
质心折叠算法
采用质心模式。创建一个评分函数,该函数仅使用范德华力(fa_atr和fa_rep)以及氢键主链-主链短程(hbond_sr_bb)能量评分项。
polyA = pyrosetta.pose_from_sequence('A' * 10)
polyA.pdb_info().name("polyA")
# Apply the SwitchResidueTypeSetMover to the pose polyA
### BEGIN SOLUTION
switch = SwitchResidueTypeSetMover("centroid")
switch.apply(polyA)
### END SOLUTION
# Create new score function with only VDW and hbond_sr_bb energy score terms.
### BEGIN SOLUTION
cen_sfxn = ScoreFunction()
cen_sfxn.set_weight(fa_atr, 1.0)
cen_sfxn.set_weight(fa_rep, 1.0)
cen_sfxn.set_weight(hbond_sr_bb, 1.0)
### END SOLUTION
蛋白质片段
Protein Fragments 的核心概念
- 片段是从已知结构的蛋白质中提取的短序列片段(通常长度为3或9个残基)。
- 每个片段包含了该短肽段的主链二面角(φ, ψ, ω) 信息。
- 这些片段按照序列位置和二级结构倾向性被分类存储在片段库中。
为什么需要它?
蛋白质的构象空间极其庞大(Levinthal悖论)。如果完全随机地改变二面角,几乎不可能在有限时间内找到天然构象。片段提供了一种“智能”的采样方式:它利用自然界中已知存在的、合理的局部结构来引导搜索,而不是盲目随机尝试。
Fragments 的运用与分辨率模式的结合
1. 在质心模式中的核心运用:全局折叠
这是片段最主要、最经典的应用场景。
目标:实现蛋白质的从头折叠。
工作流程:
准备:将蛋白质切换到质心模式以获得计算速度。
加载片段库:为目标蛋白序列准备一个3-mer和9-mer的片段库文件(如 3mer.frags, 9mer.frags)。
片段插入移动:
随机选择蛋白序列中的一个位置(如第5位残基)。
从片段库中对应于该位置的候选片段里,随机挑选一个。
将该片段的主链二面角应用到蛋白质的对应位置,替换掉原来的二面角。
为什么在质心模式下效果最好?
速度:质心模式计算极快,允许进行数万甚至数百万次的片段插入尝试,从而大规模探索构象。
粗糙能量景观:质心能量函数更平滑,能容忍一些轻微的原子碰撞,使链更容易穿过自身形成正确的拓扑结构。
关注全局结构:片段插入主要调整的是主链的二级结构和蛋白质的拓扑折叠,这正是质心模式所擅长的。
2. 在全原子模式中的运用:局部优化
在全原子模式下,片段的使用更具针对性。
目标:对特定局部区域进行精细化调整。
工作场景:
环区建模:对一个已知结构中的缺失环区进行建模。
局部结构优化:当模拟或设计发现某个区域(如一个转角或环)能量较高时,可以用片段库在该区域进行采样,寻找更合理的局部构象。
特点:
- 通常使用更短的片段(如3-mer)。
- 采样范围受限,通常与 MoveMap 结合,只允许特定区域的骨架移动。
- 计算成本高,因此不能像在质心模式下那样进行大规模采样。
在折叠代码中创建一个新的子程序,用于实现基于“片段插入”的替代随机移动。片段插入是指将连续残基组的扭转角替换为从片段库文件中随机抽取的新扭转角。在调用该子程序之前,先从片段文件中加载片段集:
### BEGIN SOLUTION
from pyrosetta.rosetta.core.fragment import *
fragset = ConstantLengthFragSet(3)
fragset.read_fragment_file("inputs/3mer.frags")
### END SOLUTION
使用FragmentMover和MoveMap
利用上述片段集和一个MoveMap对象作为参数,构建另一个Mover对象——这次是FragmentMover。MoveMap用于指定当Mover应用于pose时,允许哪些自由度发生变化(本例中为所有骨架扭转角):
### BEGIN SOLUTION
from pyrosetta.rosetta.protocols.simple_moves import ClassicFragmentMover
movemap = MoveMap()
movemap.set_bb(True)
mover_3mer = ClassicFragmentMover(fragset, movemap)
### END SOLUTION
当MoveMap对象被创建时,所有自由度初始状态均设置为False(不可移动)。若已实例化PyMOL_Mover,可通过以下命令将移动映射发送至PyMOL快速可视化允许自由度:
### BEGIN SOLUTION
test_pose = pyrosetta.pose_from_sequence("RFPMMSTFKVLLCGAVLSRIDAG")
pmm = PyMOLMover()
pmm.apply(test_pose)
pmm.send_movemap(test_pose, movemap)
### END SOLUTION
每次应用此mover时,它将随机选择一个3残基窗口,并仅插入来自片段集中随机匹配片段的骨架扭转角。以下为使用上述test_pose的示例:
### BEGIN SOLUTION
mover_3mer.apply(test_pose)
pmm.apply(test_pose)
### END SOLUTION