1

バックグラウンド

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
4

1 に答える 1

1

an を定義しない一般的な理由の 1 つは、一貫した関数も定義てオブジェクトが不変__eq__でない限り、物事がハッシュ不可になる (辞書のキーとして使用したり、セットに入れたりできない) ことです。__hash__

デフォルト__hash__では、ID は変更されないため、変更可能なオブジェクトに対しても機能する ID のみを使用します。しかし、 custom を定義すると、__eq__ID によるハッシュを維持できなくなります。または、2 つのオブジェクトを比較すると同等であるにもかかわらずハッシュが異なるという状況が発生します。これは、ハッシュがどのように機能するはずであるかと矛盾します。そのため、カスタム__hash__関数を定義する必要があります (実行できます) が、オブジェクトが変更可能である場合、実際にはそれを行うことはできません/行うべきではないため、ハッシュできないオブジェクトが作成されます。それはあなたにとって大丈夫かもしれません。

詳細については、こちらの python ドキュメントを参照してください。

__eq__したがって、オブジェクトをハッシュ可能にする必要がない限り、またはオブジェクトが不変である場合は、カスタムを使用できます。そうしないと、事態はさらに複雑になります。または__eq__、そのままにして、完全な ID 比較関数に別の名前を付けて、ハッシュ可能性を壊さないようにすることもできます。

PDB ID が何を意味するか (特に、誤検出が可能かどうか) について十分に理解していないため__eq__、その観点から実装が妥当であるかどうかを判断できません。

于 2012-05-29T15:46:56.770 に答える