从电子显微镜结构中提取链
Extracting chains from a electron microscopy structure
我需要从 PDB 提供的 cif
格式的结构文件中提取单链。我读过几个相关的问题,例如 and this. The proposed solution indeed works well if the chain ID is an integer or a single character. If applied to a structure such as 6KMW to extract chain aA
it raises the error 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'))
我需要从 PDB 提供的 cif
格式的结构文件中提取单链。我读过几个相关的问题,例如 aA
it raises the error 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'))