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文件,提取一些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()
还有关于分析结构【度量两个原子的距离、扭转角等等】