我正在尝试识别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'
有关如何解决此问题的任何建议?
答案 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。