Overview
在这里,我们将介绍Rosetta中可以帮助对接的许多类型的Mover,以及用于对接的FoldTree。请注意,DockMCMProtocol是Rosetta使用的通用高分辨率对接算法,而DockingLowRes用于低分辨率对接Mover。
下面的练习首先要下载1V74的pdb,并clean .并且将pose以三种形式就行储存:a full-atom starting pose 、 centroid poses 和 full-atom “working” poses.
from pyrosetta import *
from pyrosetta.teaching import *
from pyrosetta.toolbox import cleanATOM
pyrosetta.init()
# 对pdb进行clean
cleanATOM("1V74.pdb")
# 导入pdb
pose = pose_from_file("1V74.clean.pdb")
# 复制pose到三种形式
starting_pose = pose.clone()
cen_pose = pose.clone()
cen_switch = SwitchResidueTypeSetMover("centroid") # centroid 格式,侧链以球的形式存在
cen_switch.apply(cen_pose)
starting_cen_pose = cen_pose.clone()
Rigid-body transformations and Fold Trees
基本的对接动作是由平移和旋转组成的刚体变换。任何刚体移动都需要知道哪个部分移动,哪个部分固定。在Rosetta中,这种划分被称为Jump,一组蛋白质片段和跳跃被存储在一个被称为折叠树的姿势上的物体中。
print(pose.fold_tree())
FOLD_TREE EDGE 1 107 -1 EDGE 1 108 1 EDGE 108 194 -1
在FoldTree打印输出中,单词EDGE后面的每个三个数字序列都是开始和结束的残数,然后是一个代码。代码是-1表示蛋白质的延伸,任何正整数表示Jump,代表Jump数。
默认情况下,链A的N末端和链B的N末端之间有一个Jump,但我们可以使用setup_foldtree()来改变这一点。
from pyrosetta.rosetta.protocols.docking import setup_foldtree
print(pose.fold_tree())
setup_foldtree(pose, "A_B", Vector1([1]))
setup_foldtree(starting_pose, "A_B", Vector1([1]))
print(pose.fold_tree())
FOLD_TREE EDGE 1 107 -1 EDGE 1 108 1 EDGE 108 194 -1
FOLD_TREE EDGE 1 88 -1 EDGE 88 107 -1 EDGE 88 158 1 EDGE 158 108 -1 EDGE 158 194 -1
参数“A_B”告诉Rosetta使链A成为“刚性”链,并允许链B移动。如果pdb结构中有更多的链,则提供“AB_C”将使链A和B刚性地作为一个单元保持在一起,并允许链C移动。(第三个参数Vector1([1])是必需的,它创建了一个从1索引的Rosetta矢量对象,其中有一个元素标识FoldTree中的第一个Jump以供对接使用。)
我们将连接A和B的N端的Jump改为连接A和B中心的Jump
您可以通过从pose打印来查看Jump中的信息类型:
jump_num = 1
print(pose.jump(jump_num).get_rotation()) # rotation matrix
print(pose.jump(jump_num).get_translation()) # translation vector
-0.7685217364647527 -0.5410492486350577 -0.3415260621572572
-0.4152200273442840 0.8278586413578777 -0.3771503663279437
0.4867922241299832 -0.1480397935709470 -0.8608818444165606
-2.528204534753801 -11.32734702901771 -11.01155062262599
更多关于FoldTree的信息课查看我以前的文章:FoldTree
RigidBody Movers
两种基本操作是平移和旋转。对于平移,需要更改x、y和z坐标以及Junp数。旋转需要一个中心和一个绕其旋转的轴。刚体位移可以直接使用RigidBodyTransMover进行平移,也可以使用RigidBodySpinMover进行旋转。
然而,对于结构预测计算,我们有一个Mover,它被预先配置为在rosetta.protocols.rigid命名空间中进行围绕设定幅度变化的随机移动(在这种情况下,平均8°旋转和3Å平移)(为了方便起见,我们将用别名rigid_moves重命名它):
import pyrosetta.rosetta.protocols.rigid as rigid_moves
pert_mover = rigid_moves.RigidBodyPerturbMover(jump_num, 8, 3)
将RigidBodyMauctionMover应用于全原子姿势,并(可选)使用PyMOLMMover来确认运动是否符合您的预期。
from pyrosetta import PyMOLMover
pymol = PyMOLMover()
pymol.apply(pose)
pert_mover.apply(pose)
pymol.apply(pose)
全局扰动对于制造完全随机的起始结构是有用的。下面的Mover将使蛋白质绕其几何中心旋转。最终方向在“globe”上均匀分布。
randomize1 = rigid_moves.RigidBodyRandomizeMover(pose, jump_num, rigid_moves.partner_upstream)
randomize2 = rigid_moves.RigidBodyRandomizeMover(pose, jump_num, rigid_moves.partner_downstream)
(partner_upstream和partner_downstream是pyrossetta.rosetta.protocols.rigid命名空间中的预定义术语,在我们的例子中,它们分别指链A和B。)
将两个Mover应用于起始结构,并在PyMOL中查看该结构。(您可以将其与原始姿势一起查看)。
randomize1.apply(pose)
pymol.apply(pose)
randomize2.apply(pose)
pymol.apply(pose)
由于蛋白质不是球形的,有时随机的方向会在对partners之间产生严重的冲突,而其他时候则会放置partners,使它们不再接触。FaDockingSlideIntoContact Mover将沿着蛋白质中心线平移下游蛋白质,直到蛋白质接触。
slide = DockingSlideIntoContact(jump_num) # for centroid mode
slide = FaDockingSlideIntoContact(jump_num) # for full-atom mode
slide.apply(pose)
pymol.apply(pose)
我们之前曾使用MinMover来改变扭转角,以在分数函数中找到最接近的最小值,它也可以对跳跃平移和旋转进行操作。在MoveMap中将Jump变量设置为可移动即可:
movemap = MoveMap()
movemap.set_jump(jump_num, True)
min_mover = MinMover()
min_mover.movemap(movemap)
scorefxn = get_fa_scorefxn()
min_mover.score_function(scorefxn)
将上述MinMover应用于working pose:
scorefxn(pose)
min_mover.apply(pose)
print(pose.jump(jump_num).get_rotation())
print(pose.jump(jump_num).get_translation())
Low-Resolution Docking via RosettaDock
RosettaDock也可以执行全局对接运行,但可能需要大量时间。通常情况下,a global run需要 decoys .对于本次测试,我们将创建一个小得多的数字,并学习处理大型跑步所需的工具。
Docking作为一个完全包含protocol的mover。要使用Mover,需要一个定义了两条链和一个跳跃的起始pose。结构必须处于低分辨率(质心)模式,并且需要低分辨率对接分数功能:
scorefxn_low = create_score_function("interchain_cen")
将复杂体的质心版本随机化。然后,创建低分辨率对接结构,如下所示:
dock_lowres = DockingLowRes(scorefxn_low, jump_num)
print(cen_pose.fold_tree())
setup_foldtree(cen_pose, "A_B", Vector1([1]))
print(cen_pose.fold_tree())
dock_lowres.apply(cen_pose)
你可以通过使用函数CA_rmsd(pose1,pose2)计算所有Cα原子的均方根偏差(RMSD)来比较结构。在对接中,一个更有用的度量是配体RMSD,它是配体的主链Cα原子在受体蛋白主链叠加后的偏差。您可以使用calc_RMSD(pose1,pose2,Vector1([1]))计算配体RMSD。
print(CA_rmsd(cen_pose, starting_cen_pose))
print(calc_Lrmsd(cen_pose, starting_cen_pose, Vector1([1])))
Job Distributor
对于使用罗塞塔进行的详尽搜索(对接、细化或折叠),有必要创建大量候选结构,称为“decoys”。这通常是通过将工作分散到大量计算机上来实现的。此外,每个创建的decoys都需要单独标记。负责管理输出的对象称为PyJobDistributor。在这里,我们将使用一个简单的JobDistributor来创建多个结构。以下构造函数将JobDistributor设置为创建10个诱饵,文件名为output_1.pdb、output_2.pdb等。pdb文件还将包括根据提供的ScoreFunction的分数。
jd = PyJobDistributor("output", 10, scorefxn_low)
将每个decoys与原始的结构进行比较也很有用(如果已知的话;否则可以使用参考结构)。JobDistributor将在输出时进行RMSD计算和最终评分。要设置原始的姿势,请执行以下操作:
# your starting_cen_pose should be the native crystal structure
jd.native_pose = starting_cen_pose
创建一个随机的starting pose, working pose, fold tree, score function, job distributor, and low-resolution docking mover.现在,运行低分辨率对接协议来创建一个结构,并输出一个decoys,这样做两次,并确认您的工作目录中有两个输出文件:
cen_pose.assign(starting_cen_pose)
dock_lowres.apply(cen_pose)
jd.output_decoy(cen_pose)
每当调用output_decoy()方法时,PyJobDistributor的current_num变量就会递增,它还会输出一个更新的分数文件:output.fasc。我们可以通过使用PyJobDistributer设置循环来完成这组10个decoy,请注意jd.job_complete布尔变量,该变量指示是否已创建所有10个decoy:
while not jd.job_complete:
cen_pose.assign(starting_cen_pose)
dock_lowres.apply(cen_pose)
jd.output_decoy(cen_pose)
重置PyJobDistributor以通过重建它来创建100个decoy(或更多或更少,根据处理器的速度允许)。重新运行上面的循环以生成100个decoy。使用您的分数文件绘制分数与RMSD的对比图。(两种简单的方法是将分数文件导入Excel或使用Linux命令gnuplot。)
jd = PyJobDistributor("output", 100, scorefxn_low)
while not jd.job_complete:
cen_pose.assign(starting_cen_pose)
dock_lowres.apply(cen_pose)
jd.output_decoy(cen_pose)
High-Resolution Docking
RosettaDock的高分辨率也可作为Mover使用。该Mover包括随机刚体移动、侧链填充和刚体坐标中基于梯度的最小化。高分辨率对接需要全原子评分功能。优化的对接重量可作为标准全原子能量函数的补丁使用请注意,与DockingLowRes不同,我们必须为对接伙伴提供“A_B”,而不是jump_num。
scorefxn_high = create_score_function("ref2015.wts", "docking")
dock_hires = DockMCMProtocol()
dock_hires.set_scorefxn(scorefxn_high)
dock_hires.set_partners("A_B") # make sure the FoldTree is set up properly
高分辨率decoy需要侧链。放置侧链的一种方法是调用PackMover,它将从旋转异构体生成构象。第二种方法是从原始单体结构中复制侧链。这通常有助于对接计算,因为单体晶体结构具有良好的侧链位置。
recover_sidechains = ReturnSidechainMover(starting_pose)
recover_sidechains.apply(pose)