作者,Evil Genius
今天我们来复习分子对接,研究生阶段的分子对接一般都是AutoDuck,windows界面软件,点点点就可以了,但是随着我们分析的深入,尤其是复杂蛋白和蛋白配体模拟,需要我们采用更为强大的计算工具以及服务器。
Rosetta是一套用于生物分子结构预测与设计的算法工具集。该软件采用C++语言编写。PyRosetta是基于Python编程语言的工具包,通过封装已编译的C++库来实现Rosetta的全部功能。
进行更深入的结构预测与设计任务时,推荐使用计算集群,还是那句话啊,大家平常也多学习扩展, 自己不学习,我学成了开培训班都是要付费的啊。
这一节我们来学习一下PyRosetta的Pose。
什么的pose?其实大家照相的时候经常说摆个pose,直译过来就是姿势,那么这个词用在蛋白质上,其实就是结构信息。
蛋白质结构基础操作
关键词:pose_from_pdb(), sequence(), cleanATOM, annotated_sequence()
具体内容包括:从PDB文件加载蛋白质结构、运用Pose类解析蛋白质几何特征、对几何结构进行修改,并通过PyMOL和PyRosetta的PyMOLMover工具实现可视化呈现。
安装与加载
!pip install pyrosettacolabsetup
import pyrosettacolabsetup; pyrosettacolabsetup.install_pyrosetta()
import pyrosetta; pyrosetta.init()
from pyrosetta import *
init()
加载PDB文件
蛋白质数据库(PDB)是一种用于描述三维分子结构及其他信息的文本文件格式。Rosetta既可读取也可输出PDB文件。除PDB外,mmTF和mmCIF是Rosetta支持的其他常用文件格式。
我们以一个结构为例
### BEGIN SOLUTION
pose = pose_from_pdb("inputs/5tj3.pdb")
### END SOLUTION
Pose类的定义
Pose类包含描述蛋白质结构的多类信息,其核心组件包括:
- Energies(能量体系)
- PDBInfo(PDB信息)
- Conformation(构象系统)
可以通过pose对象查看5TJ3的序列:pose.sequence()
# print out the sequence of the pose
### BEGIN SOLUTION
pose.sequence()
### END SOLUTION
'NAVPRPKLVVGLVVDQMRWDYLYRYYSKYGEGGFKRMLNTGYSLNNVHIDYVPTVTAIGHTSIFTGSVPSIHGIAGNDWYDKELGKSVYCTSDETVQPVGTTSNSVGQHSPRNLWSTTVTDQLGLATNFTSKVVGVSLKDRASILPAGHNPTGAFWFDDTTGKFITSTYYTKELPKWVNDFNNKNVPAQLVANGWNTLLPINQYTESSEDNVEWEGLLGSKKTPTFPYTDLAKDYEAKKGLIRTTPFGNTLTLQMADAAIDGNQMGVDDITDFLTVNLASTDYVGHNFGPNSIEVEDTYLRLDRDLADFFNNLDKKVGKGNYLVFLSADHGAAHSVGFMQAHKMPTGFFDMKKEMNAKLKQKFGADNIIAAAMNYQVYFDRKVLADSKLELDDVRDYVMTELKKEPSVLYVLSTDEIWESSIPEPIKSRVINGYNWKRSGDIQIISKDGYLSAYSKKGTTHSVWNSYDSHIPLLFMGWGIKQGESNQPYHMTDIAPTVSSLLKIQFPSGAVGKPITEVIGZZZZ'
有时PDB文件不符合标准格式,需要经过清理才能被PyRosetta成功加载。确保文件成功加载的一种方法是仅保留PDB文件中的ATOM记录行。此外,也可以使用pyrosetta.toolbox中的cleanATOM函数实现相同效果:
from pyrosetta.toolbox import cleanATOM
cleanATOM("inputs/5tj3.pdb")
pose_clean = pose_from_pdb("inputs/5tj3.clean.pdb")
注意,使用cleanATOM清理PDB文件反而会导致部分残基丢失。
通过下方的annotated_sequence函数,可以更详细地查看具体差异。注意,非标准氨基酸和杂原子(hetatm)现在会得到更明确的标识。
pose.annotated_sequence()
'N[ASN:NtermProteinFull]AVPRPKLVVGLVVDQMRWDYLYRYYSKYGEGGFKRMLNTGYSLNNVHIDYVPTVT[THR:phosphorylated]AIGHTSIFTGSVPSIHGIAGNDWYDKELGKSVYCTSDETVQPVGTTSNSVGQHSPRNLWSTTVTDQLGLATNFTSKVVGVSLKDRASILPAGHNPTGAFWFDDTTGKFITSTYYTKELPKWVNDFNNKNVPAQLVANGWNTLLPINQYTESSEDNVEWEGLLGSKKTPTFPYTDLAKDYEAKKGLIRTTPFGNTLTLQMADAAIDGNQMGVDDITDFLTVNLASTDYVGHNFGPNSIEVEDTYLRLDRDLADFFNNLDKKVGKGNYLVFLSADHGAAHSVGFMQAHKMPTGFFDMKKEMNAKLKQKFGADNIIAAAMNYQVYFDRKVLADSKLELDDVRDYVMTELKKEPSVLYVLSTDEIWESSIPEPIKSRVINGYNWKRSGDIQIISKDGYLSAYSKKGTTHSVWNSYDSHIPLLFMGWGIKQGESNQPYHMTDIAPTVSSLLKIQFPSGAVGKPITEVIG[GLY:CtermProteinFull]Z[ZN]Z[ZN]Z[ZN]Z[ZN]'
pose_clean.annotated_sequence()
'N[ASN:NtermProteinFull]AVPRPKLVVGLVVDQMRWDYLYRYYSKYGEGGFKRMLNTGYSLNNVHIDYVPTVAIGHTSIFTGSVPSIHGIAGNDWYDKELGKSVYCTSDETVQPVGTTSNSVGQHSPRNLWSTTVTDQLGLATNFTSKVVGVSLKDRASILPAGHNPTGAFWFDDTTGKFITSTYYTKELPKWVNDFNNKNVPAQLVANGWNTLLPINQYTESSEDNVEWEGLLGSKKTPTFPYTDLAKDYEAKKGLIRTTPFGNTLTLQMADAAIDGNQMGVDDITDFLTVNLASTDYVGHNFGPNSIEVEDTYLRLDRDLADFFNNLDKKVGKGNYLVFLSADHGAAHSVGFMQAHKMPTGFFDMKKEMNAKLKQKFGADNIIAAAMNYQVYFDRKVLADSKLELDDVRDYVMTELKKEPSVLYVLSTDEIWESSIPEPIKSRVINGYNWKRSGDIQIISKDGYLSAYSKKGTTHSVWNSYDSHIPLLFMGWGIKQGESNQPYHMTDIAPTVSSLLKIQFPSGAVGKPITEVIG[GLY:CtermProteinFull]'
处理Pose中的残基
Keywords: total_residue(), chain(), number(), pdb2pose(), pose2pdb()
!pip install pyrosettacolabsetup
import pyrosettacolabsetup; pyrosettacolabsetup.install_pyrosetta()
import pyrosetta; pyrosetta.init()
from pyrosetta import *
init()
pose = pose_from_pdb("inputs/5tj3.pdb")
pose_clean = pose_from_pdb("inputs/5tj3.clean.pdb")
可以使用Pose类中的方法来统计残基数量并选取特定残基。注意:Pose是一个Python类,要调用其实现的方法,需要先创建类的实例(此处指pose或pose_clean实例),然后在实例后使用点号进行方法调用。
print(pose.total_residue())
print(pose_clean.total_residue())
使用pose.residue(20)函数存储pose中第20位残基的Residue信息。
# residue20 = type here
### BEGIN SOLUTION
residue20 = pose.residue(20)
### END SOLUTION
print(residue20.name())
ASP
Residue对象操作
使用pose的.residue()对象获取蛋白质pose的第24位残基。
residue24 = pose.residue(24)
PyRosetta内部对pose残基的编号方式与PDB文件不同。通过pose.pdb_info()对象可以获取与PDB文件对应的原始编号信息。
print(pose.pdb_info().chain(24))
print(pose.pdb_info().number(24))
A
47
通过pdb_info()中的pdb2pose方法,可以将PDB编号(需提供链标识符和残基编号)转换为Pose内部编号。
# PDB numbering to Pose numbering
print(pose.pdb_info().pdb2pose('A', 24))
使用pdb_info()中的pose2pdb方法,查看pose第24号残基对应的PDB链标识符和残基编号。
print(pose.pdb_info().pose2pdb(1))
24 A
通过PDB链标识符和残基编号来鉴定残基身份。
获取残基后,Residue类中提供了多种可用于分析的方法。我们可以从Pose中获取Residue类的实例,例如执行以下操作:
res_24 = pose.residue(24)
print(res_24.name())
print(res_24.is_charged())
从Pose中获取空间特征
Keywords: conformation(), bond_length(), AtomID, atom_index()
!pip install pyrosettacolabsetup
import pyrosettacolabsetup; pyrosettacolabsetup.install_pyrosetta()
import pyrosetta; pyrosetta.init()
from pyrosetta import *
init()
pose = pose_from_pdb("inputs/5tj3.pdb")
from IPython.display import Image
Image('./Media/dihedral-final.png',width='500')
Pose对象可便捷地获取角度、距离和扭转角等数据以供分析。首先让我们了解如何获取主链扭转角。
#resid = "get the pose residue number for chain A:res 28 using the pdb2pose function"
### BEGIN SOLUTION
resid = pose.pdb_info().pdb2pose('A', 28)
### END SOLUTION
print("phi:", pose.phi(resid))
print("psi:", pose.psi(resid))
print("chi1:", pose.chi(1, resid))
phi: -149.17513487055064
psi: 151.30037995499168
chi1: -82.850785668982
假设需要查找PDB文件中残基A:28的N-Cα键和Cα-C键的键长。这里有两种方法:第一种是利用Conformation类中的键长信息,该类存储了蛋白质几何结构的相关数据。可通过tab键自动补全功能查看Conformation类中的相关方法。
conformation = pose.conformation()
# do some tab completion here to explore the Conformation class methods
#conformation.
要使用Conformation类中的bond_length方法,看来我们需要创建AtomID对象。可以通过原子索引和残基ID按如下方式实现:
# Double Check: does resid contain the Pose numbering or PDB numbering?
res_28 = pose.residue(resid)
N28 = AtomID(res_28.atom_index("N"), resid)
CA28 = AtomID(res_28.atom_index("CA"), resid)
C28 = AtomID(res_28.atom_index("C"), resid)
# try printing out an AtomID object!
### BEGIN SOLUTION
print(N28)
### END SOLUTION
atomno= 1 rsd= 5
可以计算键长:
print(pose.conformation().bond_length(N28, CA28))
print(pose.conformation().bond_length(CA28, C28))
1.456100614655453
1.5184027792387658
另一种方法是基于原子的xyz坐标自行计算键长。
另一种方法是基于原子的xyz坐标自行计算键长。
N_xyz = res_28.xyz("N")
CA_xyz = res_28.xyz("CA")
C_xyz = res_28.xyz("C")
N_CA_vector = CA_xyz - N_xyz
CA_C_vector = CA_xyz - C_xyz
print(N_CA_vector.norm())
print(CA_C_vector.norm())
1.456100614655453
1.5184027792387658
并非所有键长、键角和二面角都能通过Conformation对象获取。这是因为Conformation对象仅存储了生成pose中原子xyz坐标所必需的几何参数子集。最可靠的获取方式是以xyz笛卡尔坐标向量为起点进行计算。
今天我们就到这里,生活很好,有你更好。
网友评论