我需要从PDB提供的cif
格式的结构文件中提取单链。我读过几个相关的问题,比如this和this。如果链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文件的链名称。 你现在有两个选择:
此代码段重命名链并将结构存储为pdb文件:
此代码段仅存储mmCIF格式的链“aA”:
相关问题 更多 >
编程相关推荐