• biopython----bio.PDB


    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 操作的代码:

    1. 解析PDB文件,提取一些Model、Chain、Residue和Atom对象
    2. >>> from Bio.PDB.PDBParser import PDBParser
    3. >>> parser = PDBParser()
    4. >>> structure = parser.get_structure("test", "1fat.pdb")
    5. >>> model = structure[0]
    6. >>> chain = model["A"]
    7. >>> residue = chain[1]
    8. >>> atom = residue["CA"]
    9. 迭代遍历一个结构中的所有原子
    10. >>> p = PDBParser()
    11. >>> structure = p.get_structure('X', 'pdb1fat.ent')
    12. >>> for model in structure:
    13. ... for chain in model:
    14. ... for residue in chain:
    15. ... for atom in residue:
    16. ... print atom
    17. ...
    18. 有个快捷方式可以遍历一个结构中所有原子:
    19. >>> atoms = structure.get_atoms()
    20. >>> for atom in atoms:
    21. ... print atom
    22. ...
    23. 类似地,遍历一条链中的所有原子,可以这么做:
    24. >>> atoms = chain.get_atoms()
    25. >>> for atom in atoms:
    26. ... print atom
    27. ...
    28. 遍历模型中的所有残基
    29. 或者,如果你想遍历在一条模型中的所有残基:
    30. >>> residues = model.get_residues()
    31. >>> for residue in residues:
    32. ... print residue
    33. ...
    34. 你也可以用 Selection.unfold_entities 函数来获取一个结构的所有残基:
    35. >>> res_list = Selection.unfold_entities(structure, 'R')
    36. 或者获得链上的所有原子:
    37. >>> atom_list = Selection.unfold_entities(chain, 'A')
    38. 明显的是, A=atom, R=residue, C=chain, M=model, S=structure 。你可以用这种标记返回层次中的上层,如从一个 Atoms 列表得到(唯一的) Residue 或 Chain 父类的列表:
    39. >>> residue_list = Selection.unfold_entities(atom_list, 'R')
    40. >>> chain_list = Selection.unfold_entities(atom_list, 'C')


    获取结构的序列

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

    例子:

    >>> seq = polypeptide.get_sequence()




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

  • 相关阅读:
    基础知识点
    高阶数据结构-----三种平衡树的实现以及原理(未完成)
    第五章:数组
    linux下查看所有监听端口
    HarmonyOS学习 -- ArkTS开发语言入门
    7天学完Spring:Spring框架搭建和解析以及Bean对象的创建
    CleanMyMac X免费macOS清理系统管家
    Flutter iOS上架指南
    QT信号槽实现分析
    class09:ejs模块
  • 原文地址:https://blog.csdn.net/weixin_63016274/article/details/127785365