pyrosetta-14 Docking Moves in Rosetta

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需要10^{6}-10^{5} 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)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容