【问题标题】:Converting segments of large .cif files to smaller .pdb files将大型 .cif 文件的段转换为较小的 .pdb 文件
【发布时间】:2020-02-11 12:33:02
【问题描述】:

我正在尝试从核糖体晶体结构的 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】:

    _ATOM_FORMAT_STRING 中的链名格式为 %c,而在本例中,您的链名为 QA

    PDB 文件中的链名传统上是单个字符。 但是只有这么多的字母和数字。对于核糖体,有必要使用更长的名称。 pdb 格式有第二个字母的空间——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 上提出此类问题——那里应该会尽快得到答复。

    【讨论】:

    • 哇!我完全忘记了这个!我想我通过在 biopython 中编辑 res 脚本来修复它。但这看起来也可能奏效。将其标记为已解决:)
    • @IllimarRekand 是的,我知道几个月后我回答时,原来的海报已经开始了。但我想我会把它发布给将来可能遇到这个问题的其他人。
    猜你喜欢
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多