将大型.cif文件的段转换为较小的.pdb文件

问题描述 投票:2回答:1

我正在尝试从核糖体晶体结构的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的方法,但是还没有找到可行的方法来进行此操作。

感谢您的帮助。

casting bioinformatics biopython
1个回答
0
投票

_ATOM_FORMAT_STRING中的链名称格式为%c,而在这种情况下,您具有名为QA的链。

PDB文件中的链名传统上是单个字符。但是只有这么多字母和数字。对于核糖体,必须使用更长的名称。 pdb格式在第二个字母处留有空格-1个字符的链名称左侧的空白列。许多程序支持它,但不是全部都支持它,这也不是官方规范的一部分。

因此,您可以将PDB文件与2个字符的链一起使用(如果工作流程的其余部分支持它),也可以在输出中重命名链(您的输出仅是原始结构的一小部分)。

[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上问这样的问题-它应该会在那早得到答案)。

© www.soinside.com 2019 - 2024. All rights reserved.