バックグラウンド
BiopythonのPDB
モジュールでは、PDB 構造がオブジェクトに解析されStructure
、SMCRA アーキテクチャ (Structure/Model/Chain/Residue/Atom) に構造のコンポーネントが格納されます。Entity
この階層の各レベルは、コンテナ クラスを継承するオブジェクトによって表されます。
等価
私の問題は、2 つの 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 ファイルを 2 回解析しないことです。次に、オブジェクトの同一性、つまり等価性があります。ただし、この答えは私には不完全に思えます。
各Entity
オブジェクトは、 を使用して識別タプルを返すことができますget_full_id()
。このメソッドは、最上位のオブジェクトから順にすべての ID を提供します。Entity
オブジェクトの構築時に適切な PDB ID が指定されている場合は、構造内の各構造体で一意である必要があり、すべての構造体で一意である必要がありStructure
ます。
Entity
同等性をテストするための私の解決策は、単にこの完全な ID を比較することです。あれは:
def __eq__(self, other):
return self.get_full_id() == other.get_full_id()
質問
Entity
この時点で、同等性の実装が適切かどうかを尋ねています。
- 誤検知 (たとえば、同じ PDB ID が提供された異なる構造) は心配ですか?
- 同等性をテストする必要があるときはいつでも、完全な ID を手動で比較する方がよいでしょうか?
- また、モジュール
__eq__
内で実装されていない理由はありますか?PDB