{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Pose & PDBinfo Layer\n", "\n", "@Author: 吴炜坤\n", "\n", "@email:weikun.wu@xtalpi.com/weikunwu@163.com\n", "\n", "PDBinfo是Pose和PDB中信息交换和储存的重要媒介。Pose通常是从PDB文件中衍生出来的,除了原子的坐标信息以外,PDB文件中包含了许多额外的信息,而这些信息是储存在PDBinfo中。比如温度因子数据(bfactor)、晶体解析数据(crystinfo)、原子的占用率(occupancy)等。使用PDBinfo可以实现Pose编号与PDB编号的转换以及Pose的序列信息获取等功能。如果Pose中的氨基酸发生了插入和删除,又或者其他的PDB相关信息发生了变化,更新的信息就需要从当前的Pose中获取并转换成PDBinfo的数据,因此PDBinfo和Pose是实时相互连通的两个信息储存器。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 一、PDB编号与Pose编号" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "在PDB文件中,每个氨基酸都有自己独立的编号,并且氨基酸的PDB编号是依赖于其所在的链ID,如1A,2A...120A,1B,2B...130B等,分别代表A链和B链上的氨基酸位置。\n", "而在Pose的概念中,氨基酸的编号是忽略链的分隔,按照PDB文件中链编写的顺序,**从1开始递增**,由于缺乏直观的对应方式,在Pose中的氨基酸和PDB编号的处理往往是相当棘手的,但是现在可以通过PDB_info这个的功能来轻松解决编号转换的问题。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "PyRosetta-4 2021 [Rosetta PyRosetta4.conda.mac.cxx11thread.serialization.python37.Release 2021.31+release.c7009b3115c22daa9efe2805d9d1ebba08426a54 2021-08-07T10:04:12] 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 r292 2021.31+release.c7009b3115c c7009b3115c22daa9efe2805d9d1ebba08426a54 http://www.pyrosetta.org 2021-08-07T10:04:12\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=1748780196 seed_offset=0 real_seed=1748780196 thread_index=0\n", "\u001b[0mbasic.random.init_random_generator: {0} \u001b[0mRandomGenerator:init: Normal mode, seed=1748780196 RG_type=mt19937\n", "\u001b[0mcore.chemical.GlobalResidueTypeSet: {0} \u001b[0mFinished initializing fa_standard residue type set. Created 983 residue types\n", "\u001b[0mcore.chemical.GlobalResidueTypeSet: {0} \u001b[0mTotal time to initialize 0.651955 seconds.\n", "\u001b[0mcore.import_pose.import_pose: {0} \u001b[0mFile './data/4R80.clean.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 SER:CtermProteinFull 76\n", "\u001b[0mcore.conformation.Conformation: {0} \u001b[0m\u001b[1m[ WARNING ]\u001b[0m missing heavyatom: OXT on residue SER:CtermProteinFull 152\n" ] } ], "source": [ "# 首先依然是从PDB中读入Pose\n", "from pyrosetta import init, pose_from_pdb\n", "init()\n", "pose = pose_from_pdb('./data/4R80.clean.pdb')\n", "\n", "# 获取PDBinfo对象:\n", "pose_pdbinfo = pose.pdb_info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**编号转换的处理主要使用的是pdb_info中的pdb2pose和pose2pdb函数。**\n", "- pdb2pose: 将pdb编号翻译成pose编号;\n", "- pose2pdb: 将pose编号转换成pdb编号;" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "24\n" ] } ], "source": [ "# 获取PDB号为24A的氨基酸残基所在的Pose残基编号\n", "pose_number = pose_pdbinfo.pdb2pose(chain='A', res=24)\n", "print(pose_number)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "24 A \n" ] } ], "source": [ "# 获取Pose残基编号为24的氨基酸残基所在的PDB号\n", "pdb_number = pose_pdbinfo.pose2pdb(res=24)\n", "print(pdb_number)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 二、PDB链信息\n", "由于Pose中链号也是从1号开始编,不同于PDB文件中链号信息以字母的形式进行储存。链中信息获取的方式有多种途径:\n", "- 根据链的PDB chain ID获取Pose chain ID;\n", "- 根据链的chain ID获取PDB chain ID;\n", "- 根据氨基酸的Pose编号获取其所在的chain ID;\n", "- Pose的链氨基酸序列信息;\n", "- 获取链起始和末端氨基酸信息;" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'A:1-76 B:1-76'" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 先来看看pdbinfo中链的基本信息:\n", "pose_pdbinfo.short_desc()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "可见我们的这个pose中共有2条链,分别为A和B链,分别都有76个氨基酸" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 2\n" ] } ], "source": [ "# 根据链的PDB chain ID获取Pose chain ID;\n", "from pyrosetta.rosetta.core.pose import get_chain_id_from_chain\n", "chainA_pose_chain_id = get_chain_id_from_chain('A', pose)\n", "chainB_pose_chain_id = get_chain_id_from_chain('B', pose)\n", "print(chainA_pose_chain_id, chainB_pose_chain_id)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A B\n" ] } ], "source": [ "from pyrosetta.rosetta.core.pose import get_chain_from_chain_id\n", "chain1_pdb_chain_id = get_chain_from_chain_id(1, pose)\n", "chain2_pdb_chain_id = get_chain_from_chain_id(2, pose)\n", "print(chain1_pdb_chain_id, chain2_pdb_chain_id)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A B\n" ] } ], "source": [ "# 根据某个氨基酸残基的Pose编号获取其所在的PDB链ID;\n", "residue1_chain_id = pose_pdbinfo.chain(10)\n", "residue82_chain_id = pose_pdbinfo.chain(82)\n", "print(residue1_chain_id, residue82_chain_id)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 76\n" ] } ], "source": [ "# 获取链的的起始和结尾的氨基酸Pose编号:\n", "chain1_start_pose_id = pose.chain_begin(1) # 返回某链起始的rosetta index\n", "chain1_end_pose_id = pose.chain_end(1) # 返回某链终止的rosetta index\n", "print(chain1_start_pose_id, chain1_end_pose_id)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'PSEEEEKRRAKQVAKEKILEQNPSSKVQVRRVQKQGNTIRVELEITENGKKTNITVEVEKQGNTFTVKRITETVGS'" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 获取链的序列信息:\n", "pose.chain_sequence(1) # 返回某链的氨基酸序列" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 三、PDB中晶体解析信息的提取\n", "除了基本的编号信息以外,一些晶体相关的信息也可以轻松进行提取:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "49.13" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 提取第一个原子的bfactor信息\n", "pose.pdb_info().bfactor(res=1, atom_index=1) # 返回温度因子信息" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "<CrystInfo>{0,0,0,90,90,90 : P 1}\n" ] } ], "source": [ "# 获取PDB的晶体信息\n", "crystinfo = pose.pdb_info().crystinfo()\n", "print(crystinfo)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.0\n" ] } ], "source": [ "# 获取原子的occupancy\n", "occupancy = pose.pdb_info().occupancy(res=1, atom_index=1)\n", "print(occupancy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 练习\n", "请写一个小程序,对残基中每一个原子的bfactor进行加和平均处理。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 进阶技巧. 氨基酸残基PDB LABEL\n", "PyRosetta中的PDBinfo除了储存一些实验信息以外,还可以储存用户的自定义信息,比如用户可以通过pose的label系统对一些氨基酸打上PDB标签,在后续的氨基酸范围选取中快捷方便的操作。\n", "进阶部分主要介绍:\n", "- add_reslabel/get_reslabels/clear_reslabel/res_haslabel\n", "- icode/set_resinfo" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1. 通过pdbinfo的add_reslabel函数对残基打标签:\n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "# 打标签\n", "pose_pdbinfo.add_reslabel(1, 'starts')\n", "pose_pdbinfo.add_reslabel(2, 'haha')\n", "pose_pdbinfo.add_reslabel(3, 'end')" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "vector1_std_string[starts]\n", "vector1_std_string[haha]\n", "vector1_std_string[end]\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 查标签\n", "print(pose_pdbinfo.get_reslabels(1))\n", "print(pose_pdbinfo.get_reslabels(2))\n", "print(pose_pdbinfo.get_reslabels(3))\n", "pose.dump_pdb('./data/reslabeled.pdb')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "在输出PDB文件之后,在文件的最下方可以看到以下的信息被记录:\n", "- REMARK PDBinfo-LABEL: 1 starts\n", "- REMARK PDBinfo-LABEL: 2 haha\n", "- REMARK PDBinfo-LABEL: 3 end" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 判断标签\n", "pose_pdbinfo.res_haslabel(res=1, target_label='haha')" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "# 清除标签\n", "pose_pdbinfo.clear_reslabel(1)\n", "pose_pdbinfo.clear_reslabel(2)\n", "pose_pdbinfo.clear_reslabel(3)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 判断标签还是否存在?\n", "pose_pdbinfo.res_haslabel(res=1, target_label='starts')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2. 关于icode插入与管理\n", "在PDB文件中,比如处理抗体结构时,一些特殊的PDB编号(含有insert code), 如 1A 2B 3C等(此处的代码并非是链号)。\n", "通过PDBinfo,用户也可以很方便的插入这些字符。" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "# set_resinfo(res: int, chain_id: str, pdb_res: int, ins_code: str) -> None\n", "pose_pdbinfo.set_resinfo(res=1, chain_id='A', pdb_res=1, ins_code='m')" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "m\n", "Residue 1: PRO:NtermProteinFull (PRO, P):\n", "Base: PRO\n", " Properties: POLYMER PROTEIN CANONICAL_AA LOWER_TERMINUS ALIPHATIC METALBINDING ALPHA_AA L_AA\n", " Variant types: LOWER_TERMINUS_VARIANT\n", " Main-chain atoms: N CA C \n", " Backbone atoms: N CA C O HA \n", " Side-chain atoms: CB CG CD NV CAV 1HB 2HB 1HG 2HG 1HD 2HD 1H 2H \n", "Atom Coordinates:\n", " N : 35.432, -0.708, 7.647\n", " CA : 35.959, 0.478, 8.332\n", " C : 36.62, 1.469, 7.374\n", " O : 36.946, 1.11, 6.24\n", " CB : 36.987, -0.1, 9.317\n", " CG : 37.119, -1.563, 8.97\n", " CD : 35.846, -1.957, 8.305\n", " NV : 35.4257, -0.707336, 7.64284 (virtual)\n", " CAV : 35.8996, 0.441347, 8.25002 (virtual)\n", " HA : 35.141, 0.97715, 8.8721\n", " 1HB : 37.9438, 0.433685, 9.21849\n", " 2HB : 36.6417, 0.0476102, 10.3509\n", " 1HG : 37.9855, -1.72036, 8.31089\n", " 2HG : 37.3003, -2.15428, 9.87969\n", " 1HD : 36.0441, -2.75894, 7.57861\n", " 2HD : 35.1232, -2.2907, 9.06406\n", " 1H : 35.7595, -0.700397, 6.70024\n", " 2H : 34.4274, -0.649029, 7.64284\n", "Mirrored relative to coordinates in ResidueType: FALSE\n", "\n" ] } ], "source": [ "# 查询某个残基的icode:\n", "print(pose_pdbinfo.icode(res=1))\n", "\n", "# 打印1号氨基酸残基信息:\n", "print(pose.residue(1))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 保存PDB\n", "pose.dump_pdb('./data/insert_icode.pdb')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "使用文本编辑器打开后可以见,第一个氨基酸的残基编号发生了变化:从1变成了1m\n", "```\n", "ATOM 1 N PRO A 1m 35.432 -0.708 7.647 1.00 49.13 N \n", "ATOM 2 CA PRO A 1m 35.959 0.478 8.332 1.00 38.65 C \n", "ATOM 3 C PRO A 1m 36.620 1.469 7.374 1.00 28.53 C \n", "ATOM 4 O PRO A 1m 36.946 1.110 6.240 1.00 28.02 O \n", "ATOM 5 CB PRO A 1m 36.987 -0.100 9.317 1.00 32.04 C \n", "ATOM 6 CG PRO A 1m 37.119 -1.563 8.970 1.00 40.69 C \n", "ATOM 7 CD PRO A 1m 35.846 -1.957 8.305 1.00 42.21 C \n", "ATOM 8 HA PRO A 1m 35.141 0.977 8.872 1.00 0.00 H \n", "ATOM 9 1HB PRO A 1m 37.944 0.434 9.218 1.00 0.00 H \n", "ATOM 10 2HB PRO A 1m 36.642 0.048 10.351 1.00 0.00 H \n", "ATOM 11 1HG PRO A 1m 37.985 -1.720 8.311 1.00 0.00 H \n", "ATOM 12 2HG PRO A 1m 37.300 -2.154 9.880 1.00 0.00 H \n", "ATOM 13 1HD PRO A 1m 36.044 -2.759 7.579 1.00 0.00 H \n", "ATOM 14 2HD PRO A 1m 35.123 -2.291 9.064 1.00 0.00 H \n", "ATOM 15 1H PRO A 1m 35.759 -0.700 6.700 1.00 0.00 H \n", "ATOM 16 2H PRO A 1m 34.427 -0.649 7.643 1.00 0.00 H\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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" } }, "nbformat": 4, "nbformat_minor": 4 }