5

我正在尝试为 .pdb 文件编写一个快速解析器(它们显示蛋白质结构)。我正在研究的蛋白质的一个例子是 KRAS(在癌症中很常见),在这里:http ://www.rcsb.org/pdb/files/3GFT.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”对应于原子计数,而不是一般计数):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 胆汁 A 21 63.275 111.495 12.201 0.50 12.17 C

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

我是 python 的新手,我的培训是生物统计学,所以我想知道最好的方法是什么?我是否使用 for 循环逐行解析?有没有办法在 python 中更快地做到这一点?如何处理某些原子的双重输入?

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

谢谢!

4

4 回答 4

8

没有人提到来自 BioPython 的Bio.PDB包,我感到有点惊讶。自己编写 PDB 解析器是一个相当严重的不必要的重新发明案例,我的意思是重新实现轮子。

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

我知道这是一个老问题,但也许有人仍然觉得这个指针很有帮助。

于 2020-05-06T15:50:00.267 回答
7

看起来解析 PDB 文件的库已经存在。查看:

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

简要浏览教程,似乎这就是您所说的不?

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

于 2012-04-25T23:28:10.503 回答
6

这是一个很长的描述。我不确定我是否正确:-) 如果字段(以 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
于 2012-04-25T23:34:39.347 回答
4

对于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
于 2016-08-11T10:49:46.287 回答