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

问题描述

我需要从PDB中以cif格式从结构文件中提取单链。我已经阅读了几个相关的问题,例如thisthis。如果链ID是整数或单个字符,则建议的解决方案确实可以很好地工作。如果将其应用于诸如6KMW之类的结构以提取链aA,则会引发错误TypeError: %c requires int or 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'))

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...