python - 从电子显微镜结构中提取链

标签 python biopython pdb

我需要从 PDB 中可用的 cif 格式的结构文件中提取单个链。我读过几个相关的问题,例如thisthis 。如果链 ID 是整数或单个字符,则所提出的解决方案确实效果很好。如果应用于诸如 6KMW 之类的结构要提取链aA,它会引发错误TypeError:%c需要int或char。用于重现错误和输出的完整代码如下。

from Bio.PDB import PDBList, PDBIO, FastMMCIFParser, Select

class ChainSelect(Select):
    def __init__(self, chain):
        self.chain = chain
    def accept_chain(self, chain):
        if chain.get_id() == self.chain:
            return 1
        else:          
            return 0
        
pdbl = PDBList()
io = PDBIO()
parser = FastMMCIFParser(QUIET = True)

pdbl.retrieve_pdb_file('6kmw', pdir = '.', file_format='mmCif')
structure = parser.get_structure('6kmw', '6kmw.cif')
io.set_structure(structure)
io.save('6kmw_aA.pdb', ChainSelect('aA'))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-095b98a12800> in <module>
     18 structure = parser.get_structure('6kmw', '6kmw.cif')
     19 io.set_structure(structure)
---> 20 io.save('6kmw_aA.pdb', ChainSelect('aA'))

~/miniconda3/envs/lab2/lib/python3.8/site-packages/Bio/PDB/PDBIO.py in save(self, file, select, write_end, preserve_atom_numbering)
    368                                     )
    369 
--> 370                             s = get_atom_line(
    371                                 atom,
    372                                 hetfield,

~/miniconda3/envs/lab2/lib/python3.8/site-packages/Bio/PDB/PDBIO.py in _get_atom_line(self, atom, hetfield, segid, atom_number, resname, resseq, icode, chain_id, charge)
    227                 charge,
    228             )
--> 229             return _ATOM_FORMAT_STRING % args
    230 
    231         else:

TypeError: %c requires int or char

有人知道 Biopython 功能可以实现这个结果吗?最好是不依赖于通过自定义函数解析整个文件的文件。

最佳答案

我认为,您想要实现的目标是不可能的。实际上,您想要将 cif 文件转换为 pdb 文件。您希望在此过程中将蛋白质结构减少为单链并不重要。 PDB格式是上世纪的一种文件格式。 (我知道直到今天它的传播范围有多广......)它是面向列的,并且只允许链 ID 使用一个字符。这就是您无法下载蛋白质 6KMW 的 PDB 文件的原因。请参阅工具提示 https://www.rcsb.org/structure/6KMW为此:“PDB 格式文件不适用于大型结构”。在你的情况下,“大”意味着蛋白质有很多链,需要两个字符。

您不能存储两个字符作为 PDB 文件的链名称。 您现在有两个选择:

  • 将链重命名为“aA”并将文件保存为 PDB 格式
  • 不要使用 PDB 格式作为文件格式,而坚持使用 cif

此代码片段重命名链并将结构存储为 pdb 文件:

[...]
io.set_structure(structure)
for model in structure:
    for chain in model:
        if chain.get_id() == "A":
            chain.id = "_"
            print("renamed chain A to _")
        if chain.get_id() == "aA":
            chain.id = "A"
            print("renamed chain aA to A")

io.save('6kmw_aA.pdb', ChainSelect('A'))

此代码段仅以 mmCIF 格式存储链“aA”:

from Bio.PDB.mmcifio import MMCIFIO

io = MMCIFIO()

io.set_structure(structure)
io.save("6kmw_aA.cif", ChainSelect('aA'))

关于python - 从电子显微镜结构中提取链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64000149/

相关文章:

python - 通过 ssh 流式传输远程执行程序的输出

python - django-rest-framework 中字段的单独搜索过滤器

python - 多线程 Python 代码中的 Emacs pdb 和断点问题

python - rpdb2 : how to connect to a pid

python - 如何以类似于 curl 的 --resolve 标志的方式在 python 的请求库中指定 URL 解析?

python - 无法让 Scrapy 跟踪链接

python - 如何相对于引用系移动蛋白质坐标

python - 从biopython使用NCBIWWW时出错

python - 拉普拉斯平滑到 Biopython

python - 跨过 yield 语句