{ "cells": [ { "cell_type": "markdown", "id": "f3d8c35e", "metadata": {}, "source": [ "# FoldTree的不连续性\n", "\n", "@Author: 张博文\n", "@email:bowen.zhang@xtalpi.com\n", "\n", "@Proofread: 吴炜坤\n", "@email:weikun.wu@xtalpi.com" ] }, { "cell_type": "markdown", "id": "6b014b71", "metadata": {}, "source": [ "上一节中,我们介绍了Rosetta中坐标的处理方式Rosetta的基本概念,及其顺序性、杠杠性。这一节中,我们将继续介绍: \n", "(1)FoldTree的另两个特性:跳跃性和可切割性。 \n", "(2)快速设置特殊任务foldtree的方法" ] }, { "cell_type": "code", "execution_count": 1, "id": "f086eb81", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "PyRosetta-4 2021 [Rosetta PyRosetta4.conda.mac.cxx11thread.serialization.python37.Release 2021.26+release.b308454c455dd04f6824cc8b23e54bbb9be2cdd7 2021-07-02T13:01:54] retrieved from: http://www.pyrosetta.org\n", "(C) Copyright Rosetta Commons Member Institutions. Created in JHU by Sergey Lyskov and PyRosetta Team.\n", "\u001b[0mcore.init: {0} \u001b[0mChecking for fconfig files in pwd and ./rosetta/flags\n", "\u001b[0mcore.init: {0} \u001b[0mRosetta version: PyRosetta4.conda.mac.cxx11thread.serialization.python37.Release r288 2021.26+release.b308454c455 b308454c455dd04f6824cc8b23e54bbb9be2cdd7 http://www.pyrosetta.org 2021-07-02T13:01:54\n", "\u001b[0mcore.init: {0} \u001b[0mcommand: PyRosetta -ex1 -ex2aro -database /opt/miniconda3/lib/python3.7/site-packages/pyrosetta/database\n", "\u001b[0mbasic.random.init_random_generator: {0} \u001b[0m'RNG device' seed mode, using '/dev/urandom', seed=1987000656 seed_offset=0 real_seed=1987000656 thread_index=0\n", "\u001b[0mbasic.random.init_random_generator: {0} \u001b[0mRandomGenerator:init: Normal mode, seed=1987000656 RG_type=mt19937\n" ] } ], "source": [ "# 初始化pyrosetta,使用pyrosetta必须要做的一件事情\n", "from pyrosetta import init, pose_from_pdb, pose_from_sequence\n", "init()" ] }, { "cell_type": "markdown", "id": "956e446f", "metadata": {}, "source": [ "### 一、FoldTree的不连续性" ] }, { "cell_type": "markdown", "id": "3309ddef", "metadata": {}, "source": [ "上一节中我们已经提到了FoldTree的另外两个特性:跳跃性和可切割性,这一节我们将详细的介绍。" ] }, { "cell_type": "markdown", "id": "29340e34", "metadata": {}, "source": [ "#### 1.1 FoldTree的跳跃性: Jump连接" ] }, { "cell_type": "markdown", "id": "0a905a9c", "metadata": {}, "source": [ "上一节我们已经提过,在FoldTree中当蛋白质有多条链组成时,尽管每一条链中的残基都是共价连接,多条链之间实际上并不存在实际的共价连接。而在FoldTree的概念中,一个树结构只能有一个“根”, 因此在Rosetta中,引入了一种虚拟共价链接,为成为Jump。如同跳跃一般,可以建立一种\"超远程\"的上下游关系。\n", "\n", "以下我们将实践揭开jump的定义方式:" ] }, { "cell_type": "code", "execution_count": 2, "id": "043fc87e-0364-4db2-8821-b10202d69c47", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[0mcore.chemical.GlobalResidueTypeSet: {0} \u001b[0mFinished initializing fa_standard residue type set. Created 984 residue types\n", "\u001b[0mcore.chemical.GlobalResidueTypeSet: {0} \u001b[0mTotal time to initialize 0.640777 seconds.\n", "\u001b[0mcore.import_pose.import_pose: {0} \u001b[0mFile './data/1v74.pdb' automatically determined to be of type PDB\n", "\u001b[0mcore.conformation.Conformation: {0} \u001b[0m\u001b[1m[ WARNING ]\u001b[0m missing heavyatom: OXT on residue LEU:CtermProteinFull 107\n", "\u001b[0mcore.conformation.Conformation: {0} \u001b[0m\u001b[1m[ WARNING ]\u001b[0m missing heavyatom: OXT on residue LEU:CtermProteinFull 194\n" ] } ], "source": [ "#首先读取data文件中的PDB:1V74文件\n", "pose = pose_from_pdb('./data/1v74.pdb')" ] }, { "cell_type": "code", "execution_count": 3, "id": "7b1c58d7-53ac-4ede-9e61-5ba2b797f5e2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "PDB:1V74: FOLD_TREE EDGE 1 107 -1 EDGE 1 108 1 EDGE 108 194 -1 \n", "The size of the foldtree (number of edges) is 3\n", "The number of the jump is 1\n" ] } ], "source": [ "# 输出该pose的FoldTree\n", "print(\"PDB:1V74: \",pose.fold_tree())\n", "print(f\"The size of the foldtree (number of edges) is {pose.fold_tree().size()}\") #Foldtree 的尺寸(edge的个数)\n", "print(f\"The number of the jump is {pose.fold_tree().num_jump()}\") #Foldtree 的jump点的个数" ] }, { "cell_type": "markdown", "id": "aa40610f", "metadata": {}, "source": [ "可以看到该Pose中含有3个Edge(含一个Jump Edge)。与上一章介绍的一样,其中,从1-107、108-194最后一位为-1,因此这两个edge内所有残基为共价连接,而1和108号残基,即该蛋白的A链和B链的N端由一个Jump连接,即一个虚拟的“共价键”。" ] }, { "cell_type": "markdown", "id": "34db2cd2-7afc-40ba-8a74-4175b67816f9", "metadata": {}, "source": [ "将这个FoldTree进行可视化的话,即如上图所示。此时A链的1号残基为B链108-194残基的上游,同时也是2-107号残基的上游。\n", "因此jump1的虚拟链接定义了ChainA和ChainB之间的上下游关系。" ] }, { "cell_type": "markdown", "id": "15be28c8", "metadata": {}, "source": [ "<img src=\"./imgs/set_jump.jpg\" width = \"800\" height = \"300\" align=center /> \n", "(图片来源: 晶泰科技团队)" ] }, { "cell_type": "markdown", "id": "14875583-123d-4b73-8486-8caa4a809c2c", "metadata": {}, "source": [ "**此时,FoldTree树结构才只会有一个根部起点!!Root=PoseID:1**" ] }, { "cell_type": "markdown", "id": "f6d858cf-0ffe-4c13-97c4-0d2b099595c3", "metadata": {}, "source": [ "**思考**:\n", "1. 当改变第70号氨基酸时,杠杠效应具体表现?\n", "2. 当改变第150号氨基酸时,杠杠效应具体表现?" ] }, { "cell_type": "markdown", "id": "d9d546f2-570f-4d95-8e91-1fc1a172ce93", "metadata": {}, "source": [ "#### 1.2 正确设置一个带Jump的FoldTree" ] }, { "cell_type": "markdown", "id": "c3d6c16d-d718-4963-a50f-9a60f7227178", "metadata": {}, "source": [ "设置带Jump点的foldtree方式也是通过FoldTree下的add_edge函数完成,用以下的例子,我们尝试复现1.1节中展示的foldtree。\n", "\n", "先来看一个例子:" ] }, { "cell_type": "code", "execution_count": 4, "id": "04ed5384-db07-4eb1-bee3-37d1c6485d92", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[0mcore.kinematics.FoldTree: {0} \u001b[0m\u001b[31m\u001b[1m[ ERROR ]\u001b[0m Bad fold tree at edge EDGE 108 194 -1\n", "\u001b[0mcore.kinematics.FoldTree: {0} \u001b[0m\u001b[31m\u001b[1m[ ERROR ]\u001b[0m Start residue 108 not built yet.\n", "\u001b[0mcore.kinematics.FoldTree: {0} \u001b[0m\u001b[31m\u001b[1m[ ERROR ]\u001b[0m FOLD_TREE EDGE 1 107 -1 EDGE 108 194 -1 EDGE 1 108 1\n", "FOLD_TREE EDGE 1 107 -1 EDGE 108 194 -1 EDGE 1 108 1 \n" ] } ], "source": [ "from pyrosetta.rosetta.core.kinematics import FoldTree\n", "# 完整定义试试:\n", "ft = FoldTree() #设置一个空的foldtree对象\n", "ft.add_edge(start=1, stop=107, label=-1)\n", "ft.add_edge(start=108, stop=194, label=-1)\n", "ft.add_edge(start=1, stop=108, label=1) # add jump\n", "ft.check_fold_tree() # 检查foldtree的有效性;\n", "print(ft)" ] }, { "cell_type": "markdown", "id": "40d1204f-1993-4e99-8b59-afc8dd3c1318", "metadata": {}, "source": [ "**笔者解读: 这是因为在构建foldtree时是有顺序性的。每一个子节点必须先定义父节点才能生效。在第一种做法中,108号残基在创建时没有找到他可以连接的父节点。而在第二种做法中,先定义了107-108之间的jump,因此108号残基的foldtree才是有效的!**" ] }, { "cell_type": "markdown", "id": "8bc2862e-2db9-4e24-b3e2-7afcdc5ee6de", "metadata": {}, "source": [ "我们先定义里两个edge之后再去定义jump。但发现foldtree是无效的!" ] }, { "cell_type": "code", "execution_count": 5, "id": "84551714-66ce-477e-b54c-1dd6e740e26c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pyrosetta.rosetta.core.kinematics import FoldTree\n", "# 完整定义试试:\n", "ft = FoldTree() #设置一个空的foldtree对象\n", "ft.add_edge(start=1, stop=107, label=-1)\n", "ft.add_edge(start=1, stop=108, label=1) # add jump\n", "ft.add_edge(start=108, stop=194, label=-1)\n", "ft.check_fold_tree() # 检查foldtree的有效性;" ] }, { "cell_type": "markdown", "id": "9b9af2ef-9672-45fa-bc3d-204b1ec75bd7", "metadata": {}, "source": [ "而如果先构建第一个edge,然后构建jump,在构建第二个edge时,foldtree是有效的。这种现象产生原因是?" ] }, { "cell_type": "markdown", "id": "c857d074-b4ad-4c6c-9410-aace7149762f", "metadata": {}, "source": [ "**jump点的设置练习**: 读者可根据以下foldtree的逻辑图创建一个foldtree么?(提示注意jump编号)" ] }, { "cell_type": "markdown", "id": "2949c0d3-e0a4-4896-bd23-214e000fc040", "metadata": {}, "source": [ "<img src=\"./imgs/two_jump2.jpg\" width = \"700\" height = \"300\" align=center /> \n", "(图片来源: 晶泰科技团队)" ] }, { "cell_type": "code", "execution_count": 6, "id": "daadb0ac-2550-4096-a061-b5fefd890aef", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 答案\n", "from pyrosetta.rosetta.core.kinematics import FoldTree\n", "# 完整定义试试:\n", "ft = FoldTree() #设置一个空的foldtree对象\n", "\n", "# 正确答案:\n", "ft.add_edge(start=1, stop=107, label=-1)\n", "ft.add_edge(start=107, stop=108, label=1) # add jump1\n", "ft.add_edge(start=108, stop=157, label=-1)\n", "ft.add_edge(start=88, stop=158, label=2) # add jump2\n", "ft.add_edge(start=158, stop=194, label=-1)\n", "ft.check_fold_tree() # 检查foldtree的有效性;" ] }, { "cell_type": "markdown", "id": "e0a51b5c-1f28-4c84-8770-130e5dbcaedd", "metadata": {}, "source": [ "**关键点在于按照jump的流向构建FoldTree**" ] }, { "cell_type": "markdown", "id": "a41a5092", "metadata": {}, "source": [ "#### 1.2 FoldTree的可切割性: Cutpoint" ] }, { "cell_type": "markdown", "id": "c7ee1eb9", "metadata": {}, "source": [ "FoldTree是可以在edge中进行对点的切割,即设置cutpoint,在快速设置loop时十分有用。 \n", "总体来说,Cutpoint就是FoldTree中的不连续点,相对于peptide edge的连续性来说,cutpoint的出现相当于一把剪刀,将非peptide edge内氨基酸的连接关系切断,也就是FoldTree内EDGE的上下游关系在此处被切断。" ] }, { "cell_type": "code", "execution_count": 7, "id": "807c3145-ee9e-4468-91f2-b7401692e12b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "FOLD_TREE EDGE 1 10 -1 \n" ] } ], "source": [ "# demo for add a cutpoint\n", "cutpoint_pose = pose_from_sequence('AAAAAAAAAA')\n", "pose_foldtree = cutpoint_pose.fold_tree()\n", "print(pose_foldtree)" ] }, { "cell_type": "markdown", "id": "b3a66dff-f4b3-4d75-bd53-9abcb719540e", "metadata": {}, "source": [ "一个最简单的cutpoint的设置例子,本质上cutpoint就是原有共价连接的地方,**不构建应有的链接**\n", "<img src=\"./imgs/set_cutpoint.jpg\" width = \"700\" height = \"300\" align=center /> \n", "\n", "(图片来源: 晶泰科技团队)" ] }, { "cell_type": "code", "execution_count": 8, "id": "89295550-c045-4493-920e-51a43f5d561f", "metadata": {}, "outputs": [], "source": [ "from pyrosetta.rosetta.core.kinematics import FoldTree\n", "# 完整定义试试:\n", "ft = FoldTree() #设置一个空的foldtree对象\n", "\n", "# 正确答案:\n", "ft.add_edge(start=1, stop=5, label=-1)\n", "ft.add_edge(start=5, stop=10, label=1)\n", "ft.add_edge(start=10, stop=6, label=-1)\n", "ft.check_fold_tree() # 检查foldtree的有效性;\n", "\n", "# 检查foldtree的cutpoint数量。\n", "ft.num_cutpoint()\n", "cutpoint_pose.fold_tree(ft)" ] }, { "cell_type": "markdown", "id": "0e25e8ce", "metadata": {}, "source": [ "我们可以使用对应pose的FoldTree的num_cutpoint属性来看cutpoint的数量,并通过cutpoint属性来看对应cutpoint的位置,以及is_cutpoint判断是否为cutpoint" ] }, { "cell_type": "code", "execution_count": 9, "id": "6a408f29", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The FoldTree of the Pose: FOLD_TREE EDGE 1 5 -1 EDGE 5 10 1 EDGE 10 6 -1 \n", "The number of the cutpoint in Pose is : 1\n", "The cutpoint in Pose is : 5\n" ] } ], "source": [ "#看对应pose中cutpoint的属性\n", "print(f\"The FoldTree of the Pose: {cutpoint_pose.fold_tree()}\")\n", "print(f\"The number of the cutpoint in Pose is : {cutpoint_pose.fold_tree().num_cutpoint()}\") #说明Pose的cutpoint只有一个\n", "print(f\"The cutpoint in Pose is : {cutpoint_pose.fold_tree().cutpoint(1)}\") #说明Pose中的断点在5号残基处" ] }, { "cell_type": "markdown", "id": "fc52df2f-fb35-45d9-8e4f-0eb7e83c6be9", "metadata": {}, "source": [ "尝试改变7号残基的构象,看看效果: 从第5号残基处构象被切断。" ] }, { "cell_type": "code", "execution_count": 10, "id": "b2fbc99c-779d-474f-b65c-f4f0164690c4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# set phi3\n", "cutpoint_pose.dump_pdb('./data/cutpoint_raw.pdb')\n", "cutpoint_pose.set_phi(7, 69)\n", "cutpoint_pose.set_psi(7, 60)\n", "cutpoint_pose.dump_pdb('./data/cutpoint_pertuber.pdb')" ] }, { "cell_type": "markdown", "id": "6882a37f-5ec2-4671-a224-f615e05fbd8b", "metadata": {}, "source": [ "<img src=\"./imgs/cut_chage_phi.jpg\" width = \"900\" height = \"300\" align=center /> \n", "(图片来源: 晶泰科技团队)" ] }, { "cell_type": "markdown", "id": "a246a3c2-bca2-4fe4-a152-be28635e5d29", "metadata": {}, "source": [ "一个设置cutpoint更快的方法: 直接使用FoldTree的new_jump函数,就可以完成上面伸所示的foldtree构建" ] }, { "cell_type": "code", "execution_count": 11, "id": "972ed477-7443-4422-8003-66802bfd87a4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The FoldTree of the Pose: FOLD_TREE EDGE 1 5 -1 EDGE 5 10 1 EDGE 10 6 -1 \n", "The number of the cutpoint in Pose is : 1\n", "The cutpoint in Pose is : 5\n" ] } ], "source": [ "# demo for add a cutpoint\n", "cutpoint_pose = pose_from_sequence('AAAAAAAAAA')\n", "pose_foldtree = cutpoint_pose.fold_tree()\n", "pose_foldtree.new_jump(jump_pos1=5, jump_pos2=10, cutpoint=5)\n", "\n", "#看对应pose中cutpoint的属性\n", "print(f\"The FoldTree of the Pose: {cutpoint_pose.fold_tree()}\")\n", "print(f\"The number of the cutpoint in Pose is : {cutpoint_pose.fold_tree().num_cutpoint()}\") #说明Pose的cutpoint只有一个\n", "print(f\"The cutpoint in Pose is : {cutpoint_pose.fold_tree().cutpoint(1)}\") #说明Pose中的断点在5号残基处" ] }, { "cell_type": "markdown", "id": "cdee64a1", "metadata": {}, "source": [ "### 二、一些常用FoldTree设置方法" ] }, { "cell_type": "markdown", "id": "0d63f206-7679-4b4a-a3d3-c63056745c87", "metadata": {}, "source": [ "在蛋白质建模的不同任务中,不同的任务通常需要自定义特定的FoldTree:\n", "- Docking FoldTree: 蛋白/小分子对接\n", "- Loop modeling FoldTree: loop建模\n", "- Folding FoldTree: 蛋白从头折叠" ] }, { "cell_type": "markdown", "id": "853d3dbc", "metadata": {}, "source": [ "<img src=\"./imgs/more_foldtree.jpg\" width = \"900\" height = \"300\" align=center /> \n", "(图片来源: Meiler Lab Rosetta2020教程中的Rosetta_Energy_Function ppt)" ] }, { "cell_type": "markdown", "id": "79fe0811-9888-40ae-ac41-375eb7b57ef8", "metadata": {}, "source": [ "#### 2.1 快速设置docking foldtree的方法:\n", "\n", "主要调用的函数为: setup_foldtree" ] }, { "cell_type": "code", "execution_count": 12, "id": "b6ecb1ed-7239-4037-9924-a2218c55184f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[0mcore.import_pose.import_pose: {0} \u001b[0mFile './data/1v74.pdb' automatically determined to be of type PDB\n", "\u001b[0mcore.conformation.Conformation: {0} \u001b[0m\u001b[1m[ WARNING ]\u001b[0m missing heavyatom: OXT on residue LEU:CtermProteinFull 107\n", "\u001b[0mcore.conformation.Conformation: {0} \u001b[0m\u001b[1m[ WARNING ]\u001b[0m missing heavyatom: OXT on residue LEU:CtermProteinFull 194\n", "PDB file name: ./data/1v74.pdb\n", " Pose Range Chain PDB Range | #Residues #Atoms\n", "\n", "0001 -- 0107 A 0591 -- 0697 | 0107 residues; 01728 atoms\n", "0108 -- 0194 B 0001 -- 0087 | 0087 residues; 01425 atoms\n", " TOTAL | 0194 residues; 03153 atoms\n", "\n" ] } ], "source": [ "from pyrosetta.rosetta.protocols.docking import setup_foldtree\n", "from pyrosetta.rosetta.utility import vector1_int\n", "# Docking FoldTree\n", "#首先读取data文件中的PDB:1V74文件\n", "pose = pose_from_pdb('./data/1v74.pdb')\n", "print(pose.pdb_info())" ] }, { "cell_type": "markdown", "id": "44785e22-aeba-4aae-a58c-38517230f854", "metadata": {}, "source": [ "读入的Pose中含有两条链,一条是A一条是B。使用setup_foldtree时我们需要先定义partner概念。\n", "\n", "partner参数的基本形式是\"X_Y\", 含义是我需要构建一个X链为第一个刚体,Y为第二个刚体的。\n", "\n", "partner参数支持3条链以上: 如“A_BC”, 含义是A作为一个可旋转平移刚体,BC链一同作为另外一个可旋转平移刚体。\n", "\n", "**setup_foldtree因此根据partner参数去构建相应的Docking FoldTree,并且将\"_\"中间设定为Jump1,因此一般Docking任务都会将movable_jumps参数中的vector1_int设置为1.**" ] }, { "cell_type": "code", "execution_count": 13, "id": "25405352-6304-4b26-ab64-98cdb11af194", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "FOLD_TREE EDGE 1 88 -1 EDGE 88 107 -1 EDGE 88 158 1 EDGE 158 108 -1 EDGE 158 194 -1 \n" ] } ], "source": [ "# 默认设置可以在刚体中移动的jumps为1\n", "movable_jumps_v = vector1_int()\n", "movable_jumps_v.append(1)\n", "\n", "# 设置foldtree\n", "setup_foldtree(pose, partner_chainID='A_B', movable_jumps=movable_jumps_v)\n", "\n", "print(pose.fold_tree())" ] }, { "cell_type": "markdown", "id": "33cbbcd0-e190-4f43-b2df-d994f37eacb8", "metadata": {}, "source": [ "**思考**:画出上面的图, 为什么setup_foldtree要这样去设置FoldTree呢?" ] }, { "cell_type": "code", "execution_count": null, "id": "b3b1a25b-f430-476c-8e66-7ace704e11ea", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "1fc82602-7326-4d12-a1e5-8fe2cf2472ff", "metadata": {}, "source": [ "#### 2.1 快速设置LoopMoldeing foldtree的方法:\n", "\n", "主要调用的函数为: setup_foldtree" ] }, { "cell_type": "code", "execution_count": 14, "id": "64171af1-b55b-4091-acb8-0cce67542dc3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "PDB file name: AAAAAAAA\n", " Pose Range Chain PDB Range | #Residues #Atoms\n", "\n", "0001 -- 0027 A 0001 -- 0027 | 0027 residues; 00273 atoms\n", " TOTAL | 0027 residues; 00273 atoms\n", "\n" ] } ], "source": [ "# 创建序列Pose\n", "pose = pose_from_sequence('AAAAAAAAAAAAAAAAAAAAAAAAAAA')\n", "print(pose.pdb_info())" ] }, { "cell_type": "markdown", "id": "1e6745e1-984d-4cbf-aaf5-0b7a2363bc8d", "metadata": {}, "source": [ "假设我现在要对10-20这段区域的骨架进行随机化采样,又不希望这段区域的自由度变化对1-9, 21-27的区域造成影响。\n", "\n", "这就是Loop modeling FoldTree需要做的事情。" ] }, { "cell_type": "code", "execution_count": 15, "id": "b61273c3-ddd4-4f72-a063-317b2cf3f2d5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "FOLD_TREE EDGE 1 9 -1 EDGE 9 15 -1 EDGE 9 21 1 EDGE 21 16 -1 EDGE 21 27 -1 \n" ] } ], "source": [ "from pyrosetta.rosetta.protocols.loops import Loops, Loop, fold_tree_from_loops\n", "\n", "# define loops;\n", "loop_fold_tree = FoldTree()\n", "loops = Loops()\n", "loop = Loop(10, 20, 15) # start_res, end_res, cut_res\n", "loops.add_loop(loop)\n", "\n", "# setup loop modelling foldtree;\n", "fold_tree_from_loops(pose, loops, loop_fold_tree)\n", "print(loop_fold_tree)\n", "pose.fold_tree(loop_fold_tree)" ] }, { "cell_type": "markdown", "id": "7dfa0176-b5ee-4991-9049-efb02db322bc", "metadata": {}, "source": [ "**思考**:画出上面的图,思考为什么fold_tree_from_loops要这样去设置FoldTree呢?" ] }, { "cell_type": "code", "execution_count": null, "id": "715e267f-a8fb-4255-955f-b5c1f3749839", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "9b21b508", "metadata": {}, "source": [ "**练习**" ] }, { "cell_type": "markdown", "id": "9c2c41aa-e808-46d7-9dbe-7bc9684a0b67", "metadata": {}, "source": [ "1. 如果我已知有一段功能结构区域范围,如何设置foldtree,在采样时避免这段区域发生变化呢? (难度系数: **)\n", "\n", "2. 如何设定一个可以在Docking中允许loops采样的FoldTree呢?(难度系数: ****)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.10" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 5 }