背景
在PDB
Biopython 的模块中,PDB 结构被解析为Structure
对象,这些对象将结构的组件存储在 SMCRA 架构中(Structure/Model/Chain/Residue/Atom)。此层次结构的每一级都由一个继承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;如果在构造对象时提供了正确的 PDB id,则它对于结构中的每个结构都应该是唯一的Entity
,并且在所有结构中都是唯一的。Structure
我测试Entity
等效性的解决方案只是比较这个完整的 id。那是:
def __eq__(self, other):
return self.get_full_id() == other.get_full_id()
问题
在这一点上,我在问我对Entity
等价的实现是否明智。
- 误报(例如,提供相同 PDB id 的不同结构)是否令人担忧?
- 每当我们需要测试等效性时,简单地手动比较完整的 id 会更好吗?
- 是否有任何理由在模块
__eq__
中未实现?PDB