使用biopython进行分子内蛋白质残基接触图,KeyError:' CA'

时间:2017-06-07 17:18:21

标签: python biopython pdb

我正在尝试识别3D蛋白质结构中接触的氨基酸残基。我是BioPython的新手,但找到了这个有用的网站http://www2.warwick.ac.uk/fac/sci/moac/people/students/peter_cock/python/protein_contact_map/

跟随他们的领导(我将在此重现完成;但请注意,我使用的是不同的蛋白质):

import Bio.PDB
import numpy as np

pdb_code = "1QHW"
pdb_filename = "1qhw.pdb" 

def calc_residue_dist(residue_one, residue_two) :
    """Returns the C-alpha distance between two residues"""
    diff_vector  = residue_one["CA"].coord - residue_two["CA"].coord
    return np.sqrt(np.sum(diff_vector * diff_vector))

def calc_dist_matrix(chain_one, chain_two) :
    """Returns a matrix of C-alpha distances between two chains"""
    answer = np.zeros((len(chain_one), len(chain_two)), np.float)
    for row, residue_one in enumerate(chain_one) :
        for col, residue_two in enumerate(chain_two) :
            answer[row, col] = calc_residue_dist(residue_one, residue_two)
    return answer

structure = Bio.PDB.PDBParser().get_structure(pdb_code, pdb_filename)
model = structure[0]

dist_matrix = calc_dist_matrix(model["A"], model["A"])

但是当我运行上面的代码时,我收到以下错误消息:

Traceback (most recent call last):

  File "<ipython-input-26-7239fb7ebe14>", line 4, in <module>
    dist_matrix = calc_dist_matrix(model["A"], model["A"])

  File "<ipython-input-3-730a11883f27>", line 15, in calc_dist_matrix
    answer[row, col] = calc_residue_dist(residue_one, residue_two)

  File "<ipython-input-3-730a11883f27>", line 6, in calc_residue_dist
    diff_vector  = residue_one["CA"].coord - residue_two["CA"].coord

  File "/Users/anaconda/lib/python3.6/site-packages/Bio/PDB/Entity.py", line 39, in __getitem__
    return self.child_dict[id]

KeyError: 'CA'

有关如何解决此问题的任何建议?

4 个答案:

答案 0 :(得分:1)

您的结构中含有杂原子(水,离子等;任何不是氨基酸或核酸的物质),请将其移除:

for residue in chain:
    if residue.id[0] != ' ':
        chain.detach_child(residue.id)

这将从整个结构中删除它们。如果想要保留杂原子用于进一步分析,您可能想要修改。

答案 1 :(得分:0)

所以我一直在测试(记住我对Bio知之甚少),看起来你身上的任何内容1qhw.pdb文件与该例子中的文件非常不同。

pdb_code = '1qhw'
structure = Bio.PDB.PDBParser().get_structure(pdb_code, pdb_filename)
model = structure[0]

接下来,看看里面有什么,我做了:

print(list(model))

哪位给了我:

[<Chain id=A>]

探索这个,看来pdb文件是一个dicts的词典。所以,使用这个id,

test = model['A']

给了我下一个字典。此级别是传递给导致错误的函数的级别。用以下方式打印:

print(list(test))

给我一​​个巨大的内部数据列表,包括大量残留物和相关信息。但至关重要的是,没有CA。尝试使用它来查看内部的内容并修改该行:

diff_vector  = residue_one["CA"].coord - residue_two["CA"].coord

反映您的目标,在适当的地方替换CA。 我希望这会有所帮助,更加具体,这有点棘手。

答案 2 :(得分:0)

我认为问题是模型[“A”]中的某些元素不是氨基酸,因此不包含“CA”。

为了解决这个问题,我写了一个新函数,它只返回氨基酸残基:

from Bio.PDB import *
chain = model["A"]

def aa_residues(chain):
        aa_only = []
        for i in chain:
            if i.get_resname() in standard_aa_names:
                aa_only.append(i)
        return aa_only

    AA_1 = aa_residues(model["A"])
    dist_matrix = calc_dist_matrix(AA_1, AA_1)

答案 3 :(得分:0)

获取蛋白质链的联系地图的另一个解决方案是使用PdbParser附带的ConKit

ConKit是一个专门设计用于处理预测联系人的库,但具有从PDB文件中提取联系人的功能:

>>> from conkit.io.PdbIO import PdbParser
>>> p = PdbParser()
>>> with open("1qhw.pdb", "r") as pdb_fhandle:
...     pdb = p.read(pdb_fhandle, f_id="1QHW", atom_type="CA")
>>> print(pdb)
ContactFile(id="1QHW_0" nmaps=1

这会将您的PDB文件读入pdb变量,该变量存储内部ContactFile层次结构。在该实施例中,如果参与的CA原子彼此相差8个,则认为两个残基接触。

要访问这些信息,您可以遍历ContactFile并访问每个ContactMap,在您的情况下,这对应于链A的分子内联系。

>>> for cmap in pdb:
...     print(cmap)
ContactMap(id="A", ncontacts=1601)

如果你有一个以上的链,每条链都会有一个ContactMap,而链之间会有一些分子间接触。

A链的ContactMap包含1601个联系对。您可以通过迭代或索引访问每个Contact中的ContactMap个实例。两者都很好。

>>> print(cmap[0])
Contact(id="(26, 27)" res1="S" res1_chain="A" res1_seq=26 res2="T" res2_chain="A" res2_seq=27 raw_score=0.961895)

层次结构中的每个级别都有各种功能,您可以使用这些功能操作联系人地图。可以找到示例here