{
 "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
}