首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从电子显微镜结构中提取链

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

Stack Overflow用户
提问于 2020-09-21 21:21:43
回答 1查看 271关注 0票数 2

我需要从cif格式的结构文件中提取单链,这是从PDB中获得的。我读过几个相关的问题,比如。如果链式ID是整数或单个字符,则建议的解决方案确实工作得很好。如果应用于像6千瓦这样的结构来提取链aA,则会引发错误TypeError: %c requires int or char。用于复制下面包含的错误和输出的完整代码。

代码语言:javascript
复制
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'))
代码语言:javascript
复制
---------------------------------------------------------------------------
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的功能来实现这个结果吗?最好是不依赖于通过自定义函数解析整个文件。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-23 21:15:08

我想,你想要达到的目标是不可能的。实际上,您希望将cif文件转换为pdb文件。在这个过程中,你想把蛋白质结构简化成一个单链并不重要。PDB格式是上世纪以来的一种文件格式。(我知道今天它的传播范围有多广.)它是面向列的,只允许链id的一个字符。这就是为什么不能下载蛋白质6KMW的PDB文件的原因。请参阅https://www.rcsb.org/structure/6KMW上的工具提示:"PDB格式文件对于大型结构不可用“。在你的例子中,“大”意味着,蛋白质有如此多的链,他们需要两个字符。

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

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

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

代码语言:javascript
复制
[...]
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'))

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

代码语言:javascript
复制
from Bio.PDB.mmcifio import MMCIFIO

io = MMCIFIO()

io.set_structure(structure)
io.save("6kmw_aA.cif", ChainSelect('aA'))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64000149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档