Dieses Repository enthält die Methode aus dem Vorabdruck:
Es stellt das progres
-Python-Paket bereit, mit dem Sie Strukturen anhand vorab eingebetteter Strukturdatenbanken durchsuchen, Strukturpaare bewerten und Datensätze für die Suche vorab einbetten können. Die Suche dauert normalerweise 1–2 Sekunden und ist bei mehreren Abfragen viel schneller. Bei der AlphaFold-Datenbank dauert das anfängliche Laden der Daten etwa eine Minute, die anschließende Suche dauert jedoch eine Zehntelsekunde pro Abfrage.
Derzeit stehen SCOPe, CATH, ECOD, die gesamte PDB, die AlphaFold-Strukturen für 21 Modellorganismen und die TED-Domänen der AlphaFold-Datenbank zur Suche zur Verfügung. Die Suche erfolgt nach Domäne, aber Chainsaw kann verwendet werden, um Abfragestrukturen automatisch in Domänen aufzuteilen.
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
aus, wodurch auch Biopython, mmtf-python, einops und pydantic installiert werden, sofern diese noch nicht vorhanden sind.PROGRES_DATA_DIR
festlegen, um den Speicherort dieser Daten zu ändern, beispielsweise wenn Sie nicht in das Paketverzeichnis schreiben können. Denken Sie daran, die Einstellung beizubehalten, wenn Sie Progres das nächste Mal ausführen. Alternativ steht im docker
-Verzeichnis eine Docker-Datei zur Verfügung.
Auf Unix-Systemen wird die ausführbare Datei progres
während der Installation zum Pfad hinzugefügt. Unter Windows können Sie das bin/progres
-Skript mit Python aufrufen, wenn Sie nicht auf die ausführbare Datei zugreifen können.
Führen Sie progres -h
aus, um den Hilfetext anzuzeigen, und progres {mode} -h
um den Hilfetext für jeden Modus anzuzeigen. Die Modi werden unten beschrieben, es gibt jedoch auch andere Optionen, die im Hilfetext beschrieben werden. Beispielsweise legt das Flag -d
das Gerät fest, auf dem es ausgeführt werden soll. Dies ist standardmäßig cpu
, da dies bei der Suche oft am schnellsten ist, aber cuda
ist wahrscheinlich schneller, wenn Sie Domänen mit Chainsaw aufteilen, viele Abfragen durchsuchen oder einen Datensatz einbetten. Versuchen Sie beides, wenn die Leistung wichtig ist.
So durchsuchen Sie eine PDB-Datei query.pdb
(die sich im data
befindet) nach Domänen in der SCOPe-Datenbank und drucken die Ausgabe:
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
ist der Pfad zur Abfragestrukturdatei. Alternativ ist -l
eine Textdatei mit einem Abfragedateipfad pro Zeile und jedes Ergebnis wird der Reihe nach gedruckt. Dies ist bei Mehrfachabfragen erheblich schneller, da die Einrichtung nur einmal erfolgt und mehrere Worker verwendet werden können. Es wird nur die erste Kette in jeder Datei berücksichtigt.-t
ist die vorab eingebettete Datenbank, in der gesucht werden soll. Derzeit muss dies entweder eine der unten aufgeführten Datenbanken oder der Dateipfad zu einem vorab eingebetteten Datensatz sein, der mit progres embed
generiert wurde.-f
bestimmt das Dateiformat der Abfragestruktur ( guess
, pdb
, mmcif
, mmtf
oder coords
). Standardmäßig wird dies anhand der Dateierweiterung erraten. Wenn keine Schätzung möglich ist, wird pdb
ausgewählt. coords
bezieht sich auf eine Textdatei mit den Koordinaten eines Cα-Atoms, getrennt durch Leerzeichen in jeder Zeile.-s
ist der Progres-Score (0 -> 1), ab dem Treffer zurückgegeben werden sollen, Standardwert 0,8. Wie in der Arbeit besprochen, weist 0,8 auf die gleiche Faltung hin.-m
ist die maximale Anzahl der zurückgegebenen Treffer, Standard 100.-c
gibt an, die Abfragestruktur(en) mit Chainsaw in Domänen aufzuteilen und mit jeder Domäne separat zu suchen. Wenn mit Chainsaw keine Domains gefunden werden, werden keine Ergebnisse zurückgegeben. Es wird nur die erste Kette in jeder Datei berücksichtigt. Das Ausführen der Kettensäge kann einige Sekunden dauern. Weitere Tools zur Aufteilung von Abfragestrukturen in Domänen sind Merizo und SWORD2. Sie können Domänen auch manuell mit Software wie dem Befehl pdb_selres
von pdb-tools ausschneiden.
Die Interpretation der Trefferbeschreibungen hängt von der durchsuchten Datenbank ab. Der Domänenname enthält häufig einen Verweis auf die entsprechende PDB-Datei, beispielsweise verweist „d1a6ja_“ auf die PDB-ID 1A6J-Kette A. Diese kann in der RCSB-PDB-Strukturansicht geöffnet werden, um einen schnellen Überblick zu erhalten. Für die TED-Domänen der AlphaFold-Datenbank können Dateien über Links wie diesen heruntergeladen werden, wobei AF-A0A6J8EXE6-F1
der erste Teil der Treffernotizen ist, gefolgt vom Restbereich der Domäne.
Die verfügbaren voreingebetteten Datenbanken sind:
Name | Beschreibung | Anzahl der Domänen | Suchzeit (1 Abfrage) | Suchzeit (100 Suchanfragen) |
---|---|---|---|---|
scope95 | ASTRAL-Satz von SCOPe 2.08-Domänen, geclustert mit 95 % Seq-ID | 35.371 | 1,35 s | 2,81 s |
scope40 | ASTRAL-Satz von SCOPe 2.08-Domänen, geclustert mit 40 % Sequenz-ID | 15.127 | 1,32 s | 2,36 s |
cath40 | S40 nicht-redundante Domänen von CATH 23.11.22 | 31.884 | 1,38 s | 2,79 s |
ecod70 | Repräsentative F70-Domänen von ECOD entwickeln287 | 71.635 | 1,46 s | 3,82 s |
pdb100 | Alle PDB-Proteinketten wurden ab dem 08.02.24 mit Chainsaw in Domänen aufgeteilt | 1.177.152 | 2,90 s | 27,3 s |
af21org | AlphaFold-Strukturen für 21 Modellorganismen, aufgeteilt in Domänen durch CATH-Assign | 338.258 | 2,21 s | 11,0 s |
afted | AlphaFold-Datenbankstrukturen werden von TED in Domänen aufgeteilt und mit einer Sequenzidentität von 50 % geclustert | 53.344.209 | 67,7 s | 73,1 s |
Die Suchzeit gilt für ein Protein mit 150 Resten (d1a6ja_ im PDB-Format) auf einer Intel i9-10980XE-CPU mit 256 GB RAM und PyTorch 1.11. Die Zeiten werden für 1 oder 100 Abfragen angegeben. Beachten Sie, dass afted
eine umfassende FAISS-Suche verwendet. Dies ändert nichts an den gefundenen Treffern, aber die Ähnlichkeitsbewertung weicht geringfügig ab – siehe Artikel.
So berechnen Sie den Progres-Score zwischen zwei Proteindomänen:
progres score struc_1.pdb struc_2.pdb
0.7265280485153198
-f
und -g
bestimmen das Dateiformat für die erste und zweite Struktur wie oben ( guess
, pdb
, mmcif
, mmtf
oder coords
).Die Reihenfolge der Domänen hat keinen Einfluss auf die Punktzahl. Ein Wert von 0,8 oder höher weist auf die gleiche Faltung hin.
So betten Sie einen Datensatz mit Strukturen ein, sodass dieser durchsucht werden kann:
progres embed -l filepaths.txt -o searchdb.pt
-l
ist eine Textdatei mit Informationen zu einer Struktur pro Zeile, von denen jede einen Eintrag in der Ausgabe darstellt. Der Dateipfad zur Struktur und der Domänenname sollten durch Leerzeichen getrennt werden. Optional wird jeder zusätzliche Text als Notiz für die Notizenspalte der Ergebnisse behandelt.-o
ist der Ausgabedateipfad für die PyTorch-Datei, die ein Wörterbuch mit den Einbettungen und zugehörigen Daten enthält. Es kann mit torch.load
eingelesen werden.-f
bestimmt das Dateiformat jeder Struktur wie oben ( guess
, pdb
, mmcif
, mmtf
oder coords
).Auch hier sollten die Strukturen einzelnen Proteindomänen entsprechen. Die Einbettungen werden als Float16 gespeichert, was keinen spürbaren Einfluss auf die Suchleistung hat.
Beispielsweise können Sie den obigen Befehl im data
ausführen, um eine Datenbank mit zwei Strukturen zu generieren.
progres
kann auch in Python verwendet werden, sodass es in andere Methoden integriert werden kann:
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])
Datensätze und Skripte für Benchmarking (auch für andere Methoden), FAISS-Indexgenerierung und Training befinden sich im scripts
. Das trainierte Modell und die vorab eingebetteten Datenbanken sind auf Zenodo verfügbar.
Die Implementierung des E(n)-äquivarianten GNN verwendet EGNN PyTorch. Wir integrieren auch Code von SupContrast und Chainsaw.
Bitte öffnen Sie Probleme oder kontaktieren Sie uns für Feedback. Beiträge über Pull-Requests sind willkommen.