在Python中解析.pdb文件

时间:2012-04-25 22:22:42

标签: python

我正在尝试为.pdb文件编写一个快速解析器(它们显示蛋白质结构)。我正在研究的一种蛋白质的例子是KRAS(常见于癌症)并且在这里:http://www.rcsb.org/pdb/files/3GFT.pdb

如果你向下滚动得足够远,你会得到一条如下所示的行: 原子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”对应于原子计数,而不是一般计数): MET A 1 63.645 97.355 31.526

为了使问题更复杂,有时原子数(在这种情况下为第二个“1”)是负数。在那些情况下,我想跳过这一行继续,直到我找到一个积极的条目,因为这些元素与寻找位置而不是实际蛋白质所需的生物化学有关。更糟糕的是,有时你会得到一条线:

ATOM 139 CA AILE A 21 63.260 111.496 12.203 0.50 12.87 C
ATOM 140 CA BILE A 21 63.275 111.495 12.201 0.50 12.17 C

虽然他们都提到残留物21,但生物化学不够准确,无法获得准确的位置,因此他们给出了两种选择。理想情况下,我会指定“1”,“2”或其他什么,但如果我只选择第一个选项就可以了。最后,对于原始示例中的原子类型(“N”),我只想获得带有“CA”的那些行。

我是python的新手,我的训练是在生物稳定器中,所以我想知道最好的方法是什么?我是否逐行解析这一行?有没有办法在python中更快地完成它?如何处理某些原子的双重条目?

我意识到这有点问题,但是一些指导会有很多帮助!我已经使用R编写了所有统计位,但现在我只需要以正确的格式获取文件!

谢谢!

4 个答案:

答案 0 :(得分:4)

它看起来像是一个解析PDB文件的库已经存在。退房:

http://www.csb.pitt.edu/prody/index.html

简要地查看教程,看起来这就是你所说的没有?

http://www.csb.pitt.edu/prody/tutorial.html#atomic-data

答案 1 :(得分:4)

我很惊讶没有人提到BioPython的Bio.PDB软件包。自己编写一个PDB解析器是不必要重新发明的相当严重的情况,我的意思是重新实现。

BioPython是有用的软件包集合,可用于处理其他种类的生物学数据(例如蛋白质或核酸序列)。

我知道这是一个老问题,但也许有人仍然认为此指针有用。

答案 2 :(得分: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

答案 3 :(得分:2)

对于具有大量原子的大pdb个文件,字段之间没有空白,因此您无法使用split命令。相反,您可以使用Protein Data Bank格式定义来解析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