Этот репозиторий содержит метод из препринта:
Он предоставляет пакет Python progres
, который позволяет выполнять поиск структур в предварительно встроенных структурных базах данных, оценивать пары структур и предварительно встраивать наборы данных для поиска. Поиск обычно занимает 1–2 секунды и выполняется намного быстрее для нескольких запросов. Для базы данных AlphaFold первоначальная загрузка данных занимает около минуты, но последующий поиск занимает десятую долю секунды на каждый запрос.
В настоящее время для поиска доступны SCOPe, CATH, ECOD, вся PDB, структуры AlphaFold для 21 модельного организма и домены TED базы данных AlphaFold. Поиск осуществляется по домену, но 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 вы можете вызвать сценарий bin/progres
с помощью Python, если у вас нет доступа к исполняемому файлу.
Запустите progres -h
, чтобы просмотреть текст справки, и progres {mode} -h
чтобы просмотреть текст справки для каждого режима. Режимы описаны ниже, но есть и другие варианты, описанные в тексте справки. Например, флаг -d
устанавливает устройство, на котором будет работать; по умолчанию это cpu
, так как он часто является самым быстрым для поиска, но cuda
, вероятно, будет быстрее при разделении доменов с помощью Chainsaw, поиске большого количества запросов или встраивании набора данных. Попробуйте оба, если производительность важна.
Чтобы выполнить поиск файла PDB query.pdb
(который можно найти в каталоге data
) по доменам в базе данных SCOPe и распечатать выходные данные:
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
— это текстовый файл с одним путем к файлу запроса в каждой строке, и каждый результат будет распечатан по очереди. Это значительно быстрее для нескольких запросов, поскольку настройка происходит только один раз и можно использовать несколько рабочих процессов. Учитывается только первая цепочка в каждом файле.-t
— это встроенная база данных для поиска. В настоящее время это должна быть либо одна из баз данных, перечисленных ниже, либо путь к файлу предварительно встроенного набора данных, созданного с помощью progres embed
.-f
определяет формат файла структуры запроса ( guess
, pdb
, mmcif
, mmtf
или coords
). По умолчанию это предполагается по расширению файла, при этом pdb
выбирается, если предположение невозможно. coords
относится к текстовому файлу, в котором координаты атома Cα разделены пробелами в каждой строке.-s
— это показатель прогресса (0 -> 1), выше которого возвращаются попадания, по умолчанию 0,8. Как обсуждалось в статье, 0,8 указывает на ту же кратность.-m
— максимальное количество возвращаемых совпадений, по умолчанию 100.-c
указывает на разделение структуры запроса на домены с помощью Chainsaw и поиск в каждом домене отдельно. Если с помощью Chainsaw не найдены домены, результаты не будут возвращены. Учитывается только первая цепочка в каждом файле. Запуск бензопилы может занять несколько секунд. Другие инструменты для разделения структур запросов на домены включают Merizo и SWORD2. Вы также можете вырезать домены вручную с помощью программного обеспечения, такого как команда pdb_selres
из pdb-tools.
Интерпретация описаний попаданий зависит от базы данных, в которой выполняется поиск. Доменное имя часто включает ссылку на соответствующий файл PDB, например, d1a6ja_ относится к цепочке A с идентификатором PDB 1A6J, и его можно открыть в представлении структуры PDB RCSB для быстрого просмотра. Для доменов TED базы данных AlphaFold файлы можно загрузить по таким ссылкам, как эта, где AF-A0A6J8EXE6-F1
— это первая часть заметок о попаданиях, за которой следует диапазон остатков домена.
Доступны следующие встроенные базы данных:
Имя | Описание | Количество доменов | Время поиска (1 запрос) | Время поиска (100 запросов) |
---|---|---|---|---|
scope95 | Набор ASTRAL доменов SCOPe 2.08, кластеризованных с 95% идентификатором последовательности | 35 371 | 1,35 с | 2,81 с |
scope40 | Набор ASTRAL доменов SCOPe 2.08, кластеризованных с 40% seq ID | 15 127 | 1,32 с | 2,36 с |
cath40 | Неизбыточные домены S40 от CATH 23.11.22 | 31 884 | 1,38 с | 2,79 с |
ecod70 | Репрезентативные домены F70 от ECOD development287 | 71 635 | 1,46 с | 3,82 с |
pdb100 | Все белковые цепи PDB по состоянию на 08.02.24 расщеплены на домены с помощью Chainsaw | 1 177 152 | 2,90 с | 27,3 с |
af21org | Структуры AlphaFold для 21 модельного организма разделены на домены с помощью CATH-Assign | 338 258 | 2,21 с | 11,0 с |
afted | Структуры базы данных AlphaFold разделены на домены с помощью TED и кластеризованы с 50% идентичностью последовательностей. | 53 344 209 | 67,7 с | 73,1 с |
Время поиска указано для белка из 150 остатков (d1a6ja_ в формате PDB) на процессоре Intel i9-10980XE с 256 ГБ ОЗУ и PyTorch 1.11. Время указано для 1 или 100 запросов. Обратите внимание, что afted
использует исчерпывающий поиск FAISS. Это не меняет найденные совпадения, но показатель сходства будет отличаться на небольшую величину — см. статью.
Чтобы рассчитать оценку Progres между двумя белковыми доменами:
progres score struc_1.pdb struc_2.pdb
0.7265280485153198
-f
и -g
определяют формат файла для первой и второй структур, как указано выше ( guess
, pdb
, mmcif
, mmtf
или coords
).Порядок доменов не влияет на оценку. Оценка 0,8 или выше указывает на ту же кратность.
Чтобы внедрить набор данных структур, позволяющий осуществлять поиск по нему:
progres embed -l filepaths.txt -o searchdb.pt
-l
— текстовый файл с информацией об одной структуре в каждой строке, каждая из которых будет представлять собой одну запись в выводе. Путь к структуре файла и имя домена должны быть разделены пробелами, при этом любой дополнительный текст (при необходимости) может рассматриваться как примечание для столбца примечаний результатов.-o
— это путь к выходному файлу PyTorch, содержащему словарь с внедрениями и связанными данными. Его можно прочитать с помощью torch.load
.-f
определяет формат файла каждой структуры, как указано выше ( guess
, pdb
, mmcif
, mmtf
или coords
).Опять же, структуры должны соответствовать отдельным белковым доменам. Вложения сохраняются как Float16, что не оказывает заметного влияния на производительность поиска.
Например, вы можете запустить приведенную выше команду из каталога data
, чтобы создать базу данных с двумя структурами.
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.
Пожалуйста, откройте вопросы или свяжитесь с нами, чтобы оставить отзыв. Вклад через запросы на включение приветствуются.