File size: 4,984 Bytes
31be27c
fba8f5e
08446bb
fba8f5e
 
 
08446bb
634752b
31be27c
7e12824
c74a121
31be27c
39fc6e6
 
 
 
31be27c
39fc6e6
 
ddc1bd3
08446bb
31be27c
7e12824
c74a121
 
7e12824
08446bb
7e12824
 
 
08446bb
c74a121
 
 
7e12824
fba8f5e
7e12824
8ecc9a8
fba8f5e
8ecc9a8
7e12824
08446bb
 
c74a121
7e12824
31be27c
08446bb
c74a121
7e12824
31be27c
 
 
 
c74a121
31be27c
 
c74a121
 
 
 
 
8ecc9a8
 
08446bb
 
7e12824
08446bb
 
7e12824
08446bb
 
7e12824
08446bb
 
7e12824
08446bb
31be27c
 
08446bb
7e12824
8ecc9a8
7e12824
634752b
fba8f5e
462a012
7e12824
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
from gradio import Blocks, Button, Checkbox, DownloadButton, Dropdown, Error, Examples, Image, HTML, Markdown, Progress, Tab, Textbox

from model import ModelFactory
from data import Data

# Get available models
MODELS = ModelFactory.models()

def app(seq, sub, model_name, acc):
    "Main application function"
    global progress
    scoring = "masked-marginals" if acc else "wt-marginals"

    # Validate the input
    if 1 > len(seq):
        raise Error("Sequence cannot be empty")
    if 1 > len(sub):
        raise Error("Substitutions cannot be empty")

    # Calculate the data based on the input parameters
    try:
        data = Data(seq, sub, model_name, scoring).calculate(progress)
        if isinstance(data.image, str):
            return ( Image(value=data.image, type='filepath', height=None, visible=True)
                   , HTML(value='')
                   , DownloadButton(value=data.csv, visible=True) )
        else:
            return ( Image(visible=False)
                   , HTML(value=data.image.to_html(), visible=True)
                   , DownloadButton(value=data.csv, visible=True) )
    except Exception as e:
        raise Error(str(e))
    finally:
        progress = Progress()
    
# Create the Gradio interface
with Blocks() as demo:
    Markdown("# [ESM-Scan](https://doi.org/10.1002/pro.5221)")
    # Define the interface components
    with Tab("App"):
        Markdown(open("header.md", 'r', encoding="utf-8").read())
        seq = Textbox( lines=2
                     , label="Sequence"
                     , placeholder="FASTA sequence here…"
                     , value='' )
        sub = Textbox( lines=1
                     , label="Substitutions"
                     , placeholder="Substitutions here…"
                     , value='' )
        model_name  = Dropdown(MODELS, label="Model", value="facebook/esm2_t30_150M_UR50D")
        acc_box     = Checkbox(value=True, label="Use higher accuracy scoring", interactive=True)
        run_btn     = Button(value="Run", variant="primary")
        dl_btn      = DownloadButton(label="Download raw data", visible=False)
        out_html    = HTML(visible=False)
        progress    = Progress()
        out_img     = Image(visible=False)
        run_btn.click( fn=lambda : (HTML(value=None, visible=False), Image(value=None, visible=True, height=128))
                     , outputs=[out_html, out_img]
                     ).then( fn=app
                           , inputs=[seq, sub, model_name, acc_box]
                           , outputs=[out_img, out_html, dl_btn] )
        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, sub, model_name]
          , outputs=[out_img]
          , fn=app
          , cache_examples=False )
    with Tab("Instructions"):
        Markdown(open("instructions.md", 'r', encoding="utf-8").read())

# Launch the Gradio interface
if __name__ == "__main__":
    demo.launch()