Use SPR data with adjusted scores
#12
by
jfaustin
- opened
- folding_studio_demo/app.py +158 -93
- folding_studio_demo/correlate.py +90 -64
- folding_studio_demo/model_fasta_validators.py +9 -9
- folding_studio_demo/models.py +146 -7
- folding_studio_demo/predict.py +210 -94
- spr_af_scores_mapped.csv +54 -16
folding_studio_demo/app.py
CHANGED
@@ -39,8 +39,8 @@ MOLECULE_REPS = [
|
|
39 |
|
40 |
|
41 |
MODEL_CHOICES = [
|
42 |
-
|
43 |
-
|
44 |
# ("SoloSeq", FoldingModel.SOLOSEQ),
|
45 |
("Boltz-1", FoldingModel.BOLTZ),
|
46 |
("Chai-1", FoldingModel.CHAI),
|
@@ -49,6 +49,15 @@ MODEL_CHOICES = [
|
|
49 |
|
50 |
DEFAULT_SEQ = "MALWMRLLPLLALLALWGPDPAAA"
|
51 |
MODEL_EXAMPLES = {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
FoldingModel.BOLTZ: [
|
53 |
["Monomer", f">A|protein\n{DEFAULT_SEQ}"],
|
54 |
["Multimer", f">A|protein\n{DEFAULT_SEQ}\n>B|protein\n{DEFAULT_SEQ}"],
|
@@ -70,27 +79,31 @@ def sequence_input(dropdown: gr.Dropdown | None = None) -> gr.Textbox:
|
|
70 |
Returns:
|
71 |
gr.Textbox: Sequence input component
|
72 |
"""
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
79 |
|
80 |
-
examples = gr.Examples(
|
81 |
-
examples=MODEL_EXAMPLES[FoldingModel.BOLTZ],
|
82 |
-
inputs=[dummy, sequence],
|
83 |
-
)
|
84 |
if dropdown is not None:
|
85 |
dropdown.change(
|
86 |
fn=lambda x: gr.Dataset(samples=MODEL_EXAMPLES[x]),
|
87 |
inputs=[dropdown],
|
88 |
outputs=[examples.dataset],
|
89 |
)
|
90 |
-
file_input = gr.File(
|
91 |
-
label="Upload a FASTA file",
|
92 |
-
file_types=[".fasta", ".fa"],
|
93 |
-
)
|
94 |
|
95 |
def _process_file(file: gr.File | None) -> gr.Textbox:
|
96 |
if file is None:
|
@@ -115,7 +128,7 @@ def simple_prediction(api_key: str) -> None:
|
|
115 |
"""
|
116 |
gr.Markdown(
|
117 |
"""
|
118 |
-
|
119 |
|
120 |
It will be run in the background and the results will be displayed in the output section.
|
121 |
The output will contain the protein structure and the pLDDT plot.
|
@@ -157,7 +170,19 @@ def model_comparison(api_key: str) -> None:
|
|
157 |
Args:
|
158 |
api_key (str): Folding Studio API key
|
159 |
"""
|
|
|
|
|
|
|
160 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
161 |
with gr.Row():
|
162 |
models = gr.CheckboxGroup(
|
163 |
label="Model",
|
@@ -176,6 +201,9 @@ def model_comparison(api_key: str) -> None:
|
|
176 |
variant="primary",
|
177 |
)
|
178 |
with gr.Row():
|
|
|
|
|
|
|
179 |
chai_predictions = gr.CheckboxGroup(label="Chai", visible=False)
|
180 |
protenix_predictions = gr.CheckboxGroup(label="Protenix", visible=False)
|
181 |
boltz_predictions = gr.CheckboxGroup(label="Boltz", visible=False)
|
@@ -186,28 +214,50 @@ def model_comparison(api_key: str) -> None:
|
|
186 |
metrics_plot = gr.Plot(label="pLDDT")
|
187 |
|
188 |
# Store the initial predictions
|
189 |
-
|
190 |
-
plddt_fig = gr.State()
|
191 |
|
192 |
predict_btn.click(
|
193 |
fn=predict_comparison,
|
194 |
inputs=[sequence, api_key, models],
|
195 |
outputs=[
|
|
|
|
|
|
|
|
|
196 |
chai_predictions,
|
197 |
boltz_predictions,
|
198 |
protenix_predictions,
|
199 |
-
aligned_paths,
|
200 |
-
plddt_fig,
|
201 |
],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
202 |
)
|
203 |
|
204 |
# Handle checkbox changes
|
205 |
-
for checkbox in [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
206 |
checkbox.change(
|
207 |
fn=filter_predictions,
|
208 |
inputs=[
|
209 |
-
|
210 |
-
|
|
|
|
|
211 |
chai_predictions,
|
212 |
boltz_predictions,
|
213 |
protenix_predictions,
|
@@ -242,99 +292,114 @@ def create_correlation_tab():
|
|
242 |
"antigen_sequence": "Antigen Sequence",
|
243 |
}
|
244 |
spr_data_with_scores = spr_data_with_scores.rename(columns=prettified_columns)
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
)
|
258 |
|
259 |
gr.Markdown("# Prediction and correlation")
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
with gr.Row():
|
277 |
-
correlation_ranking_plot = gr.Plot(label="Correlation ranking")
|
278 |
-
with gr.Row():
|
279 |
-
with gr.Column():
|
280 |
with gr.Row():
|
281 |
-
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
|
287 |
)
|
288 |
-
# Add checkbox for log scale and update plot when either input changes
|
289 |
with gr.Row():
|
290 |
log_scale = gr.Checkbox(
|
291 |
-
label="
|
292 |
-
|
293 |
-
|
294 |
-
score_description = gr.Markdown(
|
295 |
-
get_score_description(correlation_column.value)
|
296 |
-
)
|
297 |
-
correlation_column.change(
|
298 |
-
fn=lambda x: get_score_description(x),
|
299 |
-
inputs=correlation_column,
|
300 |
-
outputs=score_description,
|
301 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
302 |
with gr.Column():
|
303 |
regression_plot = gr.Plot(label="Correlation with binding affinity")
|
304 |
|
305 |
fake_predict_btn.click(
|
306 |
-
fn=lambda x:
|
307 |
-
|
|
|
|
|
|
|
|
|
308 |
),
|
309 |
inputs=[correlation_type],
|
310 |
-
outputs=[
|
|
|
|
|
|
|
|
|
|
|
|
|
311 |
)
|
312 |
|
313 |
-
def
|
314 |
-
return make_regression_plot(spr_data_with_scores, score, use_log)
|
315 |
-
|
316 |
-
def update_correlation_plot(correlation_type):
|
317 |
logger.info(f"Updating correlation plot for {correlation_type}")
|
318 |
corr_data = compute_correlation_data(spr_data_with_scores, SCORE_COLUMNS)
|
319 |
logger.info(f"Correlation data: {corr_data}")
|
320 |
-
|
|
|
|
|
321 |
|
322 |
correlation_column.change(
|
323 |
-
fn=
|
324 |
-
inputs=[correlation_column, log_scale],
|
325 |
-
outputs=regression_plot,
|
326 |
)
|
327 |
|
328 |
correlation_type.change(
|
329 |
-
fn=
|
330 |
-
inputs=[correlation_type],
|
331 |
-
outputs=correlation_ranking_plot,
|
332 |
)
|
333 |
-
|
334 |
log_scale.change(
|
335 |
-
fn=
|
336 |
-
inputs=[correlation_column, log_scale],
|
337 |
-
outputs=regression_plot,
|
338 |
)
|
339 |
|
340 |
|
@@ -360,7 +425,7 @@ def __main__():
|
|
360 |
)
|
361 |
api_key = gr.Textbox(label="Folding Studio API Key", type="password")
|
362 |
gr.Markdown("## Demo Usage")
|
363 |
-
with gr.Tab("🚀
|
364 |
simple_prediction(api_key)
|
365 |
with gr.Tab("📊 Model Comparison"):
|
366 |
model_comparison(api_key)
|
|
|
39 |
|
40 |
|
41 |
MODEL_CHOICES = [
|
42 |
+
("AlphaFold2", FoldingModel.AF2),
|
43 |
+
("OpenFold", FoldingModel.OPENFOLD),
|
44 |
# ("SoloSeq", FoldingModel.SOLOSEQ),
|
45 |
("Boltz-1", FoldingModel.BOLTZ),
|
46 |
("Chai-1", FoldingModel.CHAI),
|
|
|
49 |
|
50 |
DEFAULT_SEQ = "MALWMRLLPLLALLALWGPDPAAA"
|
51 |
MODEL_EXAMPLES = {
|
52 |
+
FoldingModel.AF2: [
|
53 |
+
["Monomer", f">A\n{DEFAULT_SEQ}"],
|
54 |
+
["Multimer", f">A\n{DEFAULT_SEQ}\n>B\n{DEFAULT_SEQ}"],
|
55 |
+
],
|
56 |
+
FoldingModel.OPENFOLD: [
|
57 |
+
["Monomer", f">A\n{DEFAULT_SEQ}"],
|
58 |
+
["Multimer", f">A\n{DEFAULT_SEQ}\n>B\n{DEFAULT_SEQ}"],
|
59 |
+
],
|
60 |
+
FoldingModel.SOLOSEQ: [["Monomer", f">A\n{DEFAULT_SEQ}"]],
|
61 |
FoldingModel.BOLTZ: [
|
62 |
["Monomer", f">A|protein\n{DEFAULT_SEQ}"],
|
63 |
["Multimer", f">A|protein\n{DEFAULT_SEQ}\n>B|protein\n{DEFAULT_SEQ}"],
|
|
|
79 |
Returns:
|
80 |
gr.Textbox: Sequence input component
|
81 |
"""
|
82 |
+
with gr.Row(equal_height=True):
|
83 |
+
with gr.Column():
|
84 |
+
sequence = gr.Textbox(
|
85 |
+
label="Protein Sequence",
|
86 |
+
lines=2,
|
87 |
+
placeholder="Enter a protein sequence or upload a FASTA file",
|
88 |
+
)
|
89 |
+
dummy = gr.Textbox(label="Complex type", visible=False)
|
90 |
+
|
91 |
+
examples = gr.Examples(
|
92 |
+
examples=MODEL_EXAMPLES[FoldingModel.BOLTZ],
|
93 |
+
inputs=[dummy, sequence],
|
94 |
+
)
|
95 |
+
file_input = gr.File(
|
96 |
+
label="Upload a FASTA file",
|
97 |
+
file_types=[".fasta", ".fa"],
|
98 |
+
scale=0,
|
99 |
+
)
|
100 |
|
|
|
|
|
|
|
|
|
101 |
if dropdown is not None:
|
102 |
dropdown.change(
|
103 |
fn=lambda x: gr.Dataset(samples=MODEL_EXAMPLES[x]),
|
104 |
inputs=[dropdown],
|
105 |
outputs=[examples.dataset],
|
106 |
)
|
|
|
|
|
|
|
|
|
107 |
|
108 |
def _process_file(file: gr.File | None) -> gr.Textbox:
|
109 |
if file is None:
|
|
|
128 |
"""
|
129 |
gr.Markdown(
|
130 |
"""
|
131 |
+
## Predict a Protein Structure
|
132 |
|
133 |
It will be run in the background and the results will be displayed in the output section.
|
134 |
The output will contain the protein structure and the pLDDT plot.
|
|
|
170 |
Args:
|
171 |
api_key (str): Folding Studio API key
|
172 |
"""
|
173 |
+
gr.Markdown(
|
174 |
+
"""
|
175 |
+
## Compare Folding Models
|
176 |
|
177 |
+
Select multiple models to compare their predictions on your protein sequence.
|
178 |
+
You can either enter the sequence directly or upload a FASTA file.
|
179 |
+
|
180 |
+
The selected models will run in parallel and generate:
|
181 |
+
- 3D structures of your protein that you can visualize and compare
|
182 |
+
- pLDDT confidence scores plotted for each residue
|
183 |
+
|
184 |
+
"""
|
185 |
+
)
|
186 |
with gr.Row():
|
187 |
models = gr.CheckboxGroup(
|
188 |
label="Model",
|
|
|
201 |
variant="primary",
|
202 |
)
|
203 |
with gr.Row():
|
204 |
+
af2_predictions = gr.CheckboxGroup(label="AlphaFold2", visible=False)
|
205 |
+
openfold_predictions = gr.CheckboxGroup(label="OpenFold", visible=False)
|
206 |
+
solo_predictions = gr.CheckboxGroup(label="SoloSeq", visible=False)
|
207 |
chai_predictions = gr.CheckboxGroup(label="Chai", visible=False)
|
208 |
protenix_predictions = gr.CheckboxGroup(label="Protenix", visible=False)
|
209 |
boltz_predictions = gr.CheckboxGroup(label="Boltz", visible=False)
|
|
|
214 |
metrics_plot = gr.Plot(label="pLDDT")
|
215 |
|
216 |
# Store the initial predictions
|
217 |
+
prediction_outputs = gr.State()
|
|
|
218 |
|
219 |
predict_btn.click(
|
220 |
fn=predict_comparison,
|
221 |
inputs=[sequence, api_key, models],
|
222 |
outputs=[
|
223 |
+
prediction_outputs,
|
224 |
+
af2_predictions,
|
225 |
+
openfold_predictions,
|
226 |
+
solo_predictions,
|
227 |
chai_predictions,
|
228 |
boltz_predictions,
|
229 |
protenix_predictions,
|
|
|
|
|
230 |
],
|
231 |
+
).then(
|
232 |
+
fn=filter_predictions,
|
233 |
+
inputs=[
|
234 |
+
prediction_outputs,
|
235 |
+
af2_predictions,
|
236 |
+
openfold_predictions,
|
237 |
+
solo_predictions,
|
238 |
+
chai_predictions,
|
239 |
+
boltz_predictions,
|
240 |
+
protenix_predictions,
|
241 |
+
],
|
242 |
+
outputs=[mol_outputs, metrics_plot],
|
243 |
)
|
244 |
|
245 |
# Handle checkbox changes
|
246 |
+
for checkbox in [
|
247 |
+
af2_predictions,
|
248 |
+
openfold_predictions,
|
249 |
+
solo_predictions,
|
250 |
+
chai_predictions,
|
251 |
+
boltz_predictions,
|
252 |
+
protenix_predictions,
|
253 |
+
]:
|
254 |
checkbox.change(
|
255 |
fn=filter_predictions,
|
256 |
inputs=[
|
257 |
+
prediction_outputs,
|
258 |
+
af2_predictions,
|
259 |
+
openfold_predictions,
|
260 |
+
solo_predictions,
|
261 |
chai_predictions,
|
262 |
boltz_predictions,
|
263 |
protenix_predictions,
|
|
|
292 |
"antigen_sequence": "Antigen Sequence",
|
293 |
}
|
294 |
spr_data_with_scores = spr_data_with_scores.rename(columns=prettified_columns)
|
295 |
+
columns = [
|
296 |
+
"Antibody Name",
|
297 |
+
"KD (nM)",
|
298 |
+
"Antibody VH Sequence",
|
299 |
+
"Antibody VL Sequence",
|
300 |
+
"Antigen Sequence",
|
301 |
+
]
|
302 |
+
# Display dataframe with floating point values rounded to 2 decimal places
|
303 |
+
spr_data = gr.DataFrame(
|
304 |
+
value=spr_data_with_scores[columns].round(2),
|
305 |
+
label="Experimental Antibody-Antigen Binding Affinity Data",
|
306 |
+
)
|
|
|
307 |
|
308 |
gr.Markdown("# Prediction and correlation")
|
309 |
+
|
310 |
+
fake_predict_btn = gr.Button(
|
311 |
+
"Predict structures of all complexes",
|
312 |
+
elem_classes="gradient-button",
|
313 |
+
variant="primary",
|
314 |
+
)
|
315 |
+
prediction_dataframe = gr.Dataframe(
|
316 |
+
label="Predicted Structures Data", visible=False
|
317 |
+
)
|
318 |
+
prediction_dataframe.change(
|
319 |
+
fn=lambda x: gr.Dataframe(x, visible=True),
|
320 |
+
inputs=[prediction_dataframe],
|
321 |
+
outputs=[prediction_dataframe],
|
322 |
+
)
|
323 |
+
with gr.Row(visible=False) as correlation_row:
|
324 |
+
with gr.Column(scale=0):
|
|
|
|
|
|
|
|
|
325 |
with gr.Row():
|
326 |
+
correlation_type = gr.Radio(
|
327 |
+
choices=["Spearman", "Pearson"],
|
328 |
+
value="Spearman",
|
329 |
+
label="Correlation Type",
|
330 |
+
interactive=True,
|
331 |
+
min_width=150,
|
332 |
)
|
|
|
333 |
with gr.Row():
|
334 |
log_scale = gr.Checkbox(
|
335 |
+
label="Use log scale for KD",
|
336 |
+
value=False,
|
337 |
+
min_width=150,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
338 |
)
|
339 |
+
with gr.Column():
|
340 |
+
correlation_ranking_plot = gr.Plot(label="Correlation ranking")
|
341 |
+
with gr.Row(visible=False) as regression_row:
|
342 |
+
with gr.Column(scale=0):
|
343 |
+
|
344 |
+
# User can select the columns to display in the correlation plot
|
345 |
+
correlation_column = gr.Dropdown(
|
346 |
+
label="Score data to display",
|
347 |
+
choices=SCORE_COLUMNS,
|
348 |
+
multiselect=False,
|
349 |
+
value=SCORE_COLUMNS[0],
|
350 |
+
)
|
351 |
+
score_description = gr.Markdown(
|
352 |
+
get_score_description(correlation_column.value)
|
353 |
+
)
|
354 |
+
correlation_column.change(
|
355 |
+
fn=lambda x: get_score_description(x),
|
356 |
+
inputs=correlation_column,
|
357 |
+
outputs=score_description,
|
358 |
+
)
|
359 |
with gr.Column():
|
360 |
regression_plot = gr.Plot(label="Correlation with binding affinity")
|
361 |
|
362 |
fake_predict_btn.click(
|
363 |
+
fn=lambda x: (
|
364 |
+
*fake_predict_and_correlate(
|
365 |
+
spr_data_with_scores, SCORE_COLUMNS, ["Antibody Name", "KD (nM)"]
|
366 |
+
),
|
367 |
+
gr.Row(visible=True),
|
368 |
+
gr.Row(visible=True)
|
369 |
),
|
370 |
inputs=[correlation_type],
|
371 |
+
outputs=[
|
372 |
+
prediction_dataframe,
|
373 |
+
correlation_ranking_plot,
|
374 |
+
regression_plot,
|
375 |
+
correlation_row,
|
376 |
+
regression_row,
|
377 |
+
],
|
378 |
)
|
379 |
|
380 |
+
def update_plots_with_log(correlation_type, score, use_log):
|
|
|
|
|
|
|
381 |
logger.info(f"Updating correlation plot for {correlation_type}")
|
382 |
corr_data = compute_correlation_data(spr_data_with_scores, SCORE_COLUMNS)
|
383 |
logger.info(f"Correlation data: {corr_data}")
|
384 |
+
corr_ranking_plot = plot_correlation_ranking(corr_data, correlation_type, kd_col="KD (nM)" if not use_log else "log_kd")
|
385 |
+
regression_plot = make_regression_plot(spr_data_with_scores, score, use_log)
|
386 |
+
return regression_plot, corr_ranking_plot
|
387 |
|
388 |
correlation_column.change(
|
389 |
+
fn=update_plots_with_log,
|
390 |
+
inputs=[correlation_type, correlation_column, log_scale],
|
391 |
+
outputs=[regression_plot, correlation_ranking_plot],
|
392 |
)
|
393 |
|
394 |
correlation_type.change(
|
395 |
+
fn=update_plots_with_log,
|
396 |
+
inputs=[correlation_type, correlation_column, log_scale],
|
397 |
+
outputs=[regression_plot, correlation_ranking_plot],
|
398 |
)
|
|
|
399 |
log_scale.change(
|
400 |
+
fn=update_plots_with_log,
|
401 |
+
inputs=[correlation_type, correlation_column, log_scale],
|
402 |
+
outputs=[regression_plot, correlation_ranking_plot],
|
403 |
)
|
404 |
|
405 |
|
|
|
425 |
)
|
426 |
api_key = gr.Textbox(label="Folding Studio API Key", type="password")
|
427 |
gr.Markdown("## Demo Usage")
|
428 |
+
with gr.Tab("🚀 Basic Folding"):
|
429 |
simple_prediction(api_key)
|
430 |
with gr.Tab("📊 Model Comparison"):
|
431 |
model_comparison(api_key)
|
folding_studio_demo/correlate.py
CHANGED
@@ -1,9 +1,10 @@
|
|
1 |
import logging
|
2 |
-
import pandas as pd
|
3 |
from pathlib import Path
|
|
|
4 |
import numpy as np
|
|
|
5 |
import plotly.graph_objects as go
|
6 |
-
from scipy.stats import
|
7 |
|
8 |
logger = logging.getLogger(__name__)
|
9 |
|
@@ -16,7 +17,7 @@ SCORE_COLUMN_NAMES = {
|
|
16 |
"complex_pde_boltz": "Boltz Complex pDE",
|
17 |
"complex_ipde_boltz": "Boltz Complex ipDE",
|
18 |
"interchain_pae_monomer": "AlphaFold2 GapTrick Interchain PAE",
|
19 |
-
"interface_pae_monomer": "AlphaFold2 GapTrick Interface PAE",
|
20 |
"overall_pae_monomer": "AlphaFold2 GapTrick Overall PAE",
|
21 |
"interface_plddt_monomer": "AlphaFold2 GapTrick Interface pLDDT",
|
22 |
"average_plddt_monomer": "AlphaFold2 GapTrick Average pLDDT",
|
@@ -24,15 +25,16 @@ SCORE_COLUMN_NAMES = {
|
|
24 |
"interface_ptm_monomer": "AlphaFold2 GapTrick Interface pTM",
|
25 |
"interchain_pae_multimer": "AlphaFold2 Multimer Interchain PAE",
|
26 |
"interface_pae_multimer": "AlphaFold2 Multimer Interface PAE",
|
27 |
-
"overall_pae_multimer": "AlphaFold2 Multimer Overall PAE",
|
28 |
"interface_plddt_multimer": "AlphaFold2 Multimer Interface pLDDT",
|
29 |
"average_plddt_multimer": "AlphaFold2 Multimer Average pLDDT",
|
30 |
"ptm_multimer": "AlphaFold2 Multimer pTM Score",
|
31 |
-
"interface_ptm_multimer": "AlphaFold2 Multimer Interface pTM"
|
32 |
}
|
33 |
|
34 |
SCORE_COLUMNS = list(SCORE_COLUMN_NAMES.values())
|
35 |
|
|
|
36 |
def get_score_description(score: str) -> str:
|
37 |
descriptions = {
|
38 |
"Boltz Confidence Score": "The Boltz model confidence score provides an overall assessment of prediction quality (0-1, higher is better).",
|
@@ -49,80 +51,99 @@ def get_score_description(score: str) -> str:
|
|
49 |
"AlphaFold2 GapTrick Average pLDDT": "The AlphaFold2 GapTrick model average pLDDT provides the mean confidence across all residues in monomeric predictions (0-100, higher is better).",
|
50 |
"AlphaFold2 GapTrick pTM Score": "The AlphaFold2 GapTrick model pTM score assesses overall fold accuracy in monomeric predictions (0-1, higher is better).",
|
51 |
"AlphaFold2 GapTrick Interface pTM": "The AlphaFold2 GapTrick model interface pTM specifically evaluates accuracy of interface regions in monomeric predictions (0-1, higher is better).",
|
52 |
-
"AlphaFold2
|
53 |
-
"AlphaFold2 Multimer Interface PAE": "The AlphaFold2 Multimer model interface PAE estimates position errors specifically at interfaces in multimeric predictions (lower is better).",
|
54 |
"AlphaFold2 Multimer Overall PAE": "The AlphaFold2 Multimer model overall PAE estimates position errors across the entire structure in multimeric predictions (lower is better).",
|
55 |
"AlphaFold2 Multimer Interface pLDDT": "The AlphaFold2 Multimer model interface pLDDT measures confidence in interface region predictions for multimeric models (0-100, higher is better).",
|
56 |
"AlphaFold2 Multimer Average pLDDT": "The AlphaFold2 Multimer model average pLDDT provides the mean confidence across all residues in multimeric predictions (0-100, higher is better).",
|
57 |
"AlphaFold2 Multimer pTM Score": "The AlphaFold2 Multimer model pTM score assesses overall fold accuracy in multimeric predictions (0-1, higher is better).",
|
58 |
-
"AlphaFold2 Multimer Interface pTM": "The AlphaFold2 Multimer model interface pTM specifically evaluates accuracy of interface regions in multimeric predictions (0-1, higher is better)."
|
59 |
}
|
60 |
return descriptions.get(score, "No description available for this score.")
|
61 |
|
62 |
-
|
|
|
|
|
|
|
63 |
corr_data_file = Path("corr_data.csv")
|
64 |
if corr_data_file.exists():
|
65 |
logger.info(f"Loading correlation data from {corr_data_file}")
|
66 |
return pd.read_csv(corr_data_file)
|
67 |
-
|
68 |
corr_data = []
|
69 |
spr_data_with_scores["log_kd"] = np.log10(spr_data_with_scores["KD (nM)"])
|
70 |
kd_col = "KD (nM)"
|
71 |
corr_funcs = {}
|
72 |
corr_funcs["Spearman"] = spearmanr
|
73 |
corr_funcs["Pearson"] = pearsonr
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
"
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
88 |
|
89 |
corr_data = pd.DataFrame(corr_data)
|
90 |
# Find the lines in corr_data with NaN values and remove them
|
91 |
corr_data = corr_data[corr_data["correlation"].notna()]
|
92 |
# Sort correlation data by correlation value
|
93 |
-
corr_data = corr_data.sort_values(
|
94 |
-
|
95 |
corr_data.to_csv("corr_data.csv", index=False)
|
96 |
-
|
97 |
return corr_data
|
98 |
|
99 |
-
|
|
|
|
|
|
|
100 |
# Create bar plot of correlations
|
101 |
-
data = corr_data[
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
|
|
|
|
|
|
|
|
|
|
112 |
corr_ranking_plot.update_layout(
|
113 |
title="Correlation with Binding Affinity",
|
114 |
yaxis_title="Score",
|
115 |
xaxis_title=correlation_type,
|
116 |
template="simple_white",
|
117 |
-
showlegend=False
|
118 |
)
|
119 |
return corr_ranking_plot
|
120 |
|
121 |
-
|
|
|
|
|
|
|
122 |
"""Fake predict structures of all complexes and correlate the results."""
|
123 |
-
|
124 |
corr_data = compute_correlation_data(spr_data_with_scores, score_cols)
|
125 |
-
corr_ranking_plot = plot_correlation_ranking(corr_data, "Spearman")
|
126 |
|
127 |
cols_to_show = main_cols[:]
|
128 |
cols_to_show.extend(score_cols)
|
@@ -131,17 +152,20 @@ def fake_predict_and_correlate(spr_data_with_scores: pd.DataFrame, score_cols: l
|
|
131 |
|
132 |
return spr_data_with_scores[cols_to_show].round(2), corr_ranking_plot, corr_plot
|
133 |
|
134 |
-
|
|
|
|
|
|
|
135 |
"""Select the regression plot to display."""
|
136 |
# corr_plot is a scatter plot of the regression between the binding affinity and each of the scores
|
137 |
-
scatter =
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
corr_plot = go.Figure(data=scatter)
|
146 |
corr_plot.update_layout(
|
147 |
xaxis_title="KD (nM)",
|
@@ -154,7 +178,7 @@ def make_regression_plot(spr_data_with_scores: pd.DataFrame, score: str, use_log
|
|
154 |
xanchor="right",
|
155 |
x=1,
|
156 |
),
|
157 |
-
xaxis_type="log" if use_log else "linear" # Set x-axis to logarithmic scale
|
158 |
)
|
159 |
# compute the regression line
|
160 |
if use_log:
|
@@ -162,23 +186,25 @@ def make_regression_plot(spr_data_with_scores: pd.DataFrame, score: str, use_log
|
|
162 |
x_vals = np.log10(spr_data_with_scores["KD (nM)"])
|
163 |
else:
|
164 |
x_vals = spr_data_with_scores["KD (nM)"]
|
165 |
-
|
166 |
# Fit line to data
|
167 |
corr_line = np.polyfit(x_vals, spr_data_with_scores[score], 1)
|
168 |
-
|
169 |
# Generate x points for line
|
170 |
corr_line_x = np.linspace(min(x_vals), max(x_vals), 100)
|
171 |
corr_line_y = corr_line[0] * corr_line_x + corr_line[1]
|
172 |
-
|
173 |
# Convert back from log space if needed
|
174 |
if use_log:
|
175 |
corr_line_x = 10**corr_line_x
|
176 |
# add the regression line to the plot
|
177 |
-
corr_plot.add_trace(
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
|
|
|
|
|
1 |
import logging
|
|
|
2 |
from pathlib import Path
|
3 |
+
|
4 |
import numpy as np
|
5 |
+
import pandas as pd
|
6 |
import plotly.graph_objects as go
|
7 |
+
from scipy.stats import linregress, pearsonr, spearmanr
|
8 |
|
9 |
logger = logging.getLogger(__name__)
|
10 |
|
|
|
17 |
"complex_pde_boltz": "Boltz Complex pDE",
|
18 |
"complex_ipde_boltz": "Boltz Complex ipDE",
|
19 |
"interchain_pae_monomer": "AlphaFold2 GapTrick Interchain PAE",
|
20 |
+
"interface_pae_monomer": "AlphaFold2 GapTrick Interface PAE",
|
21 |
"overall_pae_monomer": "AlphaFold2 GapTrick Overall PAE",
|
22 |
"interface_plddt_monomer": "AlphaFold2 GapTrick Interface pLDDT",
|
23 |
"average_plddt_monomer": "AlphaFold2 GapTrick Average pLDDT",
|
|
|
25 |
"interface_ptm_monomer": "AlphaFold2 GapTrick Interface pTM",
|
26 |
"interchain_pae_multimer": "AlphaFold2 Multimer Interchain PAE",
|
27 |
"interface_pae_multimer": "AlphaFold2 Multimer Interface PAE",
|
28 |
+
"overall_pae_multimer": "AlphaFold2 Multimer Overall PAE",
|
29 |
"interface_plddt_multimer": "AlphaFold2 Multimer Interface pLDDT",
|
30 |
"average_plddt_multimer": "AlphaFold2 Multimer Average pLDDT",
|
31 |
"ptm_multimer": "AlphaFold2 Multimer pTM Score",
|
32 |
+
"interface_ptm_multimer": "AlphaFold2 Multimer Interface pTM",
|
33 |
}
|
34 |
|
35 |
SCORE_COLUMNS = list(SCORE_COLUMN_NAMES.values())
|
36 |
|
37 |
+
|
38 |
def get_score_description(score: str) -> str:
|
39 |
descriptions = {
|
40 |
"Boltz Confidence Score": "The Boltz model confidence score provides an overall assessment of prediction quality (0-1, higher is better).",
|
|
|
51 |
"AlphaFold2 GapTrick Average pLDDT": "The AlphaFold2 GapTrick model average pLDDT provides the mean confidence across all residues in monomeric predictions (0-100, higher is better).",
|
52 |
"AlphaFold2 GapTrick pTM Score": "The AlphaFold2 GapTrick model pTM score assesses overall fold accuracy in monomeric predictions (0-1, higher is better).",
|
53 |
"AlphaFold2 GapTrick Interface pTM": "The AlphaFold2 GapTrick model interface pTM specifically evaluates accuracy of interface regions in monomeric predictions (0-1, higher is better).",
|
54 |
+
"AlphaFold2 Multimer Interface PAE": "The AlphaFold2 Multimer model interface PAE estimates position errors specifically at interfaces in multimeric predictions (lower is better).",
|
|
|
55 |
"AlphaFold2 Multimer Overall PAE": "The AlphaFold2 Multimer model overall PAE estimates position errors across the entire structure in multimeric predictions (lower is better).",
|
56 |
"AlphaFold2 Multimer Interface pLDDT": "The AlphaFold2 Multimer model interface pLDDT measures confidence in interface region predictions for multimeric models (0-100, higher is better).",
|
57 |
"AlphaFold2 Multimer Average pLDDT": "The AlphaFold2 Multimer model average pLDDT provides the mean confidence across all residues in multimeric predictions (0-100, higher is better).",
|
58 |
"AlphaFold2 Multimer pTM Score": "The AlphaFold2 Multimer model pTM score assesses overall fold accuracy in multimeric predictions (0-1, higher is better).",
|
59 |
+
"AlphaFold2 Multimer Interface pTM": "The AlphaFold2 Multimer model interface pTM specifically evaluates accuracy of interface regions in multimeric predictions (0-1, higher is better).",
|
60 |
}
|
61 |
return descriptions.get(score, "No description available for this score.")
|
62 |
|
63 |
+
|
64 |
+
def compute_correlation_data(
|
65 |
+
spr_data_with_scores: pd.DataFrame, score_cols: list[str]
|
66 |
+
) -> pd.DataFrame:
|
67 |
corr_data_file = Path("corr_data.csv")
|
68 |
if corr_data_file.exists():
|
69 |
logger.info(f"Loading correlation data from {corr_data_file}")
|
70 |
return pd.read_csv(corr_data_file)
|
71 |
+
|
72 |
corr_data = []
|
73 |
spr_data_with_scores["log_kd"] = np.log10(spr_data_with_scores["KD (nM)"])
|
74 |
kd_col = "KD (nM)"
|
75 |
corr_funcs = {}
|
76 |
corr_funcs["Spearman"] = spearmanr
|
77 |
corr_funcs["Pearson"] = pearsonr
|
78 |
+
for kd_col in ["KD (nM)", "log_kd"]:
|
79 |
+
for correlation_type, corr_func in corr_funcs.items():
|
80 |
+
for score_col in score_cols:
|
81 |
+
logger.info(
|
82 |
+
f"Computing {correlation_type} correlation between {score_col} and {kd_col}"
|
83 |
+
)
|
84 |
+
res = corr_func(
|
85 |
+
spr_data_with_scores[kd_col], spr_data_with_scores[score_col]
|
86 |
+
)
|
87 |
+
logger.info(f"Correlation function: {corr_func}")
|
88 |
+
correlation_value = res.statistic
|
89 |
+
corr_data.append(
|
90 |
+
{
|
91 |
+
"correlation_type": correlation_type,
|
92 |
+
"kd_col": kd_col,
|
93 |
+
"score": score_col,
|
94 |
+
"correlation": correlation_value,
|
95 |
+
"p-value": res.pvalue,
|
96 |
+
}
|
97 |
+
)
|
98 |
|
99 |
corr_data = pd.DataFrame(corr_data)
|
100 |
# Find the lines in corr_data with NaN values and remove them
|
101 |
corr_data = corr_data[corr_data["correlation"].notna()]
|
102 |
# Sort correlation data by correlation value
|
103 |
+
corr_data = corr_data.sort_values("correlation", ascending=True)
|
104 |
+
|
105 |
corr_data.to_csv("corr_data.csv", index=False)
|
106 |
+
|
107 |
return corr_data
|
108 |
|
109 |
+
|
110 |
+
def plot_correlation_ranking(
|
111 |
+
corr_data: pd.DataFrame, correlation_type: str, kd_col: str
|
112 |
+
) -> go.Figure:
|
113 |
# Create bar plot of correlations
|
114 |
+
data = corr_data[
|
115 |
+
(corr_data["correlation_type"] == correlation_type)
|
116 |
+
& (corr_data["kd_col"] == kd_col)
|
117 |
+
]
|
118 |
+
corr_ranking_plot = go.Figure(
|
119 |
+
data=[
|
120 |
+
go.Bar(
|
121 |
+
x=data["correlation"],
|
122 |
+
y=data["score"],
|
123 |
+
name=correlation_type,
|
124 |
+
text=data["correlation"],
|
125 |
+
orientation="h",
|
126 |
+
hovertemplate="<i>Score:</i> %{y}<br><i>Correlation:</i> %{x:.3f}<br>",
|
127 |
+
)
|
128 |
+
]
|
129 |
+
)
|
130 |
corr_ranking_plot.update_layout(
|
131 |
title="Correlation with Binding Affinity",
|
132 |
yaxis_title="Score",
|
133 |
xaxis_title=correlation_type,
|
134 |
template="simple_white",
|
135 |
+
showlegend=False,
|
136 |
)
|
137 |
return corr_ranking_plot
|
138 |
|
139 |
+
|
140 |
+
def fake_predict_and_correlate(
|
141 |
+
spr_data_with_scores: pd.DataFrame, score_cols: list[str], main_cols: list[str]
|
142 |
+
) -> tuple[pd.DataFrame, go.Figure]:
|
143 |
"""Fake predict structures of all complexes and correlate the results."""
|
144 |
+
|
145 |
corr_data = compute_correlation_data(spr_data_with_scores, score_cols)
|
146 |
+
corr_ranking_plot = plot_correlation_ranking(corr_data, "Spearman", kd_col="KD (nM)")
|
147 |
|
148 |
cols_to_show = main_cols[:]
|
149 |
cols_to_show.extend(score_cols)
|
|
|
152 |
|
153 |
return spr_data_with_scores[cols_to_show].round(2), corr_ranking_plot, corr_plot
|
154 |
|
155 |
+
|
156 |
+
def make_regression_plot(
|
157 |
+
spr_data_with_scores: pd.DataFrame, score: str, use_log: bool
|
158 |
+
) -> go.Figure:
|
159 |
"""Select the regression plot to display."""
|
160 |
# corr_plot is a scatter plot of the regression between the binding affinity and each of the scores
|
161 |
+
scatter = go.Scatter(
|
162 |
+
x=spr_data_with_scores["KD (nM)"],
|
163 |
+
y=spr_data_with_scores[score],
|
164 |
+
name=f"Samples",
|
165 |
+
mode="markers", # Only show markers/dots, no lines
|
166 |
+
hovertemplate="<i>Score:</i> %{y}<br><i>KD:</i> %{x:.2f}<br>",
|
167 |
+
marker=dict(color="#1f77b4"), # Set color to match default first color
|
168 |
+
)
|
169 |
corr_plot = go.Figure(data=scatter)
|
170 |
corr_plot.update_layout(
|
171 |
xaxis_title="KD (nM)",
|
|
|
178 |
xanchor="right",
|
179 |
x=1,
|
180 |
),
|
181 |
+
xaxis_type="log" if use_log else "linear", # Set x-axis to logarithmic scale
|
182 |
)
|
183 |
# compute the regression line
|
184 |
if use_log:
|
|
|
186 |
x_vals = np.log10(spr_data_with_scores["KD (nM)"])
|
187 |
else:
|
188 |
x_vals = spr_data_with_scores["KD (nM)"]
|
189 |
+
|
190 |
# Fit line to data
|
191 |
corr_line = np.polyfit(x_vals, spr_data_with_scores[score], 1)
|
192 |
+
|
193 |
# Generate x points for line
|
194 |
corr_line_x = np.linspace(min(x_vals), max(x_vals), 100)
|
195 |
corr_line_y = corr_line[0] * corr_line_x + corr_line[1]
|
196 |
+
|
197 |
# Convert back from log space if needed
|
198 |
if use_log:
|
199 |
corr_line_x = 10**corr_line_x
|
200 |
# add the regression line to the plot
|
201 |
+
corr_plot.add_trace(
|
202 |
+
go.Scatter(
|
203 |
+
x=corr_line_x,
|
204 |
+
y=corr_line_y,
|
205 |
+
mode="lines",
|
206 |
+
name=f"Regression line",
|
207 |
+
line=dict(color="#1f77b4"), # Set same color as scatter points
|
208 |
+
)
|
209 |
+
)
|
210 |
+
return corr_plot
|
folding_studio_demo/model_fasta_validators.py
CHANGED
@@ -248,15 +248,15 @@ class ChaiFastaValidator(BaseFastaValidator):
|
|
248 |
)
|
249 |
seen_names.add(name)
|
250 |
# validate sequence format
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
|
261 |
return True, None
|
262 |
|
|
|
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 |
|
folding_studio_demo/models.py
CHANGED
@@ -1,17 +1,26 @@
|
|
1 |
"""Models for the Folding Studio API."""
|
2 |
|
|
|
3 |
import logging
|
4 |
import os
|
|
|
|
|
|
|
5 |
from pathlib import Path
|
6 |
from typing import Any
|
7 |
|
8 |
import gradio as gr
|
9 |
import numpy as np
|
|
|
10 |
from folding_studio.client import Client
|
|
|
|
|
11 |
from folding_studio.query import Query
|
12 |
from folding_studio.query.boltz import BoltzQuery
|
13 |
from folding_studio.query.chai import ChaiQuery
|
14 |
from folding_studio.query.protenix import ProtenixQuery
|
|
|
|
|
15 |
|
16 |
from folding_studio_demo.model_fasta_validators import (
|
17 |
BaseFastaValidator,
|
@@ -20,15 +29,29 @@ from folding_studio_demo.model_fasta_validators import (
|
|
20 |
ProtenixFastaValidator,
|
21 |
)
|
22 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
logger = logging.getLogger(__name__)
|
24 |
|
25 |
|
26 |
class AF3Model:
|
27 |
-
|
28 |
-
|
29 |
-
):
|
30 |
self.api_key = api_key
|
31 |
-
self.model_name = model_name
|
32 |
self.query = query
|
33 |
self.validator = validator
|
34 |
|
@@ -116,8 +139,10 @@ class AF3Model:
|
|
116 |
|
117 |
|
118 |
class ChaiModel(AF3Model):
|
|
|
|
|
119 |
def __init__(self, api_key: str):
|
120 |
-
super().__init__(api_key,
|
121 |
|
122 |
def call(
|
123 |
self, seq_file: Path | str, output_dir: Path, format_fasta: bool = False
|
@@ -158,8 +183,10 @@ class ChaiModel(AF3Model):
|
|
158 |
|
159 |
|
160 |
class ProtenixModel(AF3Model):
|
|
|
|
|
161 |
def __init__(self, api_key: str):
|
162 |
-
super().__init__(api_key,
|
163 |
|
164 |
def call(
|
165 |
self, seq_file: Path | str, output_dir: Path, format_fasta: bool = False
|
@@ -179,8 +206,10 @@ class ProtenixModel(AF3Model):
|
|
179 |
|
180 |
|
181 |
class BoltzModel(AF3Model):
|
|
|
|
|
182 |
def __init__(self, api_key: str):
|
183 |
-
super().__init__(api_key,
|
184 |
|
185 |
def call(
|
186 |
self, seq_file: Path | str, output_dir: Path, format_fasta: bool = False
|
@@ -205,3 +234,113 @@ class BoltzModel(AF3Model):
|
|
205 |
}
|
206 |
for cif_path in prediction_paths
|
207 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
"""Models for the Folding Studio API."""
|
2 |
|
3 |
+
import json
|
4 |
import logging
|
5 |
import os
|
6 |
+
import sys
|
7 |
+
import time
|
8 |
+
from io import StringIO
|
9 |
from pathlib import Path
|
10 |
from typing import Any
|
11 |
|
12 |
import gradio as gr
|
13 |
import numpy as np
|
14 |
+
from folding_studio import single_job_prediction
|
15 |
from folding_studio.client import Client
|
16 |
+
from folding_studio.commands.experiment import results as get_results
|
17 |
+
from folding_studio.commands.experiment import status as get_status
|
18 |
from folding_studio.query import Query
|
19 |
from folding_studio.query.boltz import BoltzQuery
|
20 |
from folding_studio.query.chai import ChaiQuery
|
21 |
from folding_studio.query.protenix import ProtenixQuery
|
22 |
+
from folding_studio_data_models import AF2Parameters, OpenFoldParameters
|
23 |
+
from folding_studio_data_models.parameters.base import BaseFoldingParameters
|
24 |
|
25 |
from folding_studio_demo.model_fasta_validators import (
|
26 |
BaseFastaValidator,
|
|
|
29 |
ProtenixFastaValidator,
|
30 |
)
|
31 |
|
32 |
+
|
33 |
+
class Capturing(list):
|
34 |
+
"""Capture stdout output."""
|
35 |
+
|
36 |
+
def __enter__(self):
|
37 |
+
self._stdout = sys.stdout
|
38 |
+
sys.stdout = self._stringio = StringIO()
|
39 |
+
return self
|
40 |
+
|
41 |
+
def __exit__(self, *args):
|
42 |
+
self.extend(self._stringio.getvalue().splitlines())
|
43 |
+
del self._stringio # free up some memory
|
44 |
+
sys.stdout = self._stdout
|
45 |
+
|
46 |
+
|
47 |
logger = logging.getLogger(__name__)
|
48 |
|
49 |
|
50 |
class AF3Model:
|
51 |
+
model_name = None
|
52 |
+
|
53 |
+
def __init__(self, api_key: str, query: Query, validator: BaseFastaValidator):
|
54 |
self.api_key = api_key
|
|
|
55 |
self.query = query
|
56 |
self.validator = validator
|
57 |
|
|
|
139 |
|
140 |
|
141 |
class ChaiModel(AF3Model):
|
142 |
+
model_name = "Chai"
|
143 |
+
|
144 |
def __init__(self, api_key: str):
|
145 |
+
super().__init__(api_key, ChaiQuery, ChaiFastaValidator())
|
146 |
|
147 |
def call(
|
148 |
self, seq_file: Path | str, output_dir: Path, format_fasta: bool = False
|
|
|
183 |
|
184 |
|
185 |
class ProtenixModel(AF3Model):
|
186 |
+
model_name = "Protenix"
|
187 |
+
|
188 |
def __init__(self, api_key: str):
|
189 |
+
super().__init__(api_key, ProtenixQuery, ProtenixFastaValidator())
|
190 |
|
191 |
def call(
|
192 |
self, seq_file: Path | str, output_dir: Path, format_fasta: bool = False
|
|
|
206 |
|
207 |
|
208 |
class BoltzModel(AF3Model):
|
209 |
+
model_name = "Boltz"
|
210 |
+
|
211 |
def __init__(self, api_key: str):
|
212 |
+
super().__init__(api_key, BoltzQuery, BoltzFastaValidator())
|
213 |
|
214 |
def call(
|
215 |
self, seq_file: Path | str, output_dir: Path, format_fasta: bool = False
|
|
|
234 |
}
|
235 |
for cif_path in prediction_paths
|
236 |
}
|
237 |
+
|
238 |
+
|
239 |
+
class OldModel:
|
240 |
+
model_name = None
|
241 |
+
|
242 |
+
def __init__(self, api_key: str):
|
243 |
+
self.api_key = api_key
|
244 |
+
|
245 |
+
def call(
|
246 |
+
self,
|
247 |
+
seq_file: Path | str,
|
248 |
+
output_dir: Path,
|
249 |
+
parameters: BaseFoldingParameters,
|
250 |
+
*args,
|
251 |
+
**kwargs,
|
252 |
+
) -> None:
|
253 |
+
"""Predict protein structure from amino acid sequence using AF2 model.
|
254 |
+
|
255 |
+
Args:
|
256 |
+
seq_file (Path | str): Path to FASTA file containing amino acid sequence
|
257 |
+
output_dir (Path): Path to output directory
|
258 |
+
"""
|
259 |
+
output = single_job_prediction(
|
260 |
+
fasta_file=seq_file,
|
261 |
+
parameters=parameters,
|
262 |
+
)
|
263 |
+
experiment_id = output["message"]["experiment_id"]
|
264 |
+
done = False
|
265 |
+
while not done:
|
266 |
+
with Capturing() as output:
|
267 |
+
get_status(experiment_id)
|
268 |
+
status = output[0]
|
269 |
+
logger.info(f"Experiment {experiment_id} status: {status}")
|
270 |
+
if status == "Done":
|
271 |
+
done = True
|
272 |
+
logger.info("Downloading results")
|
273 |
+
get_results(
|
274 |
+
experiment_id,
|
275 |
+
force=True,
|
276 |
+
unzip=True,
|
277 |
+
output=output_dir / "results.zip",
|
278 |
+
)
|
279 |
+
logger.info("Results downloaded to %s", output_dir)
|
280 |
+
else:
|
281 |
+
logger.info("Sleeping for 10 seconds")
|
282 |
+
time.sleep(10)
|
283 |
+
|
284 |
+
def format_fasta(self, seq_file: Path | str) -> None:
|
285 |
+
"""Format sequence to FASTA format.
|
286 |
+
|
287 |
+
Args:
|
288 |
+
seq_file (Path | str): Path to FASTA file
|
289 |
+
"""
|
290 |
+
return
|
291 |
+
|
292 |
+
def predictions(self, output_dir: Path) -> dict[int, dict[str, Any]]:
|
293 |
+
"""Get the path to the prediction.
|
294 |
+
|
295 |
+
Args:
|
296 |
+
output_dir (Path): Path to output directory
|
297 |
+
|
298 |
+
Returns:
|
299 |
+
dict[int, dict[str, Any]]: Dictionary mapping model indices to their prediction paths and metrics
|
300 |
+
"""
|
301 |
+
prediction_paths = list(
|
302 |
+
(output_dir / "results").rglob("relaxed_model_[0-9]_ptm_pred_0.pdb")
|
303 |
+
)
|
304 |
+
metrics_path = output_dir / "results" / "metrics_per_model.json"
|
305 |
+
if not metrics_path.exists():
|
306 |
+
return {}
|
307 |
+
with open(metrics_path, "r") as f:
|
308 |
+
metrics = json.load(f)
|
309 |
+
output = {
|
310 |
+
int(pred_path.stem.split("_")[2]): {
|
311 |
+
"prediction_path": pred_path,
|
312 |
+
"metrics": metrics[f"model_{int(pred_path.stem.split('_')[2])}_ptm"],
|
313 |
+
}
|
314 |
+
for pred_path in prediction_paths
|
315 |
+
}
|
316 |
+
return output
|
317 |
+
|
318 |
+
def has_prediction(self, output_dir: Path) -> bool:
|
319 |
+
"""Check if prediction exists in output directory."""
|
320 |
+
return len(self.predictions(output_dir)) > 0
|
321 |
+
|
322 |
+
def check_file_description(self, seq_file: Path | str) -> tuple[bool, str | None]:
|
323 |
+
"""Check if the file description is correct.
|
324 |
+
|
325 |
+
Args:
|
326 |
+
seq_file (Path | str): Path to FASTA file
|
327 |
+
|
328 |
+
Returns:
|
329 |
+
tuple[bool, str | None]: Tuple containing a boolean indicating if the format is correct and an error message if not
|
330 |
+
"""
|
331 |
+
|
332 |
+
return True, None
|
333 |
+
|
334 |
+
|
335 |
+
class AF2Model(OldModel):
|
336 |
+
model_name = "AlphaFold2"
|
337 |
+
|
338 |
+
def call(self, seq_file: Path | str, output_dir: Path, *args, **kwargs) -> None:
|
339 |
+
super().call(seq_file, output_dir, AF2Parameters(), *args, **kwargs)
|
340 |
+
|
341 |
+
|
342 |
+
class OpenFoldModel(OldModel):
|
343 |
+
model_name = "OpenFold"
|
344 |
+
|
345 |
+
def call(self, seq_file: Path | str, output_dir: Path, *args, **kwargs) -> None:
|
346 |
+
super().call(seq_file, output_dir, OpenFoldParameters(), *args, **kwargs)
|
folding_studio_demo/predict.py
CHANGED
@@ -1,9 +1,11 @@
|
|
1 |
"""Predict protein structure using Folding Studio."""
|
2 |
|
|
|
3 |
import hashlib
|
4 |
import logging
|
5 |
from io import StringIO
|
6 |
from pathlib import Path
|
|
|
7 |
|
8 |
import gradio as gr
|
9 |
import numpy as np
|
@@ -12,7 +14,13 @@ from Bio import SeqIO
|
|
12 |
from Bio.PDB import PDBIO, MMCIFParser, PDBParser, Superimposer
|
13 |
from folding_studio_data_models import FoldingModel
|
14 |
|
15 |
-
from folding_studio_demo.models import
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
|
17 |
logger = logging.getLogger(__name__)
|
18 |
|
@@ -85,20 +93,22 @@ def convert_cif_to_pdb(cif_path: str, pdb_path: str) -> None:
|
|
85 |
def create_plddt_figure(
|
86 |
plddt_vals: list[list[float]],
|
87 |
model_name: str,
|
|
|
88 |
residue_codes: list[list[str]] = None,
|
89 |
) -> go.Figure:
|
90 |
"""Create a plot of metrics."""
|
91 |
plddt_traces = []
|
92 |
-
|
|
|
93 |
# Create hover text with residue codes if available
|
94 |
if residue_codes and i < len(residue_codes):
|
95 |
hover_text = [
|
96 |
-
f"<i>pLDDT</i>: {plddt:.2f}<br><i>Residue:</i> {code} {idx}"
|
97 |
for idx, (plddt, code) in enumerate(zip(plddt_val, residue_codes[i]))
|
98 |
]
|
99 |
else:
|
100 |
hover_text = [
|
101 |
-
f"<i>pLDDT</i>: {plddt:.2f}<br><i>Residue index:</i> {idx}"
|
102 |
for idx, plddt in enumerate(plddt_val)
|
103 |
]
|
104 |
|
@@ -108,7 +118,7 @@ def create_plddt_figure(
|
|
108 |
y=plddt_val,
|
109 |
hovertemplate="%{text}<extra></extra>",
|
110 |
text=hover_text,
|
111 |
-
name=f"{model_name} {
|
112 |
visible=True,
|
113 |
)
|
114 |
)
|
@@ -150,8 +160,19 @@ def _write_fasta_file(
|
|
150 |
return seq_id, seq_file
|
151 |
|
152 |
|
153 |
-
def
|
154 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
155 |
|
156 |
# Lists to store pLDDT values and residue codes
|
157 |
plddt_values = []
|
@@ -206,6 +227,10 @@ def predict(
|
|
206 |
model = ChaiModel(api_key)
|
207 |
elif model_type == FoldingModel.PROTENIX:
|
208 |
model = ProtenixModel(api_key)
|
|
|
|
|
|
|
|
|
209 |
else:
|
210 |
raise ValueError(f"Model {model_type} not supported")
|
211 |
|
@@ -235,22 +260,36 @@ def predict(
|
|
235 |
progress(
|
236 |
0.4 + (0.4 * i / total_predictions), desc=f"Converting model {model_idx}..."
|
237 |
)
|
238 |
-
|
239 |
-
logger.info(f"
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
|
|
|
|
247 |
model_plddt_vals.append(plddt_vals)
|
248 |
model_residue_codes.append(residue_codes)
|
249 |
|
250 |
progress(0.8, desc="Generating plots...")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
251 |
plddt_fig = create_plddt_figure(
|
252 |
plddt_vals=model_plddt_vals,
|
253 |
model_name=model.model_name,
|
|
|
254 |
residue_codes=model_residue_codes,
|
255 |
)
|
256 |
|
@@ -258,11 +297,13 @@ def predict(
|
|
258 |
return pdb_paths, plddt_fig
|
259 |
|
260 |
|
261 |
-
def align_structures(
|
|
|
|
|
262 |
"""Align multiple PDB structures to the first structure.
|
263 |
|
264 |
Args:
|
265 |
-
|
266 |
|
267 |
Returns:
|
268 |
list[str]: List of paths to aligned PDB files
|
@@ -271,39 +312,47 @@ def align_structures(pdb_paths: list[str]) -> list[str]:
|
|
271 |
parser = PDBParser()
|
272 |
io = PDBIO()
|
273 |
|
274 |
-
#
|
275 |
-
|
|
|
|
|
|
|
|
|
|
|
276 |
ref_atoms = [atom for atom in ref_structure.get_atoms() if atom.get_name() == "CA"]
|
277 |
|
278 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
279 |
|
280 |
-
|
281 |
-
|
282 |
-
# Parse the structure to align
|
283 |
-
structure = parser.get_structure(f"model_{i}", pdb_path)
|
284 |
-
atoms = [atom for atom in structure.get_atoms() if atom.get_name() == "CA"]
|
285 |
|
286 |
-
|
287 |
-
|
288 |
|
289 |
-
|
290 |
-
|
291 |
|
292 |
-
|
293 |
-
|
|
|
|
|
294 |
|
295 |
-
|
296 |
-
aligned_path = str(Path(pdb_path).parent / f"aligned_{Path(pdb_path).name}")
|
297 |
-
io.set_structure(structure)
|
298 |
-
io.save(aligned_path)
|
299 |
-
aligned_paths.append(aligned_path)
|
300 |
|
301 |
-
return
|
302 |
|
303 |
|
304 |
def filter_predictions(
|
305 |
-
|
306 |
-
|
|
|
|
|
307 |
chai_selected: list[int],
|
308 |
boltz_selected: list[int],
|
309 |
protenix_selected: list[int],
|
@@ -316,7 +365,7 @@ def filter_predictions(
|
|
316 |
chai_selected (list[int]): Selected Chai model indices
|
317 |
boltz_selected (list[int]): Selected Boltz model indices
|
318 |
protenix_selected (list[int]): Selected Protenix model indices
|
319 |
-
model_predictions (dict[FoldingModel,
|
320 |
|
321 |
Returns:
|
322 |
tuple[list[str], go.Figure]: Filtered PDB paths and updated pLDDT plot
|
@@ -325,26 +374,30 @@ def filter_predictions(
|
|
325 |
filtered_fig = go.Figure()
|
326 |
|
327 |
# Keep track of which traces to show
|
328 |
-
|
329 |
|
330 |
# Helper function to check if a trace should be visible
|
331 |
-
def should_show_trace(
|
332 |
-
model_name
|
333 |
-
|
334 |
-
|
335 |
-
|
|
|
|
|
|
|
336 |
return True
|
337 |
-
if model_name ==
|
338 |
return True
|
339 |
-
if model_name ==
|
340 |
return True
|
341 |
return False
|
342 |
|
343 |
# Filter traces and paths
|
344 |
-
for
|
345 |
-
|
346 |
-
|
347 |
-
|
|
|
348 |
|
349 |
# Update layout
|
350 |
filtered_fig.update_layout(
|
@@ -355,21 +408,58 @@ def filter_predictions(
|
|
355 |
template="simple_white",
|
356 |
legend=dict(yanchor="bottom", y=0.01, xanchor="left", x=0.99),
|
357 |
)
|
|
|
358 |
|
359 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
360 |
|
361 |
|
362 |
def predict_comparison(
|
363 |
sequence: str, api_key: str, model_types: list[FoldingModel], progress=gr.Progress()
|
364 |
) -> tuple[
|
365 |
-
|
366 |
-
|
|
|
|
|
367 |
gr.CheckboxGroup,
|
368 |
gr.CheckboxGroup,
|
369 |
gr.CheckboxGroup,
|
370 |
-
list[str],
|
371 |
-
go.Figure,
|
372 |
-
dict,
|
373 |
]:
|
374 |
"""Predict protein structure from amino acid sequence using multiple models.
|
375 |
|
@@ -381,68 +471,94 @@ def predict_comparison(
|
|
381 |
|
382 |
Returns:
|
383 |
tuple containing:
|
384 |
-
-
|
385 |
-
-
|
|
|
|
|
386 |
- gr.CheckboxGroup: Chai predictions checkbox group
|
387 |
- gr.CheckboxGroup: Boltz predictions checkbox group
|
388 |
- gr.CheckboxGroup: Protenix predictions checkbox group
|
389 |
-
- list[str]: Original PDB paths
|
390 |
-
- go.Figure: Original pLDDT plot
|
391 |
-
- dict: Model predictions mapping
|
392 |
"""
|
393 |
if not api_key:
|
394 |
raise gr.Error("Missing API key, please enter a valid API key")
|
395 |
|
396 |
-
|
397 |
-
|
398 |
-
|
399 |
-
total_models = len(model_types)
|
400 |
model_predictions = {}
|
401 |
|
402 |
-
|
403 |
-
|
404 |
-
|
405 |
-
|
406 |
-
|
407 |
-
|
408 |
-
|
409 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
410 |
|
411 |
progress(0.9, desc="Aligning structures...")
|
412 |
-
|
413 |
-
|
414 |
-
plddt_fig.update_layout(
|
415 |
-
title="pLDDT",
|
416 |
-
xaxis_title="Residue index",
|
417 |
-
yaxis_title="pLDDT",
|
418 |
-
height=500,
|
419 |
-
template="simple_white",
|
420 |
-
legend=dict(yanchor="bottom", y=0.01, xanchor="left", x=0.99),
|
421 |
-
)
|
422 |
|
423 |
progress(1.0, desc="Done!")
|
424 |
|
425 |
# Create checkbox groups for each model type
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
426 |
chai_predictions = gr.CheckboxGroup(
|
427 |
visible=model_predictions.get(FoldingModel.CHAI) is not None,
|
428 |
-
choices=model_predictions.get(FoldingModel.CHAI,
|
429 |
-
value=model_predictions.get(FoldingModel.CHAI,
|
430 |
)
|
431 |
boltz_predictions = gr.CheckboxGroup(
|
432 |
visible=model_predictions.get(FoldingModel.BOLTZ) is not None,
|
433 |
-
choices=model_predictions.get(FoldingModel.BOLTZ,
|
434 |
-
value=model_predictions.get(FoldingModel.BOLTZ,
|
435 |
)
|
436 |
protenix_predictions = gr.CheckboxGroup(
|
437 |
visible=model_predictions.get(FoldingModel.PROTENIX) is not None,
|
438 |
-
choices=model_predictions.get(FoldingModel.PROTENIX,
|
439 |
-
value=model_predictions.get(FoldingModel.PROTENIX,
|
440 |
)
|
441 |
|
442 |
return (
|
|
|
|
|
|
|
|
|
443 |
chai_predictions,
|
444 |
boltz_predictions,
|
445 |
protenix_predictions,
|
446 |
-
aligned_paths,
|
447 |
-
plddt_fig,
|
448 |
)
|
|
|
1 |
"""Predict protein structure using Folding Studio."""
|
2 |
|
3 |
+
import concurrent.futures
|
4 |
import hashlib
|
5 |
import logging
|
6 |
from io import StringIO
|
7 |
from pathlib import Path
|
8 |
+
from typing import Any
|
9 |
|
10 |
import gradio as gr
|
11 |
import numpy as np
|
|
|
14 |
from Bio.PDB import PDBIO, MMCIFParser, PDBParser, Superimposer
|
15 |
from folding_studio_data_models import FoldingModel
|
16 |
|
17 |
+
from folding_studio_demo.models import (
|
18 |
+
AF2Model,
|
19 |
+
BoltzModel,
|
20 |
+
ChaiModel,
|
21 |
+
OpenFoldModel,
|
22 |
+
ProtenixModel,
|
23 |
+
)
|
24 |
|
25 |
logger = logging.getLogger(__name__)
|
26 |
|
|
|
93 |
def create_plddt_figure(
|
94 |
plddt_vals: list[list[float]],
|
95 |
model_name: str,
|
96 |
+
indexes: list[int],
|
97 |
residue_codes: list[list[str]] = None,
|
98 |
) -> go.Figure:
|
99 |
"""Create a plot of metrics."""
|
100 |
plddt_traces = []
|
101 |
+
|
102 |
+
for i, (plddt_val, index) in enumerate(zip(plddt_vals, indexes)):
|
103 |
# Create hover text with residue codes if available
|
104 |
if residue_codes and i < len(residue_codes):
|
105 |
hover_text = [
|
106 |
+
f"<i>{model_name} {index}</i><br><i>pLDDT</i>: {plddt:.2f}<br><i>Residue:</i> {code} {idx}"
|
107 |
for idx, (plddt, code) in enumerate(zip(plddt_val, residue_codes[i]))
|
108 |
]
|
109 |
else:
|
110 |
hover_text = [
|
111 |
+
f"<i>{model_name} {index}</i><br><i>pLDDT</i>: {plddt:.2f}<br><i>Residue index:</i> {idx}"
|
112 |
for idx, plddt in enumerate(plddt_val)
|
113 |
]
|
114 |
|
|
|
118 |
y=plddt_val,
|
119 |
hovertemplate="%{text}<extra></extra>",
|
120 |
text=hover_text,
|
121 |
+
name=f"{model_name} {index}",
|
122 |
visible=True,
|
123 |
)
|
124 |
)
|
|
|
160 |
return seq_id, seq_file
|
161 |
|
162 |
|
163 |
+
def extract_plddt_from_structure(structure_path: str) -> tuple[list[float], list[str]]:
|
164 |
+
"""Extract pLDDT values and residue codes from a structure file.
|
165 |
+
|
166 |
+
Args:
|
167 |
+
structure_path (Path): Path to structure file
|
168 |
+
|
169 |
+
Returns:
|
170 |
+
tuple[list[float], list[str]]: Tuple containing lists of pLDDT values and residue codes
|
171 |
+
"""
|
172 |
+
if Path(structure_path).suffix == ".cif":
|
173 |
+
structure = MMCIFParser().get_structure("structure", structure_path)
|
174 |
+
else:
|
175 |
+
structure = PDBParser().get_structure("structure", structure_path)
|
176 |
|
177 |
# Lists to store pLDDT values and residue codes
|
178 |
plddt_values = []
|
|
|
227 |
model = ChaiModel(api_key)
|
228 |
elif model_type == FoldingModel.PROTENIX:
|
229 |
model = ProtenixModel(api_key)
|
230 |
+
elif model_type == FoldingModel.AF2:
|
231 |
+
model = AF2Model(api_key)
|
232 |
+
elif model_type == FoldingModel.OPENFOLD:
|
233 |
+
model = OpenFoldModel(api_key)
|
234 |
else:
|
235 |
raise ValueError(f"Model {model_type} not supported")
|
236 |
|
|
|
260 |
progress(
|
261 |
0.4 + (0.4 * i / total_predictions), desc=f"Converting model {model_idx}..."
|
262 |
)
|
263 |
+
prediction_path = prediction["prediction_path"]
|
264 |
+
logger.info(f"Prediction file: {prediction_path}")
|
265 |
+
if Path(prediction_path).suffix == ".cif":
|
266 |
+
converted_pdb_path = str(
|
267 |
+
output_dir / f"{model.model_name}_prediction_{model_idx}.pdb"
|
268 |
+
)
|
269 |
+
convert_cif_to_pdb(str(prediction_path), str(converted_pdb_path))
|
270 |
+
pdb_paths.append(converted_pdb_path)
|
271 |
+
else:
|
272 |
+
pdb_paths.append(str(prediction_path))
|
273 |
+
plddt_vals, residue_codes = extract_plddt_from_structure(prediction_path)
|
274 |
model_plddt_vals.append(plddt_vals)
|
275 |
model_residue_codes.append(residue_codes)
|
276 |
|
277 |
progress(0.8, desc="Generating plots...")
|
278 |
+
indexes = []
|
279 |
+
for pdb_path in pdb_paths:
|
280 |
+
if model_type in [
|
281 |
+
FoldingModel.AF2,
|
282 |
+
FoldingModel.OPENFOLD,
|
283 |
+
FoldingModel.SOLOSEQ,
|
284 |
+
]:
|
285 |
+
indexes.append(int(Path(pdb_path).stem.split("_")[2]))
|
286 |
+
else:
|
287 |
+
indexes.append(int(Path(pdb_path).stem[-1]))
|
288 |
+
|
289 |
plddt_fig = create_plddt_figure(
|
290 |
plddt_vals=model_plddt_vals,
|
291 |
model_name=model.model_name,
|
292 |
+
indexes=indexes,
|
293 |
residue_codes=model_residue_codes,
|
294 |
)
|
295 |
|
|
|
297 |
return pdb_paths, plddt_fig
|
298 |
|
299 |
|
300 |
+
def align_structures(
|
301 |
+
model_predictions: dict[FoldingModel, dict[int, dict[str, Any]]],
|
302 |
+
) -> list[str]:
|
303 |
"""Align multiple PDB structures to the first structure.
|
304 |
|
305 |
Args:
|
306 |
+
model_predictions (dict[FoldingModel, dict[int, dict[str, Any]]]): Dictionary mapping models to their prediction indices
|
307 |
|
308 |
Returns:
|
309 |
list[str]: List of paths to aligned PDB files
|
|
|
312 |
parser = PDBParser()
|
313 |
io = PDBIO()
|
314 |
|
315 |
+
# Get the first structure as reference
|
316 |
+
first_model = next(iter(model_predictions.keys()))
|
317 |
+
first_pred = next(iter(model_predictions[first_model].values()))
|
318 |
+
ref_pdb_path = first_pred["pdb_path"]
|
319 |
+
|
320 |
+
# Parse reference structure and get CA atoms
|
321 |
+
ref_structure = parser.get_structure("reference", ref_pdb_path)
|
322 |
ref_atoms = [atom for atom in ref_structure.get_atoms() if atom.get_name() == "CA"]
|
323 |
|
324 |
+
for model_type in model_predictions.keys():
|
325 |
+
for index, prediction in model_predictions[model_type].items():
|
326 |
+
pdb_path = prediction["pdb_path"]
|
327 |
+
|
328 |
+
# Parse the structure to align
|
329 |
+
structure = parser.get_structure(f"{model_type}_{index}", pdb_path)
|
330 |
+
atoms = [atom for atom in structure.get_atoms() if atom.get_name() == "CA"]
|
331 |
|
332 |
+
# Create superimposer
|
333 |
+
sup = Superimposer()
|
|
|
|
|
|
|
334 |
|
335 |
+
# Set the reference and moving atoms
|
336 |
+
sup.set_atoms(ref_atoms, atoms)
|
337 |
|
338 |
+
# Apply the transformation to all atoms in the structure
|
339 |
+
sup.apply(structure.get_atoms())
|
340 |
|
341 |
+
# Save the aligned structure
|
342 |
+
aligned_path = str(Path(pdb_path).parent / f"aligned_{Path(pdb_path).name}")
|
343 |
+
io.set_structure(structure)
|
344 |
+
io.save(aligned_path)
|
345 |
|
346 |
+
model_predictions[model_type][index]["pdb_path"] = aligned_path
|
|
|
|
|
|
|
|
|
347 |
|
348 |
+
return model_predictions
|
349 |
|
350 |
|
351 |
def filter_predictions(
|
352 |
+
model_predictions: dict[FoldingModel, dict[int, dict[str, Any]]],
|
353 |
+
af2_selected: list[int],
|
354 |
+
openfold_selected: list[int],
|
355 |
+
solo_selected: list[int],
|
356 |
chai_selected: list[int],
|
357 |
boltz_selected: list[int],
|
358 |
protenix_selected: list[int],
|
|
|
365 |
chai_selected (list[int]): Selected Chai model indices
|
366 |
boltz_selected (list[int]): Selected Boltz model indices
|
367 |
protenix_selected (list[int]): Selected Protenix model indices
|
368 |
+
model_predictions (dict[FoldingModel, dict[int, dict[str, Any]]]): Dictionary mapping models to their prediction indices
|
369 |
|
370 |
Returns:
|
371 |
tuple[list[str], go.Figure]: Filtered PDB paths and updated pLDDT plot
|
|
|
374 |
filtered_fig = go.Figure()
|
375 |
|
376 |
# Keep track of which traces to show
|
377 |
+
filtered_paths = []
|
378 |
|
379 |
# Helper function to check if a trace should be visible
|
380 |
+
def should_show_trace(model_name, pred_index: int) -> bool:
|
381 |
+
if model_name == FoldingModel.CHAI and pred_index in chai_selected:
|
382 |
+
return True
|
383 |
+
if model_name == FoldingModel.BOLTZ and pred_index in boltz_selected:
|
384 |
+
return True
|
385 |
+
if model_name == FoldingModel.PROTENIX and pred_index in protenix_selected:
|
386 |
+
return True
|
387 |
+
if model_name == FoldingModel.AF2 and pred_index in af2_selected:
|
388 |
return True
|
389 |
+
if model_name == FoldingModel.OPENFOLD and pred_index in openfold_selected:
|
390 |
return True
|
391 |
+
if model_name == FoldingModel.SOLOSEQ and pred_index in solo_selected:
|
392 |
return True
|
393 |
return False
|
394 |
|
395 |
# Filter traces and paths
|
396 |
+
for model_type in model_predictions.keys():
|
397 |
+
for index, prediction in model_predictions[model_type].items():
|
398 |
+
if should_show_trace(model_type, index):
|
399 |
+
filtered_fig.add_trace(prediction["plddt_trace"])
|
400 |
+
filtered_paths.append(prediction["pdb_path"])
|
401 |
|
402 |
# Update layout
|
403 |
filtered_fig.update_layout(
|
|
|
408 |
template="simple_white",
|
409 |
legend=dict(yanchor="bottom", y=0.01, xanchor="left", x=0.99),
|
410 |
)
|
411 |
+
return filtered_paths, filtered_fig
|
412 |
|
413 |
+
|
414 |
+
def run_prediction(
|
415 |
+
sequence: str,
|
416 |
+
api_key: str,
|
417 |
+
model_type: FoldingModel,
|
418 |
+
format_fasta: bool = False,
|
419 |
+
) -> dict[FoldingModel, dict[int, dict[str, Any]]]:
|
420 |
+
"""Run a single prediction.
|
421 |
+
|
422 |
+
Args:
|
423 |
+
sequence (str): Amino acid sequence to predict structure for
|
424 |
+
api_key (str): Folding API key
|
425 |
+
model_type (FoldingModel): Folding model to use
|
426 |
+
format_fasta (bool): Whether to format the FASTA file
|
427 |
+
|
428 |
+
Returns:
|
429 |
+
Tuple containing:
|
430 |
+
- List of PDB paths
|
431 |
+
- pLDDT plot
|
432 |
+
- Dictionary mapping model to prediction indices
|
433 |
+
"""
|
434 |
+
model_pdb_paths, model_plddt_traces = predict(
|
435 |
+
sequence, api_key, model_type, format_fasta=format_fasta
|
436 |
+
)
|
437 |
+
model_pdb_paths = sorted(model_pdb_paths)
|
438 |
+
model_predictions = {}
|
439 |
+
for pdb_path, plddt_trace in zip(model_pdb_paths, model_plddt_traces.data):
|
440 |
+
if model_type in [
|
441 |
+
FoldingModel.AF2,
|
442 |
+
FoldingModel.OPENFOLD,
|
443 |
+
FoldingModel.SOLOSEQ,
|
444 |
+
]:
|
445 |
+
index = int(Path(pdb_path).stem.split("_")[2])
|
446 |
+
else:
|
447 |
+
index = int(Path(pdb_path).stem[-1])
|
448 |
+
|
449 |
+
model_predictions[index] = {"pdb_path": pdb_path, "plddt_trace": plddt_trace}
|
450 |
+
return model_predictions
|
451 |
|
452 |
|
453 |
def predict_comparison(
|
454 |
sequence: str, api_key: str, model_types: list[FoldingModel], progress=gr.Progress()
|
455 |
) -> tuple[
|
456 |
+
dict[FoldingModel, dict[int, dict[str, Any]]],
|
457 |
+
gr.CheckboxGroup,
|
458 |
+
gr.CheckboxGroup,
|
459 |
+
gr.CheckboxGroup,
|
460 |
gr.CheckboxGroup,
|
461 |
gr.CheckboxGroup,
|
462 |
gr.CheckboxGroup,
|
|
|
|
|
|
|
463 |
]:
|
464 |
"""Predict protein structure from amino acid sequence using multiple models.
|
465 |
|
|
|
471 |
|
472 |
Returns:
|
473 |
tuple containing:
|
474 |
+
- dict[FoldingModel, dict[int, dict[str, Any]]]: Model predictions mapping
|
475 |
+
- gr.CheckboxGroup: AF2 predictions checkbox group
|
476 |
+
- gr.CheckboxGroup: OpenFold predictions checkbox group
|
477 |
+
- gr.CheckboxGroup: SoloSeq predictions checkbox group
|
478 |
- gr.CheckboxGroup: Chai predictions checkbox group
|
479 |
- gr.CheckboxGroup: Boltz predictions checkbox group
|
480 |
- gr.CheckboxGroup: Protenix predictions checkbox group
|
|
|
|
|
|
|
481 |
"""
|
482 |
if not api_key:
|
483 |
raise gr.Error("Missing API key, please enter a valid API key")
|
484 |
|
485 |
+
progress(0, desc="Starting parallel predictions...")
|
486 |
+
|
487 |
+
# Run predictions in parallel
|
|
|
488 |
model_predictions = {}
|
489 |
|
490 |
+
with concurrent.futures.ThreadPoolExecutor() as executor:
|
491 |
+
# Create a future for each model prediction
|
492 |
+
future_to_model = {
|
493 |
+
executor.submit(
|
494 |
+
run_prediction, sequence, api_key, model_type, True
|
495 |
+
): model_type
|
496 |
+
for model_type in model_types
|
497 |
+
}
|
498 |
+
|
499 |
+
# Process results as they complete
|
500 |
+
total_models = len(model_types)
|
501 |
+
completed = 0
|
502 |
+
|
503 |
+
for future in concurrent.futures.as_completed(future_to_model):
|
504 |
+
model_type = future_to_model[future]
|
505 |
+
try:
|
506 |
+
model_preds = future.result()
|
507 |
+
model_predictions[model_type] = model_preds
|
508 |
+
|
509 |
+
completed += 1
|
510 |
+
progress(
|
511 |
+
completed / total_models,
|
512 |
+
desc=f"Completed {model_type} prediction...",
|
513 |
+
)
|
514 |
+
except Exception as e:
|
515 |
+
logger.error(f"Prediction failed for {model_type}: {str(e)}")
|
516 |
+
raise gr.Error(f"Prediction failed for {model_type}: {str(e)}")
|
517 |
|
518 |
progress(0.9, desc="Aligning structures...")
|
519 |
+
|
520 |
+
model_predictions = align_structures(model_predictions)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
521 |
|
522 |
progress(1.0, desc="Done!")
|
523 |
|
524 |
# Create checkbox groups for each model type
|
525 |
+
af2_predictions = gr.CheckboxGroup(
|
526 |
+
visible=model_predictions.get(FoldingModel.AF2) is not None,
|
527 |
+
choices=list(model_predictions.get(FoldingModel.AF2, {}).keys()),
|
528 |
+
value=list(model_predictions.get(FoldingModel.AF2, {}).keys()),
|
529 |
+
)
|
530 |
+
openfold_predictions = gr.CheckboxGroup(
|
531 |
+
visible=model_predictions.get(FoldingModel.OPENFOLD) is not None,
|
532 |
+
choices=list(model_predictions.get(FoldingModel.OPENFOLD, {}).keys()),
|
533 |
+
value=list(model_predictions.get(FoldingModel.OPENFOLD, {}).keys()),
|
534 |
+
)
|
535 |
+
solo_predictions = gr.CheckboxGroup(
|
536 |
+
visible=model_predictions.get(FoldingModel.SOLOSEQ) is not None,
|
537 |
+
choices=list(model_predictions.get(FoldingModel.SOLOSEQ, {}).keys()),
|
538 |
+
value=list(model_predictions.get(FoldingModel.SOLOSEQ, {}).keys()),
|
539 |
+
)
|
540 |
chai_predictions = gr.CheckboxGroup(
|
541 |
visible=model_predictions.get(FoldingModel.CHAI) is not None,
|
542 |
+
choices=list(model_predictions.get(FoldingModel.CHAI, {}).keys()),
|
543 |
+
value=list(model_predictions.get(FoldingModel.CHAI, {}).keys()),
|
544 |
)
|
545 |
boltz_predictions = gr.CheckboxGroup(
|
546 |
visible=model_predictions.get(FoldingModel.BOLTZ) is not None,
|
547 |
+
choices=list(model_predictions.get(FoldingModel.BOLTZ, {}).keys()),
|
548 |
+
value=list(model_predictions.get(FoldingModel.BOLTZ, {}).keys()),
|
549 |
)
|
550 |
protenix_predictions = gr.CheckboxGroup(
|
551 |
visible=model_predictions.get(FoldingModel.PROTENIX) is not None,
|
552 |
+
choices=list(model_predictions.get(FoldingModel.PROTENIX, {}).keys()),
|
553 |
+
value=list(model_predictions.get(FoldingModel.PROTENIX, {}).keys()),
|
554 |
)
|
555 |
|
556 |
return (
|
557 |
+
model_predictions,
|
558 |
+
af2_predictions,
|
559 |
+
openfold_predictions,
|
560 |
+
solo_predictions,
|
561 |
chai_predictions,
|
562 |
boltz_predictions,
|
563 |
protenix_predictions,
|
|
|
|
|
564 |
)
|
spr_af_scores_mapped.csv
CHANGED
@@ -1,16 +1,54 @@
|
|
1 |
-
antibody_name,antigen_lineage,
|
2 |
-
bd45_43;covox_269,B,
|
3 |
-
bd45_41;covox_384,B,
|
4 |
-
covox_58,B,
|
5 |
-
covox_278,B,
|
6 |
-
bd45_39;covox_45,B,
|
7 |
-
covox_253,B,
|
8 |
-
bd45_42;covox_316,B,
|
9 |
-
bd45_38;covox_75,B,
|
10 |
-
amubarvimab;bd45_21;brii_196;p2c_1f11,B
|
11 |
-
bd45_7;p2b_2f6,B
|
12 |
-
bd45_22;p2c_1a3,B
|
13 |
-
p22a_1d1,B
|
14 |
-
p5a_1d2,B
|
15 |
-
p5a_3c8,B
|
16 |
-
p5a_3c12,B
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
antibody_name,antigen_lineage,pdb_id,KD (nM),antigen_sequence,antibody_vh_sequence,antibody_vl_sequence,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,confidence_score_boltz,ptm_boltz,iptm_boltz,complex_plddt_boltz,complex_iplddt_boltz,complex_pde_boltz,complex_ipde_boltz
|
2 |
+
bd45_43;covox_269,B,7neh,5.162393162,ITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,QVQLVESGGGLIQPGGSLRLSCAASGLTVNRNYMSWIRQAPGKGLEWVSVIYSGGSTFYADSVKGRFTISRDNSKNTLSLQMNSLRAEDTAIYYCARDFYEGSFDIWGQGTMVTVSS,AIQLTQSPSFLSASIGDRVTITCRASQGISSYLAWYQQKPGKAPKLLIYAASTLQSGVPSRFSGSGSGTEFTLTISSLQPEDFASYYCQQLNSYPAPVFGPGTKVDIK,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,0.8122190833091736,-0.622314453125,-0.4887041449546814,-0.8930978178977966,-0.806194543838501,0.5618233680725098,4.58146858215332
|
3 |
+
bd45_41;covox_384,B,7bep,6.0200266319999995,ITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,EVQLVESGGGLVKPGESLRLSCAASGFTFSDYYMTWIRQAPGKGLEWVSYIRSSGHTIYYADSVKGRFTISRDNAKNSLYLQMNSLRVEDTAVYYCARGGVLRFLEWPLNAFDIWGQGTMVTVSS,DIQLTQSPSSLSASVGDRVTITCRASQGISNYLAWYQQKPGKVPKLLIYAASTLQSGVPSRFSGSGSGTDFTLTISSLQPEDVATYYCQKYNNALGTFGQGTKVEIK,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,0.784950315952301,-0.5717063546180725,-0.433135837316513,-0.8729039430618286,-0.7885793447494507,0.8438798785209656,9.28584098815918
|
4 |
+
covox_58,B,7qny,10.472440945,NLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFE,QVQLVESGGGLVQPGRSLRLSCAASGFTFDDYAMHWVRQPPGKGLEWVSGVSWNSGTIGYADSVKGRFIISRDNAKNSLYLQMNSLKAEDTALYYCAREVGGTFGVLISREGGLDYWGQGTLVTVSS,SYELTQPPSVSVAPGQTARITCGGNTIGSKSVHWYQQRPGQAPVLVVYDDSDRPSGIPERFSGSNSGNTATLTISRVEAGDEADYYCQVWDSSSDRVVFGGGTKLTVL,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,0.8313369154930115,-0.676577627658844,-0.5685209631919861,-0.897040843963623,-0.833217978477478,0.7001155614852905,5.648256778717041
|
5 |
+
covox_278,B,7or9,12.865473560000002,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,QVQLVQSGAEVKKPGASVKVSCKASGYIFIRYGISWVRQAPGQGLEWMGWISANNGYTNYAQKLQGRVTMTTDTSTSTAYMELRSLRSDDTAVYYCARDGGILTGYLDYFDHWGQGTLVTVSS,DIQMTQSPSSLSASVGDRLTITCRASQSIASYLNWYQQKPGKAPKLLIYAASSLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYHCQQSYSTLGITFGPGTKVDIK,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,0.7772464752197266,-0.5814127326011658,-0.4433014094829559,-0.8607327342033386,-0.8026694655418396,0.8121297359466553,7.579174995422363
|
6 |
+
bd45_39;covox_45,B,7bel,28.70041021666667,NLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,QVQLVESGGGVVQPGRSLRLSCAASGFTFSTYAMHWVRQAPGKGLEWVAVLSYDGSNKYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAKGGSYAYYYYMDVWGKGTTVTVSS,DIQLTQSPSSLSASVGDRVTITCQASQDISNYLNWYQQKPGKAPKLLIYDASNLETGVPSRFSGGGSGTDFTFTITSLQPEDIATYYCQQYDNLPLTFGGGTKVDIK,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,0.8353190422058105,-0.6677908301353455,-0.5568398833274841,-0.9049388766288756,-0.8570007085800171,0.6362362504005432,6.423116207122803
|
7 |
+
covox_253,B,7ben,68.8637716275,CPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFE,QVQLVQSGPEVKKPGTSVKVSCKASGFTFTTSAVQWVRQARGQRLEWIGWIVVGSGNTNYAQKFQERVTITRDMSTTTAYMELSSLRSEDTAVYFCAAPHCNSTSCYDAFDIWGQGTMVTVSS,DIQMTQSPGTLSLSPGEGATLSCRASQSVSSSYLAWYQQKPGQAPRLLIYGASSGATGIPDRFSGSGSGTDFTLTISRLEPEDFAVYYCQQYGSSPYTFGQGTKVEIK,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,0.9115001559257508,-0.8542655110359192,-0.8447184562683105,-0.9281955361366272,-0.9091010093688964,0.319677323102951,0.5802255868911743
|
8 |
+
bd45_42;covox_316,B,7beh,102.189625528,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,QVQLVQSGAEVKKPGASVKVSCKASGYTFTGYYMHWVRQAPGQGLEWMGWINPNSGGTNYTQKFQGRVTMTRDTSISTAYMELSRLRSDDTAVYSCARDMAFSMVRGSFDYWGQGTLVTVSS,QAVLTQPPSASGSPGQSVTISCTGTSSDVGGYNYVSWYQQHPGKAPKLMIYEVSKRPSGVPDRFSGSKSGNTASLTVSGLQAEDEADYYCSSYAGSNHWVFGGGTKLTVL,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,0.8498350977897644,-0.7469604015350342,-0.6533957719802856,-0.8989449143409729,-0.817704975605011,0.4679538607597351,2.8642566204071045
|
9 |
+
bd45_38;covox_75,B,7ben,343.82737152857146,PFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFE,QVQLVESGGGVVQPGRSLRLSCAASGFTFNNYPLHWVRQAPGKGPEWVAVISQDGGNKYYVDSVKGRFTISRDNSKNTLYLQMNNLRAEDTALYYCARDVVVVVAARNHYYNGMDVWGQGTTVTVSS,DIQLTQSPSSVSASVGDRVTITCRASQGISSWLAWYQQKPGKAPKLLIYAVSSLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQAKSFPFTFGPGTKVEIK,4.280910491943359,1.8528887355045576,3.296236038208008,-97.84887746209483,-97.12766254435262,-0.9162785046409112,-0.883798736684097,29.72571563720703,28.106682943667305,29.010249137878414,-28.289168829306377,-30.9851561767962,-0.1754442919273257,-0.1535423486688642,0.8054940104484558,-0.6095264554023743,-0.4771669507026672,-0.8875757455825806,-0.816137433052063,0.6916928887367249,5.467700958251953
|
10 |
+
amubarvimab;bd45_21;brii_196;p2c_1f11,B,7e8m,2.12,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,EVQLVESGGGLVQPGGSLRLSCAASGITVSSNYMNWVRQAPGKGLEWVSLIYSGGSTYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYHCARDLVVYGMDVWGQGTTVTVSS,EIVLTQSPGTLSISPGERATLSCRASQSVSSSYLAWYQQKPGQAPRLLIYGASSRATGIPDRFSGSGSGTDFTLTISRLEPEDFAVYYCQQYGSSPTFGQGTKLEIK,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,0.8260219693183899,-0.6421446204185486,-0.5207476615905762,-0.9023404717445374,-0.8012434840202332,0.5480695366859436,4.200762748718262
|
11 |
+
bd45_7;p2b_2f6,B,8dcc,5.14,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,QVQLQESGPGLVKPSETLSLTCTVSGYSISSGYYWGWIRQPPGKGLEWIGSIYHSGSTYYNPSLKTRVTISVDTSKNQFSLKLSSVTAADTAVYYCARAVVGIVVVPAAGRRAFDIWGQGTMVTVSS,QSALTQPPSASGSPGQSVTISCTGTSSDVGGYNYVSWYQQHPGKAPKLMIYEVSKRPSGVPDRFSGSKSGNTASLTVSGLQAEDEADYYCSSYAGSNNLVFGGGTKLTVL,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,0.7698132395744324,-0.5812377333641052,-0.443026065826416,-0.8515099883079529,-0.762564480304718,0.883591890335083,8.343637466430664
|
12 |
+
bd45_22;p2c_1a3,B,7cdj,2.47,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,QVQLVESGGGLVKPGGSLRLSCAASGFTFSDYYMSWIRQAPGKGLEWVSYISSSGSTIYYADSVKGRFTISRDNAKNSLYLQMNSLRAEDTAVYYCARDFSHQQLVPSWGQGTLVTVSS,DIQLTQSPSFLSASVGDRVTITCRASQGISSYLAWYQQKPGKAPKLLIYAASTLQSGVPSRFSGSGSGTEFTLTISSLQPEDFATYYCQQLNSYPLTFGGGTKVEIK,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,0.8156558871269226,-0.6943522095680237,-0.5846490859985352,-0.8734075427055359,-0.7654898166656494,0.5038766860961914,3.305140733718872
|
13 |
+
p22a_1d1,B,7chs,5.79,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,EVQLVESGGGLIQPGGSLRLSCAASGFTVSSNYMSWVRQAPGKGLEWVSVIYSGGSTYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCARDRDYYGMDVWGQGTTVTVSS,DIQLTQSPSFLSASVGDRVTITCRASQGISSYLAWYQQKPGKAPKLLIYAASTLQSGVPSRFSGSGSGTEFTLTISSLQPEDFATYYCLHLNSYRTFGLGTKVEIK,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,0.8081307411193848,-0.6247673034667969,-0.501613974571228,-0.8847599029541016,-0.8055034279823303,0.5922093987464905,4.902284145355225
|
14 |
+
p5a_1d2,B,7cho,14.02,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,EVQLVESGGGLIQPGGSLRLSCAASGFIVSSNYMSWVRQAPGKGLEWVSIIYSGGSTYYADSVKGRFTISRDNSNNTLYLQMNSLRAEDTAVYYCARALQVGATSDYFDYWGQGTLVTVSS,QSVLTQPPSVSGAPGQRVTISCTGSSSNIGAGYDVHWYQQLPGTAPKLLIYGNSNRPSGVPDRFSGSKSGTSASLAITGLQAEDETDYYCQSCDSSLSVVVFGGGTKLTVL,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,0.85244220495224,-0.728440523147583,-0.6363945007324219,-0.9064540863037108,-0.8290671706199646,0.5106469988822937,3.337573528289795
|
15 |
+
p5a_3c8,B,7chp,1.3,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPA,EVQLVESGGGLIQPGGSLRLSCAASGFTVSSNYMSWVRQAPGKGLEWVSFIYSGGSTYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCARDLQEHGMDVWGQGTTVTVSS,DIQLTQSPSSLSASVGDRVTITCRASQGISSYLAWYQQKPGKAPKLLIYAASTLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQHLNSYPPGYTFGQGTKLEIK,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,0.7977039217948914,-0.63083815574646,-0.4971179366111755,-0.8728504180908203,-0.7950778007507324,0.639260470867157,5.186392307281494
|
16 |
+
p5a_3c12,B,7d0d,8.47,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,QITLKESGPTLVKPTQTLTLTCTFSGFSLSTSGVGVGWIRQPPGKALEWLALIYWDDDKRYSPSLKSRLTITKDTSKNQVVLTMTNMDPVDTATYYCAHSLFLTVGYSSSWSPFDYWGQGTLVTVSS,DIVMTQSPDSLAVSLGERATINCKSSQSVLYSSNNKNYLAWYQQKPGQPPKLLIYWASTRESGVPDRFSGSGSGTDFTLTISSLQAEDVAVYYCQQYYSTPHTFGQGTKLEIK,7.6485068798065186,5.97126897492192,6.7199506759643555,-83.05635573300732,-90.64425766741088,-0.8163897656562413,-0.671605208580836,29.85387134552002,27.43845858222049,28.873510360717773,-26.92122404475132,-30.364718345462027,-0.2184182315071453,-0.1605370419381908,0.8014394640922546,-0.6204851269721985,-0.4947324395179748,-0.878116250038147,-0.7781279683113098,0.600617527961731,4.05993127822876
|
17 |
+
bd45_54;cb6;etesevimab;js_016;ly3832479;ly_cov016;shi_cb6,B,7c01,27.2,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,EVQLVESGGGLVQPGGSLRLSCAASGFTVSSNYMSWVRQAPGKGLEWVSVIYSGGSTFYADSVKGRFTISRDNSMNTLFLQMNSLRAEDTAVYYCARVLPMYGDYLDYWGQGTLVTVSS,DIVMTQSPSSLSASVGDRVTITCRASQSISRYLNWYQQKPGKAPKLLIYAASSLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQSYSTPPEYTFGQGTKLEIK,3.756307363510132,2.128447752601498,3.090202569961548,-97.6461879391296,-97.26070626999866,-0.9254551526847368,-0.8677110453208677,29.32232093811035,27.24074842582775,27.511402130126953,-34.92356155562333,-39.68775474051035,-0.2896420033073744,-0.1626670353904362,0.819520890712738,-0.6361677050590515,-0.5081703662872314,-0.8973584771156311,-0.8270019292831421,0.6209957599639893,5.416858196258545
|
18 |
+
b38;bd45_74,B,7bz5,226.1,NLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,EVQLVESGGGLVQPGGSLRLSCAASGFIVSSNYMSWVRQAPGKGLEWVSVIYSGGSTYYADSVKGRFTISRHNSKNTLYLQMNSLRAEDTAVYYCAREAYGMDVWGQGTTVTVSS,DIVMTQSPSFLSASVGDRVTITCRASQGISSYLAWYQQKPGKAPKLLIYAASTLQSGVPSRFSGSGSGTEFTLTISSLQPEDFATYYCQQLNSYPPYTFGQGTKLEIK,3.6588540077209473,2.0183379865718143,2.985830068588257,-97.89573736797102,-97.61834343774912,-0.9239897998675464,-0.874104045015708,29.322489738464355,26.88337370126633,28.34695339202881,-28.683235707038403,-30.07956744592768,-0.1800356511892592,-0.1665891106854405,0.807386040687561,-0.6099106669425964,-0.4734986424446106,-0.8908578753471375,-0.8007948994636536,0.6189569234848022,5.238494873046875
|
19 |
+
bd30_236;bd_236,B,7x63,7.8,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,EVQLVESGGGLIQPGGSLRLSCAASGITVGWNYMSWVRQAPGKGLEWVSVIYPGGSTDYADSVKGRFTISRDKSKNTLYLQMNSLRAEDTAVYYCARDLGEAGGMDVWGQGTTVTVSS,AIQLTQSPSSLSASVGDRVTITCRASQGIPSSYLAWYQQKPGKAPKLLIYAASTLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQLNSYPPAFGGGTKVEIK,3.994213700294494,2.2775376655654713,3.2573500871658325,-97.19073000420336,-96.94722943386157,-0.9147700089566092,-0.8591293000768674,29.353395462036133,27.30239335619582,28.055672645568848,-30.22021127797199,-33.64002650613898,-0.2220753391530885,-0.1619999006405755,0.8036960959434509,-0.5981668829917908,-0.4583724439144134,-0.8900269269943237,-0.7891557812690735,0.6274881958961487,5.3838348388671875
|
20 |
+
604;bd30_604;bd_604;dxp_604,B,8hws,0.05,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,EVQLVESGGGLIQPGGSLRLSCAASGIIVSSNYMTWVRQAPGKGLEWVSVIYSGGSTFYADSVKGRFTISRDNSKNTLYLQMSSLRAEDTAVYYCARDLGPYGMDVWGQGTTVTVSS,DIQLTQSPSFLSASVGDRVTITCRASQGISSDLAWYQQKPGKAPNLLIYAASTLQSGVPSRFSGSGSGTEFTLTISSLQPEDFATYYCQQLNSDLYTFGQGTKLEIK,4.400998830795288,2.6637176256842596,3.6481235027313232,-95.7119270882778,-96.02421529273563,-0.9042364431063752,-0.8372930292772083,29.172849655151367,27.17382807738242,28.11342716217041,-28.935454849283772,-31.41067246232605,-0.1813220901460277,-0.1633943722845848,0.8845887184143066,-0.8007594347000122,-0.7316951155662537,-0.9228121638298036,-0.8624889850616455,0.3976951241493225,1.709693431854248
|
21 |
+
bd30_629;bd_629,B,7ch5,0.8,NLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFE,EVQLVESGGGLIQPGGSLRLSCAASEFIVSRNYMSWVRQAPGKGLEWVSVIYSGGSTYYADSVKGRFTISRDNSKNTLNLQMNSLRAEDTAVYYCARDYGDYYFDYWGQGTLVTVSS,EIVLTQSPGTLSLSPGERATLSCRASQGVSSFLAWYQQKPGQAPRLLIHGASSRATGIPDRFSGSGSGTDFTLTITRLEPEDFAVYYCQQYGSSPRTFGQGTKVEIK,4.037263870239258,2.3809633372494807,3.3240456581115723,-96.7494604527708,-97.09161542506467,-0.9133181748939044,-0.8532259404344162,29.114646911621097,27.135868763398072,27.843456268310547,-31.787164043719393,-35.90008802885798,-0.2268176133475881,-0.1638083851371557,0.8074035048484802,-0.6194781064987183,-0.4824706017971039,-0.8886366486549377,-0.7906217575073242,0.625114917755127,5.724989414215088
|
22 |
+
bd45_67;c102,B,7k8m,49.0,NLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFEL,QVQLVESGGGLIQPGGSLRLSCAASGFIVSSNYMSWVRQAPGKGLEWVSVIYSGGSTFYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCARDYGDYYFDYWGQGTLVTVSS,EIVLTQSPGTLSLSPGERATLSCRASQSVSSSYLAWYQQKPGQAPRLLIYGASSRATGIPDRFSGSGSGTDFTLTISRLEPEDFAVYYCQQYGSSPRTFGQGTKVEIK,3.752142310142517,2.101394569255271,3.141359806060791,-97.29175885740376,-97.4493696803594,-0.9221204626888536,-0.8692774138047807,29.37706756591797,26.87093691440514,28.205734252929688,-29.62826380585027,-33.254081576067605,-0.2044245860783137,-0.1667272901786875,0.7967143654823303,-0.5979894995689392,-0.4538632929325104,-0.8824270963668823,-0.7720768451690674,0.652141809463501,6.204518795013428
|
23 |
+
bd45_65;c105,B,6xcm,17.4,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,QVQLVESGGGLIQPGGSLRLSCAASGFTVSSNYMSWVRQAPGKGLEWVSVIYSGGSTYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCARGEGWELPYDYWGQGTLVTVSS,QSALTQPPSASGSPGQSVTISCTGTSSDVGGYKYVSWYQQHPGKAPKLMIYEVSKRPSGVPDRFSGSKSGNTASLTVSGLQAEDEADYYCSSYEGSNNFVVFGGGTKLTVL,6.4364333152771,4.752463420641791,5.573083877563477,-86.17781052860835,-90.8829789188625,-0.8500728778464863,-0.7284539301241402,29.49038600921631,27.630793411858047,27.978410720825195,-31.844763150545965,-36.08030496808164,-0.2516151569431434,-0.1584917251752475,0.7777058482170105,-0.6262052655220032,-0.4964358806610107,-0.8480232954025269,-0.7546373009681702,0.6825246214866638,4.584840297698975
|
24 |
+
bd45_50;cova2_04,B,7jmo,55.5,NLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,QVQLVETGGGLIQPGGSLRLSCAASGFTVSSNYMSWVRQAPGKGLEWVSVIYSGGSTFYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCARDLERAGGMDVWGQGTMVTVSS,EIVMTQSPGTLSLSPGERATLSCRASQSVSSSYLAWYQQKPGQAPRLLIYGASSRATGIPDRFSGSGSGTDFTLTISRLEPEDFAVYYCQQYGSLYTFGQGTKVDIK,3.695557117462158,2.0126694790095767,3.020557641983032,-97.674999697212,-97.65659786042384,-0.9247828269753228,-0.8744344317977322,29.542219161987305,27.427869734337285,28.341693878173828,-30.968098493196603,-33.988426083034526,-0.2087389638321222,-0.160650408768734,0.8102996945381165,-0.6179168820381165,-0.4868167042732239,-0.8911703824996948,-0.789629340171814,0.5591203570365906,4.190255165100098
|
25 |
+
bd45_16;s2h14,B,7jx3,135.5,ITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKK,EVQLVESGGGLVKPGGSLRLSCAASGFTFSNAWMSWVRQAPGKGLEWVGRIKSKTDGGTTDYAAPVKGRFTISRDDSKNTLYLQMNSLKTEDTAVYYCTTGSETYYYDSSGPFDYWGQGTLVTVSS,NFMLTQPHSVSESPGKTVTISCTRSSGSIASNYVQWYQQRPGSSPTTVIYEDNQRPSGVPDRFSGSIDSSSNSASLTISGLKTEDEADYYCQSYDSSNQVFGGGTKLTVL,4.396639585494995,2.5640318413021332,3.478428840637207,-96.93132684309798,-96.95184059736698,-0.9134134196804902,-0.8428759742296937,29.78923797607422,27.947787843652673,28.05274200439453,-37.51338034117831,-45.126821650193754,-0.2948394806532725,-0.1551774689219985,0.8256539702415466,-0.6639388203620911,-0.5543997287750244,-0.8934674859046936,-0.8365002274513245,0.6085013747215271,5.247827053070068
|
26 |
+
bd45_3;casirivimab;regn10933,B,6xdg,1.9,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,QVQLVESGGGLVKPGGSLRLSCAASGFTFSDYYMSWIRQAPGKGLEWVSYITYSGSTIYYADSVKGRFTISRDNAKSSLYLQMNSLRAEDTAVYYCARDRGTTMVPFDYWGQGTLVTVSS,DIQMTQSPSSLSASVGDRVTITCQASQDITNYLNWYQQKPGKAPKLLIYAASNLETGVPSRFSGSGSGTDFTFTISGLQPEDIATYYCQQYDNLPLTFGGGTKVEIK,5.710702896118164,3.430699833440471,4.736518383026123,-91.9844107664326,-94.32365213473588,-0.8591901594635216,-0.7955565692008225,29.557764053344727,28.039246331652937,28.93879508972168,-27.264424099887073,-28.311848533018424,-0.1654364034989729,-0.154234194414334,0.7955614328384399,-0.5911784172058105,-0.4543851613998413,-0.8808554410934448,-0.7964072227478027,0.6016823053359985,5.142148017883301
|
27 |
+
bamlanivimab;bd45_11;ly3819253;ly_cov555,B,7kmg,2.7,NLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,QVQLVQSGAEVKKPGSSVKVSCKASGGTFSNYAISWVRQAPGQGLEWMGRIIPILGIANYAQKFQGRVTITADKSTSTAYMELSSLRSEDTAVYYCARGYYEARHYYYYYAMDVWGQGTAVTVSS,DIQMTQSPSSLSASVGDRVTITCRASQSISSYLSWYQQKPGKAPKLLIYAASSLQSGVPSRFSGSGSGTDFTLTITSLQPEDFATYYCQQSYSTPRTFGQGTKVEIK,4.198333740234375,2.1230251679084446,3.4514501094818115,-97.23854384579566,-96.413913097922,-0.911500330370605,-0.8680247844688443,29.7426815032959,28.01211544187988,28.88332176208496,-27.087260252529877,-29.38181419479705,-0.1706229401120542,-0.1545134142494904,0.7652053236961365,-0.5884153842926025,-0.45290407538414,-0.8432806134223938,-0.7909672260284424,0.902398943901062,9.020432472229004
|
28 |
+
ab23,B,7byr,734.7,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,QVQLVQSGSELKKPGASVKVSCKASGYTFTSYAMNWVRQAPGQGLEWMGWINTNTGNPTYAQGFTGRFVFSLDTSVSTAYLQISSLKAEDTAVYYCARPQGGSSWYRDYYYGMDVWGQGTTVTVSS,DIQMTQSPSTLSASVGDRVTITCRASQSISSWLAWYQQKPGKAPKLLIYKASSLESGVPSRFSGSGSGTEFTLTISSLQPDDFATYYCQQYNSYPYTFGQGTKLEIK,5.7584264278411865,3.619439350778309,5.493600845336914,-89.05999039842195,-91.59792621887976,-0.8423061162382275,-0.7856090856919846,29.772135734558105,27.595409660661165,28.84312438964844,-27.96239689718867,-30.585276915045455,-0.1896679995259579,-0.1588660352695431,0.7833446860313416,-0.5736169219017029,-0.437797486782074,-0.8697314262390137,-0.8149273991584778,0.8495485186576843,8.084565162658691
|
29 |
+
bd45_49;cova2_39,B,7jmp,23.5,FGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFE,QVQLVETGGGLIQPGGSLRLSCAASGFTVSSNYMSWVRQAPGKGLEWVSVIYTGGTTYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCARAHVDTAMVESGAFDIWGQGTRVTVSS,QSALTQPASVSGSPGQSITISCTGTSSDVGSYNLVSWYQQHPGKAPKLMIYEVTKRPSGVSNRFSGSKSGNTASLTISGLQAEDEADYYCCSYAGSSTWVFGGGTKLTVL,4.123084545135498,2.5868978436307715,3.425662636756897,-97.07965603699648,-94.9635953041548,-0.9084263459640208,-0.8415920728021226,29.572556495666504,28.100643969740464,28.463546752929688,-31.28862128436322,-34.94716275064345,-0.2375795844685743,-0.1536041769967028,0.8876116871833801,-0.8216595649719238,-0.766454815864563,-0.9179009199142456,-0.886243462562561,0.3559711873531341,0.8455747365951538
|
30 |
+
c121,B,7k8x,7.5,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,QVQLVQSGAEVKKPGASVKVSCKASGYTFTGYYMHWVRQAPGQGLEWMGWISPVSGGTNYAQKFQGRVTMTRDTSISTAYMELSRLRSDDTAVYYCARAPLFPTGVLAGDYYYYGMDVWGQGTTVTVSS,QSALTQPASVSGSPGQSITISCTGTSSDVGSYNLVSWYQQHPGKAPKLMIYEGSKRPSGVSNRFSGSKSGNTASLTISGLQAEDEADYYCCSYAGSSTLVFGGGTKLTVL,5.367863893508911,4.483937104048992,5.145024299621582,-85.6356295948908,-91.17540300391344,-0.8588649368145442,-0.7416119579963584,29.6442232131958,28.015230963719116,28.427989959716797,-32.02229703157973,-38.20697142266387,-0.2564747913380424,-0.1544813249210026,0.8722413182258606,-0.8327726721763611,-0.7821183800697327,-0.8947719931602478,-0.8302052617073059,0.4585577845573425,1.4906868934631348
|
31 |
+
bd45_60;bms_986413;c144,B,7k90,118.6,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,EVQLVESGGGLIQPGGSLRLSCAASGFTVSNNYMSWVRQAPGKGLEWVSVIYSGGSTYYADSVKGRFTISRDKSKNTLYLQMNRLRAEDTAVYYCAREGEVEGYNDFWSGYSRDRYYFDYWGQGTLVTVSS,QSALTQPASVSGSPGQSITISCTGTSSDVGGYNYVSWYQQHPGKAPKLMIYDVSNRPSGVSNRFSGSKSGNTASLTISGLQAEDEADYYCSSYTSSSTRVFGTGTKVTVL,5.820320129394531,3.9999246694254538,4.884236812591553,-90.4167053220531,-93.13394286105442,-0.8699632335266255,-0.7659321848957601,29.813172340393063,27.90726715368783,28.55602264404297,-29.55138505809996,-36.34748318966482,-0.2374338507346409,-0.1555972288392972,0.8830507397651672,-0.880916953086853,-0.8472033739089966,-0.8920125961303711,-0.8481523394584656,0.4691607654094696,1.2180975675582886
|
32 |
+
bd45_27;h4,B,7l58,18.5,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,QVQLVQSGAEVKKPGASVKVSCKASGYTFTGYYMHWVRQAPGQGLEWMGRINPNSGGTNYAQKFQGRVTMTRDTSISTAYMELSRLRSDDTAVYYCARVPYCSSTSCHRDWYFDLWGRGTLVT,DIQMTQSPLSLPVTPGEPASISCRSSQSLLDSDDGNTYLDWYLQKPGQSPQLLIYTLSYRASGVPDRFSGSGSGTDFTLKISRVEAEDVGVYYCMQRIEFPLTFGGGTKVEI,6.13195276260376,4.547904402799018,5.774697303771973,-87.23887393031404,-89.62019776005573,-0.8433900688767302,-0.738456097596274,29.605708122253414,27.520676323357613,28.681806564331055,-31.351063090649603,-31.542517608586195,-0.2230279421216539,-0.1596595162108121,0.7883245348930359,-0.5900335311889648,-0.45372074842453,-0.8719754815101624,-0.7731411457061768,0.7354199886322021,5.9015607833862305
|
33 |
+
s2e12,B,7r6x,2.1,PNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,QVQLVQSGPEVKKPGTSVRVSCKASGFTFTSSAVQWVRQARGQRLEWVGWIVVGSGNTNYAQKFHERVTITRDMSTSTAYMELSSLRSEDTAVYYCASPYCSGGSCSDGFDIWGQGTMVTVSS,DIVLTQTPGTLSLSPGERATLSCRASQSVSSSYLAWYQQKPGQAPRLLIYGASSRATGIPDRFSGSGSGTDFTLTISRLEPEDFAVYYCQQYVGLTGWTFGQGTKVEIK,4.6941118240356445,2.347662512015139,3.8155436515808105,-96.81582520131975,-96.84442030371952,-0.8997209434234145,-0.8551222531433533,29.05059814453125,26.912014382267344,27.210227966308594,-35.441449581823186,-41.72914114632976,-0.2884613692589819,-0.1662713324563222,0.9162670373916626,-0.8048012256622314,-0.8496560454368591,-0.9329198002815248,-0.9126208424568176,0.3305166363716125,0.6463102698326111
|
34 |
+
s2m11,B,8dlw,82.5,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,EVQLVQSGAEVKKPGASVKVSCKASGYTFTGYYMHWVRQAPGQGLEWMGWINPISSGTSYAQTFQGRVTMTSDTSITTAYMELSRLRSDDTAVYYCARAAPFYDFWSGYSYFDYWGQGTLVTVSS,EIVMMQSPGTLSLSPGERATLSCRASQSVSSSYLAWYQQKPGQAPRLLIYGASSRATGIPDRFSGSGSGTDFTLTISRLEPEDFAVYYCQQYGSSAWTFGQGTKVEIK,3.7903997898101807,2.1359647882028416,3.2721967697143555,-97.80599946634992,-97.43009747678546,-0.9220662301772358,-0.8672763132718851,29.79399871826172,16.748294983378273,25.030134201049805,-58.596329442050504,-55.56283241179506,-0.5163574995547012,-0.3274064220641481,0.8740434050559998,-0.7723896503448486,-0.6921893954277039,-0.9195069074630736,-0.8647580146789551,0.468371719121933,1.7737302780151367
|
35 |
+
2_4,B,6xey,57.0,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,QVQLVQSGAEVKKPGASVKVSCKASGYTFTGYYMHWVRQAPGQGLEWMGWINPNSGGTNYTQMFQGRVTMTRDTSISTAYMEVSRLRSDDTAVYYCARDRSWAVVYYYMDVWGKGTTVTVSS,QSALTQPPSASGSPGQSVTISCTGTSSDVGGYNYVSWYQQHPGKAPKLMIYEVSKRPSGVPDRFSGSKSGNTASLTVSGLQAEDEADYYCSSYAGSNNLVFGGGTKLTVL,4.929173231124878,3.3410111556517585,4.407776355743408,-93.67488182433378,-93.86518926137244,-0.8941374094049486,-0.8003276464934338,29.74277687072754,27.263461143972293,28.40849781036377,-29.0122781152488,-33.949656576746975,-0.2652493493166934,-0.162420914404931,0.8257797360420227,-0.6743962168693542,-0.5556591749191284,-0.8933098316192627,-0.8285577297210693,0.5602933168411255,3.839163303375244
|
36 |
+
bd_368_2,B,7chf,10.6,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCG,EVQLLESGGGVVQPGGSLRLSCAASGFAFTTYAMNWVRQAPGRGLEWVSAISDGGGSAYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAKTRGRGLYDYVWGSKDYWGQGTLVTVSS,DIVMTQSPLSLPVTPGEPASISCRSSQSLLHSNGYNYLDWYLQKPGQSPQLLIYLGSNRASGVPDRFSGSGSGTDFTLKISRVEAEDVGVYYCMQALQTPGTFGQGTRLEIK,4.461946725845337,2.5024072363972665,3.743009328842163,-96.6514387625579,-96.00206107838125,-0.8990554553518113,-0.8463458903492488,29.73224639892578,27.509575458798825,28.624370574951172,-27.203968877407675,-30.601991341145418,-0.1817402522234116,-0.159777717187517,0.8255629539489746,-0.6854852437973022,-0.5700072050094604,-0.8894519209861755,-0.8053597807884216,0.4920808672904968,3.1887125968933105
|
37 |
+
bd45_68;c002,B,7k8s,74.4,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,EVQLVESGGGVVQPGRSLRLSCAASGFTFSIYGMHWVRQAPGKGLEWVAVISYDGSNKYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAKEGRPSDIVVVVAFDYWGQGTLVTVSS,DIQLTQSPSSLSASVGDRVTITCRASQSISSYLNWYQQKPGKAPKLLIYAASSLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQSYSTPRTFGQGTKVEIK,6.955448627471924,4.498572886354976,5.247814178466797,-88.45099056135865,-92.24203672341382,-0.8443057644254821,-0.7408887061541052,29.72929000854492,28.098661717970188,28.874387741088867,-27.69668585327663,-29.99647051692373,-0.1679655828196952,-0.1536244771481252,0.8013404011726379,-0.6110754609107971,-0.4823541939258575,-0.8810868859291077,-0.7911386489868164,0.7178725004196167,5.449672222137451
|
38 |
+
bd45_34;cv07_270,B,6xkp,18.7,NLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,QVQLVESGGGLVKPGGSLRLSCAASGFTFSDYYMTWIRQAPGKGLEWVSYISSSGSTIYYADSVKGRFTISRDNAKNSLYLQMNSLRAEDTAVYYCARARGSSGWYRIGTRWGNWFDPWGQGTLVTVSS,QSALTQPASVSGSPGQSITISCTGTSSDVGGYNYVSWYQQHPGKAPKLMIYEVSNRPSGVSNRFSGSKSGNTASLTISGLQAEDEADYYCSSYTSSSNVVFGGGTMLTVL,4.175543785095215,2.373752709574576,3.2796013355255127,-97.11940219835168,-96.8978089488789,-0.91774189525141,-0.8536361920041631,29.842841148376465,28.366062623713095,28.977081298828125,-29.332427010360867,-32.087063805612196,-0.2027383995976357,-0.150910121448011,0.7781082987785339,-0.6234115362167358,-0.5006304979324341,-0.8474777340888977,-0.790484607219696,0.9119642972946168,9.496830940246582
|
39 |
+
bd45_121;p17,B,7cwn,15.7,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,QQLVESGGGVVQPGRSLRLSCAASGFTFSSYAMHWVRQAPGKGLEWVAVISYDGSNKYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCARHATLMNNKDIWGQGTLVTVSS,DIQLTQSPSSLSASVGDRVTITCRASQSISSYLNWYQQKPGKAPKLLIYAASSLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQSYSTPRTFGQGTKVEIK,6.84061336517334,3.3883153531900807,5.355259895324707,-91.01590573969212,-91.86554195831675,-0.8483963689504885,-0.7978076982472123,29.83927631378174,28.18584484354655,28.651819229125977,-31.90575813246104,-34.886829715492354,-0.2030847805572237,-0.1527341695090403,0.7935856580734253,-0.5725716948509216,-0.4322860836982727,-0.8839105367660522,-0.8123855590820312,1.0896159410476685,11.85800075531006
|
40 |
+
bd45_17;s2h13,B,7jv4,256.0,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,EVQLVESGGDSVQPGGSLRLSCAAAGFTFSSYWMNWVRQAPGKGLEWVANIKQDGSEKYYVDSVKGRFTISRDNAKNSLYLQMNSLRAEDTAVYYCALSSGYSGYAGNYWGQGTLVTVSS,QAVVTQEPSLTVSPGGTVTLTCGSSTGAVTSGHYPYWFQQKPGQAPRTLIYDTSNKHSWTPARFSGSLLGGKAALTLSGARPEDEAEYYCLLSYSGARGVFGGGTKLTVL,4.609053611755371,3.1428052167577816,4.074997901916504,-94.2291900688914,-94.97592877896878,-0.8898500575029613,-0.8109731377590895,29.22559928894043,26.65667165256751,27.81351947784424,-35.7667397377162,-36.70547969983458,-0.2472369485580977,-0.1691259723001678,0.7806947231292725,-0.5837822556495667,-0.4415719509124756,-0.8654754161834717,-0.7569332122802734,0.7465585470199585,6.0116705894470215
|
41 |
+
bd45_4;imdevimab;regn10987,B,7zjl,20.5,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,QVQLVESGGGVVQPGRSLRLSCAASGFTFSNYAMYWVRQAPGKGLEWVAVISYDGSNKYYADSVKGRFTISRDNSKNTLYLQMNSLRTEDTAVYYCASGSDYGDYLLVYWGQGTLVTVSS,QSALTQPASVSGSPGQSITISCTGTSSDVGGYNYVSWYQQHPGKAPKLMIYDVSKRPSGVSNRFSGSKSGNTASLTISGLQSEDEADYYCNSLTSISTWVFGGGTKLTVL,5.395852088928223,2.764960693573979,3.951341152191162,-96.16693381684875,-96.03590007174324,-0.8943583603603353,-0.8316607174100925,29.71203994750977,28.470846238428233,29.04074764251709,-27.50479672103421,-30.607489529117142,-0.1874180391163263,-0.1498596010958033,0.7804175019264221,-0.5642211437225342,-0.4231846034526825,-0.8697257041931152,-0.7838578820228577,0.8087309002876282,6.416257381439209
|
42 |
+
bd45_64;c110,B,7k8v,2.4,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,QVQLQQSGAEVKKPGESLKISCKGSGYSFTSYWIGWVRQMPGKGLEWMGIIYPGDSDTRYSPSFQGQVTISADKSISTAYMQWSSLKASDTAMYYCARSFRDDPRIAVAGPADAFDIWGQGTMVTVSS,DIQMTQSPSTLSASVGDRVTITCRASQSISYWLAWYQQKPGKAPKLLIYQASSLESGVPSRFSGSESGTEFTLTISSLQPDDFATYYCQQYNSYPYTFGQGTKLEIK,12.731308937072754,6.661313110644916,9.542131423950195,-78.88927970102706,-85.52292529093127,-0.7444392206569428,-0.6414092689469812,29.84807586669922,27.80913458974738,28.929767608642575,-27.53958242696327,-29.227469200424103,-0.1722203973274763,-0.1566185095604561,0.8359307646751404,-0.7372189164161682,-0.655605673789978,-0.8810120224952698,-0.8059696555137634,0.6033827662467957,3.5965394973754883
|
43 |
+
bd45_63;c119,B,7k8w,10.8,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,QVQLVQSGAEVKKPGASVKVSCKASGYTFTSYYMHWVRQAPGQGLEWMGIINPSGGSTSYAQKLQGRVTMTRDTSTSTVYMELSSLRSEDTAVYYCARANHETTMDTYYYYYYMDVWGKGTTVTVSS,QSALTQPASVSGSPGQSITISCTGTSSDVGGYKYVSWYQRHPGKAPKLMIYDVSNRPSGVSNRFSGSKSGNTASLTISGLQAEDEADYYCSSYTSSSTSVVFGGGTQLTVL,5.443324089050293,3.616330442657041,4.4308552742004395,-92.09268544002582,-94.12550294907984,-0.8780551709712483,-0.7857719283312719,29.815004348754883,27.977888032174477,28.708821296691895,-29.376624644153782,-31.6704993449153,-0.2108832232352169,-0.1548663897398603,0.7926152944564819,-0.598787784576416,-0.4686140120029449,-0.873615562915802,-0.7956722378730774,0.6595845222473145,5.198920249938965
|
44 |
+
bd45_61;bms_986414;c135,B,7k8z,5.0,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,QVQLVESGGGVVQPGRSLRLSCAASGFTFSSYAMHWVRQAPGKGLEWVAVIPFDGRNKYYADSVTGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCASSSGYLFHSDYWGQGTLVTVSS,DIQMTQSPSTLSASVGDRVTITCRASQSISNWLAWFQQKPGKAPKLLIYEASSLESGVPSRFSGSGSGTEFTLTISSLQPDDFATYYCQQYNSYPWTFGQGTKVEIK,8.234559059143066,3.994086620852917,6.041779041290283,-92.1479134183486,-92.67221830429766,-0.8269049612107217,-0.7662303462012485,29.467466354370117,27.499800244862847,28.318639755249023,-29.137908430121577,-32.03605512356809,-0.1969720621451531,-0.1598818752139111,0.7796916365623474,-0.5714750289916992,-0.4313467741012573,-0.866777777671814,-0.7679586410522461,0.6375339031219482,5.208919525146484
|
45 |
+
bd45_1;gsk4182136;s309;sotrovimab;vir_7831;xevudy,B,7r6w,0.3,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,QVQLVQSGAEVKKPGASVKVSCKASGYPFTSYGISWVRQAPGQGLEWMGWISTYNGNTNYAQKFQGRVTMTTDTSTTTGYMELRRLRSDDTAVYYCARDYTRGAWFGESLIGGFDNWGQGTLVTVSS,EIVLTQSPGTLSLSPGERATLSCRASQTVSSTSLAWYQQKPGQAPRLLIYGASSRATGIPDRFSGSGSGTDFTLTISRLEPEDFAVYYCQQHDTSLTFGGGTKVEIK,4.035280227661133,2.1879774658228124,3.214127779006958,-97.586294896018,-97.78692552902648,-0.9168130538466628,-0.8642742302730783,29.46262550354004,27.239163579335372,28.214332580566406,-28.111347070609728,-31.835693294296725,-0.197552429920012,-0.1626842231171148,0.7895846962928772,-0.5726590156555176,-0.433131068944931,-0.8786981105804443,-0.811526894569397,1.0025489330291748,10.086435317993164
|
46 |
+
2h04,B,7k9j,133.5,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,EVQLQQSGAELVKPGASVKMSCKASGYTFTSYWITWVKQRPGQGLEWIGDIYPGSGSTKYNEKFRSEATLTVDTSSTTAYMQLSSLTSEDSAVYYCARWDFYGSRTFDYWGQGTTLTVSS,DIVLTQSPAILSVSPGERVSFSCRASQNIGTIIHWYQQRTNGSPRLLIKYASESVSGIPSRFSGSGSGTDFTLSINSVESEDIADYYCQQSSSWPLTFGAGTKLEL,5.5522050857543945,3.041350958815084,4.5895092487335205,-94.49311763338775,-91.39039245341203,-0.8817706878708991,-0.8164768411093322,29.418560028076172,27.98694058942123,28.17454433441162,-33.61158879530535,-34.574326230604456,-0.2508088107745393,-0.1547729554794146,0.7856423258781433,-0.571944534778595,-0.4345081448554992,-0.8734259009361267,-0.8325319290161133,0.6114388108253479,5.5772385597229
|
47 |
+
47d11;abbv_47d11,B,7akd,114.4,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,QVQLQESGPGLVKPSETLSLTCSVSGGSISSHYWSWIRQPPGKGLEWIGYIYYSGSTNHNPSLKSRVTISVDTSKNQFSLKLSSVTAADTAVYYCARGVLLWFGEPIFEIWGQGTMVTVSS,EIVMTQSPATLSVSPGERATLSCRASQSVSSSLAWYQQKPGQAPRLLIYGASTRAPGIPARFSGSGSGTEFTLTISSLQSEDFAVYYCQQYNNWPLTFGGGTKVEI,5.490380764007568,3.2952370952349423,4.705025672912598,-92.1416111266067,-94.18903519337286,-0.8748528155487488,-0.8027736597968829,29.626730918884277,27.558930717370448,28.560216903686523,-28.805804275135554,-33.09713122769224,-0.1959079980613512,-0.1592528564459155,0.7533620595932007,-0.5864310264587402,-0.4550740718841553,-0.8279340267181396,-0.751384437084198,0.8081450462341309,7.574724197387695
|
48 |
+
bd45_51;cova1_16,B,7lm8,39.3,NLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKK,QVQLVQSGAEVKKPGASVKVSCKASGYTFTSYYMHWVRQAPGQGLEWMGIINSSGGSTSYAQKFQGRVTMTRDTSTSTVYMELSSLRSEDTAVYYCARPPRNYYDRSGYYQRAEYFQHWGQGTLVTVSS,DIQLTQSPSSLSASVGDRVTITCQASQDISNYLNWYQQRPGKAPKLLIYDASNLETGVPSRFSGSGSGTDFTFTISSLQPEDIATYYCQQYDNPPLTFGGGTKLEIK,4.054622411727905,2.3062880757802025,3.3268402814865112,-97.4141787798708,-97.7504291827374,-0.9156229671016866,-0.8574841891806301,29.544042587280273,27.663066857468205,28.238636016845703,-29.922500266532385,-35.042157324403966,-0.2249247780000396,-0.1581510868209615,0.8197484016418457,-0.6141525506973267,-0.4896186590194702,-0.902280867099762,-0.8115324378013611,0.6478267312049866,5.265340805053711
|
49 |
+
2_36;mab2_36;mab_2_36,B,7n5h,25.5,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,QVQLQESGPGLVKPSETLSLTCTVSGGSVSSSNYYWSWIRQPPGKGLEWIGYMYYSGSTKYNPSLKSRVTISVDTSKNQFSLKLSSVTAADTAVYYCAREVYYYDRSGYYASDGFDIWGQGTMVTVSS,EIVLTQSPGTLSLSPGERATLSCRASQSVSSSYLAWYQQKPGQAPRLLIYGASSRATGIPDRFSGSGSGTDFTLTISRLEPEDFAVYYCQQYGSSPQTFGQGTKVEIK,5.51184606552124,3.4954805127935127,4.655013084411621,-91.56488723607376,-93.99126170903035,-0.8788724895280995,-0.792128197935659,29.45844554901123,27.190016831292045,27.64794158935547,-33.965713221432466,-38.14089769590593,-0.2509794897899634,-0.1632181239908253,0.8579543232917786,-0.7514504790306091,-0.6738511323928833,-0.9039801359176636,-0.8606258034706116,0.5185177326202393,2.2926836013793945
|
50 |
+
bd45_36;cr3022;cr3022_bloom,B,7lop,19.2,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,QMQLVQSGTEVKKPGESLKISCKGSGYGFITYWIGWVRQMPGKGLEWMGIIYPGDSETRYSPSFQGQVTISADKSINTAYLQWSSLKASDTAIYYCAGGSGISTPMDVWGQGTTVTVSS,DIQLTQSPDSLAVSLGERATINCKSSQSVLYSSINKNYLAWYQQKPGQPPKLLIYWASTRESGVPDRFSGSGSGTDFTLTISSLQAEDVAVYYCQQYYSTPYTFGQGTKVEIK,3.785881757736206,2.1887367745598056,3.154212474822998,-97.31325329160802,-97.57536327952296,-0.9249923637997646,-0.8642304813154394,29.614891052246097,27.25495690388121,28.62714958190918,-26.76361146923883,-30.0443491733584,-0.1862765651335828,-0.1625130249435957,0.82429039478302,-0.6890798807144165,-0.5778682827949524,-0.885895848274231,-0.7914222478866577,0.5398352146148682,3.682659864425659
|
51 |
+
bd45_30;ey6a,B,7nx8,11.5,NLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGP,EVQLVESGGGVVQPGRSLRLSCAASAFTFSSYDMHWVRQAPGKGLEWVAVISYDGSNKYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAKDGGKLWVYYFDYWGQGTLVTVSS,DIQMTQSPSSLSASVGDRVTITCRASQSISSYLNWYQQKPGKAPKLLIYAASSLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQSYSTLALTFGGGTKVEIK,3.929850935935974,2.1863213407188695,3.1314921379089355,-97.51058894055473,-97.71229369662947,-0.9213583874991912,-0.8643696586243207,29.878454208374023,28.315772050135845,29.09880256652832,-28.7715268732945,-32.06879935855624,-0.1916635431145444,-0.1514169276635339,0.8350378274917603,-0.7006388902664185,-0.6028293371200562,-0.8930899500846863,-0.8327577114105225,0.6301888227462769,5.578433990478516
|
52 |
+
bd45_9;h014,B,7cwn,0.4,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,VQLVQSGAEVKKPGATVKISCKVSGYSFSNYYIHWVKQAPGKSLEWIGYIDPFNGGTSDNLKFKGAATLTADTSTDTAYMELSSLRSEDTAVYYCARSEYDPYYVMDYWGQGTTVTVSS,IVLTQSPFQSVSPKEKVTITCRASQSISSNLHWYQQKPDQSPKLLIKYASQSISGIPSRFSGSGSGTDFTLTINSLEAEDFGIYFCQQTNFWPYIFGQGTKLEIL,6.031911134719849,4.9439687633453815,5.354763031005859,-86.79975783130662,-90.51398378567076,-0.871041595425665,-0.7192128581655506,29.82300090789795,27.54247150507448,28.78650951385498,-29.727914321816193,-31.984040053501733,-0.1824768566146962,-0.1594276974580828,0.7948814630508423,-0.6780011653900146,-0.5725476145744324,-0.8504648804664612,-0.7923485040664673,0.6161614060401917,4.652228832244873
|
53 |
+
bd45_19;s2a4,B,7jvc,9.0,VRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,EVQLVESGGGLVQPGGSLRLSCAASGFTFSSYWMNWVRQAPGKGLEWVANIKQDGSEKYYVDSVKGRFTISRDNAKNSLFLQMNSLRAEDTAVYYCARVWWLRGSFDYWGQGTLVTVSS,NFMLTQPHSVSESPGKTVTISCTGSSGSIASNYVQWYQQRPGSAPTTVIYEDNQRPSGVPDRFSGSIDSSSNSASLTISGLKTEDEADYYCQSYDSSNHVVFGGGTKLTVL,4.43854284286499,2.843207806437586,3.9522820711135864,-94.91913347613088,-95.89177499223236,-0.9156193065210604,-0.827333676502878,29.44169044494629,27.38740351860855,27.531078338623047,-40.35470606697892,-44.12683806675659,-0.3018415175756866,-0.1610843881621995,0.79897540807724,-0.6072283387184143,-0.4732429385185241,-0.880408525466919,-0.8060691356658936,0.6705988049507141,5.717726707458496
|
54 |
+
bd45_14;s304,B,8hws,4.4,TNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPK,VQLVESGGGLVQPGGSLRLSCAASGFTFSSYDMHWVRQTTGKGLEWVSTIGTAGDTYYPDSVKGRFTISREDAKNSLYLQMNSLRAGDTAVYYCARGDSSGYYYYFDYWGQGTLLTVSS,DIEMTQSPSSLSAAVGDRVTITCRASQSIGSYLNWYQQKPGKAPKLLIYAASSLQSGVPSRFSGSGSGTDFTLTISSLQPEDFAIYYCQQSYVSPTYTFGPGTKVDIK,4.787611484527588,2.8059083707912547,3.77287483215332,-94.91462018880014,-96.1300700923888,-0.9052554984532524,-0.829393508408732,29.710834503173828,28.24864526075121,28.94913673400879,-27.831625419639547,-29.99205705206104,-0.1656382480513416,-0.1520960549320848,0.9223516583442688,-0.9372462034225464,-0.9285171031951904,-0.9208102822303772,-0.899919331073761,0.3208865523338318,0.4858148396015167
|