Ce référentiel contient la méthode de la pré-impression :
Il fournit le package Python progres
qui vous permet de rechercher des structures dans des bases de données structurelles pré-intégrées, d'évaluer des paires de structures et des ensembles de données pré-intégrés pour la recherche. La recherche prend généralement 1 à 2 secondes et est beaucoup plus rapide pour plusieurs requêtes. Pour la base de données AlphaFold, le chargement initial des données prend environ une minute, mais la recherche ultérieure prend un dixième de seconde par requête.
Actuellement, SCOPe, CATH, ECOD, l'ensemble du PDB, les structures AlphaFold pour 21 organismes modèles et les domaines TED de la base de données AlphaFold sont fournis pour la recherche. La recherche est effectuée par domaine, mais Chainsaw peut être utilisé pour diviser automatiquement les structures de requête en domaines.
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
, qui installera également Biopython, mmtf-python, einops et pydantic s'ils ne sont pas déjà présents.PROGRES_DATA_DIR
pour modifier l'emplacement de stockage de ces données, par exemple si vous ne pouvez pas écrire dans le répertoire du package. N'oubliez pas de le conserver la prochaine fois que vous exécuterez Progres. Alternativement, un fichier Docker est disponible dans le répertoire docker
.
Sur les systèmes Unix, l'exécutable progres
sera ajouté au chemin lors de l'installation. Sous Windows, vous pouvez appeler le script bin/progres
avec python si vous ne pouvez pas accéder à l'exécutable.
Exécutez progres -h
pour voir le texte d'aide et progres {mode} -h
pour voir le texte d'aide pour chaque mode. Les modes sont décrits ci-dessous mais il existe d'autres options décrites dans le texte d'aide. Par exemple, l'indicateur -d
définit le périphérique sur lequel s'exécuter ; il s'agit cpu
par défaut car il est souvent le plus rapide pour la recherche, mais cuda
sera probablement plus rapide lors du fractionnement de domaines avec Chainsaw, de la recherche de nombreuses requêtes ou de l'intégration d'un ensemble de données. Essayez les deux si les performances sont importantes.
Pour rechercher un fichier PDB query.pdb
(qui se trouve dans le répertoire data
) par rapport aux domaines de la base de données SCOPe et imprimer le résultat :
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
est le chemin d'accès au fichier de structure de requête. Alternativement, -l
est un fichier texte avec un chemin de fichier de requête par ligne et chaque résultat sera imprimé tour à tour. Ceci est considérablement plus rapide pour plusieurs requêtes puisque la configuration n’a lieu qu’une seule fois et que plusieurs travailleurs peuvent être utilisés. Seule la première chaîne de chaque fichier est prise en compte.-t
est la base de données pré-intégrée dans laquelle effectuer la recherche. Actuellement, il doit s'agir soit de l'une des bases de données répertoriées ci-dessous, soit du chemin d'accès au fichier d'un ensemble de données pré-intégré généré avec progres embed
.-f
détermine le format de fichier de la structure de requête ( guess
, pdb
, mmcif
, mmtf
ou coords
). Par défaut, cela est deviné à partir de l'extension du fichier, avec pdb
choisi si une supposition ne peut pas être faite. coords
fait référence à un fichier texte avec les coordonnées d'un atome Cα séparées par un espace blanc sur chaque ligne.-s
est le score de progression (0 -> 1) au-dessus duquel renvoyer les hits, par défaut 0,8. Comme indiqué dans l'article, 0,8 indique le même pli.-m
est le nombre maximum d'accès à renvoyer, 100 par défaut.-c
indique de diviser la ou les structures de requête en domaines avec Chainsaw et de rechercher chaque domaine séparément. Si aucun domaine n'est trouvé avec Chainsaw, aucun résultat ne sera renvoyé. Seule la première chaîne de chaque fichier est prise en compte. L’exécution de Chainsaw peut prendre quelques secondes. D'autres outils permettant de diviser les structures de requêtes en domaines incluent Merizo et SWORD2. Vous pouvez également découper des domaines manuellement à l'aide d'un logiciel tel que la commande pdb_selres
de pdb-tools.
L'interprétation des descriptions des hits dépend de la base de données recherchée. Le nom de domaine inclut souvent une référence au fichier PDB correspondant, par exemple d1a6ja_ fait référence à la chaîne A de l'ID 1A6J du PDB, et cela peut être ouvert dans la vue de la structure RCSB PDB pour avoir un aperçu rapide. Pour les domaines TED de la base de données AlphaFold, les fichiers peuvent être téléchargés à partir de liens tels que celui-ci où AF-A0A6J8EXE6-F1
est la première partie des notes de référence et est suivi de la plage résiduelle du domaine.
Les bases de données pré-embarquées disponibles sont :
Nom | Description | Nombre de domaines | Temps de recherche (1 requête) | Temps de recherche (100 requêtes) |
---|---|---|---|---|
scope95 | Ensemble ASTRAL de domaines SCOPe 2.08 regroupés à 95 % d'ID séq | 35 371 | 1,35 s | 2,81 s |
scope40 | Ensemble ASTRAL de domaines SCOPe 2.08 regroupés à 40 % d'ID séq | 15 127 | 1,32 s | 2,36 s |
cath40 | Domaines non redondants S40 du CATH 23/11/22 | 31 884 | 1,38 s | 2,79 s |
ecod70 | Domaines représentatifs F70 d'ECOD develop287 | 71 635 | 1,46 s | 3,82 s |
pdb100 | Toutes les chaînes protéiques PDB au 08/02/24 divisées en domaines avec Chainsaw | 1 177 152 | 2,90 s | 27,3 s |
af21org | Structures AlphaFold pour 21 organismes modèles divisés en domaines par CATH-Assign | 338 258 | 2,21 s | 11,0 s |
afted | Structures de base de données AlphaFold divisées en domaines par TED et regroupées à 50 % d'identité de séquence | 53 344 209 | 67,7 s | 73,1 s |
Le temps de recherche correspond à une protéine de 150 résidus (d1a6ja_ au format PDB) sur un processeur Intel i9-10980XE avec 256 Go de RAM et PyTorch 1.11. Les temps sont donnés pour 1 ou 100 requêtes. Notez afted
utilise une recherche FAISS exhaustive. Cela ne change pas les résultats trouvés, mais le score de similarité différera légèrement - voir l'article.
Pour calculer le score Progress entre deux domaines protéiques :
progres score struc_1.pdb struc_2.pdb
0.7265280485153198
-f
et -g
déterminent le format de fichier pour les première et deuxième structures comme ci-dessus ( guess
, pdb
, mmcif
, mmtf
ou coords
).L'ordre des domaines n'affecte pas le score. Un score de 0,8 ou plus indique le même pli.
Pour intégrer un ensemble de données de structures, permettant de le rechercher :
progres embed -l filepaths.txt -o searchdb.pt
-l
est un fichier texte contenant des informations sur une structure par ligne, chacune représentant une entrée dans la sortie. Un espace blanc doit séparer le chemin du fichier vers la structure et le nom de domaine, tout texte supplémentaire étant éventuellement traité comme une note pour la colonne des notes des résultats.-o
est le chemin du fichier de sortie du fichier PyTorch contenant un dictionnaire avec les intégrations et les données associées. Il peut être lu avec torch.load
.-f
détermine le format de fichier de chaque structure comme ci-dessus ( guess
, pdb
, mmcif
, mmtf
ou coords
).Encore une fois, les structures doivent correspondre à des domaines protéiques uniques. Les intégrations sont stockées sous Float16, ce qui n'a aucun effet notable sur les performances de recherche.
À titre d'exemple, vous pouvez exécuter la commande ci-dessus à partir du répertoire data
pour générer une base de données avec deux structures.
progres
peut également être utilisé en Python, lui permettant d'être intégré à d'autres méthodes :
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])
Les ensembles de données et les scripts pour l'analyse comparative (y compris pour d'autres méthodes), la génération d'index FAISS et la formation se trouvent dans le répertoire scripts
. Le modèle entraîné et les bases de données pré-embarquées sont disponibles sur Zenodo.
L'implémentation du GNN équivariant E(n) utilise EGNN PyTorch. Nous incluons également le code de SupContrast et Chainsaw.
Veuillez ouvrir des problèmes ou nous contacter pour tout commentaire. Les contributions via des pull request sont les bienvenues.