Add correlation tab

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