Add correlation tab
#5
by
jfaustin
- opened
- .gitignore +4 -2
- Dockerfile +16 -22
- Makefile +1 -1
- app.py +0 -213
- folding_studio_demo/__init__.py +12 -0
- folding_studio_demo/app.py +218 -0
- folding_studio_demo/correlate.py +110 -0
- folding_studio_demo/model_fasta_validators.py +367 -0
- molecule.py β folding_studio_demo/molecule.py +7 -9
- folding_studio_demo/predict.py +279 -0
- folding_studio_demo/protein.py +0 -0
- pyproject.toml +16 -1
- spr_af_scores_mapped.csv +16 -0
- uv.lock +0 -0
.gitignore
CHANGED
@@ -1,3 +1,5 @@
|
|
1 |
.envrc
|
2 |
-
|
3 |
-
|
|
|
|
|
|
1 |
.envrc
|
2 |
+
**/__pycache__/
|
3 |
+
output/
|
4 |
+
sequences/
|
5 |
+
boltz_results/
|
Dockerfile
CHANGED
@@ -8,7 +8,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
8 |
wget build-essential git && \
|
9 |
rm -rf /var/lib/apt/lists/*
|
10 |
|
11 |
-
COPY --from=uv-fetcher /uv /uvx /
|
12 |
|
13 |
ENV VIRTUAL_ENV=/modules/.venv
|
14 |
RUN uv venv "$VIRTUAL_ENV" && . "$VIRTUAL_ENV/bin/activate"
|
@@ -17,34 +17,28 @@ ENV PATH="$VIRTUAL_ENV/bin:$PATH"
|
|
17 |
# Set the working directory to the user's home directory
|
18 |
WORKDIR /app
|
19 |
|
20 |
-
|
|
|
|
|
|
|
|
|
|
|
21 |
|
22 |
-
|
|
|
23 |
|
24 |
-
|
25 |
-
|
|
|
|
|
26 |
|
27 |
-
COPY app.py /app/app.py
|
28 |
-
COPY molecule.py /app/molecule.py
|
29 |
# COPY pred.cif /app/boltz_results/pred_model_0.cif
|
30 |
# COPY plddt_0.npz /app/boltz_results/plddt_0.npz
|
|
|
31 |
|
32 |
EXPOSE 7860
|
33 |
ENV GRADIO_SERVER_NAME="0.0.0.0"
|
34 |
-
ARG FOLDING_PROJECT_CODE
|
35 |
ENV FOLDING_PROJECT_CODE=$FOLDING_PROJECT_CODE
|
36 |
|
37 |
-
|
38 |
-
RUN mkdir -p /app/output/html
|
39 |
-
|
40 |
-
# Create volume for HTML output
|
41 |
-
VOLUME ["/app/output/html"]
|
42 |
-
|
43 |
-
# Create a non-root user and set permissions
|
44 |
-
RUN useradd -m -u 1000 appuser && \
|
45 |
-
chown -R appuser:appuser /app
|
46 |
-
|
47 |
-
# Switch to non-root user
|
48 |
-
USER appuser
|
49 |
-
|
50 |
-
CMD ["python3", "app.py"]
|
|
|
8 |
wget build-essential git && \
|
9 |
rm -rf /var/lib/apt/lists/*
|
10 |
|
11 |
+
COPY --from=uv-fetcher /uv /uvx /bin/
|
12 |
|
13 |
ENV VIRTUAL_ENV=/modules/.venv
|
14 |
RUN uv venv "$VIRTUAL_ENV" && . "$VIRTUAL_ENV/bin/activate"
|
|
|
17 |
# Set the working directory to the user's home directory
|
18 |
WORKDIR /app
|
19 |
|
20 |
+
# Create a non-root user and set permissions
|
21 |
+
RUN useradd -m -u 1000 appuser && \
|
22 |
+
chown -R appuser:appuser /app
|
23 |
+
|
24 |
+
# Switch to non-root user
|
25 |
+
USER appuser
|
26 |
|
27 |
+
COPY pyproject.toml uv.lock README.md ./
|
28 |
+
COPY folding-studio ./folding-studio
|
29 |
|
30 |
+
RUN uv sync --locked --no-install-project --no-dev
|
31 |
+
|
32 |
+
COPY folding_studio_demo ./folding_studio_demo
|
33 |
+
RUN uv sync --locked --no-dev
|
34 |
|
|
|
|
|
35 |
# COPY pred.cif /app/boltz_results/pred_model_0.cif
|
36 |
# COPY plddt_0.npz /app/boltz_results/plddt_0.npz
|
37 |
+
COPY spr_af_scores_mapped.csv /app/spr_af_scores_mapped.csv
|
38 |
|
39 |
EXPOSE 7860
|
40 |
ENV GRADIO_SERVER_NAME="0.0.0.0"
|
41 |
+
ARG FOLDING_PROJECT_CODE="folding_dev"
|
42 |
ENV FOLDING_PROJECT_CODE=$FOLDING_PROJECT_CODE
|
43 |
|
44 |
+
CMD ["uv", "run", "folding-studio-demo"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Makefile
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
# Variables
|
2 |
-
DOCKER_IMAGE_NAME = folding-studio
|
3 |
DOCKER_IMAGE_TAG = latest
|
4 |
PORT = 7860
|
5 |
OUTPUT_DIR = ./output
|
|
|
1 |
# Variables
|
2 |
+
DOCKER_IMAGE_NAME = folding-studio-demo
|
3 |
DOCKER_IMAGE_TAG = latest
|
4 |
PORT = 7860
|
5 |
OUTPUT_DIR = ./output
|
app.py
DELETED
@@ -1,213 +0,0 @@
|
|
1 |
-
from Bio.PDB import MMCIFParser, PDBIO
|
2 |
-
from folding_studio.client import Client
|
3 |
-
from folding_studio.query.boltz import BoltzQuery, BoltzParameters
|
4 |
-
from pathlib import Path
|
5 |
-
import gradio as gr
|
6 |
-
import hashlib
|
7 |
-
import logging
|
8 |
-
import numpy as np
|
9 |
-
import os
|
10 |
-
import plotly.graph_objects as go
|
11 |
-
|
12 |
-
from molecule import molecule
|
13 |
-
|
14 |
-
# Configure logging
|
15 |
-
logging.basicConfig(
|
16 |
-
level=logging.INFO,
|
17 |
-
format='%(asctime)s - %(levelname)s - %(message)s',
|
18 |
-
handlers=[
|
19 |
-
logging.StreamHandler(),
|
20 |
-
]
|
21 |
-
)
|
22 |
-
logger = logging.getLogger(__name__)
|
23 |
-
|
24 |
-
|
25 |
-
def convert_cif_to_pdb(cif_path: str, pdb_path: str) -> None:
|
26 |
-
"""Convert a .cif file to .pdb format using Biopython.
|
27 |
-
|
28 |
-
Args:
|
29 |
-
cif_path (str): Path to input .cif file
|
30 |
-
pdb_path (str): Path to output .pdb file
|
31 |
-
"""
|
32 |
-
# Parse the CIF file
|
33 |
-
parser = MMCIFParser()
|
34 |
-
structure = parser.get_structure("structure", cif_path)
|
35 |
-
|
36 |
-
# Save as PDB
|
37 |
-
io = PDBIO()
|
38 |
-
io.set_structure(structure)
|
39 |
-
io.save(pdb_path)
|
40 |
-
|
41 |
-
def call_boltz(seq_file: Path | str, api_key: str, output_dir: Path) -> None:
|
42 |
-
"""Call Boltz prediction."""
|
43 |
-
# Initialize parameters with CLI-provided values
|
44 |
-
parameters = {
|
45 |
-
"recycling_steps": 3,
|
46 |
-
"sampling_steps": 200,
|
47 |
-
"diffusion_samples": 1,
|
48 |
-
"step_scale": 1.638,
|
49 |
-
"msa_pairing_strategy": "greedy",
|
50 |
-
"write_full_pae": False,
|
51 |
-
"write_full_pde": False,
|
52 |
-
"use_msa_server": True,
|
53 |
-
"seed": 0,
|
54 |
-
"custom_msa_paths": None,
|
55 |
-
}
|
56 |
-
|
57 |
-
# Create a client using API key
|
58 |
-
logger.info("Authenticating client with API key")
|
59 |
-
client = Client.from_api_key(api_key=api_key)
|
60 |
-
|
61 |
-
# Define query
|
62 |
-
seq_file = Path(seq_file)
|
63 |
-
query = BoltzQuery.from_file(seq_file, query_name="gradio", parameters=BoltzParameters(**parameters))
|
64 |
-
query.save_parameters(output_dir)
|
65 |
-
|
66 |
-
logger.info("Payload: %s", query.payload)
|
67 |
-
|
68 |
-
# Send a request
|
69 |
-
logger.info("Sending request to Folding Studio API")
|
70 |
-
response = client.send_request(query, project_code=os.environ["FOLDING_PROJECT_CODE"])
|
71 |
-
|
72 |
-
# Access confidence data
|
73 |
-
logger.info("Confidence data: %s", response.confidence_data)
|
74 |
-
|
75 |
-
response.download_results(output_dir=output_dir, force=True, unzip=True)
|
76 |
-
logger.info("Results downloaded to %s", output_dir)
|
77 |
-
|
78 |
-
|
79 |
-
def predict(sequence: str, api_key: str) -> str:
|
80 |
-
"""Predict protein structure from amino acid sequence using Boltz model.
|
81 |
-
|
82 |
-
Args:
|
83 |
-
sequence (str): Amino acid sequence to predict structure for
|
84 |
-
api_key (str): Folding API key
|
85 |
-
|
86 |
-
Returns:
|
87 |
-
str: HTML iframe containing 3D molecular visualization
|
88 |
-
"""
|
89 |
-
|
90 |
-
# Set up unique output directory based on sequence hash
|
91 |
-
seq_id = hashlib.sha1(sequence.encode()).hexdigest()
|
92 |
-
seq_file = Path(f"sequence_{seq_id}.fasta")
|
93 |
-
_write_fasta_file(seq_file, sequence)
|
94 |
-
output_dir = Path(f"sequence_{seq_id}")
|
95 |
-
output_dir.mkdir(parents=True, exist_ok=True)
|
96 |
-
|
97 |
-
# Check if prediction already exists
|
98 |
-
pred_cif = list(output_dir.rglob("*_model_0.cif"))
|
99 |
-
if not pred_cif:
|
100 |
-
# Run Boltz prediction
|
101 |
-
logger.info(f"Predicting {seq_file.stem}")
|
102 |
-
call_boltz(seq_file=seq_file, api_key=api_key, output_dir=output_dir)
|
103 |
-
logger.info("Prediction done. Output directory: %s", output_dir)
|
104 |
-
else:
|
105 |
-
logger.info("Prediction already exists. Output directory: %s", output_dir)
|
106 |
-
|
107 |
-
# output_dir = Path("boltz_results") # debug
|
108 |
-
# Convert output CIF to PDB
|
109 |
-
pred_cif = list(output_dir.rglob("*_model_0.cif"))[0]
|
110 |
-
logger.info("Output file: %s", pred_cif)
|
111 |
-
|
112 |
-
converted_pdb_path = str(output_dir / "pred.pdb")
|
113 |
-
convert_cif_to_pdb(str(pred_cif), str(converted_pdb_path))
|
114 |
-
logger.info("Converted PDB file: %s", converted_pdb_path)
|
115 |
-
|
116 |
-
|
117 |
-
# Generate molecular visualization
|
118 |
-
mol = _create_molecule_visualization(
|
119 |
-
converted_pdb_path,
|
120 |
-
sequence,
|
121 |
-
)
|
122 |
-
|
123 |
-
plddt_file = list(pred_cif.parent.glob("plddt_*.npz"))[0]
|
124 |
-
logger.info("plddt file: %s", plddt_file)
|
125 |
-
plddt_vals = np.load(plddt_file)["plddt"]
|
126 |
-
|
127 |
-
return _wrap_in_iframe(mol), add_plddt_plot(plddt_vals=plddt_vals)
|
128 |
-
|
129 |
-
|
130 |
-
def _write_fasta_file(filepath: Path, sequence: str) -> None:
|
131 |
-
"""Write sequence to FASTA file."""
|
132 |
-
with open(filepath, "w") as f:
|
133 |
-
f.write(f">A|protein\n{sequence}")
|
134 |
-
|
135 |
-
|
136 |
-
def _create_molecule_visualization(pdb_path: Path, sequence: str) -> str:
|
137 |
-
"""Create molecular visualization using molecule module."""
|
138 |
-
return molecule(
|
139 |
-
str(pdb_path),
|
140 |
-
lenSeqs=1,
|
141 |
-
num_res=len(sequence),
|
142 |
-
selectedResidues=list(range(1, len(sequence) + 1)),
|
143 |
-
allSeqs=[sequence],
|
144 |
-
sequences=[{
|
145 |
-
"Score": 0,
|
146 |
-
"RMSD": 0,
|
147 |
-
"Recovery": 0,
|
148 |
-
"Mean pLDDT": 0,
|
149 |
-
"seq": sequence
|
150 |
-
}],
|
151 |
-
)
|
152 |
-
|
153 |
-
|
154 |
-
def _wrap_in_iframe(content: str) -> str:
|
155 |
-
"""Wrap content in an HTML iframe with appropriate styling and permissions."""
|
156 |
-
return f"""<iframe
|
157 |
-
name="result"
|
158 |
-
style="width: 100%; height: 100vh;"
|
159 |
-
allow="midi; geolocation; microphone; camera; display-capture; encrypted-media;"
|
160 |
-
sandbox="allow-modals allow-forms allow-scripts allow-same-origin allow-popups allow-top-navigation-by-user-activation allow-downloads"
|
161 |
-
allowfullscreen=""
|
162 |
-
allowpaymentrequest=""
|
163 |
-
frameborder="0"
|
164 |
-
srcdoc='{content}'
|
165 |
-
></iframe>"""
|
166 |
-
|
167 |
-
def add_plddt_plot(plddt_vals: list[float]) -> str:
|
168 |
-
"""Create a plot of metrics."""
|
169 |
-
visible = True
|
170 |
-
plddt_trace = go.Scatter(
|
171 |
-
x=np.arange(len(plddt_vals)),
|
172 |
-
y=plddt_vals,
|
173 |
-
hovertemplate="<i>pLDDT</i>: %{y:.2f} <br><i>Residue index:</i> %{x}<br>",
|
174 |
-
name="seq",
|
175 |
-
visible=visible,
|
176 |
-
)
|
177 |
-
|
178 |
-
plddt_fig = go.Figure(data=[plddt_trace])
|
179 |
-
plddt_fig.update_layout(
|
180 |
-
title="pLDDT",
|
181 |
-
xaxis_title="Residue index",
|
182 |
-
yaxis_title="pLDDT",
|
183 |
-
height=500,
|
184 |
-
template="simple_white",
|
185 |
-
legend=dict(yanchor="bottom", y=0.01, xanchor="left", x=0.99),
|
186 |
-
)
|
187 |
-
return plddt_fig
|
188 |
-
|
189 |
-
demo = gr.Blocks(title="Folding Studio: structure prediction with Boltz-1")
|
190 |
-
|
191 |
-
with demo:
|
192 |
-
gr.Markdown("# Input")
|
193 |
-
with gr.Row():
|
194 |
-
with gr.Column():
|
195 |
-
sequence = gr.Textbox(label="Sequence", value="")
|
196 |
-
api_key = gr.Textbox(label="Folding API Key", type="password")
|
197 |
-
gr.Markdown("# Output")
|
198 |
-
with gr.Row():
|
199 |
-
predict_btn = gr.Button("Predict")
|
200 |
-
with gr.Row():
|
201 |
-
with gr.Column():
|
202 |
-
mol_output = gr.HTML()
|
203 |
-
with gr.Column():
|
204 |
-
metrics_plot = gr.Plot(label="pLDDT")
|
205 |
-
|
206 |
-
predict_btn.click(
|
207 |
-
fn=predict,
|
208 |
-
inputs=[sequence, api_key],
|
209 |
-
outputs=[mol_output, metrics_plot]
|
210 |
-
)
|
211 |
-
|
212 |
-
demo.launch()
|
213 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
folding_studio_demo/__init__.py
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Folding Studio Demo."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
|
5 |
+
# Configure logging
|
6 |
+
logging.basicConfig(
|
7 |
+
level=logging.INFO,
|
8 |
+
format="%(asctime)s - %(levelname)s - %(message)s",
|
9 |
+
handlers=[
|
10 |
+
logging.StreamHandler(),
|
11 |
+
],
|
12 |
+
)
|
folding_studio_demo/app.py
ADDED
@@ -0,0 +1,218 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Folding Studio Demo App."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
|
5 |
+
import gradio as gr
|
6 |
+
from folding_studio_data_models import FoldingModel
|
7 |
+
from gradio_molecule3d import Molecule3D
|
8 |
+
import pandas as pd
|
9 |
+
|
10 |
+
from folding_studio_demo.predict import predict
|
11 |
+
from folding_studio_demo.correlate import fake_predict_and_correlate, SCORE_COLUMNS, select_correlation_plot
|
12 |
+
|
13 |
+
logger = logging.getLogger(__name__)
|
14 |
+
|
15 |
+
|
16 |
+
MOLECULE_REPS = [
|
17 |
+
{
|
18 |
+
"model": 0,
|
19 |
+
"chain": "",
|
20 |
+
"resname": "",
|
21 |
+
"style": "cartoon",
|
22 |
+
"color": "alphafold",
|
23 |
+
# "residue_range": "",
|
24 |
+
"around": 0,
|
25 |
+
"byres": False,
|
26 |
+
# "visible": False,
|
27 |
+
# "opacity": 0.5
|
28 |
+
}
|
29 |
+
]
|
30 |
+
|
31 |
+
DEFAULT_PROTEIN_SEQ = ">protein description\nMALWMRLLPLLALLALWGPDPAAA"
|
32 |
+
|
33 |
+
MODEL_CHOICES = [
|
34 |
+
# ("AlphaFold2", FoldingModel.AF2),
|
35 |
+
# ("OpenFold", FoldingModel.OPENFOLD),
|
36 |
+
# ("SoloSeq", FoldingModel.SOLOSEQ),
|
37 |
+
("Boltz-1", FoldingModel.BOLTZ),
|
38 |
+
("Chai-1", FoldingModel.CHAI),
|
39 |
+
("Protenix", FoldingModel.PROTENIX),
|
40 |
+
]
|
41 |
+
|
42 |
+
|
43 |
+
def sequence_input() -> gr.Textbox:
|
44 |
+
"""Sequence input component.
|
45 |
+
|
46 |
+
Returns:
|
47 |
+
gr.Textbox: Sequence input component
|
48 |
+
"""
|
49 |
+
sequence = gr.Textbox(
|
50 |
+
label="Protein Sequence",
|
51 |
+
value=DEFAULT_PROTEIN_SEQ,
|
52 |
+
lines=2,
|
53 |
+
placeholder="Enter a protein sequence or upload a FASTA file",
|
54 |
+
)
|
55 |
+
file_input = gr.File(
|
56 |
+
label="Upload a FASTA file",
|
57 |
+
file_types=[".fasta", ".fa"],
|
58 |
+
)
|
59 |
+
|
60 |
+
def _process_file(file: gr.File | None) -> gr.Textbox:
|
61 |
+
if file is None:
|
62 |
+
return gr.Textbox()
|
63 |
+
try:
|
64 |
+
with open(file.name, "r") as f:
|
65 |
+
content = f.read().strip()
|
66 |
+
return gr.Textbox(value=content)
|
67 |
+
except Exception as e:
|
68 |
+
logger.error(f"Error reading file: {e}")
|
69 |
+
return gr.Textbox()
|
70 |
+
|
71 |
+
file_input.change(fn=_process_file, inputs=[file_input], outputs=[sequence])
|
72 |
+
return sequence
|
73 |
+
|
74 |
+
|
75 |
+
def simple_prediction(api_key: str) -> None:
|
76 |
+
"""Simple prediction tab.
|
77 |
+
|
78 |
+
Args:
|
79 |
+
api_key (str): Folding Studio API key
|
80 |
+
"""
|
81 |
+
gr.Markdown(
|
82 |
+
"""
|
83 |
+
### Predict a Protein Structure
|
84 |
+
|
85 |
+
It will be run in the background and the results will be displayed in the output section.
|
86 |
+
The output will contain the protein structure and the pLDDT plot.
|
87 |
+
|
88 |
+
Select a model to run the inference with and enter a protein sequence or upload a FASTA file.
|
89 |
+
"""
|
90 |
+
)
|
91 |
+
with gr.Row():
|
92 |
+
dropdown = gr.Dropdown(
|
93 |
+
label="Model",
|
94 |
+
choices=MODEL_CHOICES,
|
95 |
+
scale=0,
|
96 |
+
value=FoldingModel.BOLTZ,
|
97 |
+
)
|
98 |
+
with gr.Column():
|
99 |
+
sequence = sequence_input()
|
100 |
+
|
101 |
+
predict_btn = gr.Button("Predict")
|
102 |
+
|
103 |
+
with gr.Row():
|
104 |
+
mol_output = Molecule3D(label="Protein Structure", reps=MOLECULE_REPS)
|
105 |
+
metrics_plot = gr.Plot(label="pLDDT")
|
106 |
+
|
107 |
+
predict_btn.click(
|
108 |
+
fn=predict,
|
109 |
+
inputs=[sequence, api_key, dropdown],
|
110 |
+
outputs=[mol_output, metrics_plot],
|
111 |
+
)
|
112 |
+
|
113 |
+
|
114 |
+
def model_comparison(api_key: str) -> None:
|
115 |
+
"""Model comparison tab.
|
116 |
+
|
117 |
+
Args:
|
118 |
+
api_key (str): Folding Studio API key
|
119 |
+
"""
|
120 |
+
|
121 |
+
with gr.Row():
|
122 |
+
model = gr.Dropdown(
|
123 |
+
label="Model",
|
124 |
+
choices=MODEL_CHOICES,
|
125 |
+
multiselect=True,
|
126 |
+
scale=0,
|
127 |
+
min_width=300,
|
128 |
+
value=[FoldingModel.BOLTZ, FoldingModel.CHAI, FoldingModel.PROTENIX],
|
129 |
+
)
|
130 |
+
with gr.Column():
|
131 |
+
sequence = sequence_input()
|
132 |
+
|
133 |
+
predict_btn = gr.Button("Compare Models")
|
134 |
+
|
135 |
+
with gr.Row():
|
136 |
+
mol_output = Molecule3D(label="Protein Structure", reps=MOLECULE_REPS)
|
137 |
+
metrics_plot = gr.Plot(label="pLDDT")
|
138 |
+
|
139 |
+
predict_btn.click(
|
140 |
+
fn=predict,
|
141 |
+
inputs=[sequence, api_key, model],
|
142 |
+
outputs=[mol_output, metrics_plot],
|
143 |
+
)
|
144 |
+
|
145 |
+
|
146 |
+
def create_correlation_tab():
|
147 |
+
gr.Markdown("# Correlation with experimental binding affinity data")
|
148 |
+
spr_data_with_scores = pd.read_csv("spr_af_scores_mapped.csv")
|
149 |
+
prettified_columns = {
|
150 |
+
"antibody_name": "Antibody Name",
|
151 |
+
"KD (nM)": "KD (nM)",
|
152 |
+
"antibody_vh_sequence": "Antibody VH Sequence",
|
153 |
+
"antibody_vl_sequence": "Antibody VL Sequence",
|
154 |
+
"antigen_sequence": "Antigen Sequence"
|
155 |
+
}
|
156 |
+
spr_data_with_scores = spr_data_with_scores.rename(columns=prettified_columns)
|
157 |
+
with gr.Row():
|
158 |
+
columns = [
|
159 |
+
"Antibody Name",
|
160 |
+
"KD (nM)",
|
161 |
+
"Antibody VH Sequence",
|
162 |
+
"Antibody VL Sequence",
|
163 |
+
"Antigen Sequence"
|
164 |
+
]
|
165 |
+
# Display dataframe with floating point values rounded to 2 decimal places
|
166 |
+
spr_data = gr.DataFrame(value=spr_data_with_scores[columns].round(2), label="Experimental Antibody-Antigen Binding Affinity Data")
|
167 |
+
|
168 |
+
gr.Markdown("# Prediction and correlation")
|
169 |
+
with gr.Row():
|
170 |
+
fake_predict_btn = gr.Button("Predict structures of all complexes")
|
171 |
+
with gr.Row():
|
172 |
+
prediction_dataframe = gr.Dataframe(label="Predicted Structures Data")
|
173 |
+
with gr.Row():
|
174 |
+
correlation_ranking_plot = gr.Plot(label="Correlation ranking")
|
175 |
+
with gr.Row():
|
176 |
+
# User can select the columns to display in the correlation plot
|
177 |
+
correlation_column = gr.Dropdown(label="Score data to display", choices=SCORE_COLUMNS, multiselect=False)
|
178 |
+
correlation_plot = gr.Plot(label="Correlation with binding affinity")
|
179 |
+
|
180 |
+
fake_predict_btn.click(
|
181 |
+
fn=lambda x: fake_predict_and_correlate(spr_data_with_scores, SCORE_COLUMNS, ["Antibody Name", "KD (nM)"]),
|
182 |
+
inputs=None,
|
183 |
+
outputs=[prediction_dataframe, correlation_ranking_plot]
|
184 |
+
)
|
185 |
+
|
186 |
+
# Call function to update the correlation plot when the user selects the columns
|
187 |
+
correlation_column.change(
|
188 |
+
fn=lambda score: select_correlation_plot(spr_data_with_scores, score),
|
189 |
+
inputs=correlation_column,
|
190 |
+
outputs=correlation_plot
|
191 |
+
)
|
192 |
+
|
193 |
+
def __main__():
|
194 |
+
with gr.Blocks(title="Folding Studio Demo") as demo:
|
195 |
+
gr.Markdown(
|
196 |
+
"""
|
197 |
+
# Folding Studio: Harness the Power of Protein Folding π§¬
|
198 |
+
|
199 |
+
Folding Studio is a platform for protein structure prediction.
|
200 |
+
It uses the latest AI-powered folding models to predict the structure of a protein.
|
201 |
+
|
202 |
+
Available models are : AlphaFold2, OpenFold, SoloSeq, Boltz-1, Chai and Protenix.
|
203 |
+
|
204 |
+
## API Key
|
205 |
+
To use the Folding Studio API, you need to provide an API key.
|
206 |
+
You can get your API key by asking to the Folding Studio team.
|
207 |
+
"""
|
208 |
+
)
|
209 |
+
api_key = gr.Textbox(label="Folding Studio API Key", type="password")
|
210 |
+
gr.Markdown("## Demo Usage")
|
211 |
+
with gr.Tab("π Simple Prediction"):
|
212 |
+
simple_prediction(api_key)
|
213 |
+
with gr.Tab("π Model Comparison"):
|
214 |
+
model_comparison(api_key)
|
215 |
+
with gr.Tab("π Correlations"):
|
216 |
+
create_correlation_tab()
|
217 |
+
|
218 |
+
demo.launch()
|
folding_studio_demo/correlate.py
ADDED
@@ -0,0 +1,110 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import logging
|
2 |
+
import pandas as pd
|
3 |
+
import numpy as np
|
4 |
+
import plotly.graph_objects as go
|
5 |
+
from scipy.stats import spearmanr
|
6 |
+
|
7 |
+
logger = logging.getLogger(__name__)
|
8 |
+
|
9 |
+
SCORE_COLUMNS = [
|
10 |
+
"confidence_score_boltz",
|
11 |
+
"ptm_boltz",
|
12 |
+
"iptm_boltz",
|
13 |
+
"complex_plddt_boltz",
|
14 |
+
"complex_iplddt_boltz",
|
15 |
+
"complex_pde_boltz",
|
16 |
+
"complex_ipde_boltz",
|
17 |
+
"interchain_pae_monomer",
|
18 |
+
"interface_pae_monomer",
|
19 |
+
"overall_pae_monomer",
|
20 |
+
"interface_plddt_monomer",
|
21 |
+
"average_plddt_monomer",
|
22 |
+
"ptm_monomer",
|
23 |
+
"interface_ptm_monomer",
|
24 |
+
"interchain_pae_multimer",
|
25 |
+
"interface_pae_multimer",
|
26 |
+
"overall_pae_multimer",
|
27 |
+
"interface_plddt_multimer",
|
28 |
+
"average_plddt_multimer",
|
29 |
+
"ptm_multimer",
|
30 |
+
"interface_ptm_multimer"
|
31 |
+
]
|
32 |
+
|
33 |
+
def fake_predict_and_correlate(spr_data_with_scores: pd.DataFrame, score_cols: list[str], main_cols: list[str]) -> tuple[pd.DataFrame, go.Figure]:
|
34 |
+
"""Fake predict structures of all complexes and correlate the results."""
|
35 |
+
corr_data = []
|
36 |
+
spr_data_with_scores["log_kd"] = np.log10(spr_data_with_scores["KD (nM)"])
|
37 |
+
kd_col = "KD (nM)"
|
38 |
+
for score_col in score_cols:
|
39 |
+
logger.info(f"Computing correlation between {score_col} and KD (nM)")
|
40 |
+
res = spearmanr(spr_data_with_scores[kd_col], spr_data_with_scores[score_col])
|
41 |
+
corr_data.append({"score": score_col, "correlation": res.statistic, "p-value": res.pvalue})
|
42 |
+
logger.info(f"Correlation between {score_col} and KD (nM): {res.statistic}")
|
43 |
+
|
44 |
+
corr_data = pd.DataFrame(corr_data)
|
45 |
+
# Find the lines in corr_data with NaN values and remove them
|
46 |
+
corr_data = corr_data[corr_data["correlation"].notna()]
|
47 |
+
# Sort correlation data by correlation value
|
48 |
+
corr_data = corr_data.sort_values('correlation', ascending=True)
|
49 |
+
|
50 |
+
# Create bar plot of correlations
|
51 |
+
corr_ranking_plot = go.Figure(data=[
|
52 |
+
go.Bar(
|
53 |
+
x=corr_data["correlation"],
|
54 |
+
y=corr_data["score"],
|
55 |
+
name="correlation",
|
56 |
+
orientation='h',
|
57 |
+
hovertemplate="<i>Score:</i> %{y}<br><i>Correlation:</i> %{x:.3f}<br>"
|
58 |
+
)
|
59 |
+
])
|
60 |
+
corr_ranking_plot.update_layout(
|
61 |
+
title="Correlation with Binding Affinity",
|
62 |
+
yaxis_title="Score Type",
|
63 |
+
xaxis_title="Spearman Correlation",
|
64 |
+
template="simple_white",
|
65 |
+
showlegend=False
|
66 |
+
)
|
67 |
+
|
68 |
+
cols_to_show = main_cols[:]
|
69 |
+
cols_to_show.extend(score_cols)
|
70 |
+
|
71 |
+
return spr_data_with_scores[cols_to_show].round(2), corr_ranking_plot
|
72 |
+
|
73 |
+
def select_correlation_plot(spr_data_with_scores: pd.DataFrame, score: str) -> go.Figure:
|
74 |
+
"""Select the correlation plot to display."""
|
75 |
+
# corr_plot is a scatter plot of the correlation between the binding affinity and each of the scores
|
76 |
+
scatter = go.Scatter(
|
77 |
+
x=spr_data_with_scores["KD (nM)"],
|
78 |
+
y=spr_data_with_scores[score],
|
79 |
+
name=f"KD (nM) vs {score}",
|
80 |
+
mode='markers', # Only show markers/dots, no lines
|
81 |
+
hovertemplate="<i>Score:</i> %{y}<br><i>KD:</i> %{x:.2f}<br>",
|
82 |
+
marker=dict(color='#1f77b4') # Set color to match default first color
|
83 |
+
)
|
84 |
+
corr_plot = go.Figure(data=scatter)
|
85 |
+
corr_plot.update_layout(
|
86 |
+
xaxis_title="KD (nM)",
|
87 |
+
yaxis_title=score,
|
88 |
+
template="simple_white",
|
89 |
+
legend=dict(
|
90 |
+
orientation="h",
|
91 |
+
yanchor="bottom",
|
92 |
+
y=1.02,
|
93 |
+
xanchor="right",
|
94 |
+
x=1
|
95 |
+
)
|
96 |
+
# xaxis_type="log" # Set x-axis to logarithmic scale
|
97 |
+
)
|
98 |
+
# compute the correlation line
|
99 |
+
corr_line = np.polyfit(spr_data_with_scores["KD (nM)"], spr_data_with_scores[score], 1)
|
100 |
+
corr_line_x = np.linspace(min(spr_data_with_scores["KD (nM)"]), max(spr_data_with_scores["KD (nM)"]), 100)
|
101 |
+
corr_line_y = corr_line[0] * corr_line_x + corr_line[1]
|
102 |
+
# add the correlation line to the plot
|
103 |
+
corr_plot.add_trace(go.Scatter(
|
104 |
+
x=corr_line_x,
|
105 |
+
y=corr_line_y,
|
106 |
+
mode='lines',
|
107 |
+
name=f"Correlation",
|
108 |
+
line=dict(color='#1f77b4') # Set same color as scatter points
|
109 |
+
))
|
110 |
+
return corr_plot
|
folding_studio_demo/model_fasta_validators.py
ADDED
@@ -0,0 +1,367 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Utils for validating the FASTA files for the AF3 like models."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
import re
|
5 |
+
import shutil
|
6 |
+
from abc import abstractmethod
|
7 |
+
from collections import defaultdict
|
8 |
+
from enum import Enum
|
9 |
+
from pathlib import Path
|
10 |
+
|
11 |
+
from Bio import SeqIO
|
12 |
+
|
13 |
+
|
14 |
+
class EntityType(str, Enum):
|
15 |
+
"""Enum for the entity type of a given sequence."""
|
16 |
+
|
17 |
+
DNA = "dna"
|
18 |
+
RNA = "rna"
|
19 |
+
PROTEIN = "protein"
|
20 |
+
PEPTIDE = "peptide"
|
21 |
+
ION = "ion"
|
22 |
+
LIGAND = "ligand"
|
23 |
+
SMILES = "smiles"
|
24 |
+
CCD = "ccd"
|
25 |
+
|
26 |
+
|
27 |
+
def get_entity_type(sequence: str) -> EntityType:
|
28 |
+
"""Get the entity type of a given sequence.
|
29 |
+
|
30 |
+
The entity type is determined based on the sequence composition.
|
31 |
+
|
32 |
+
Args:
|
33 |
+
sequence (str): The input sequence.
|
34 |
+
|
35 |
+
Returns:
|
36 |
+
EntityType: The entity type of the input sequence.
|
37 |
+
"""
|
38 |
+
DNA_SEQUENCE_SET = set("ACGT")
|
39 |
+
RNA_SEQUENCE_SET = set("ACGU")
|
40 |
+
PROTEIN_SEQUENCE_SET = set("ACDEFGHIKLMNPQRSTVWY")
|
41 |
+
|
42 |
+
# Detect IONS (e.g., Mg2+, Na+, Cl-)
|
43 |
+
if re.fullmatch(r"[A-Za-z]{1,2}[\d\+\-]*", sequence):
|
44 |
+
return EntityType.ION
|
45 |
+
|
46 |
+
# Detect DNA
|
47 |
+
if set(sequence.upper()).issubset(DNA_SEQUENCE_SET):
|
48 |
+
return EntityType.DNA
|
49 |
+
|
50 |
+
# Detect RNA
|
51 |
+
elif set(sequence.upper()).issubset(RNA_SEQUENCE_SET):
|
52 |
+
return EntityType.RNA
|
53 |
+
|
54 |
+
# Detect PROTEIN
|
55 |
+
elif set(sequence.upper()).issubset(PROTEIN_SEQUENCE_SET):
|
56 |
+
return EntityType.PROTEIN
|
57 |
+
|
58 |
+
# Default to LIGAND
|
59 |
+
return EntityType.LIGAND
|
60 |
+
|
61 |
+
|
62 |
+
def has_multiple_chains(header: str) -> bool:
|
63 |
+
"""Check if a given header contains multiple chains in RCSB format.
|
64 |
+
|
65 |
+
A header with multiple chains will have the following in the header:
|
66 |
+
```
|
67 |
+
Chains A, B, C, ...
|
68 |
+
```
|
69 |
+
where `A`, `B`, `C`, ... are the chain identifiers.
|
70 |
+
|
71 |
+
|
72 |
+
Args:
|
73 |
+
header (str): The input header string containing chain information.
|
74 |
+
|
75 |
+
Returns:
|
76 |
+
bool: True if the header contains multiple chains, False otherwise.
|
77 |
+
"""
|
78 |
+
match = re.search(r"chains?\s+([A-Za-z, ]+)", header, re.I)
|
79 |
+
return len(match.group(1).replace(" ", "").split(",")) > 1 if match else False
|
80 |
+
|
81 |
+
|
82 |
+
class BaseFastaValidator:
|
83 |
+
"""Base class for validating FASTA files."""
|
84 |
+
|
85 |
+
@abstractmethod
|
86 |
+
def is_valid_fasta(self, fasta_path: Path) -> tuple[bool, str | None]:
|
87 |
+
"""Validate whether a given FASTA file follows the required format.
|
88 |
+
|
89 |
+
Args:
|
90 |
+
fasta_path (Path): Path to the FASTA file.
|
91 |
+
|
92 |
+
Returns:
|
93 |
+
tuple[bool, str | None]: Tuple containing a boolean indicating if the format is correct and an error message if not
|
94 |
+
"""
|
95 |
+
raise NotImplementedError("Subclasses must implement this method")
|
96 |
+
|
97 |
+
@abstractmethod
|
98 |
+
def transform_fasta(self, fasta_path: Path) -> str:
|
99 |
+
"""Transform a FASTA file into the required format.
|
100 |
+
|
101 |
+
Args:
|
102 |
+
fasta_path (Path): Path to the FASTA file.
|
103 |
+
|
104 |
+
Returns:
|
105 |
+
Transformed FASTA content in the required format.
|
106 |
+
"""
|
107 |
+
raise NotImplementedError("Subclasses must implement this method")
|
108 |
+
|
109 |
+
def process_directory(self, input_dir: str, output_dir: str) -> None:
|
110 |
+
"""Process all FASTA files in the input directory, validate or transform them, and save them to the output directory.
|
111 |
+
|
112 |
+
Args:
|
113 |
+
input_dir (str): Path to the directory containing FASTA files.
|
114 |
+
output_dir (str): Path to the output directory where processed files will be saved.
|
115 |
+
"""
|
116 |
+
|
117 |
+
output_path = Path(output_dir)
|
118 |
+
output_path.mkdir(parents=True, exist_ok=True)
|
119 |
+
|
120 |
+
for fasta_file in Path(input_dir).glob("*.fasta"):
|
121 |
+
output_file = output_path / fasta_file.name
|
122 |
+
if has_multiple_chains(fasta_file.read_text()):
|
123 |
+
logging.warning(
|
124 |
+
f"Skipping {fasta_file} because it contains multiple chains in a single sequence.\n"
|
125 |
+
"Please split multiple chains into separate sequences using the following format:\n"
|
126 |
+
">Chain A\n"
|
127 |
+
"MTEIVLKFL...\n"
|
128 |
+
">Chain B\n"
|
129 |
+
"MTEIVLKFL...\n\n"
|
130 |
+
"Instead of:\n"
|
131 |
+
">Chains A, B\n"
|
132 |
+
"MTEIVLKFL..."
|
133 |
+
)
|
134 |
+
continue
|
135 |
+
if self.is_valid_fasta(fasta_file):
|
136 |
+
shutil.copy(fasta_file, output_file)
|
137 |
+
else:
|
138 |
+
transformed_content = self.transform_fasta(fasta_file)
|
139 |
+
output_file.write_text(transformed_content)
|
140 |
+
|
141 |
+
|
142 |
+
class BoltzFastaValidator(BaseFastaValidator):
|
143 |
+
"""Validate whether a given FASTA file follows the required format for Boltz."""
|
144 |
+
|
145 |
+
SUPPORTED_ENTITY_TYPES = {
|
146 |
+
EntityType.PROTEIN,
|
147 |
+
EntityType.RNA,
|
148 |
+
EntityType.DNA,
|
149 |
+
EntityType.SMILES,
|
150 |
+
EntityType.CCD,
|
151 |
+
}
|
152 |
+
|
153 |
+
def is_valid_fasta(self, fasta_path: Path) -> tuple[bool, str | None]:
|
154 |
+
"""Validate whether a given FASTA file follows the required format.
|
155 |
+
|
156 |
+
The expected FASTA header format is:
|
157 |
+
```
|
158 |
+
>CHAIN_ID|ENTITY_TYPE
|
159 |
+
```
|
160 |
+
where `ENTITY_TYPE` must be one of: "protein", "rna", "dna", "smiles" or "ccd".
|
161 |
+
|
162 |
+
Args:
|
163 |
+
fasta_path (Path): Path to the FASTA file.
|
164 |
+
|
165 |
+
Returns:
|
166 |
+
tuple[bool, str | None]: Tuple containing a boolean indicating if the format is correct and an error message if not
|
167 |
+
"""
|
168 |
+
with fasta_path.open("r") as f:
|
169 |
+
for record in SeqIO.parse(f, "fasta"):
|
170 |
+
header_parts = record.id.split("|")
|
171 |
+
if not (1 < len(header_parts) <= 3):
|
172 |
+
msg = "BOLTZ Validation Error: Invalid header format. Expected '>CHAIN_ID|ENTITY_TYPE'"
|
173 |
+
return False, msg
|
174 |
+
if header_parts[1].lower() not in self.SUPPORTED_ENTITY_TYPES:
|
175 |
+
return (
|
176 |
+
False,
|
177 |
+
f"BOLTZ Validation Error: Invalid entity type '{header_parts[1]}'. Supported types: {', '.join(self.SUPPORTED_ENTITY_TYPES)}",
|
178 |
+
)
|
179 |
+
return True, None
|
180 |
+
|
181 |
+
def transform_fasta(self, fasta_path: Path) -> str:
|
182 |
+
"""Transform a FASTA file into the '>CHAIN_ID|ENTITY_TYPE|MSA_ID' format.
|
183 |
+
|
184 |
+
This function extracts chain identifiers from the FASTA header and determines
|
185 |
+
the entity type (DNA, RNA, or PROTEIN) based on the sequence composition.
|
186 |
+
|
187 |
+
Args:
|
188 |
+
fasta_path (Path): Path to the FASTA file.
|
189 |
+
|
190 |
+
Returns:
|
191 |
+
Transformed FASTA content in the required format.
|
192 |
+
"""
|
193 |
+
transformed_lines = []
|
194 |
+
|
195 |
+
with fasta_path.open("r") as f:
|
196 |
+
for record_index, record in enumerate(SeqIO.parse(f, "fasta")):
|
197 |
+
chain = chr(ord("A") + record_index)
|
198 |
+
# extract entity type
|
199 |
+
entity_type = get_entity_type(str(record.seq))
|
200 |
+
transformed_lines.append(f">{chain.upper()}|{entity_type.value}")
|
201 |
+
# append sequence
|
202 |
+
transformed_lines.append(str(record.seq))
|
203 |
+
|
204 |
+
return "\n".join(transformed_lines)
|
205 |
+
|
206 |
+
|
207 |
+
class ChaiFastaValidator(BaseFastaValidator):
|
208 |
+
"""Validate whether a given FASTA file follows the required format for Chai."""
|
209 |
+
|
210 |
+
SUPPORTED_ENTITY_TYPES = EntityType.__members__.values()
|
211 |
+
|
212 |
+
def is_valid_fasta(self, fasta_path: Path) -> tuple[bool, str | None]:
|
213 |
+
"""Validate whether a given FASTA file follows the required format.
|
214 |
+
|
215 |
+
The expected FASTA header format is:
|
216 |
+
```
|
217 |
+
>ENTITY_TYPE|name=NAME
|
218 |
+
```
|
219 |
+
Args:
|
220 |
+
fasta_path (Path): Path to the FASTA file.
|
221 |
+
|
222 |
+
Returns:
|
223 |
+
tuple[bool, str | None]: Tuple containing a boolean indicating if the format is correct and an error message if not
|
224 |
+
"""
|
225 |
+
|
226 |
+
seen_names = set()
|
227 |
+
with fasta_path.open("r") as f:
|
228 |
+
for record in SeqIO.parse(f, "fasta"):
|
229 |
+
# validate header format
|
230 |
+
match = re.match(r"^([A-Za-z]+)\|name=([\w\-]+)$", record.description)
|
231 |
+
if not match:
|
232 |
+
return (
|
233 |
+
False,
|
234 |
+
"CHAI Validation Error: Invalid header format. Expected '>ENTITY_TYPE|name=NAME'",
|
235 |
+
)
|
236 |
+
# validate entity type
|
237 |
+
entity_type, name = match.groups()
|
238 |
+
if entity_type not in self.SUPPORTED_ENTITY_TYPES or not name:
|
239 |
+
return (
|
240 |
+
False,
|
241 |
+
f"CHAI Validation Error: Invalid entity type '{entity_type}'. Supported types: {', '.join(self.SUPPORTED_ENTITY_TYPES)}",
|
242 |
+
)
|
243 |
+
# check uniqueness of name
|
244 |
+
if name in seen_names:
|
245 |
+
return (
|
246 |
+
False,
|
247 |
+
f"CHAI Validation Error: Duplicate name '{name}'. Each sequence must have a unique name",
|
248 |
+
)
|
249 |
+
seen_names.add(name)
|
250 |
+
# validate sequence format
|
251 |
+
sequence = str(record.seq).strip()
|
252 |
+
if (
|
253 |
+
entity_type in {EntityType.PEPTIDE, EntityType.PROTEIN}
|
254 |
+
and not get_entity_type(sequence) == entity_type
|
255 |
+
):
|
256 |
+
return (
|
257 |
+
False,
|
258 |
+
f"CHAI Validation Error: Sequence type mismatch. Expected '{entity_type}' but found '{get_entity_type(sequence)}'",
|
259 |
+
)
|
260 |
+
|
261 |
+
return True, None
|
262 |
+
|
263 |
+
def transform_fasta(self, fasta_path: Path) -> str:
|
264 |
+
"""Transform a FASTA file into the '>TYPE|name=NAME' format by ensuring each main header
|
265 |
+
is unique (adding a number if necessary).
|
266 |
+
|
267 |
+
The expected output format is:
|
268 |
+
'>protein|name=NAME'
|
269 |
+
'SEQUENCE'
|
270 |
+
|
271 |
+
Args:
|
272 |
+
fasta_path (Path): Path to the FASTA file.
|
273 |
+
|
274 |
+
Returns:
|
275 |
+
Transformed FASTA content in the required Chai format.
|
276 |
+
"""
|
277 |
+
transformed_lines = []
|
278 |
+
header_map = {}
|
279 |
+
|
280 |
+
with fasta_path.open("r") as f:
|
281 |
+
for record in SeqIO.parse(f, "fasta"):
|
282 |
+
main_header = record.description.split("|")[0].strip()
|
283 |
+
|
284 |
+
if main_header not in header_map:
|
285 |
+
header_map[main_header] = 1
|
286 |
+
updated_header = main_header
|
287 |
+
|
288 |
+
else:
|
289 |
+
header_map[main_header] += 1
|
290 |
+
updated_header = main_header + "_" + str(header_map[main_header])
|
291 |
+
|
292 |
+
entity_type = get_entity_type(str(record.seq))
|
293 |
+
header = f">{entity_type.value}|name={updated_header}"
|
294 |
+
|
295 |
+
transformed_lines.append(header)
|
296 |
+
transformed_lines.append(str(record.seq))
|
297 |
+
|
298 |
+
return "\n".join(transformed_lines)
|
299 |
+
|
300 |
+
|
301 |
+
class ProtenixFastaValidator(BaseFastaValidator):
|
302 |
+
"""Validate whether a given FASTA file follows the required format for Protenix."""
|
303 |
+
|
304 |
+
def is_valid_fasta(self, fasta_path: Path) -> tuple[bool, str | None]:
|
305 |
+
"""Validate whether a given FASTA file follows the required format.
|
306 |
+
|
307 |
+
The expected FASTA header format is:
|
308 |
+
```
|
309 |
+
> UNIQUE ID[|...]
|
310 |
+
```
|
311 |
+
|
312 |
+
Args:
|
313 |
+
fasta_path (Path): Path to the FASTA file.
|
314 |
+
|
315 |
+
Returns:
|
316 |
+
tuple[bool, str | None]: Tuple containing a boolean indicating if the format is correct and an error message if not
|
317 |
+
"""
|
318 |
+
seen_headers = set()
|
319 |
+
|
320 |
+
with fasta_path.open("r") as f:
|
321 |
+
for record in SeqIO.parse(f, "fasta"):
|
322 |
+
main_header = record.description.split("|")[0].strip()
|
323 |
+
if main_header in seen_headers:
|
324 |
+
return (
|
325 |
+
False,
|
326 |
+
f"PROTENIX Validation Error: Duplicate header '{main_header}'. Each sequence must have a unique header",
|
327 |
+
)
|
328 |
+
seen_headers.add(main_header)
|
329 |
+
|
330 |
+
return True, None
|
331 |
+
|
332 |
+
def transform_fasta(self, fasta_path: Path) -> str:
|
333 |
+
"""Transform a FASTA file into the '>NAME|Chain X' format by ensuring each main header
|
334 |
+
is unique (adding a number if necessary).
|
335 |
+
|
336 |
+
The expected output format is:
|
337 |
+
'>protein_1 | Chain A'
|
338 |
+
'SEQUENCE'
|
339 |
+
'>protein_2 | Chain B'
|
340 |
+
'SEQUENCE'
|
341 |
+
|
342 |
+
Args:
|
343 |
+
fasta_path (Path): Path to the FASTA file.
|
344 |
+
|
345 |
+
Returns:
|
346 |
+
Transformed FASTA content in the required Protenix format.
|
347 |
+
"""
|
348 |
+
transformed_lines = []
|
349 |
+
header_count = defaultdict(int)
|
350 |
+
|
351 |
+
with fasta_path.open("r") as f:
|
352 |
+
for record in SeqIO.parse(f, "fasta"):
|
353 |
+
header_parts = [part.strip() for part in record.description.split("|")]
|
354 |
+
main_header = header_parts[0]
|
355 |
+
|
356 |
+
# Ensure unique headers
|
357 |
+
header_count[main_header] += 1
|
358 |
+
updated_main_header = (
|
359 |
+
f"{main_header}_{header_count[main_header]}"
|
360 |
+
if header_count[main_header] > 1
|
361 |
+
else main_header
|
362 |
+
)
|
363 |
+
|
364 |
+
transformed_lines.append(f">{updated_main_header}")
|
365 |
+
transformed_lines.append(str(record.seq))
|
366 |
+
|
367 |
+
return "\n".join(transformed_lines)
|
molecule.py β folding_studio_demo/molecule.py
RENAMED
@@ -1,15 +1,16 @@
|
|
1 |
-
import logging
|
2 |
|
3 |
# Configure logging
|
4 |
logging.basicConfig(
|
5 |
level=logging.INFO,
|
6 |
-
format=
|
7 |
handlers=[
|
8 |
logging.StreamHandler(),
|
9 |
-
]
|
10 |
)
|
11 |
logger = logging.getLogger(__name__)
|
12 |
|
|
|
13 |
def read_mol(molpath):
|
14 |
with open(molpath, "r") as fp:
|
15 |
lines = fp.readlines()
|
@@ -19,10 +20,7 @@ def read_mol(molpath):
|
|
19 |
return mol
|
20 |
|
21 |
|
22 |
-
def molecule(
|
23 |
-
input_pdb, lenSeqs, num_res, selectedResidues, allSeqs, sequences
|
24 |
-
):
|
25 |
-
|
26 |
options = ""
|
27 |
pred_mol = "["
|
28 |
seqdata = "{"
|
@@ -265,5 +263,5 @@ def molecule(
|
|
265 |
</script>
|
266 |
</body></html>"""
|
267 |
)
|
268 |
-
|
269 |
-
return x
|
|
|
1 |
+
import logging
|
2 |
|
3 |
# Configure logging
|
4 |
logging.basicConfig(
|
5 |
level=logging.INFO,
|
6 |
+
format="%(asctime)s - %(levelname)s - %(message)s",
|
7 |
handlers=[
|
8 |
logging.StreamHandler(),
|
9 |
+
],
|
10 |
)
|
11 |
logger = logging.getLogger(__name__)
|
12 |
|
13 |
+
|
14 |
def read_mol(molpath):
|
15 |
with open(molpath, "r") as fp:
|
16 |
lines = fp.readlines()
|
|
|
20 |
return mol
|
21 |
|
22 |
|
23 |
+
def molecule(input_pdb, lenSeqs, num_res, selectedResidues, allSeqs, sequences):
|
|
|
|
|
|
|
24 |
options = ""
|
25 |
pred_mol = "["
|
26 |
seqdata = "{"
|
|
|
263 |
</script>
|
264 |
</body></html>"""
|
265 |
)
|
266 |
+
|
267 |
+
return x
|
folding_studio_demo/predict.py
ADDED
@@ -0,0 +1,279 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Predict protein structure using Folding Studio."""
|
2 |
+
|
3 |
+
import hashlib
|
4 |
+
import logging
|
5 |
+
import os
|
6 |
+
from pathlib import Path
|
7 |
+
|
8 |
+
import gradio as gr
|
9 |
+
import numpy as np
|
10 |
+
import plotly.graph_objects as go
|
11 |
+
from Bio import SeqIO
|
12 |
+
from Bio.PDB import PDBIO, MMCIFParser
|
13 |
+
from folding_studio.client import Client
|
14 |
+
from folding_studio.query import Query
|
15 |
+
from folding_studio.query.boltz import BoltzQuery
|
16 |
+
from folding_studio.query.chai import ChaiQuery
|
17 |
+
from folding_studio.query.protenix import ProtenixQuery
|
18 |
+
from folding_studio_data_models import FoldingModel
|
19 |
+
|
20 |
+
from folding_studio_demo.model_fasta_validators import (
|
21 |
+
BaseFastaValidator,
|
22 |
+
BoltzFastaValidator,
|
23 |
+
ChaiFastaValidator,
|
24 |
+
ProtenixFastaValidator,
|
25 |
+
)
|
26 |
+
|
27 |
+
logger = logging.getLogger(__name__)
|
28 |
+
|
29 |
+
SEQUENCE_DIR = Path("sequences")
|
30 |
+
SEQUENCE_DIR.mkdir(parents=True, exist_ok=True)
|
31 |
+
|
32 |
+
OUTPUT_DIR = Path("output")
|
33 |
+
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
|
34 |
+
|
35 |
+
|
36 |
+
def convert_cif_to_pdb(cif_path: str, pdb_path: str) -> None:
|
37 |
+
"""Convert a .cif file to .pdb format using Biopython.
|
38 |
+
|
39 |
+
Args:
|
40 |
+
cif_path (str): Path to input .cif file
|
41 |
+
pdb_path (str): Path to output .pdb file
|
42 |
+
"""
|
43 |
+
# Parse the CIF file
|
44 |
+
parser = MMCIFParser()
|
45 |
+
structure = parser.get_structure("structure", cif_path)
|
46 |
+
|
47 |
+
# Save as PDB
|
48 |
+
io = PDBIO()
|
49 |
+
io.set_structure(structure)
|
50 |
+
io.save(pdb_path)
|
51 |
+
|
52 |
+
|
53 |
+
def add_plddt_plot(plddt_vals: list[float]) -> str:
|
54 |
+
"""Create a plot of metrics."""
|
55 |
+
visible = True
|
56 |
+
plddt_trace = go.Scatter(
|
57 |
+
x=np.arange(len(plddt_vals)),
|
58 |
+
y=plddt_vals,
|
59 |
+
hovertemplate="<i>pLDDT</i>: %{y:.2f} <br><i>Residue index:</i> %{x}<br>",
|
60 |
+
name="seq",
|
61 |
+
visible=visible,
|
62 |
+
)
|
63 |
+
|
64 |
+
plddt_fig = go.Figure(data=[plddt_trace])
|
65 |
+
plddt_fig.update_layout(
|
66 |
+
title="pLDDT",
|
67 |
+
xaxis_title="Residue index",
|
68 |
+
yaxis_title="pLDDT",
|
69 |
+
height=500,
|
70 |
+
template="simple_white",
|
71 |
+
legend=dict(yanchor="bottom", y=0.01, xanchor="left", x=0.99),
|
72 |
+
)
|
73 |
+
return plddt_fig
|
74 |
+
|
75 |
+
|
76 |
+
def _write_fasta_file(
|
77 |
+
sequence: str, directory: Path = SEQUENCE_DIR
|
78 |
+
) -> tuple[str, Path]:
|
79 |
+
"""Write sequence to FASTA file.
|
80 |
+
|
81 |
+
Args:
|
82 |
+
sequence (str): Sequence to write to FASTA file
|
83 |
+
directory (Path): Directory to write FASTA file to (default: SEQUENCE_DIR)
|
84 |
+
|
85 |
+
Returns:
|
86 |
+
tuple[str, Path]: Tuple containing the sequence ID and the path to the FASTA file
|
87 |
+
"""
|
88 |
+
seq_id = hashlib.sha1(sequence.encode()).hexdigest()
|
89 |
+
seq_file = directory / f"sequence_{seq_id}.fasta"
|
90 |
+
with open(seq_file, "w") as f:
|
91 |
+
f.write(sequence)
|
92 |
+
return seq_id, seq_file
|
93 |
+
|
94 |
+
|
95 |
+
class AF3Model:
|
96 |
+
def __init__(
|
97 |
+
self, api_key: str, model_name: str, query: Query, validator: BaseFastaValidator
|
98 |
+
):
|
99 |
+
self.api_key = api_key
|
100 |
+
self.model_name = model_name
|
101 |
+
self.query = query
|
102 |
+
self.validator = validator
|
103 |
+
|
104 |
+
def call(self, seq_file: Path | str, output_dir: Path) -> None:
|
105 |
+
"""Predict protein structure from amino acid sequence using AF3 model.
|
106 |
+
|
107 |
+
Args:
|
108 |
+
seq_file (Path | str): Path to FASTA file containing amino acid sequence
|
109 |
+
output_dir (Path): Path to output directory
|
110 |
+
"""
|
111 |
+
# Validate FASTA format before calling
|
112 |
+
is_valid, error_msg = self.check_file_description(seq_file)
|
113 |
+
if not is_valid:
|
114 |
+
logger.error(error_msg)
|
115 |
+
raise gr.Error(error_msg)
|
116 |
+
|
117 |
+
# Create a client using API key
|
118 |
+
logger.info("Authenticating client with API key")
|
119 |
+
client = Client.from_api_key(api_key=self.api_key)
|
120 |
+
|
121 |
+
# Define query
|
122 |
+
query: Query = self.query.from_file(path=seq_file, query_name="gradio")
|
123 |
+
query.save_parameters(output_dir)
|
124 |
+
|
125 |
+
logger.info("Payload: %s", query.payload)
|
126 |
+
|
127 |
+
# Send a request
|
128 |
+
logger.info(f"Sending {self.model_name} request to Folding Studio API")
|
129 |
+
response = client.send_request(
|
130 |
+
query, project_code=os.environ["FOLDING_PROJECT_CODE"]
|
131 |
+
)
|
132 |
+
|
133 |
+
# Access confidence data
|
134 |
+
logger.info("Confidence data: %s", response.confidence_data)
|
135 |
+
|
136 |
+
response.download_results(output_dir=output_dir, force=True, unzip=True)
|
137 |
+
logger.info("Results downloaded to %s", output_dir)
|
138 |
+
|
139 |
+
def format_fasta(self, sequence: str) -> str:
|
140 |
+
"""Format sequence to FASTA format."""
|
141 |
+
return f">{self.model_name}\n{sequence}"
|
142 |
+
|
143 |
+
def predictions(self, output_dir: Path) -> list[Path]:
|
144 |
+
"""Get the path to the prediction."""
|
145 |
+
raise NotImplementedError("Not implemented")
|
146 |
+
|
147 |
+
def has_prediction(self, output_dir: Path) -> bool:
|
148 |
+
"""Check if prediction exists in output directory."""
|
149 |
+
return any(self.predictions(output_dir))
|
150 |
+
|
151 |
+
def check_file_description(self, seq_file: Path | str) -> tuple[bool, str | None]:
|
152 |
+
"""Check if the file description is correct.
|
153 |
+
|
154 |
+
Args:
|
155 |
+
seq_file (Path | str): Path to FASTA file
|
156 |
+
|
157 |
+
Returns:
|
158 |
+
tuple[bool, str | None]: Tuple containing a boolean indicating if the format is correct and an error message if not
|
159 |
+
"""
|
160 |
+
input_rep = list(SeqIO.parse(seq_file, "fasta"))
|
161 |
+
if not input_rep:
|
162 |
+
error_msg = f"{self.model_name.upper()} Validation Error: No sequence found"
|
163 |
+
return False, error_msg
|
164 |
+
|
165 |
+
is_valid, error_msg = self.validator.is_valid_fasta(seq_file)
|
166 |
+
if not is_valid:
|
167 |
+
return False, error_msg
|
168 |
+
|
169 |
+
return True, None
|
170 |
+
|
171 |
+
|
172 |
+
class ChaiModel(AF3Model):
|
173 |
+
def __init__(self, api_key: str):
|
174 |
+
super().__init__(api_key, "Chai", ChaiQuery, ChaiFastaValidator())
|
175 |
+
|
176 |
+
def call(self, seq_file: Path | str, output_dir: Path) -> None:
|
177 |
+
"""Predict protein structure from amino acid sequence using Chai model.
|
178 |
+
|
179 |
+
Args:
|
180 |
+
seq_file (Path | str): Path to FASTA file containing amino acid sequence
|
181 |
+
output_dir (Path): Path to output directory
|
182 |
+
"""
|
183 |
+
super().call(seq_file, output_dir)
|
184 |
+
|
185 |
+
def predictions(self, output_dir: Path) -> list[Path]:
|
186 |
+
"""Get the path to the prediction."""
|
187 |
+
return list(output_dir.rglob("*_model_[0-9].cif"))
|
188 |
+
|
189 |
+
|
190 |
+
class ProtenixModel(AF3Model):
|
191 |
+
def __init__(self, api_key: str):
|
192 |
+
super().__init__(api_key, "Protenix", ProtenixQuery, ProtenixFastaValidator())
|
193 |
+
|
194 |
+
def call(self, seq_file: Path | str, output_dir: Path) -> None:
|
195 |
+
"""Predict protein structure from amino acid sequence using Protenix model.
|
196 |
+
|
197 |
+
Args:
|
198 |
+
seq_file (Path | str): Path to FASTA file containing amino acid sequence
|
199 |
+
output_dir (Path): Path to output directory
|
200 |
+
"""
|
201 |
+
super().call(seq_file, output_dir)
|
202 |
+
|
203 |
+
def predictions(self, output_dir: Path) -> list[Path]:
|
204 |
+
"""Get the path to the prediction."""
|
205 |
+
return list(output_dir.rglob("*_model_[0-9].cif"))
|
206 |
+
|
207 |
+
|
208 |
+
class BoltzModel(AF3Model):
|
209 |
+
def __init__(self, api_key: str):
|
210 |
+
super().__init__(api_key, "Boltz", BoltzQuery, BoltzFastaValidator())
|
211 |
+
|
212 |
+
def call(self, seq_file: Path | str, output_dir: Path) -> None:
|
213 |
+
"""Predict protein structure from amino acid sequence using Boltz model.
|
214 |
+
|
215 |
+
Args:
|
216 |
+
seq_file (Path | str): Path to FASTA file containing amino acid sequence
|
217 |
+
output_dir (Path): Path to output directory
|
218 |
+
"""
|
219 |
+
|
220 |
+
super().call(seq_file, output_dir)
|
221 |
+
|
222 |
+
def predictions(self, output_dir: Path) -> list[Path]:
|
223 |
+
"""Get the path to the prediction."""
|
224 |
+
return list(output_dir.rglob("*_model_[0-9].cif"))
|
225 |
+
|
226 |
+
|
227 |
+
def predict(sequence: str, api_key: str, model_type: FoldingModel) -> tuple[str, str]:
|
228 |
+
"""Predict protein structure from amino acid sequence using Boltz model.
|
229 |
+
|
230 |
+
Args:
|
231 |
+
sequence (str): Amino acid sequence to predict structure for
|
232 |
+
api_key (str): Folding API key
|
233 |
+
model (FoldingModel): Folding model to use
|
234 |
+
|
235 |
+
Returns:
|
236 |
+
tuple[str, str]: Tuple containing the path to the PDB file and the pLDDT plot
|
237 |
+
"""
|
238 |
+
|
239 |
+
# Set up unique output directory based on sequence hash
|
240 |
+
seq_id, seq_file = _write_fasta_file(sequence)
|
241 |
+
output_dir = OUTPUT_DIR / seq_id / model_type
|
242 |
+
output_dir.mkdir(parents=True, exist_ok=True)
|
243 |
+
|
244 |
+
if model_type == FoldingModel.BOLTZ:
|
245 |
+
model = BoltzModel(api_key)
|
246 |
+
elif model_type == FoldingModel.CHAI:
|
247 |
+
model = ChaiModel(api_key)
|
248 |
+
elif model_type == FoldingModel.PROTENIX:
|
249 |
+
model = ProtenixModel(api_key)
|
250 |
+
else:
|
251 |
+
raise ValueError(f"Model {model_type} not supported")
|
252 |
+
|
253 |
+
# Check if prediction already exists
|
254 |
+
if not model.has_prediction(output_dir):
|
255 |
+
# Run Boltz prediction
|
256 |
+
logger.info(f"Predicting {seq_id}")
|
257 |
+
model.call(seq_file=seq_file, output_dir=output_dir)
|
258 |
+
logger.info("Prediction done. Output directory: %s", output_dir)
|
259 |
+
else:
|
260 |
+
logger.info("Prediction already exists. Output directory: %s", output_dir)
|
261 |
+
|
262 |
+
# output_dir = Path("boltz_results") # debug
|
263 |
+
|
264 |
+
# Convert output CIF to PDB
|
265 |
+
if not model.has_prediction(output_dir):
|
266 |
+
raise gr.Error("No prediction found")
|
267 |
+
|
268 |
+
pred_cif = model.predictions(output_dir)[0]
|
269 |
+
logger.info("Output file: %s", pred_cif)
|
270 |
+
|
271 |
+
converted_pdb_path = str(output_dir / f"pred_{seq_id}.pdb")
|
272 |
+
convert_cif_to_pdb(str(pred_cif), str(converted_pdb_path))
|
273 |
+
logger.info("Converted PDB file: %s", converted_pdb_path)
|
274 |
+
|
275 |
+
plddt_file = list(pred_cif.parent.glob("plddt_*.npz"))[0]
|
276 |
+
logger.info("plddt file: %s", plddt_file)
|
277 |
+
plddt_vals = np.load(plddt_file)["plddt"]
|
278 |
+
|
279 |
+
return converted_pdb_path, add_plddt_plot(plddt_vals=plddt_vals)
|
folding_studio_demo/protein.py
ADDED
File without changes
|
pyproject.toml
CHANGED
@@ -1,12 +1,27 @@
|
|
1 |
[project]
|
2 |
-
name = "
|
3 |
version = "0.1.0"
|
4 |
description = "Add your description here"
|
5 |
readme = "README.md"
|
6 |
requires-python = ">=3.11"
|
7 |
dependencies = [
|
8 |
"gradio==5.30.0",
|
|
|
9 |
"ipython>=9.2.0",
|
|
|
10 |
"numpy>=2.2.6",
|
11 |
"plotly>=6.1.1",
|
|
|
|
|
|
|
12 |
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
[project]
|
2 |
+
name = "folding-studio-demo"
|
3 |
version = "0.1.0"
|
4 |
description = "Add your description here"
|
5 |
readme = "README.md"
|
6 |
requires-python = ">=3.11"
|
7 |
dependencies = [
|
8 |
"gradio==5.30.0",
|
9 |
+
"gradio-molecule3d>=0.0.7",
|
10 |
"ipython>=9.2.0",
|
11 |
+
"jupyter>=1.1.1",
|
12 |
"numpy>=2.2.6",
|
13 |
"plotly>=6.1.1",
|
14 |
+
"scipy>=1.15.3",
|
15 |
+
"folding-studio",
|
16 |
+
"biopython>=1.85",
|
17 |
]
|
18 |
+
|
19 |
+
[build-system]
|
20 |
+
requires = ["hatchling"]
|
21 |
+
build-backend = "hatchling.build"
|
22 |
+
|
23 |
+
[tool.uv.sources]
|
24 |
+
folding-studio = { path = "./folding-studio" }
|
25 |
+
|
26 |
+
[project.scripts]
|
27 |
+
folding-studio-demo = "folding_studio_demo.app:__main__"
|
spr_af_scores_mapped.csv
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
antibody_name,antigen_lineage,kon (1/Β΅M 1/s),koff (1/s),KD (nM),source_name,source_doi,pdb_id,antigen_chain_ids,antibody_heavy_chain_id,antibody_light_chain_id,structure_release_date,structure_resolution,gene_id,antigen_host,antigen_residue_indices,antigen_residue_indices_trimmed,antigen_domain,antibody_light_chain_host,epitope_residues,epitope_mutations,mutations,lineage_mutations_in_epitope,epitope_domain,epitope_is_multichain,epitope_isin_wt,paratope_residues,antibody_vh_sequence,antibody_vl_sequence,spike_sequence,antigen_sequence,antigen_sequence_without_indels,antigen_sequence_trimmed,antigen_sequence_trimmed_without_indels,antigen_pdb_sequence,antigen_pdb_sequence_trimmed,confidence_score_boltz,ptm_boltz,iptm_boltz,ligand_iptm_boltz,protein_iptm_boltz,complex_plddt_boltz,complex_iplddt_boltz,complex_pde_boltz,complex_ipde_boltz,interchain_pae_monomer,interface_pae_monomer,overall_pae_monomer,interface_plddt_monomer,average_plddt_monomer,ptm_monomer,interface_ptm_monomer,interchain_pae_multimer,interface_pae_multimer,overall_pae_multimer,interface_plddt_multimer,average_plddt_multimer,ptm_multimer,interface_ptm_multimer
|
2 |
+
bd45_43;covox_269,B,0.293,0.00151,5.162393162,huhn_2025_spr,10.1038/s41467-024-54916-5,7neh,E,H,L,02/04/21,1.77,S,severe acute respiratory syndrome coronavirus 2 (2697049),"(332, 527)",,RBD,homo sapiens (9606),R403 D405 E406 R408 T415 G416 K417 D420 Y421 Y453 L455 F456 R457 K458 S459 N460 Y473 Q474 A475 G476 F486 N487 Y489 Q493 S494 Y495 G496 F497 Q498 N501 Y505,,,,RBD,False,True,H:N30 R31 N32 Y33 Y52 S53 G54 G55 S56 F58 R94 D95 F96 Y97 E98 D101;L:S30 S31 Y32 Q90 L91 N92 S93 Y94,QVQLVESGGGLIQPGGSLRLSCAASGLTVNRNYMSWIRQAPGKGLEWVSVIYSGGSTFYADSVKGRFTISRDNSKNTLSLQMNSLRAEDTAIYYCARDFYEGSFDIWGQGTMVTVSS,AIQLTQSPSFLSASIGDRVTITCRASQGISSYLAWYQQKPGKAPKLLIYAASTLQSGVPSRFSGSGSGTEFTLTISSLQPEDFASYYCQQLNSYPAPVFGPGTKVDIK,MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELDSFKEELDKYFKNHTSPDVDLGDISGINASVVNIQKEIDRLNEVAKNLNESLIDLQELGKYEQYIKWPWYIWLGFIAGLIAIVMVTIMLCCMTSCCSCLKGCCSCGSCCKFDEDDSEPVLKGVKLHYT,ITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,ITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,,,-TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGK,,0.815568387508392,0.631265461444855,0.499751955270767,0.0,0.499751955270767,0.894522488117218,0.808752834796906,0.574461817741394,4.69568395614624,3.723450183868408,2.065487838091536,3.046133041381836,97.62024275169595,97.58975656824344,0.9224043719056731,0.8713607670503896,29.375048637390137,27.4414244016436,28.373729705810547,29.83158417666077,31.749196704388066,0.1932366931512888,0.1605053034841711
|
3 |
+
bd45_41;covox_384,B,0.7466666666666667,0.0043133333333333,6.0200266319999995,huhn_2025_spr,10.1038/s41467-024-54916-5,7bep,C,D,F,12/24/20,2.61,S,severe acute respiratory syndrome coronavirus 2 (2697049),"(332, 528)",,RBD,homo sapiens (9606),L452 L455 F456 I472 G482 V483 E484 G485 F486 Y489 F490 L492,,,,RBD,False,True,F:S30 Y32 N92 N93 A94 L95;D:Y50 R52 H55 T56 Y58 L98 F100 L100A E100B W100C,EVQLVESGGGLVKPGESLRLSCAASGFTFSDYYMTWIRQAPGKGLEWVSYIRSSGHTIYYADSVKGRFTISRDNAKNSLYLQMNSLRVEDTAVYYCARGGVLRFLEWPLNAFDIWGQGTMVTVSS,DIQLTQSPSSLSASVGDRVTITCRASQGISNYLAWYQQKPGKVPKLLIYAASTLQSGVPSRFSGSGSGTDFTLTISSLQPEDVATYYCQKYNNALGTFGQGTKVEIK,MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELDSFKEELDKYFKNHTSPDVDLGDISGINASVVNIQKEIDRLNEVAKNLNESLIDLQELGKYEQYIKWPWYIWLGFIAGLIAIVMVTIMLCCMTSCCSCLKGCCSCGSCCKFDEDDSEPVLKGVKLHYT,ITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,ITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,,,-TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGKK,,0.783776104450226,0.566782534122467,0.427239209413528,0.0,0.427239209413528,0.87291032075882,0.786508798599243,0.867737531661987,9.8238639831543,4.809793472290039,2.045966428021883,3.723745822906494,97.230994247972,97.19396149825464,0.8891827579215439,0.8724955180116689,29.54940414428711,27.382281917096904,28.28030586242676,31.741909817932445,35.71164433102995,0.2412751374627494,0.1611393982227129
|
4 |
+
covox_58,B,0.479,0.00415,10.472440945,huhn_2025_spr,10.1038/s41467-024-54916-5,7qny,E,A,B,12/23/21,2.84,S,severe acute respiratory syndrome coronavirus 2 (2697049),"(334, 516)",,RBD,homo sapiens (9606),E340 V341 A344 T345 R346 F347 A348 S349 A352 N354 K356 S399 K444 Y449 N450 R466,,,,RBD,False,True,A:S52 W52A N53 S54 G55 T56 I57 G58 T99 F100 V100B L100C;B:S95 D95A,QVQLVESGGGLVQPGRSLRLSCAASGFTFDDYAMHWVRQPPGKGLEWVSGVSWNSGTIGYADSVKGRFIISRDNAKNSLYLQMNSLKAEDTALYYCAREVGGTFGVLISREGGLDYWGQGTLVTVSS,SYELTQPPSVSVAPGQTARITCGGNTIGSKSVHWYQQRPGQAPVLVVYDDSDRPSGIPERFSGSNSGNTATLTISRVEAGDEADYYCQVWDSSSDRVVFGGGTKLTVL,MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELDSFKEELDKYFKNHTSPDVDLGDISGINASVVNIQKEIDRLNEVAKNLNESLIDLQELGKYEQYIKWPWYIWLGFIAGLIAIVMVTIMLCCMTSCCSCLKGCCSCGSCCKFDEDDSEPVLKGVKLHYT,NLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFE,NLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFE,,,NLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFE,,0.813834190368652,0.623498022556305,0.497233539819717,0.0,0.497233539819717,0.892984330654144,0.831231832504273,0.777176558971405,6.74987268447876,3.416905641555786,2.73430979206958,3.271117687225342,95.47922926078462,96.64388937350576,0.9293244224193686,0.8333618649239609,29.62367248535156,27.908499213470808,28.87879753112793,27.93079605430594,28.99558687866513,0.1632285223405918,0.1555844490249545
|
5 |
+
covox_278,B,0.4905,0.006315,12.865473560000002,huhn_2025_spr,10.1038/s41467-024-54916-5,7or9,E,H,L,06/04/21,2.34,S,severe acute respiratory syndrome coronavirus 2 (2697049),"(333, 527)",,RBD,homo sapiens (9606),T345 R346 Y351 N440 L441 D442 S443 K444 V445 G446 G447 N448 Y449 N450 Y451 L452 T470 E484 F490 L492 P499,,,,RBD,False,True,H:I30 R31 W50 N53 Y56 N58 I98 L99 T100 G100A Y100B L100C D100D;L:A30 S31 Y32 L33 A50 S52 S91 Y92 S93 T94 L95,QVQLVQSGAEVKKPGASVKVSCKASGYIFIRYGISWVRQAPGQGLEWMGWISANNGYTNYAQKLQGRVTMTTDTSTSTAYMELRSLRSDDTAVYYCARDGGILTGYLDYFDHWGQGTLVTVSS,DIQMTQSPSSLSASVGDRLTITCRASQSIASYLNWYQQKPGKAPKLLIYAASSLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYHCQQSYSTLGITFGPGTKVDIK,MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELDSFKEELDKYFKNHTSPDVDLGDISGINASVVNIQKEIDRLNEVAKNLNESLIDLQELGKYEQYIKWPWYIWLGFIAGLIAIVMVTIMLCCMTSCCSCLKGCCSCGSCCKFDEDDSEPVLKGVKLHYT,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,,,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGK,,0.780656039714813,0.592200815677643,0.456630498170853,0.0,0.456630498170853,0.861662447452545,0.78568172454834,0.749391078948975,6.61570310592651,3.967527985572815,1.887516614885252,3.1754387617111206,97.71261536639231,97.2269496569076,0.922128938711486,0.8817608181456824,29.532506942749023,26.75908168640427,27.047605514526367,42.820148956954306,52.943542943851064,0.3415059963152309,0.1679752252684513
|
6 |
+
bd45_39;covox_45,B,0.2276666666666666,0.0065266666666666,28.70041021666667,huhn_2025_spr,10.1038/s41467-024-54916-5,7bel,X,C,D,12/23/20,2.53,S,severe acute respiratory syndrome coronavirus 2 (2697049),"(334, 527)",,RBD,homo sapiens (9606),W353 N354 R355 K356 R357 I358 S359 N360 N394 Y396 P426 D428 K462 P463 F464 E465 R466 I468 E516 L518,,,,RBD,False,True,C:T31 Y32 S52 Y52A D53 S55 N56 Y58 K94 S97 Y98 A99 Y100 Y100A Y100B Y100C D101;D:N31 Y32 Y49 D50 N53 L54 E55 D92 N93,QVQLVESGGGVVQPGRSLRLSCAASGFTFSTYAMHWVRQAPGKGLEWVAVLSYDGSNKYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAKGGSYAYYYYMDVWGKGTTVTVSS,DIQLTQSPSSLSASVGDRVTITCQASQDISNYLNWYQQKPGKAPKLLIYDASNLETGVPSRFSGGGSGTDFTFTITSLQPEDIATYYCQQYDNLPLTFGGGTKVDIK,MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELDSFKEELDKYFKNHTSPDVDLGDISGINASVVNIQKEIDRLNEVAKNLNESLIDLQELGKYEQYIKWPWYIWLGFIAGLIAIVMVTIMLCCMTSCCSCLKGCCSCGSCCKFDEDDSEPVLKGVKLHYT,NLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,NLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,,,NLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGK,,0.864258110523224,0.750974237918854,0.670291066169739,0.0,0.670291066169739,0.912749826908112,0.863511741161346,0.518989622592926,4.14870548248291,3.968512177467346,2.542677193895171,3.364487648010254,96.57266771591796,97.10952461348532,0.914509605012032,0.8440767834045971,29.85724639892578,28.17639105213889,29.10641288757324,28.077718924878248,29.73296412083579,0.1647350462688318,0.1528304609817936
|
7 |
+
covox_253,B,0.69975,0.0343125,68.8637716275,huhn_2025_spr,10.1038/s41467-024-54916-5,7ben,C,D,F,12/24/20,2.5,S,severe acute respiratory syndrome coronavirus 2 (2697049),"(336, 516)",,RBD,homo sapiens (9606),K417 Y421 Y453 L455 F456 R457 K458 Y473 Q474 A475 G476 S477 T478 P479 G485 F486 N487 C488 Y489 Q493,,,,RBD,False,True,D:T30 T31 S32 A33 W50 V52 G53 S54 N56 P95 S99 T100 S100A C100B Y100C D100D A100E F100F;F:S31 Y32 Y91 G92 Y96,QVQLVQSGPEVKKPGTSVKVSCKASGFTFTTSAVQWVRQARGQRLEWIGWIVVGSGNTNYAQKFQERVTITRDMSTTTAYMELSSLRSEDTAVYFCAAPHCNSTSCYDAFDIWGQGTMVTVSS,DIQMTQSPGTLSLSPGEGATLSCRASQSVSSSYLAWYQQKPGQAPRLLIYGASSGATGIPDRFSGSGSGTDFTLTISRLEPEDFAVYYCQQYGSSPYTFGQGTKVEIK,MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELDSFKEELDKYFKNHTSPDVDLGDISGINASVVNIQKEIDRLNEVAKNLNESLIDLQELGKYEQYIKWPWYIWLGFIAGLIAIVMVTIMLCCMTSCCSCLKGCCSCGSCCKFDEDDSEPVLKGVKLHYT,CPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFE,CPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFE,,,CPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFE,,0.914573848247528,0.883981227874756,0.856384038925171,0.0,0.856384038925171,0.929121315479279,0.915573418140411,0.315263271331787,0.520528972148895,4.548707008361816,2.2264484833746336,3.614177465438843,97.53705417062714,96.7483133214709,0.9031158034443396,0.8620604364444605,26.547210693359375,25.422632414234357,26.56904697418213,37.23036184257237,49.15953242545456,0.4282457681214566,0.1836282104429391
|
8 |
+
bd45_42;covox_316,B,0.4048,0.04032,102.189625528,huhn_2025_spr,10.1038/s41467-024-54916-5,7beh,E,H,L,12/23/20,2.3,S,severe acute respiratory syndrome coronavirus 2 (2697049),"(333, 527)",,RBD,homo sapiens (9606),Y449 Y453 L455 F456 V483 E484 G485 F486 N487 C488 Y489 F490 L492 Q493 S494,,,,RBD,False,True,H:T30 G31 Y33 W50 N52 N53 S54 G56 N58 F98 S99 M100 V100A R100B;L:Y30C Y32 Y91 N95 W96,QVQLVQSGAEVKKPGASVKVSCKASGYTFTGYYMHWVRQAPGQGLEWMGWINPNSGGTNYTQKFQGRVTMTRDTSISTAYMELSRLRSDDTAVYSCARDMAFSMVRGSFDYWGQGTLVTVSS,QAVLTQPPSASGSPGQSVTISCTGTSSDVGGYNYVSWYQQHPGKAPKLMIYEVSKRPSGVPDRFSGSKSGNTASLTVSGLQAEDEADYYCSSYAGSNHWVFGGGTKLTVL,MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELDSFKEELDKYFKNHTSPDVDLGDISGINASVVNIQKEIDRLNEVAKNLNESLIDLQELGKYEQYIKWPWYIWLGFIAGLIAIVMVTIMLCCMTSCCSCLKGCCSCGSCCKFDEDDSEPVLKGVKLHYT,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,,,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGK,,0.836899876594544,0.708972632884979,0.600401759147644,0.0,0.600401759147644,0.896024405956268,0.814204096794128,0.500937461853027,3.40170907974243,3.9755221605300903,2.4679562958916876,3.3112473487854004,97.23949349040056,97.2444966855708,0.920971468523108,0.8482919517430124,29.79031562805176,17.87317807569991,25.04682159423828,59.24685751554468,57.925111098887655,0.5151529747182887,0.3037515428354363
|
9 |
+
bd45_38;covox_75,B,0.0959999999999999,0.0313285714285714,343.82737152857146,huhn_2025_spr,10.1038/s41467-024-54916-5,7ben,C,G,I,12/24/20,2.5,S,severe acute respiratory syndrome coronavirus 2 (2697049),"(336, 516)",,RBD,homo sapiens (9606),N440 L441 D442 S443 K444 V445 G446 G447 N448 Y449 N450 L452 E484 F490 L492 Q493 S494 Y495 G496,,,,RBD,False,True,I:S30 S31 W32 A50 A91 K92 S93 F94 F96;G:V98 V100 A100A A100B R100C N100D H100E Y100F Y100G N100H,QVQLVESGGGVVQPGRSLRLSCAASGFTFNNYPLHWVRQAPGKGPEWVAVISQDGGNKYYVDSVKGRFTISRDNSKNTLYLQMNNLRAEDTALYYCARDVVVVVAARNHYYNGMDVWGQGTTVTVSS,DIQLTQSPSSVSASVGDRVTITCRASQGISSWLAWYQQKPGKAPKLLIYAVSSLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQAKSFPFTFGPGTKVEIK,MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELDSFKEELDKYFKNHTSPDVDLGDISGINASVVNIQKEIDRLNEVAKNLNESLIDLQELGKYEQYIKWPWYIWLGFIAGLIAIVMVTIMLCCMTSCCSCLKGCCSCGSCCKFDEDDSEPVLKGVKLHYT,CPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFE,CPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFE,,,CPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFE,,0.801655769348145,0.594999551773071,0.457680195569992,0.0,0.457680195569992,0.887649655342102,0.804755747318268,0.705984234809876,5.93294382095337,4.286665439605713,2.027977637602458,3.3147683143615723,97.71978281117325,96.8930778481744,0.9159003126831424,0.8735424882781723,26.957773208618164,25.519889059658937,26.960838317871097,37.47481094984693,47.88164702045448,0.4208675533072618,0.1824414576700511
|
10 |
+
amubarvimab;bd45_21;brii_196;p2c_1f11,B,,,2.12,ju_2020_nature,10.1038/s41586-020-2380-z,7e8m,E,H,L,03/02/21,2.09,S,severe acute respiratory syndrome coronavirus 2 (2697049),"(333, 527)",,RBD,homo sapiens (9606),R403 T415 G416 N417 D420 Y421 Y453 L455 F456 R457 K458 S459 N460 Y473 Q474 A475 F486 N487 Y489 Q493 S494 Y495 Y501 Y505,K417N N501Y,,,RBD,False,False,H:S30 S31 N32 Y33 Y52 S53 G54 G55 S56 Y58 R94 L96 V97 V98 Y99 D101;L:S30 S30A S31 Y32 Q90 Y91 G92 S93,EVQLVESGGGLVQPGGSLRLSCAASGITVSSNYMNWVRQAPGKGLEWVSLIYSGGSTYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYHCARDLVVYGMDVWGQGTTVTVSS,EIVLTQSPGTLSISPGERATLSCRASQSVSSSYLAWYQQKPGQAPRLLIYGASSRATGIPDRFSGSGSGTDFTLTISRLEPEDFAVYYCQQYGSSPTFGQGTKLEIK,MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELDSFKEELDKYFKNHTSPDVDLGDISGINASVVNIQKEIDRLNEVAKNLNESLIDLQELGKYEQYIKWPWYIWLGFIAGLIAIVMVTIMLCCMTSCCSCLKGCCSCGSCCKFDEDDSEPVLKGVKLHYT,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,,,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGNIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVKGFNCYFPLQSYGFQPTYGVGYQPYRVVVLSFELLHAPATVCGP,,0.806627571582794,0.604901313781738,0.469731539487839,0.0,0.469731539487839,0.890851616859436,0.782432734966278,0.653874278068543,5.79969501495361,3.889882802963257,2.1447279756893742,3.1076622009277344,97.63849821703336,97.03031474832582,0.9184391725953712,0.8667697875832223,29.34839630126953,27.19294934209429,28.324119567871097,28.5653600028306,32.27080636498517,0.2005613357989986,0.1631862178489821
|
11 |
+
bd45_7;p2b_2f6,B,,,5.14,ju_2020_nature,10.1038/s41586-020-2380-z,8dcc,E,H,L,07/06/22,2.57,S,severe acute respiratory syndrome coronavirus 2 (2697049),"(333, 526)",,RBD,homo sapiens (9606),Y351 K444 G446 G447 N448 Y449 N450 L452 I472 V483 E484 G485 F490 L492 Q493 S494,,,,RBD,False,True,H:S30 S31 G31A Y32 H53 G98 I99 V100 V100A V100B P100C R100H;L:G30B Y30C N31 Y32 E50,QVQLQESGPGLVKPSETLSLTCTVSGYSISSGYYWGWIRQPPGKGLEWIGSIYHSGSTYYNPSLKTRVTISVDTSKNQFSLKLSSVTAADTAVYYCARAVVGIVVVPAAGRRAFDIWGQGTMVTVSS,QSALTQPPSASGSPGQSVTISCTGTSSDVGGYNYVSWYQQHPGKAPKLMIYEVSKRPSGVPDRFSGSKSGNTASLTVSGLQAEDEADYYCSSYAGSNNLVFGGGTKLTVL,MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELDSFKEELDKYFKNHTSPDVDLGDISGINASVVNIQKEIDRLNEVAKNLNESLIDLQELGKYEQYIKWPWYIWLGFIAGLIAIVMVTIMLCCMTSCCSCLKGCCSCGSCCKFDEDDSEPVLKGVKLHYT,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,,,KNLCPFGEVFNATRFASVYAWNRKRISNCVYDYSVLYNSASFSTFKCYGVSPTKLKDLCFTYVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDTSTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLTFELLDAPPTVCG,,0.779910862445831,0.605188310146332,0.472482472658157,0.0,0.472482472658157,0.856767952442169,0.776917576789856,0.806709885597229,7.29232597351074,4.219140529632568,2.249224998168091,3.4182815551757812,97.19018392155026,97.32025286418748,0.9073658369599488,0.8607524475911202,29.55217933654785,27.74894137274779,28.309181213378903,30.19989435806049,34.6484895742348,0.2291970218536952,0.1572482637418456
|
12 |
+
bd45_22;p2c_1a3,B,,,2.47,ju_2020_nature,10.1038/s41586-020-2380-z,7cdj,E,H,L,06/19/20,3.4,S,severe acute respiratory syndrome coronavirus 2 (2697049),"(333, 526)",,RBD,homo sapiens (9606),Y449 L452 L455 F456 G476 S477 T478 P479 C480 N481 V483 E484 G485 F486 N487 Y489 F490 L492 Q493 S494,,,,RBD,False,True,L:S30 Y32 L91 N92 S93 Y94;H:Y33 Y50 S52 S52A S53 G54 S55 T56 F96 S97 H98 Q99 Q100 L100A,QVQLVESGGGLVKPGGSLRLSCAASGFTFSDYYMSWIRQAPGKGLEWVSYISSSGSTIYYADSVKGRFTISRDNAKNSLYLQMNSLRAEDTAVYYCARDFSHQQLVPSWGQGTLVTVSS,DIQLTQSPSFLSASVGDRVTITCRASQGISSYLAWYQQKPGKAPKLLIYAASTLQSGVPSRFSGSGSGTEFTLTISSLQPEDFATYYCQQLNSYPLTFGGGTKVEIK,MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELDSFKEELDKYFKNHTSPDVDLGDISGINASVVNIQKEIDRLNEVAKNLNESLIDLQELGKYEQYIKWPWYIWLGFIAGLIAIVMVTIMLCCMTSCCSCLKGCCSCGSCCKFDEDDSEPVLKGVKLHYT,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,,,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,,0.804550170898438,0.655625939369202,0.529589176177979,0.0,0.529589176177979,0.873290419578552,0.78179919719696,0.559738159179688,4.29560947418213,4.319523096084595,2.2729202048269994,3.5641493797302246,96.98280673538328,96.97517601506055,0.9009612852404294,0.859393807173975,29.33012962341309,27.404896638158995,28.285560607910156,29.053955817539126,31.906904000955564,0.1927061390351921,0.1608966397629959
|
13 |
+
p22a_1d1,B,,,5.79,zhang_2021_nat_comms,10.1038/s41467-021-24514-w,7chs,E,H,L,07/06/20,2.4,S,severe acute respiratory syndrome coronavirus 2 (2697049),"(333, 526)",,RBD,homo sapiens (9606),R403 D405 E406 T415 G416 K417 D420 Y421 Y453 L455 F456 R457 K458 S459 N460 Y473 Q474 A475 F486 N487 Y489 F490 L492 Q493 Y495 G496 F497 Q498 N501 Y505,,,,RBD,False,True,H:S30 S31 N32 Y33 Y52 S53 G54 G55 S56 Y58 R94 R96 D97 Y98 Y99 D101;L:S30 Y32 H90 L91 N92 Y94,EVQLVESGGGLIQPGGSLRLSCAASGFTVSSNYMSWVRQAPGKGLEWVSVIYSGGSTYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCARDRDYYGMDVWGQGTTVTVSS,DIQLTQSPSFLSASVGDRVTITCRASQGISSYLAWYQQKPGKAPKLLIYAASTLQSGVPSRFSGSGSGTEFTLTISSLQPEDFATYYCLHLNSYRTFGLGTKVEIK,MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELDSFKEELDKYFKNHTSPDVDLGDISGINASVVNIQKEIDRLNEVAKNLNESLIDLQELGKYEQYIKWPWYIWLGFIAGLIAIVMVTIMLCCMTSCCSCLKGCCSCGSCCKFDEDDSEPVLKGVKLHYT,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,,,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,,0.799001395702362,0.583963930606842,0.443157732486725,0.0,0.443157732486725,0.887962281703949,0.783845901489258,0.580890655517578,4.91616106033325,3.8282817602157593,2.26178554607675,3.11441421508789,97.40743986108662,96.75478221302072,0.919711764602881,0.8600319811246402,29.322518348693848,27.32672814436949,28.218334197998047,29.90523019047135,33.48768084795022,0.2129387496796693,0.1617372981596133
|
14 |
+
p5a_1d2,B,,,14.02,zhang_2021_nat_comms,10.1038/s41467-021-24514-w,7cho,A,B,C,07/06/20,2.56,S,severe acute respiratory syndrome coronavirus 2 (2697049),"(333, 526)",,RBD,homo sapiens (9606),R403 D405 T415 G416 K417 D420 Y421 Y453 L455 F456 R457 K458 S459 N460 Y473 Q474 A475 F486 N487 Y489 Q493 N501 G502 G504 Y505,,,,RBD,False,True,B:S30 S31 N32 Y33 Y52 S53 G54 G55 S56 Y58 R94 L96 Q97 V98 G99 A100 T100A D100C D101;C:G30A A30B G30C Y31 S95A,EVQLVESGGGLIQPGGSLRLSCAASGFIVSSNYMSWVRQAPGKGLEWVSIIYSGGSTYYADSVKGRFTISRDNSNNTLYLQMNSLRAEDTAVYYCARALQVGATSDYFDYWGQGTLVTVSS,QSVLTQPPSVSGAPGQRVTISCTGSSSNIGAGYDVHWYQQLPGTAPKLLIYGNSNRPSGVPDRFSGSKSGTSASLAITGLQAEDETDYYCQSCDSSLSVVVFGGGTKLTVL,MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELDSFKEELDKYFKNHTSPDVDLGDISGINASVVNIQKEIDRLNEVAKNLNESLIDLQELGKYEQYIKWPWYIWLGFIAGLIAIVMVTIMLCCMTSCCSCLKGCCSCGSCCKFDEDDSEPVLKGVKLHYT,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,,,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,,0.840566754341126,0.695268392562866,0.592147290706635,0.0,0.592147290706635,0.902671635150909,0.818431437015533,0.5360067486763,3.70838093757629,4.224268436431885,2.5905382789884297,3.5311367511749268,95.49891960723396,95.8846969442526,0.9089658019474836,0.8413878468162714,29.70927906036377,27.910024175490378,28.62742042541504,28.847876247700896,31.60096486393412,0.19691031850727,0.155568632470583
|
15 |
+
p5a_3c8,B,,,1.3,zhang_2021_nat_comms,10.1038/s41467-021-24514-w,7chp,E,H,L,07/06/20,2.36,S,severe acute respiratory syndrome coronavirus 2 (2697049),"(333, 522)",,RBD,homo sapiens (9606),R403 D405 E406 R408 T415 G416 K417 D420 Y421 Y449 Y453 L455 F456 R457 K458 S459 N460 Y473 Q474 A475 F486 N487 Y489 Q493 S494 Y495 G496 F497 Q498 N501 Y505,,,,RBD,False,True,L:S30 S31 Y32 H90 L91 N92 S93 Y94;H:S31 N32 Y33 Y52 S53 G54 G55 S56 Y58 R94 L96 Q97 E98 H99 D101,EVQLVESGGGLIQPGGSLRLSCAASGFTVSSNYMSWVRQAPGKGLEWVSFIYSGGSTYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCARDLQEHGMDVWGQGTTVTVSS,DIQLTQSPSSLSASVGDRVTITCRASQGISSYLAWYQQKPGKAPKLLIYAASTLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQHLNSYPPGYTFGQGTKLEIK,MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELDSFKEELDKYFKNHTSPDVDLGDISGINASVVNIQKEIDRLNEVAKNLNESLIDLQELGKYEQYIKWPWYIWLGFIAGLIAIVMVTIMLCCMTSCCSCLKGCCSCGSCCKFDEDDSEPVLKGVKLHYT,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPA,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPA,,,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPA,,0.799769759178162,0.636229515075684,0.505165874958038,0.0,0.505165874958038,0.873420715332031,0.791917443275452,0.623001635074616,4.9553861618042,3.5803418159484863,1.945987765655582,2.9488518238067627,97.97371806493044,96.72675060619106,0.9255255894656254,0.8783303373121849,29.55667209625244,27.446456582910205,28.21571350097656,29.73038928410532,33.446187252617214,0.2329041029431821,0.1604514663965165
|
16 |
+
p5a_3c12,B,,,8.47,zhang_2021_nat_comms,10.1038/s41467-021-24514-w,7d0d,A,H,L,09/09/20,3.8,S,severe acute respiratory syndrome coronavirus 2 (2697049),"(27, 1146)","(327, 528)",spike,homo sapiens (9606),G416 K417 F456 A475 V483 E484 G485 F486 N487 Y489 F490 Q493,,,,RBD,False,True,L:Y30A S30C N30D N30E Y91;H:S31A L50 Y52 W53 D54 D56 R58 F97 L98 T99 Y100B,QITLKESGPTLVKPTQTLTLTCTFSGFSLSTSGVGVGWIRQPPGKALEWLALIYWDDDKRYSPSLKSRLTITKDTSKNQVVLTMTNMDPVDTATYYCAHSLFLTVGYSSSWSPFDYWGQGTLVTVSS,DIVMTQSPDSLAVSLGERATINCKSSQSVLYSSNNKNYLAWYQQKPGQPPKLLIYWASTRESGVPDRFSGSGSGTDFTLTISSLQAEDVAVYYCQQYYSTPHTFGQGTKLEIK,MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELDSFKEELDKYFKNHTSPDVDLGDISGINASVVNIQKEIDRLNEVAKNLNESLIDLQELGKYEQYIKWPWYIWLGFIAGLIAIVMVTIMLCCMTSCCSCLKGCCSCGSCCKFDEDDSEPVLKGVKLHYT,AYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELD,AYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELD,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,AYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDPPEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELD,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,0.801107525825501,0.621712863445282,0.496211916208267,0.0,0.496211916208267,0.877331376075745,0.781339168548584,0.592956483364105,4.11549758911133,7.736447334289551,6.066557600040628,6.794885158538818,82.95154693193497,90.5823181115092,0.8142294848482255,0.6673523088520965,29.801297187805176,27.44481049316726,28.826437950134277,27.01779102581493,30.210954111641698,0.2179942246544585,0.1604690751968928
|
uv.lock
CHANGED
The diff for this file is too large to render.
See raw diff
|
|