【问题标题】:How to extract only relevant atom and save a pdb file (not locally)?如何仅提取相关原子并保存 pdb 文件(不在本地)?
【发布时间】:2022-01-13 08:38:33
【问题描述】:

我有一个原子列表。 rep_atoms = [CA, CB, CD3](碳原子)。 我只想从任何给定的 PDB 文件中保存这些。我不想在本地保存它;我希望它保存在内存中(大量迭代)。 我已经到了下面的代码,但是它将文件保存在本地并且非常慢。 所以,我的目标是来自 PDB 中的每个原子,如果它存在于 rep_atoms 中。使 new_pdb 仅存储该信息,以便稍后在我的代码中调用它时,它应该是一个 PDB 文件,而不会保存在我的计算机中的本地文件夹中。

如何附加每个原子?打印所有原子非常快。我想附加它,但它不会是 PDB 结构文件。我该怎么办?

class rep_atom_Select(Select):
    def accept_atom(self, atom):
        if atom.get_name() in rep_atoms:
            return 1
        else:
            return 0

def rep_atoms_pdb(input_pdb):
    io = PDBIO()
    io.set_structure(input_pdb)
    for model in input_pdb:
        for chain in model:
            for residue in chain:
                for atom in residue:
                    if atom.get_name() in rep_atoms:
                        print(atom)
#                        dnr_only = io.save("dnr_only.pdb", rep_atom_Select())

【问题讨论】:

  • 在循环之后保存文件似乎是简单明了的解决方案。
  • 从缩进来看,您似乎将 pdb 文件保存在内部 for 循环中。当 io.save 也不在循环中时,您是否检查了性能?
  • @LydiavanDyke 即使性能好,在我的电脑中也会占用大量空间。 (对于任何给定的 pdb,我需要 1000 多个版本的 pdb。)
  • 我能想到的一个解决方案是提取原子信息,然后附加到文件中。像 Atom、Atom_SeqNo、Res、Res_ID 等等。但我认为这会在某个地方出现缩进和所有问题。
  • @tripleee 很抱歉,但我无法理解您的意思。 Lydia van Dyke 也说过类似的话。我不能将 io.save 放在其他地方,给我缩进错误。

标签: biopython protein-database


【解决方案1】:

在循环后保存一次,而不是在循环内保存数千次。

def rep_atoms_pdb(input_pdb):
    my_atoms = list()
    for model in input_pdb:
        for chain in model:
            for residue in chain:
                for atom in residue:
                    if atom.get_name() in rep_atoms: # or if rep_atom_Select().accept_atom(atom):
                        my_atoms.append(atom) # or something like this
    # The function returns the list of extracted atoms
    return my_atoms

您对rep_atom_Select() 的定义似乎与此设计不直接兼容,我也不确定将原子作为列表接收是否真的是您想要的,但这至少应该让您朝着正确的方向轻推。

简要阅读Bio.PDB.PDBIO 文档表明您可能只想返回实际的 PDBIO 对象。我认为是这样的:

class rep_atom_Select(Select):
    def accept_atom(self, atom):
        if atom.get_name() in rep_atoms:
            return 1
        else:
            return 0

def rep_atoms_pdb(input_pdb):
    io = rep_atom_Select()
    io.set_structure(input_pdb)
    return io

这是基于对文档的粗略阅读,但至少演示了如何使用覆盖的类来仅选择 input_pdb 结构中的一些原子。

【讨论】:

  • 谢谢!确实是XY problem
  • 现在可能会看到更新的答案。我无法对此进行测试,但希望它至少可以帮助您解开这里的概念。我不知道PDBIO 是否会立即在您的子类中应用过滤器,但我猜这就是它的工作原理。
猜你喜欢
  • 2020-04-29
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多