Spaces:
Running
Running
import gradio as gr | |
from get_index import get_engine | |
from protein_viz import render_html | |
index_repo = "ronig/siamese_protein_index" | |
model_repo = "ronig/protein_search_engine" | |
engine = get_engine(index_repo, model_repo) | |
def search_and_display(seq, n_res): | |
n_res = int(limit_n_results(n_res)) | |
search_res = engine.search_by_sequence(seq, n=n_res) | |
results_options = update_dropdown_menu(search_res) | |
formatted_search_results = format_search_results(search_res) | |
return formatted_search_results, results_options | |
def limit_n_results(n): | |
return max(min(n, 20), 1) | |
def update_dropdown_menu(search_res): | |
choices = [ | |
','.join([row['pdb_name'], row['chain_id']]) | |
for row in search_res | |
] | |
return gr.Dropdown.update( | |
choices=choices, interactive=True, value=choices[0], visible=True | |
) | |
def format_search_results(raw_search_results): | |
formatted_search_results = {} | |
for res in raw_search_results: | |
prot = res["pdb_name"] | |
chain = res["chain_id"] | |
value = res["score"] | |
genes = ",".join(res["gene_ids"]) | |
key = f"PDB: {prot} | Chain: {chain}" | |
if genes != "Unknown": | |
key += f" | Gene: {genes}" | |
formatted_search_results[key] = value | |
return formatted_search_results | |
def switch_viz(new_choice): | |
pdb_id, chain = new_choice.split(',') | |
title_update = gr.Markdown.update(visible=True) | |
return render_html(pdb_id=pdb_id, chain=chain), title_update | |
with gr.Blocks() as demo: | |
with gr.Column(): | |
gr.Markdown(""" | |
# Protein Binding Search Engine | |
This application examines all files uploaded to [PDB](https://www.rcsb.org/) to find the chains with which a given protein sequence is most likely to bind. | |
If the results are linked to a specific gene, their IDs will also be displayed. | |
""") | |
with gr.Column(): | |
with gr.Row(): | |
with gr.Column(): | |
seq_input = gr.Textbox( | |
value="KFLIYQMECSTMIFGL", | |
label="Input Sequence" | |
) | |
n_results = gr.Number(5, label="N Results") | |
search_button = gr.Button("Search", variant='primary') | |
search_results = gr.Label(num_top_classes=20, label="Search Results") | |
viz_header = gr.Markdown("## Visualization", visible=False) | |
results_selector = gr.Dropdown( | |
choices=[], multiselect=False, visible=False, | |
label="Visualized Search Result" | |
) | |
protein_viz = gr.HTML( | |
value=render_html(pdb_id=None, chain=None), | |
label="Protein Visualization" | |
) | |
gr.Examples([ | |
"KFLIYQMECSTMIFGL", | |
"PHFAMPPIHEDHLE", | |
"AEERIISLD" | |
], inputs=[seq_input]) | |
search_button.click( | |
search_and_display, | |
inputs=[seq_input, n_results], | |
outputs=[search_results, results_selector] | |
) | |
results_selector.change( | |
switch_viz, inputs=results_selector, outputs=[protein_viz, viz_header] | |
) | |
if __name__ == "__main__": | |
demo.launch() | |