このリポジトリには、プレプリントのメソッドが含まれています。
これは、事前に埋め込まれた構造データベースに対して構造を検索し、構造のペアをスコア化し、検索用に事前に埋め込まれたデータセットを可能にするprogres
Python パッケージを提供します。通常、検索には 1 ~ 2 秒かかりますが、複数のクエリの場合ははるかに高速になります。 AlphaFold データベースの場合、最初のデータのロードには約 1 分かかりますが、その後の検索にはクエリごとに 10 分の 1 秒かかります。
現在、SCOPe、CATH、ECOD、PDB 全体、21 のモデル生物の AlphaFold 構造、および AlphaFold データベース TED ドメインが検索用に提供されています。検索はドメインごとに行われますが、Chainsaw を使用してクエリ構造を自動的にドメインに分割することができます。
conda create -n prog python=3.9
conda activate prog
conda install pytorch=1.11 faiss-cpu -c pytorch
conda install pytorch-scatter pyg -c pyg
conda install kimlab::stride
pip install progres
実行します。これにより、Biopython、mmtf-python、einops、pydantic がまだ存在しない場合はインストールされます。PROGRES_DATA_DIR
設定すると、たとえばパッケージ ディレクトリに書き込めない場合などに、このデータの保存場所を変更できます。次回 Progres を実行するときも、忘れずに設定したままにしてください。あるいは、Docker ファイルはdocker
ディレクトリで入手できます。
Unix システムでは、インストール中に実行可能progres
パスに追加されます。 Windows では、実行可能ファイルにアクセスできない場合は、Python を使用してbin/progres
スクリプトを呼び出すことができます。
progres -h
実行するとヘルプ テキストが表示され、 progres {mode} -h
実行すると各モードのヘルプ テキストが表示されます。モードについては以下で説明しますが、ヘルプ テキストで説明されている他のオプションもあります。たとえば、 -d
フラグは、実行するデバイスを設定します。これはデフォルトではcpu
です。検索にはこれが最も速いことが多いためですが、Chainsaw でドメインを分割したり、多くのクエリを検索したり、データセットを埋め込んだりする場合は、 cuda
方が高速になる可能性があります。パフォーマンスが重要な場合は両方を試してください。
SCOPE データベース内のドメインに対して PDB ファイルquery.pdb
( data
ディレクトリにあります) を検索し、出力を印刷するには、次の手順を実行します。
progres search -q query.pdb -t scope95
# QUERY_NUM: 1
# QUERY: query.pdb
# DOMAIN_NUM: 1
# DOMAIN_SIZE: 150 residues (1-150)
# DATABASE: scope95
# PARAMETERS: minsimilarity 0.8, maxhits 100, chainsaw no, faiss no, progres v0.2.7
# HIT_N DOMAIN HIT_NRES SIMILARITY NOTES
1 d1a6ja_ 150 1.0000 d.112.1.1 - Nitrogen regulatory bacterial protein IIa-ntr {Escherichia coli [TaxId: 562]}
2 d2a0ja_ 146 0.9988 d.112.1.0 - automated matches {Neisseria meningitidis [TaxId: 122586]}
3 d3urra1 151 0.9983 d.112.1.0 - automated matches {Burkholderia thailandensis [TaxId: 271848]}
4 d3lf6a_ 154 0.9971 d.112.1.1 - automated matches {Artificial gene [TaxId: 32630]}
5 d3oxpa1 147 0.9968 d.112.1.0 - automated matches {Yersinia pestis [TaxId: 214092]}
...
-q
クエリ構造ファイルへのパスです。あるいは、 -l
1 行に 1 つのクエリ ファイル パスを持つテキスト ファイルで、各結果が順番に出力されます。セットアップが 1 回だけ行われ、複数のワーカーを使用できるため、複数のクエリの処理が大幅に高速になります。各ファイルの最初のチェーンのみが考慮されます。-t
、検索対象となる事前埋め込みデータベースです。現時点では、これは以下にリストされているデータベースのいずれか、またはprogres embed
で生成された事前埋め込みデータセットへのファイル パスである必要があります。-f
クエリ構造のファイル形式 ( guess
、 pdb
、 mmcif
、 mmtf
またはcoords
) を決定します。デフォルトでは、これはファイル拡張子から推測され、推測できない場合はpdb
が選択されます。 coords
、各行に空白で区切られた Cα 原子の座標を含むテキスト ファイルを指します。-s
、それを超えるとヒットを返す Progres スコア (0 -> 1) で、デフォルトは 0.8 です。論文で説明されているように、0.8 は同じ倍数を示します。-m
返されるヒットの最大数で、デフォルトは 100 です。-c
Chainsaw でクエリ構造をドメインに分割し、各ドメインで個別に検索することを示します。 Chainsaw でドメインが見つからない場合、結果は返されません。各ファイルの最初のチェーンのみが考慮されます。チェーンソーの実行には数秒かかる場合があります。クエリ構造をドメインに分割するための他のツールには、Merizo や SWORD2 などがあります。 pdb-tools のpdb_selres
コマンドなどのソフトウェアを使用して、ドメインを手動でスライスすることもできます。
ヒットした説明の解釈は、検索対象のデータベースによって異なります。ドメイン名には、対応する PDB ファイルへの参照が含まれることがよくあります。たとえば、d1a6ja_ は PDB ID 1A6J チェーン A を指します。これを RCSB PDB 構造ビューで開くと、簡単に確認できます。 AlphaFold データベース TED ドメインの場合、このようなリンクからファイルをダウンロードできます。AF AF-A0A6J8EXE6-F1
がヒット ノートの最初の部分で、その後にドメインの残基範囲が続きます。
利用可能な組み込みデータベースは次のとおりです。
名前 | 説明 | ドメインの数 | 検索時間(1クエリ) | 検索時間 (100 クエリ) |
---|---|---|---|---|
scope95 | 95% の配列 ID でクラスター化された SCOPe 2.08 ドメインの ASTRAL セット | 35,371 | 1.35秒 | 2.81秒 |
scope40 | 40% の配列 ID でクラスター化された SCOPe 2.08 ドメインの ASTRAL セット | 15,127 | 1.32秒 | 2.36秒 |
cath40 | CATH 23/11/22 からの S40 非冗長ドメイン | 31,884 | 1.38秒 | 2.79秒 |
ecod70 | ECOD 開発の F70 代表ドメイン287 | 71,635 | 1.46秒 | 3.82秒 |
pdb100 | 02/08/24 の時点ですべての PDB タンパク質鎖がチェーンソーでドメインに分割される | 1,177,152 | 2.90秒 | 27.3秒 |
af21org | CATH-Assign によってドメインに分割された 21 のモデル生物の AlphaFold 構造 | 338,258 | 2.21秒 | 11.0秒 |
afted | AlphaFold データベース構造は TED によってドメインに分割され、50% の配列同一性でクラスター化されています。 | 53,344,209 | 67.7秒 | 73.1秒 |
検索時間は、256 GB RAM および PyTorch 1.11 を搭載した Intel i9-10980XE CPU での 150 残基タンパク質 (PDB 形式の d1a6ja_) の場合です。時間は 1 クエリまたは 100 クエリごとに与えられます。 afted
徹底的な FAISS 検索を使用することに注意してください。これによって検出されるヒットは変わりませんが、類似性スコアはわずかに異なります。論文を参照してください。
2 つのタンパク質ドメイン間の Progres スコアを計算するには:
progres score struc_1.pdb struc_2.pdb
0.7265280485153198
-f
と-g
上記の最初と 2 番目の構造のファイル形式を決定します ( guess
、 pdb
、 mmcif
、 mmtf
またはcoords
)。ドメインの順序はスコアに影響しません。 0.8 以上のスコアは同じ倍数であることを示します。
構造のデータセットを埋め込んで検索できるようにするには、次の手順を実行します。
progres embed -l filepaths.txt -o searchdb.pt
-l
は、1 行に 1 つの構造に関する情報を含むテキスト ファイルで、出力ではそれぞれが 1 つのエントリになります。構造へのファイル パスとドメイン名は空白で区切る必要があり、オプションで追加のテキストは結果のメモ列のメモとして扱われます。-o
埋め込みと関連データを含む辞書を含む PyTorch ファイルの出力ファイル パスです。 torch.load
で読み込むことができます。-f
、上記のように各構造のファイル形式を決定します ( guess
、 pdb
、 mmcif
、 mmtf
またはcoords
)。繰り返しになりますが、構造は単一のタンパク質ドメインに対応する必要があります。埋め込みは Float16 として保存され、検索パフォーマンスに目立った影響はありません。
たとえば、 data
ディレクトリから上記のコマンドを実行して、2 つの構造を持つデータベースを生成できます。
progres
Python でも使用でき、他のメソッドに統合できます。
import progres as pg
# Search as above, returns a list where each entry is a dictionary for a query
# A generator is also available as pg.progres_search_generator
results = pg . progres_search ( querystructure = "query.pdb" , targetdb = "scope95" )
results [ 0 ]. keys () # dict_keys(['query_num', 'query', 'query_size', 'database', 'minsimilarity',
# 'maxhits', 'domains', 'hits_nres', 'similarities', 'notes'])
# Score as above, returns a float (similarity score 0 to 1)
pg . progres_score ( "struc_1.pdb" , "struc_2.pdb" )
# Pre-embed as above, saves a dictionary
pg . progres_embed ( structurelist = "filepaths.txt" , outputfile = "searchdb.pt" )
import torch
torch . load ( "searchdb.pt" ). keys () # dict_keys(['ids', 'embeddings', 'nres', 'notes'])
# Read a structure file into a PyTorch Geometric graph
graph = pg . read_graph ( "query.pdb" )
graph # Data(x=[150, 67], edge_index=[2, 2758], coords=[150, 3])
# Embed a single structure
embedding = pg . embed_structure ( "query.pdb" )
embedding . shape # torch.Size([128])
# Load and reuse the model for speed
model = pg . load_trained_model ()
embedding = pg . embed_structure ( "query.pdb" , model = model )
# Embed Cα coordinates and search with the embedding
# This is useful for using progres in existing pipelines that give out Cα coordinates
# queryembeddings should have shape (128) or (n, 128)
# and should be normalised across the 128 dimension
coords = pg . read_coords ( "query.pdb" )
embedding = pg . embed_coords ( coords ) # Can take a list of coords or a tensor of shape (nres, 3)
results = pg . progres_search ( queryembeddings = embedding , targetdb = "scope95" )
# Get the similarity score (0 to 1) between two embeddings
# The distance (1 - similarity) is also available as pg.embedding_distance
score = pg . embedding_similarity ( embedding , embedding )
score # tensor(1.) in this case since they are the same embedding
# Get all-v-all similarity scores between 1000 embeddings
embs = torch . nn . functional . normalize ( torch . randn ( 1000 , 128 ), dim = 1 )
scores = pg . embedding_similarity ( embs . unsqueeze ( 0 ), embs . unsqueeze ( 1 ))
scores . shape # torch.Size([1000, 1000])
ベンチマーク (他の手法を含む)、FAISS インデックスの生成、トレーニング用のデータセットとスクリプトはscripts
ディレクトリにあります。トレーニング済みモデルと事前埋め込みデータベースは Zenodo で入手できます。
E(n) 等変 GNN の実装には EGNN PyTorch が使用されます。 SupContrast と Chainsaw のコードも含まれています。
問題を開いていただくか、フィードバックをお寄せください。プルリクエストによる貢献は大歓迎です。