gpt4 book ai didi

python - 在 Biopython 的 PDB 模块中实现等效性

转载 作者:太空宇宙 更新时间:2023-11-03 19:17:44 25 4
gpt4 key购买 nike

背景

在Biopython的PDB模块中,PDB structures被解析为 Structure 对象,这些对象将结构的组件存储在 SMCRA 架构中(结构/模型/链/残基/原子)。此层次结构的每个级别都由继承 Entity 容器类的对象表示。

等价

我的问题是任何两个实体对象都不可能相等。

从同一文件构建的结构不相等:

>>> from Bio import PDB
>>> parser = PDB.PDBParser()
>>> struct1 = parser.get_structure("1hgg", "pdb1hgg.ent")
>>> struct2 = parser.get_structure("1hgg", "pdb1hgg.ent")
>>> struct1 == struct2
False

该结构中的残基不相等:

>>> first_res1 = struct1.get_residues().next()
>>> first_res2 = struct2.get_residues().next()
>>> first_res1 == first_res2
False

等等。

如果我们单独解析同一个 PDB 文件,结构中的任何 Entity 对象都不会相等。

解决方案

此问题的明显解决方案是永远不要解析同一个 PDB 文件两次。然后,我们就有了对象同一性,因此也就有了等价性。然而,这个答案对我来说似乎不完整。

每个Entity对象都可以返回一个标识元组get_full_id() 。此方法给出从顶部对象向下的所有 id;它对于结构中的每个Entity 应该是唯一的,并且如果在构造 Structure 对象时提供了正确的 PDB id,则在所有结构中都应该是唯一的。

我的测试Entity等效性的解决方案只是比较这个完整的ID。即:

def __eq__(self, other):
return self.get_full_id() == other.get_full_id()

问题

此时,我想问我的 Entity 等效实现是否合理。

  • 是否担心误报(例如,提供相同 PDB ID 的不同结构)?
  • 每当我们需要测试等效性时,简单地手动比较完整 ID 是否更好?
  • __eq__PDB 模块中未实现是否有任何原因?

最佳答案

不定义 __eq__ 的一个常见原因是它使事物不可散列(因此您不能将它们用作字典键或将它们放入集合中),除非您还定义了一致的 __hash__ 函数,并且你的对象是不可变的。

默认情况下,对象的 __hash__ 仅使用 ID,这甚至适用于可变对象,因为 ID 永远不会改变。但是如果你定义了一个自定义的__eq__,你就不能继续按ID进行散列,否则你会遇到这样的情况:两个对象可以比较相等但具有不同的散列,这与散列的方式不一致应该可以工作。因此,您必须定义一个自定义 __hash__ 函数(您可以这样做),但是如果您的对象是可变的,您就不能/不应该这样做,,要么,所以你只会有一个不可散列的对象。这可能适合你。

在 python 文档中查看更多信息 here .

因此,只要您不需要对象可散列,或者它们是不可变的,您就可以使用自定义 __eq__;否则事情会变得更加复杂。或者,您可以保留 __eq__ 并将完整 ID 比较函数命名为其他名称,以免破坏哈希性。

我不太了解 PDB ID 的含义(特别是是否可能出现误报),无法从这个角度判断您的 __eq__ 实现是否合理。

关于python - 在 Biopython 的 PDB 模块中实现等效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10802123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com