2013-07-20 69 views
1

我正在解析PDB文件,我有一個鏈式名稱列表以及格式(鏈,[座標])中的XYZ座標。我有很多座標,但只有3個不同的鏈條。我想將所有來自同一鏈的座標壓縮到一個列表中,以便獲得鏈= [座標],[座標],[座標]等等。我查看了biopython文檔,但我很難理解如何獲得我想要的座標,所以我決定手動提取座標。這是我到目前爲止的代碼:分隔(X,Y)的列表

pdb_file = open('1adq.pdb') 
import numpy as np 

chainids = [] 
chainpos= [] 

for line in pdb_file: 
    if line.startswith("ATOM"): 
     # get x, y, z coordinates for Cas 
     chainid =str((line[20:22].strip())) 
     atomid = str((line[16:20].strip())) 
     pdbresn= int(line[23:26].strip()) 
     x = float(line[30:38].strip()) 
     y = float(line[38:46].strip()) 
     z = float(line[46:54].strip()) 
     if line[12:16].strip() == "CA": 
      chainpos.append((chainid,[x, y, z])) 
      chainids.append(chainid) 

allchainids = np.unique(chainids) 
print(chainpos) 

和一些輸出:

[('A', [1.719, -25.217, 8.694]), ('A', [2.934, -21.997, 7.084]), ('A', [5.35, -19.779,  8.986]) 

我的理想輸出將是:

A = ([1.719, -25.217, 8.694]), ([2.934, -21.997, 7.084]),(5.35, -19.779,8.986])... 

謝謝!

Here is a section of PDB file: 
ATOM  1 N PRO A 238  1.285 -26.367 7.882 0.00 25.30   N 
ATOM  2 CA PRO A 238  1.719 -25.217 8.694 0.00 25.30   C 
ATOM  3 C PRO A 238  2.599 -24.279 7.885 0.00 25.30   C 
ATOM  4 O PRO A 238  3.573 -24.716 7.275 0.00 25.30   O 
ATOM  5 CB PRO A 238  2.469 -25.791 9.881 0.00 25.30   C 

A是鏈名稱有第4欄,我不知道是什麼的鏈名是先驗的,但因爲我的行解析線,我與格式座標粘鏈的名字我之前提到。現在我想把所有的座標都放在一個「A」之前,並把它們放在一個名爲「A」的列表中。我不能在「A」中硬編碼,因爲它不總是「A」。我也有「L」和「H」,但我想我可以讓他們一旦我得到了理解駝峯..

+0

你想創建變量'A'。 ,或打印出「A =([1.719,-25.217,8.694]),([2.934,-21.997,7.084]),(5.35,-19.779,8.986))...」 – inspectorG4dget

+0

此外,請張貼PDB文件相關部分的代表性樣本,以便我們知道您要解析的內容 – inspectorG4dget

+0

有一個名爲pdb_tools的密集型庫,用Python編寫。 – chupvl

回答

1

只是讓元組的列表

>>> chainpos.append((chainid,x, y, z)) 
>>> chainpos 
[('A', 1.719, -25.217, 8.694), ('A', 2.934, -21.997, 7.084)] 
>>> import itertools 
>>> for id, coor in itertools.groupby(chainpos,lambda x:x[0]): 
...  print(id, [c[1:] for c in coor]) 
+0

這正是我一直在尋找的!我喜歡它維持秩序,因爲它可能在未來某個時候變得重要。 – pioneer903

+0

有沒有辦法使用這個itertool將它們保存到自己的列表中? – pioneer903

+0

只需更改此行並將其附加到新列表中即可。 print(id,[c [1:] for c in coor] [0])。這是你想要的 – raton

0

您可以使用列表理解:

>>> print chainpos 
[('A', [1.719, -25.217, 8.694]), ('A', [2.934, -21.997, 7.084]), ('A', [5.35, -19.779,  8.986])] 
>>> print "A =", [ t[1] for t in chainpos] 
+0

如果它不是「A」呢?目前還不清楚我們是否知道該字母是什麼,先驗 – inspectorG4dget

+0

A只是象徵原子所屬的肽鏈,在這種情況下,它是脯氨酸。所以通常'A'不能保證。 – seth

+0

恰好Seth。在PDB文件中,鏈總是連續列出的,也就是說,一旦有一個字母來表示鏈,那個鏈字母就會被保留下來,直到下一個鏈開始。在這種情況下,它會去是這樣的: 一個 一個 一個 一個 大號 大號 ^ h ^ h 在我的代碼存儲所有在allchainids鏈的名字,因此具有「[ 'A'「L ''H']在這裏。 – pioneer903

1

你想要的東西像:

import numpy as np 

chain_dict = {} 

for line in open('input'): 
    if line.startswith("ATOM"): 
     line = line.split() 
     # get x, y, z coordinates for Cas 
     chainid = line[4] 
     atomid = line[2] 
     pdbresn= line[5] 
     xyz = [line[6],line[7],line[8]] 
     if chainid not in chain_dict: 
      chain_dict[chainid]=[xyz] 
     else: 
      chain_dict[chainid].append(xyz) 

其中,爲您的數據。例如,給出:

>>> chain_dict 
{'A': [['1.285', '-26.367', '7.882'], ['1.719', '-25.217', '8.694'], ['2.599', '-24.279', '7.885'], ['3.573', '-24.716', '7.275'], ['2.469', '-25.791', '9.881']] 

,並因爲它是一本字典,很明顯,你可以d ○:

>>> chain_dict['A'] 
[['1.285', '-26.367', '7.882'], ['1.719', '-25.217', '8.694'], ['2.599', '-24.279', '7.885'], ['3.573', '-24.716', '7.275'], ['2.469', '-25.791', '9.881']] 

得到的只是你感興趣鏈的XYZ COORDS

+0

這看起來很有趣。我將不得不花一點時間理解Python字典..它們比列表更復雜。 – pioneer903