biopython----bio.PDB

本文介绍了如何使用Biopython的Bio.PDB模块解析PDB和mmCIF文件,创建Structure对象,并进行结构分析。通过PDBParser和MMCIFParser获取原子数据,利用SMCRA层次结构访问原子、残基、链和模型。同时展示了如何进行原子坐标计算以及遍历结构中的各个元素。此外,还提及了从mmCIF文件中提取特定信息,如溶剂含量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Bio.PDB是Biopython中处理生物大分子晶体结构的模块。除了别的类之外,Bio.PDB包含PDBParser类,此类能够产生一个Structure对象,以一种较方便的方式获取文件中的原子数据。只是在处理PDB文件头所包含的信息时,该类有一定的局限性。

【学习】

https://zhuanlan.zhihu.com/p/564677699

https://biopython-cn.readthedocs.io/zh_CN/latest/cn/chr11.html

from Bio.PDB.PDBParser import PDBParser
>>> p = PDBParser(PERMISSIVE=1)

通过 PDBParser 解析PDB文件,就产生了Structure对象

在此例子中,PDB文件为’pdb1fat.ent’,’1fat’是用户定义的结构名称

structure_id = "1fat"
>>> filename = "pdb1fat.ent"
>>> s = p.get_structure(structure_id, filename)

解析pdb文件

没有创建 Structure 对象的时候,也可以创建这个字典,比如直接从PDB文件创建:

>>> file = open(filename,'r')
>>> header_dict = parse_pdb_header(file)
>>> file.close()

 get_header 和 get_trailer 方法来提取PDB文件中的文件头和文件尾(简单的字符串列表)。

许多PDB文件头包含不完整或错误的信息。许多错误在等价的mmCIF格式文件中得到修正。

与PDB文件的情形类似,先创建一个 MMCIFParser 对象:

>>> from Bio.PDB.MMCIFParser import MMCIFParser
>>> parser = MMCIFParser()

然后用这个解析器从mmCIF文件创建一个结构对象:

>>> structure = parser.get_structure('1fat', '1fat.cif')

为了尽量少访问mmCIF文件,可以用 MMCIF2Dict 类创建一个Python字典来将所有mmCIF文件中各种标签映射到其对应的值上。若有多个值(像 _atom_site.Cartn_y 标签,储存的是所有原子的*y*坐标值),则这个标签映射到一个值列表。从mmCIF文件创建字典如下:

>>> from Bio.PDB.MMCIF2Dict import MMCIF2Dict
>>> mmcif_dict = MMCIF2Dict('1FAT.cif')

例:从mmCIF文件获取溶剂含量:

>>> sc = mmcif_dict['_exptl_crystal.density_percent_sol']

例:获取包含所有原子*y*坐标的列表:

>>> y_list = mmcif_dict['_atom_site.Cartn_y']


一个 Structure 对象的整体布局遵循称为SMCRA(Structure/Model/Chain/Residue/Atom,结构/模型/链/残基/原子)的体系架构:

  • 结构由模型组成
  • 模型由多条链组成
  • 链由残基组成
  • 多个原子构成残基

结构,模型,链,残基都是实体基类的子类。原子类仅仅(部分)实现了实体接口(因为原子类没有子类)。 

对于每个实体子类,你可以用该子类的一个唯一标识符作为键来提取子类(比如,可以用原子名称作为键从残基对象中提取一个原子对象;用链的标识符作为键从域对象中提取链)

child_entity = parent_entity[child_id]
child_list = parent_entity.get_list()  对象获得所有子实体的列表 
parent_entity = child_entity.get_parent()

在SMCRA的所有层次水平,你还可以提取一个 完整id 。完整id是包含所有从顶层对象(结构)到当前对象的id的一个元组。一个残基对象的完整id可以这么得到:

>>> full_id = residue.get_full_id()
>>> print full_id
("1abc", 0, "A", ("", 10, "A"))

  • id为”1abc”的结构
  • id为0的模型
  • id为”A”的链
  • id为(” “, 10, “A”)的残基


残基常用: 

 residue.get_resname()       # returns the residue name, e.g. "ASN"
>>> residue.is_disordered()     # returns 1 if the residue has disordered atoms
>>> residue.get_segid()         # returns the SEGID, e.g. "CHN1"
>>> residue.has_id(name)        # test if a residue has a certain atom

 原子常用:

>>> a.get_name()       # atom name (spaces stripped, e.g. "CA")
>>> a.get_id()         # id (equals atom name)
>>> a.get_coord()      # atomic coordinates
>>> a.get_vector()     # atomic coordinates as Vector object
>>> a.get_bfactor()    # isotropic B factor
>>> a.get_occupancy()  # occupancy
>>> a.get_altloc()     # alternative location specifier
>>> a.get_sigatm()     # standard deviation of atomic parameters
>>> a.get_siguij()     # standard deviation of anisotropic B factor
>>> a.get_anisou()     # anisotropic B factor
>>> a.get_fullname()   # atom name (with spaces, e.g. ".CA.")

get_vector 方法会返回一个代表 Atom 对象坐标的 Vector 对象,可以对原子坐标进行向量运算。 Vector 实现了完整的三维向量运算、矩阵乘法(包括左乘和右乘)和一些高级的、与旋转相关的操作。

举个Bio.PDB的 Vector 模块功能的例子,假设你要查找Gly残基的Cβ原子的位置,如果存在的话。将Gly残基的N原子沿Cα-C化学键旋转-120度,能大致将其放在一个真正的Cβ原子的位置上。使用 Vector 模块中的``rotaxis`` 方法(能用来构造一个绕特定坐标轴的旋转):

# get atom coordinates as vectors
>>> n = residue['N'].get_vector()
>>> c = residue['C'].get_vector()
>>> ca = residue['CA'].get_vector()
# center at origin
>>> n = n - ca
>>> c = c - ca
# find rotation matrix that rotates n
# -120 degrees along the ca-c vector
>>> rot = rotaxis(-pi * 120.0/180.0, c)
# apply rotation to ca-n vector
>>> cb_at_origin = n.left_multiply(rot)
# put on top of ca atom
>>> cb = cb_at_origin+ca

 对pdb 操作的代码:

解析PDB文件,提取一些Model、Chain、Residue和Atom对象
>>> from Bio.PDB.PDBParser import PDBParser
>>> parser = PDBParser()
>>> structure = parser.get_structure("test", "1fat.pdb")
>>> model = structure[0]
>>> chain = model["A"]
>>> residue = chain[1]
>>> atom = residue["CA"]

迭代遍历一个结构中的所有原子
>>> p = PDBParser()
>>> structure = p.get_structure('X', 'pdb1fat.ent')
>>> for model in structure:
...     for chain in model:
...         for residue in chain:
...             for atom in residue:
...                 print atom
...

有个快捷方式可以遍历一个结构中所有原子:

>>> atoms = structure.get_atoms()
>>> for atom in atoms:
...     print atom
...

类似地,遍历一条链中的所有原子,可以这么做:

>>> atoms = chain.get_atoms()
>>> for atom in atoms:
...     print atom
...

遍历模型中的所有残基
或者,如果你想遍历在一条模型中的所有残基:

>>> residues = model.get_residues()
>>> for residue in residues:
...     print residue
...

你也可以用 Selection.unfold_entities 函数来获取一个结构的所有残基:

>>> res_list = Selection.unfold_entities(structure, 'R')

或者获得链上的所有原子:

>>> atom_list = Selection.unfold_entities(chain, 'A')

明显的是, A=atom, R=residue, C=chain, M=model, S=structure 。你可以用这种标记返回层次中的上层,如从一个 Atoms 列表得到(唯一的) Residue 或 Chain 父类的列表:

>>> residue_list = Selection.unfold_entities(atom_list, 'R')
>>> chain_list = Selection.unfold_entities(atom_list, 'C')


获取结构的序列

从 Polypeptide 对象获得。该序列表示为一个Biopython Seq 对象,它的字母表由 ProteinAlphabet 对象来定义。

例子:

>>> seq = polypeptide.get_sequence()




还有关于分析结构【度量两个原子的距离、扭转角等等】 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值