Este repositório contém o método da pré-impressão:
Ele fornece o pacote progres
Python que permite pesquisar estruturas em bancos de dados estruturais pré-incorporados, pontuar pares de estruturas e conjuntos de dados pré-incorporados para pesquisa. A pesquisa normalmente leva de 1 a 2 segundos e é muito mais rápida para consultas múltiplas. Para o banco de dados AlphaFold, o carregamento inicial dos dados leva cerca de um minuto, mas a pesquisa subsequente leva um décimo de segundo por consulta.
Atualmente SCOPe, CATH, ECOD, todo o PDB, as estruturas AlphaFold para 21 organismos modelo e os domínios TED do banco de dados AlphaFold são fornecidos para pesquisa. A pesquisa é feita por domínio, mas o Chainsaw pode ser usado para dividir automaticamente as estruturas de consulta em domínios.
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
, que também instalará Biopython, mmtf-python, einops e pydantic se ainda não estiverem presentes.PROGRES_DATA_DIR
para alterar onde esses dados são armazenados, por exemplo, se você não puder gravar no diretório do pacote. Lembre-se de mantê-lo definido na próxima vez que executar o Progres. Como alternativa, um arquivo Docker está disponível no diretório docker
.
Em sistemas Unix, os progres
executáveis serão adicionados ao caminho durante a instalação. No Windows você pode chamar o script bin/progres
com python se não conseguir acessar o executável.
Execute progres -h
para ver o texto de ajuda e progres {mode} -h
para ver o texto de ajuda de cada modo. Os modos são descritos abaixo, mas existem outras opções descritas no texto de ajuda. Por exemplo, o sinalizador -d
define o dispositivo para execução; esta é cpu
por padrão, pois geralmente é mais rápida para pesquisa, mas cuda
provavelmente será mais rápida ao dividir domínios com o Chainsaw, pesquisar muitas consultas ou incorporar um conjunto de dados. Experimente ambos se o desempenho for importante.
Para pesquisar um arquivo PDB query.pdb
(que pode ser encontrado no diretório data
) em domínios no banco de dados SCOPe e imprimir a saída:
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
é o caminho para o arquivo de estrutura de consulta. Alternativamente, -l
é um arquivo de texto com um caminho de arquivo de consulta por linha e cada resultado será impresso por vez. Isto é consideravelmente mais rápido para múltiplas consultas, uma vez que a configuração ocorre apenas uma vez e vários trabalhadores podem ser usados. Apenas a primeira cadeia de cada arquivo é considerada.-t
é o banco de dados pré-incorporado para pesquisa. Atualmente, este deve ser um dos bancos de dados listados abaixo ou o caminho do arquivo para um conjunto de dados pré-incorporado gerado com progres embed
.-f
determina o formato do arquivo da estrutura da consulta ( guess
, pdb
, mmcif
, mmtf
ou coords
). Por padrão, isso é adivinhado a partir da extensão do arquivo, com pdb
escolhido se uma estimativa não puder ser feita. coords
refere-se a um arquivo de texto com as coordenadas de um átomo Cα separadas por um espaço em branco em cada linha.-s
é a pontuação do Progres (0 -> 1) acima da qual retornar acertos, padrão 0,8. Conforme discutido no artigo, 0,8 indica a mesma dobra.-m
é o número máximo de ocorrências a serem retornadas, o padrão é 100.-c
indica dividir a(s) estrutura(s) de consulta em domínios com Chainsaw e pesquisar cada domínio separadamente. Se nenhum domínio for encontrado com o Chainsaw, nenhum resultado será retornado. Apenas a primeira cadeia de cada arquivo é considerada. A execução da motosserra pode levar alguns segundos. Outras ferramentas para dividir estruturas de consulta em domínios incluem Merizo e SWORD2. Você também pode dividir domínios manualmente usando software como o comando pdb_selres
do pdb-tools.
A interpretação das descrições dos resultados depende da base de dados que está a ser pesquisada. O nome de domínio geralmente inclui uma referência ao arquivo PDB correspondente, por exemplo, d1a6ja_ refere-se ao ID do PDB 1A6J cadeia A, e isso pode ser aberto na visualização da estrutura do PDB RCSB para obter uma visão rápida. Para os domínios TED do banco de dados AlphaFold, os arquivos podem ser baixados de links como este, onde AF-A0A6J8EXE6-F1
é a primeira parte das notas de acerto e é seguido pelo intervalo de resíduos do domínio.
Os bancos de dados pré-incorporados disponíveis são:
Nome | Descrição | Número de domínios | Tempo de pesquisa (1 consulta) | Tempo de pesquisa (100 consultas) |
---|---|---|---|---|
scope95 | Conjunto ASTRAL de domínios SCOPe 2.08 agrupados em 95% de ID seq | 35.371 | 1,35s | 2,81s |
scope40 | Conjunto ASTRAL de domínios SCOPe 2.08 agrupados em 40% de ID seq | 15.127 | 1,32s | 2,36s |
cath40 | Domínios não redundantes S40 do CATH 23/11/22 | 31.884 | 1,38s | 2,79s |
ecod70 | Domínios representativos F70 do ECOD development287 | 71.635 | 1,46s | 3,82s |
pdb100 | Todas as cadeias de proteínas PDB em 08/02/24 divididas em domínios com Chainsaw | 1.177.152 | 2,90s | 27,3 segundos |
af21org | Estruturas AlphaFold para 21 organismos modelo divididos em domínios por CATH-Assign | 338.258 | 2,21s | 11,0s |
afted | Estruturas de banco de dados AlphaFold divididas em domínios pelo TED e agrupadas com 50% de identidade de sequência | 53.344.209 | 67,7s | 73,1 segundos |
O tempo de pesquisa é para uma proteína de 150 resíduos (d1a6ja_ no formato PDB) em uma CPU Intel i9-10980XE com 256 GB de RAM e PyTorch 1.11. Os tempos são fornecidos para 1 ou 100 consultas. Observe que afted
usa pesquisa FAISS exaustiva. Isso não altera os acertos encontrados, mas a pontuação de similaridade será um pouco diferente - consulte o artigo.
Para calcular a pontuação Progres entre dois domínios de proteínas:
progres score struc_1.pdb struc_2.pdb
0.7265280485153198
-f
e -g
determinam o formato do arquivo para a primeira e segunda estruturas como acima ( guess
, pdb
, mmcif
, mmtf
ou coords
).A ordem dos domínios não afeta a pontuação. Uma pontuação de 0,8 ou superior indica a mesma dobra.
Para incorporar um conjunto de dados de estruturas, permitindo que ele seja pesquisado:
progres embed -l filepaths.txt -o searchdb.pt
-l
é um arquivo de texto com informações sobre uma estrutura por linha, cada uma das quais será uma entrada na saída. O espaço em branco deve separar o caminho do arquivo para a estrutura e o nome do domínio, com opcionalmente qualquer texto adicional sendo tratado como uma nota para a coluna de notas dos resultados.-o
é o caminho do arquivo de saída para o arquivo PyTorch que contém um dicionário com os embeddings e dados associados. Ele pode ser lido com torch.load
.-f
determina o formato de arquivo de cada estrutura acima ( guess
, pdb
, mmcif
, mmtf
ou coords
).Novamente, as estruturas devem corresponder a domínios proteicos únicos. Os embeddings são armazenados como Float16, o que não tem efeito perceptível no desempenho da pesquisa.
Por exemplo, você pode executar o comando acima no diretório data
para gerar um banco de dados com duas estruturas.
progres
também pode ser usado em Python, permitindo que seja integrado a outros métodos:
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])
Conjuntos de dados e scripts para benchmarking (inclusive para outros métodos), geração de índice FAISS e treinamento estão no diretório scripts
. O modelo treinado e os bancos de dados pré-incorporados estão disponíveis no Zenodo.
A implementação do GNN E(n)-equivariante usa EGNN PyTorch. Também incluímos código de SupContrast e Chainsaw.
Abra problemas ou entre em contato com qualquer feedback. Contribuições por meio de solicitações pull são bem-vindas.