Research
Security News
Malicious npm Package Targets Solana Developers and Hijacks Funds
A malicious npm package targets Solana developers, rerouting funds in 2% of transactions to a hardcoded address.
This repository contains the method from the pre-print:
It provides the progres
Python package that lets you search structures against pre-embedded structural databases, score pairs of structures and pre-embed datasets for searching against.
Searching typically takes 1-2 s and is much faster for multiple queries.
For the AlphaFold database, initial data loading takes around a minute but subsequent searching takes a tenth of a second per query.
Currently SCOPe, CATH, ECOD, the whole PDB, the AlphaFold structures for 21 model organisms and the AlphaFold database TED domains are provided for searching against. Searching is done by domain but Chainsaw can be used to automatically split query structures into domains.
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
, which will also install Biopython, mmtf-python, einops and pydantic if they are not already present.PROGRES_DATA_DIR
to change where this data is stored, for example if you cannot write to the package directory. Remember to keep it set the next time you run Progres.Alternatively, a Docker file is available in the docker
directory.
On Unix systems the executable progres
will be added to the path during installation.
On Windows you can call the bin/progres
script with python if you can't access the executable.
Run progres -h
to see the help text and progres {mode} -h
to see the help text for each mode.
The modes are described below but there are other options outlined in the help text.
For example the -d
flag sets the device to run on; this is cpu
by default since this is often fastest for searching, but cuda
will likely be faster when splitting domains with Chainsaw, searching many queries or embedding a dataset.
Try both if performance is important.
To search a PDB file query.pdb
(which can be found in the data
directory) against domains in the SCOPe database and print output:
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
is the path to the query structure file. Alternatively, -l
is a text file with one query file path per line and each result will be printed in turn. This is considerably faster for multiple queries since setup only occurs once and multiple workers can be used. Only the first chain in each file is considered.-t
is the pre-embedded database to search against. Currently this must be either one of the databases listed below or the file path to a pre-embedded dataset generated with progres embed
.-f
determines the file format of the query structure (guess
, pdb
, mmcif
, mmtf
or coords
). By default this is guessed from the file extension, with pdb
chosen if a guess can't be made. coords
refers to a text file with the coordinates of a Cα atom separated by white space on each line.-s
is the Progres score (0 -> 1) above which to return hits, default 0.8. As discussed in the paper, 0.8 indicates the same fold.-m
is the maximum number of hits to return, default 100.-c
indicates to split the query structure(s) into domains with Chainsaw and search with each domain separately. If no domains are found with Chainsaw, no results will be returned. Only the first chain in each file is considered. Running Chainsaw may take a few seconds.Other tools for splitting query structures into domains include Merizo and SWORD2.
You can also slice out domains manually using software such as the pdb_selres
command from pdb-tools.
Interpreting the hit descriptions depends on the database being searched.
The domain name often includes a reference to the corresponding PDB file, for example d1a6ja_ refers to PDB ID 1A6J chain A, and this can be opened in the RCSB PDB structure view to get a quick look.
For the AlphaFold database TED domains, files can be downloaded from links such as this where AF-A0A6J8EXE6-F1
is the first part of the hit notes and is followed by the residue range of the domain.
The available pre-embedded databases are:
Name | Description | Number of domains | Search time (1 query) | Search time (100 queries) |
---|---|---|---|---|
scope95 | ASTRAL set of SCOPe 2.08 domains clustered at 95% seq ID | 35,371 | 1.35 s | 2.81 s |
scope40 | ASTRAL set of SCOPe 2.08 domains clustered at 40% seq ID | 15,127 | 1.32 s | 2.36 s |
cath40 | S40 non-redundant domains from CATH 23/11/22 | 31,884 | 1.38 s | 2.79 s |
ecod70 | F70 representative domains from ECOD develop287 | 71,635 | 1.46 s | 3.82 s |
pdb100 | All PDB protein chains as of 02/08/24 split into domains with Chainsaw | 1,177,152 | 2.90 s | 27.3 s |
af21org | AlphaFold structures for 21 model organisms split into domains by CATH-Assign | 338,258 | 2.21 s | 11.0 s |
afted | AlphaFold database structures split into domains by TED and clustered at 50% sequence identity | 53,344,209 | 67.7 s | 73.1 s |
Search time is for a 150 residue protein (d1a6ja_ in PDB format) on an Intel i9-10980XE CPU with 256 GB RAM and PyTorch 1.11.
Times are given for 1 or 100 queries.
Note that afted
uses exhaustive FAISS searching.
This doesn't change the hits that are found, but the similarity score will differ by a small amount - see the paper.
To calculate the Progres score between two protein domains:
progres score struc_1.pdb struc_2.pdb
0.7265280485153198
-f
and -g
determine the file format for the first and second structures as above (guess
, pdb
, mmcif
, mmtf
or coords
).The order of the domains does not affect the score. A score of 0.8 or higher indicates the same fold.
To embed a dataset of structures, allowing it to be searched against:
progres embed -l filepaths.txt -o searchdb.pt
-l
is a text file with information on one structure per line, each of which will be one entry in the output. White space should separate the file path to the structure and the domain name, with optionally any additional text being treated as a note for the notes column of the results.-o
is the output file path for the PyTorch file containing a dictionary with the embeddings and associated data. It can be read in with torch.load
.-f
determines the file format of each structure as above (guess
, pdb
, mmcif
, mmtf
or coords
).Again, the structures should correspond to single protein domains. The embeddings are stored as Float16, which has no noticeable effect on search performance.
As an example, you can run the above command from the data
directory to generate a database with two structures.
progres
can also be used in Python, allowing it to be integrated into other methods:
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])
Datasets and scripts for benchmarking (including for other methods), FAISS index generation and training are in the scripts
directory.
The trained model and pre-embedded databases are available on Zenodo.
The implementation of the E(n)-equivariant GNN uses EGNN PyTorch. We also include code from SupContrast and Chainsaw.
Please open issues or get in touch with any feedback. Contributions via pull requests are welcome.
FAQs
Fast protein structure searching using structure graph embeddings
We found that progres demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
A malicious npm package targets Solana developers, rerouting funds in 2% of transactions to a hardcoded address.
Security News
Research
Socket researchers have discovered malicious npm packages targeting crypto developers, stealing credentials and wallet data using spyware delivered through typosquats of popular cryptographic libraries.
Security News
Socket's package search now displays weekly downloads for npm packages, helping developers quickly assess popularity and make more informed decisions.