2012-04-25 235 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