| from gradio import Blocks, Button, Checkbox, DataFrame, DownloadButton, Dropdown, Examples, Image, Markdown, Tab, Textbox |
|
|
| from model import get_models |
| from data import Data |
|
|
| |
| SCORING = ["wt-marginals", "masked-marginals"] |
|
|
| |
| MODELS = get_models() |
|
|
| def app(*argv): |
| """ |
| Main application function |
| """ |
| |
| seq, trg, model_name, *_ = argv |
| scoring = SCORING[scoring_strategy.value] |
| |
| data = Data(seq, trg, model_name, scoring).calculate() |
|
|
| if isinstance(data.image(), str): |
| out = Image(value=data.image(), type='filepath', visible=True), DataFrame(visible=False) |
| else: |
| out = Image(visible=False), DataFrame(value=data.image(), visible=True) |
| |
| return *out, DownloadButton(value=data.csv(), visible=True) |
|
|
| |
| with Blocks() as esm_scan: |
| Markdown("# [ESM-Scan](https://doi.org/10.1002/pro.5221)") |
| |
| with Tab("App"): |
| Markdown(open("header.md", "r", encoding="utf-8").read()) |
| seq = Textbox( |
| lines=2, |
| label="Sequence", |
| placeholder="FASTA sequence here...", |
| value='' |
| ) |
| trg = Textbox( |
| lines=1, |
| label="Substitutions", |
| placeholder="Substitutions here...", |
| value="" |
| ) |
| model_name = Dropdown(MODELS, label="Model", value="facebook/esm2_t30_150M_UR50D") |
| scoring_strategy = Checkbox(value=True, label="Use higher accuracy scoring", interactive=True) |
| btn = Button(value="Run", variant="primary") |
| dlb = DownloadButton(label="Download raw data", visible=False) |
| out = Image(visible=False) |
| ouu = DataFrame(visible=False) |
| btn.click( |
| fn=app, |
| inputs=[seq, trg, model_name], |
| outputs=[out, ouu, dlb] |
| ) |
| ex = Examples( |
| examples=[ |
| [ |
| "MVEQYLLEAIVRDARDGITISDCSRPDNPLVFVNDAFTRMTGYDAEEVIGKNCRFLQRGDINLSAVHTIKIAMLTHEPCLVTLKNYRKDGTIFWNELSLTPIINKNGLITHYLGIQKDVSAQVILNQTLHEENHLLKSNKEMLEYLVNIDALTGLHNRRFLEDQLVIQWKLASRHINTITIFMIDIDYFKAFNDTYGHTAGDEALRTIAKTLNNCFMRGSDFVARYGGEEFTILAIGMTELQAHEYSTKLVQKIENLNIHHKGSPLGHLTISLGYSQANPQYHNDQNLVIEQADRALYSAKVEGKNRAVAYREQ", |
| "deep mutational scanning", |
| "facebook/esm2_t6_8M_UR50D" |
| ], |
| [ |
| "MVEQYLLEAIVRDARDGITISDCSRPDNPLVFVNDAFTRMTGYDAEEVIGKNCRFLQRGDINLSAVHTIKIAMLTHEPCLVTLKNYRKDGTIFWNELSLTPIINKNGLITHYLGIQKDVSAQVILNQTLHEENHLLKSNKEMLEYLVNIDALTGLHNRRFLEDQLVIQWKLASRHINTITIFMIDIDYFKAFNDTYGHTAGDEALRTIAKTLNNCFMRGSDFVARYGGEEFTILAIGMTELQAHEYSTKLVQKIENLNIHHKGSPLGHLTISLGYSQANPQYHNDQNLVIEQADRALYSAKVEGKNRAVAYREQ", |
| "217 218 219", |
| "facebook/esm2_t12_35M_UR50D" |
| ], |
| [ |
| "MVEQYLLEAIVRDARDGITISDCSRPDNPLVFVNDAFTRMTGYDAEEVIGKNCRFLQRGDINLSAVHTIKIAMLTHEPCLVTLKNYRKDGTIFWNELSLTPIINKNGLITHYLGIQKDVSAQVILNQTLHEENHLLKSNKEMLEYLVNIDALTGLHNRRFLEDQLVIQWKLASRHINTITIFMIDIDYFKAFNDTYGHTAGDEALRTIAKTLNNCFMRGSDFVARYGGEEFTILAIGMTELQAHEYSTKLVQKIENLNIHHKGSPLGHLTISLGYSQANPQYHNDQNLVIEQADRALYSAKVEGKNRAVAYREQ", |
| "R218K R218S R218N R218A R218V R218D", |
| "facebook/esm2_t30_150M_UR50D", |
| ], |
| [ |
| "MVEQYLLEAIVRDARDGITISDCSRPDNPLVFVNDAFTRMTGYDAEEVIGKNCRFLQRGDINLSAVHTIKIAMLTHEPCLVTLKNYRKDGTIFWNELSLTPIINKNGLITHYLGIQKDVSAQVILNQTLHEENHLLKSNKEMLEYLVNIDALTGLHNRRFLEDQLVIQWKLASRHINTITIFMIDIDYFKAFNDTYGHTAGDEALRTIAKTLNNCFMRGSDFVARYGGEEFTILAIGMTELQAHEYSTKLVQKIENLNIHHKGSPLGHLTISLGYSQANPQYHNDQNLVIEQADRALYSAKVEGKNRAVAYREQ", |
| "MVEQYLLEAIVRDARDGITISDCSRPDNPLVFVNDAFTRMTGYDAEEVIGKNCRFLQRGDINLSAVHTIKIAMLTHEPCLVTLKNYRKDGTIFWNELSLTPIINKNGLITHYLGIQKDVSAQVILNQTLHEENHLLKSNKEMLEYLVNIDALTGLHNRRFLEDQLVIQWKLASRHINTITIFMIDIDYFKAFNDTYGHTAGDEALRTIAKTLNNCFMWGSDFVARYGGEEFTILAIGMTELQAHEYSTKLVQKIENLNIHHKGSPLGHLTISLGYSQANPQYHNDQNLVIEQADRALYSAKVEGKNRAVAYREQ", |
| "facebook/esm2_t33_650M_UR50D", |
| ], |
| ], |
| inputs=[seq, |
| trg, |
| model_name], |
| outputs=[out], |
| fn=app, |
| cache_examples=False |
| ) |
| with Tab("Instructions"): |
| Markdown(open("instructions.md", "r", encoding="utf-8").read()) |
|
|
| |
| if __name__ == "__main__": |
| esm_scan.launch() |
|
|