2017-06-07 11 views
0

私は3次元タンパク質構造中の接触しているアミノ酸残基を同定しようとしています。私はBioPythonに新しいですが、彼らのリードに続き、この便利サイトhttp://www2.warwick.ac.uk/fac/sci/moac/people/students/peter_cock/python/protein_contact_map/biopythonを用いた分子内タンパク質残基接触マップ、KeyError: 'CA'

た(私は完成のためにここに再現します。私は別のタンパク質を使用していていること、しかし、注意してください):

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

エラーメッセージを見ると、「CA」という名前のキーはありません。入力ファイルが何であるかを知らなくても、それ以上の手助けは難しいです。ロードされているdictが期待どおりであることを確認することができます。 –

+0

入力ファイルはhttp://www.rcsb.org/pdb/explore/explore.do?structureId=1qhwにあります。右上 - > "ファイルをダウンロードする" - > "PDB形式" – Hia3

答えて

0

私はテストしています(私はバイオについてほとんど知っていないことを覚えておいてください)、それはあなたの中にあるもののように見えます。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'] 

私に次のdictを与えます。このレベルは、エラーを引き起こしている関数に渡されているレベルです。これを印刷する:

print(list(test)) 

多くの残渣や関連情報を含む膨大なデータが入っています。しかし、決定的には、いいえCA。いただきました!内部の参照と行を変更するためにこれを使用してみてください:

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

は、適切な場合にCAを交換し、あなたが後にあるものを反映します。 私はこれが助けてくれることを願っています。

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) 
+0

["しかし、PDBファイルでは、スペースはアトム名の一部になることがあります。 Cα原子(これは'CA 'と呼ばれます)が除去されている場合、スペースは問題を生み出します(つまり、同じ残基に' CA 'という2つの原子が存在します)。組織/ウィキ/ The_Biopython_Structure_Bioinformatics_FAQ)?? – qPCR4vir

+0

おそらくこの代わりにこの関数を使うことができます: '' from Bio.PDB.Polypptide import is_aa'' – peterjc

0

タンパク質鎖のためのコンタクトマップを得るための別の解決策は、PdbParserConKitに同梱されて使用することです:

は、この問題を回避するために、私は唯一のアミノ酸残基を返す新しい関数を書きました。

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 

これは内部ContactFile階層を格納pdb変数、にあなたのPDBファイルを読み込み、 。この例では、関与するCA原子が互いに8Å以内にある場合、2つの残基が接触していると考えられる。情報にアクセスするには

、あなたは、あなたが複数のチェーンを持っている希望の場合、あなたのケースで連鎖A.

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

ため、分子内の連絡先に対応する、ContactFileを反復処理し、各ContactMapにアクセスすることができます各鎖にはContactMapがあり、鎖間には分子間接触のために追加の鎖が存在する。

チェーンAのContactMapには、1601個のコンタクトペアが含まれています。それぞれのContactMapにあるContactのインスタンスには、反復または索引付けのいずれかを実行してアクセスできます。両方とも正常です。

>>> 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です。

1

あなたは、ヘテロ原子(水、イオン、等;アミノ酸または核酸ではないもの)があり、あなたの構造では、それらを削除します。

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

これはあなたの全体の構造からそれらを削除します。さらなる分析のためにヘテロ原子を保持したい場合は、変更することができます。

関連する問題