2012-04-25 236 views
2

我正在嘗試爲.pdb文件(它們顯示蛋白質結構)編寫一個快速解析器。我看到的蛋白質的一個例子是KRAS(在癌症中很常見),並且在這裏:http://www.rcsb.org/pdb/files/3GFT.pdb在Python中解析.pdb文件

如果向下滾動得足夠遠,您將看到一條如下所示的線: ATOM 1 N MET A 1 63.645 97.355 31.526 1.00 33.80 N

第一個元素「原子」是指這涉及蛋白質中的實際原子。 1涉及一般計數,N涉及原子的類型,「MET」是殘基的名稱,「A」涉及鏈的類型,1(第二個「1」)是原子計數並且那麼接下來的3個數字就是太空中的xyz位置。

我需要輸出什麼是這樣的(其中「1」下方對應於原子數,不是一般的計數): 遇到了一個1 63.645 97.355 31.526

爲了使問題更復雜,有時原子數(在這種情況下第二個「1」)是負數。在那些情況下,我想跳過這條線,直到我打開一個積極的條目,因爲這些元素與找到位置而不是實際蛋白質所需的生物化學有關。爲了使事情更糟的是,有時你會得到一個行這樣的:

ATOM 139 CA愛樂A 21 63.260 111.496 12.203 0.50 12.87Ç
ATOM 140 CA膽汁A 21 63.275 111.495 12.201 0.50 12.17Ç

雖然他們兩者均指殘留物21,生物化學物質不夠精確以得到確切的位置,所以他們給出兩種選擇。理想情況下,我會指定「1」,「2」或其他,但如果我只是採取第一個選項就可以了。最後,在我原來的例子中,對於原子類型(「N」),我只想讓這些行具有「CA」。

我是python的新手,我的培訓是在biostats,所以我想知道什麼是最好的方法來做到這一點?我是否用for循環解析這行代碼?有沒有辦法在Python中更快地做到這一點?我如何處理一些原子的雙重入口?

我意識到這是有點要問,但一些指導將是一大幫忙!我使用R編寫了所有的統計數據,但現在我只需要以正確的格式獲取我的文件!

謝謝!

+0

這是相關的:http://code.google.com/ p/PDB-工具/? – miku 2012-04-25 22:25:00

回答

2

這是一個很長的描述。我不確定是否得到了正確的答案:-) 如果字段(對於以ATOM開頭的行)是固定的,您可以使用拆分和一些comaprisons。 我已經使用散列來查看該條目是否已被看到,以消除 重複,如你所想。 希望這會給你一個開始,

visited = {} 
for line in open('3GFT.pdb'): 
    list = line.split() 
    id = list[0] 
    if id == 'ATOM': 
     type = list[2] 
     if type == 'CA': 
      residue = list[3] 
      type_of_chain = list[4] 
      atom_count = int(list[5]) 
      position = list[6:8] 
      if atom_count >= 0: 
       if type_of_chain not in visited: 
        visited[type_of_chain] = 1 
        print residue,type_of_chain,atom_count,' '.join(position) 

將輸出,

MET A 1 62.935 97.579 
GLY B 0 39.524 105.916 
GLY C 0 67.295 110.376 
MET D 1 59.311 124.106 
GLY E 0 44.038 96.819 
GLY F 0 44.187 123.590 
+0

嗨,謝謝你!這不是我所需要的,但我能夠拼湊出正確的結果!謝謝! – user1357015 2012-04-26 01:16:13

+0

輕微更正: 1)list [6:8]應該是列表[6:9] 2)最終的if應該是: if(atom_count> = 1): 如果atom_count未被訪問且type_of_chain == chain_required: – user1357015 2012-04-26 01:17:36

1

對於大pdb文件有很多的原子,沒有空白字段之間留下,所以你不能使用split命令。相反,你可以使用蛋白質數據銀行格式定義來解析pdb文件:

with open('min.pdb') as pdbfile: 
    for line in pdbfile: 
     if line[:4] == 'ATOM' or line[:6] == "HETATM": 
      print line 
      # Split the line 
      splitted_line = [line[:6], line[6:11], line[12:16], line[17:20], line[21], line[22:26], line[30:38], line[38:46], line[46:54]] 
      print splitted_line 
      # To format again the pdb file with the fields extracted 
      print "%-6s%5s %4s %3s %s%4s %8s%8s%8s\n"%tuple(splitted_line) 

下面是一個示例輸出:

# Original line: 
HETATM10000 O HOH B3257  2.509 40.006 -4.097 1.00 0.00   O 

# Fields extracted: 
['HETATM', '10000', ' O ', 'HOH', 'B', '3257', ' 2.509', ' 40.006', ' -4.097'] 

# Reformatted line: 
HETATM10000 O HOH B3257  2.509 40.006 -4.097