将大型 .cif 文件的片段转换为较小的 .pdb 文件
Converting segments of large .cif files to smaller .pdb files
我正试图从核糖体 crystal 结构的 cif 文件中找出一些与配体的结合位点,但遇到了一个涉及类型错误的恼人问题。
TypeError: %c requires int or char
使用下面的代码,
from Bio.PDB import *
from Bio import PDB
class save_res(Select):
def accept_residue(self, residue):
if residue in keep_res_list:
print(residue)
return 1
else:
return 0
keep_res_list = []
parser = MMCIFParser()
structure = parser.get_structure("1vvj.cif", "./1vvj.cif")
structure = structure[0]
atom_list = Selection.unfold_entities(structure, "A") # A for atoms
ns = NeighborSearch(atom_list)
for residue in structure.get_residues():
if residue.get_resname() == "PAR":
for atom in residue:
center = atom.get_coord()
neighbors = ns.search(center, 5.0)
neighbor_residue_list = Selection.unfold_entities(neighbors, "R")
for res in neighbor_residue_list:
if res not in keep_res_list:
keep_res_list.append(res)
io = PDBIO()
io.set_structure(structure)
io.save("1vvj_bs.pdb", save_res())
给我错误:
File "/scratch/software/anaconda3/envs/my-devel-3.6/lib/python3.6/site-packages/Bio/PDB/PDBIO.py", line 112, in _get_atom_line
return _ATOM_FORMAT_STRING % args
TypeError: %c requires int or char
当将 pdb-id 更改为 1fyb 时,此代码运行良好,它也具有相同的配体 ID。
我认为问题源于原始文件中的大量链及其 ID。我在这个假设中是完全错误的还是有人知道如何解决这个问题?我一直在努力寻找重命名链 ID 的方法,但还没有找到可行的方法。
感谢您的帮助。
_ATOM_FORMAT_STRING
中的链名称格式为 %c
,而在本例中您的链名称为 QA
。
传统上,PDB 文件中的链名称是单个字符。
但是只有这么多字母和数字。对于核糖体,有必要使用更长的名称。 pdb 格式的第二个字母为 space——1 个字符链名称左侧的空列。许多程序支持它,但不是全部,这不是官方规范的一部分。
因此您可以使用带有 2 个字符链的 PDB 文件(如果您的工作流的其余部分支持它)或在输出中重命名链(您的输出只是原始结构的一小部分)。
以下是 gemmi 中的操作方法:
import gemmi
structure = gemmi.read_structure('1vvj.cif')
model = structure[0]
ns = gemmi.NeighborSearch(model, structure.cell, 5.0).populate()
for chain in model:
for residue in chain:
if residue.name == 'PAR':
for atom in residue:
for nb in ns.find_neighbors(atom):
nb.to_cra(model).residue.flag = 'y'
sel = gemmi.Selection().set_residue_flags('y')
new_structure = sel.copy_structure_selection(structure)
#new_structure.remove_empty_chains()
#new_structure.shorten_chain_names()
new_structure.write_minimal_pdb('1vvj-par.pdb')
注释掉的两行正在重命名链。
与您的代码相比,一个不同之处在于 gemmi 中的 NeighborSearch 是对称感知的。它还从对称配对中找到附近的原子。在 BioPython 中,您只能在非对称单位 (asu) 中搜索。
两者都不同于生物组装——
PDB-101 covers it nicely。
如果您只想在 asu 中搜索 - 将 structure.cell
替换为上面的 gemmi.UnitCell()
,即不要传递晶胞信息。
(您可以在 bioinformatics.SE 上提出此类问题——那里应该会尽快得到答复)。
我正试图从核糖体 crystal 结构的 cif 文件中找出一些与配体的结合位点,但遇到了一个涉及类型错误的恼人问题。
TypeError: %c requires int or char
使用下面的代码,
from Bio.PDB import *
from Bio import PDB
class save_res(Select):
def accept_residue(self, residue):
if residue in keep_res_list:
print(residue)
return 1
else:
return 0
keep_res_list = []
parser = MMCIFParser()
structure = parser.get_structure("1vvj.cif", "./1vvj.cif")
structure = structure[0]
atom_list = Selection.unfold_entities(structure, "A") # A for atoms
ns = NeighborSearch(atom_list)
for residue in structure.get_residues():
if residue.get_resname() == "PAR":
for atom in residue:
center = atom.get_coord()
neighbors = ns.search(center, 5.0)
neighbor_residue_list = Selection.unfold_entities(neighbors, "R")
for res in neighbor_residue_list:
if res not in keep_res_list:
keep_res_list.append(res)
io = PDBIO()
io.set_structure(structure)
io.save("1vvj_bs.pdb", save_res())
给我错误:
File "/scratch/software/anaconda3/envs/my-devel-3.6/lib/python3.6/site-packages/Bio/PDB/PDBIO.py", line 112, in _get_atom_line
return _ATOM_FORMAT_STRING % args
TypeError: %c requires int or char
当将 pdb-id 更改为 1fyb 时,此代码运行良好,它也具有相同的配体 ID。 我认为问题源于原始文件中的大量链及其 ID。我在这个假设中是完全错误的还是有人知道如何解决这个问题?我一直在努力寻找重命名链 ID 的方法,但还没有找到可行的方法。
感谢您的帮助。
_ATOM_FORMAT_STRING
中的链名称格式为 %c
,而在本例中您的链名称为 QA
。
传统上,PDB 文件中的链名称是单个字符。 但是只有这么多字母和数字。对于核糖体,有必要使用更长的名称。 pdb 格式的第二个字母为 space——1 个字符链名称左侧的空列。许多程序支持它,但不是全部,这不是官方规范的一部分。
因此您可以使用带有 2 个字符链的 PDB 文件(如果您的工作流的其余部分支持它)或在输出中重命名链(您的输出只是原始结构的一小部分)。
以下是 gemmi 中的操作方法:
import gemmi
structure = gemmi.read_structure('1vvj.cif')
model = structure[0]
ns = gemmi.NeighborSearch(model, structure.cell, 5.0).populate()
for chain in model:
for residue in chain:
if residue.name == 'PAR':
for atom in residue:
for nb in ns.find_neighbors(atom):
nb.to_cra(model).residue.flag = 'y'
sel = gemmi.Selection().set_residue_flags('y')
new_structure = sel.copy_structure_selection(structure)
#new_structure.remove_empty_chains()
#new_structure.shorten_chain_names()
new_structure.write_minimal_pdb('1vvj-par.pdb')
注释掉的两行正在重命名链。
与您的代码相比,一个不同之处在于 gemmi 中的 NeighborSearch 是对称感知的。它还从对称配对中找到附近的原子。在 BioPython 中,您只能在非对称单位 (asu) 中搜索。
两者都不同于生物组装——
PDB-101 covers it nicely。
如果您只想在 asu 中搜索 - 将 structure.cell
替换为上面的 gemmi.UnitCell()
,即不要传递晶胞信息。
(您可以在 bioinformatics.SE 上提出此类问题——那里应该会尽快得到答复)。