File size: 3,594 Bytes
89ffb34
89be9f9
9f169cd
d3204b1
89be9f9
 
f606ed7
 
 
 
 
cf3bd3a
 
d3204b1
 
 
 
99a0d01
 
 
 
 
d3204b1
 
 
592b51c
d3204b1
592b51c
d3204b1
 
 
 
 
 
 
 
89ee386
d3204b1
 
 
 
 
 
 
 
9f169cd
 
 
d3204b1
 
9f169cd
 
d3204b1
9f169cd
d3204b1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78951dd
 
d3204b1
 
a2591b6
27992d2
 
 
 
d41b7db
 
350befe
27992d2
350befe
 
 
 
78951dd
 
d3204b1
 
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
88
89
90
91
92
93
94
95
96
97
import pandas as pd
import streamlit as st
import os, shutil
from tiger import tiger_exhibit, load_transcripts, TARGET_LEN, NUCLEOTIDE_TOKENS


@st.cache
def convert_df(df):
    # IMPORTANT: Cache the conversion to prevent computation on every rerun
    return df.to_csv().encode('utf-8')

# title and instructions
st.title('TIGER Cas13 Efficacy Prediction')
st.session_state["fasta_seq"] = ""
st.session_state["text_seq"] = ""
status_bar, status_text = None, None

with st.form(key='calc_options'):
    c1_names = ['On Target Only', 'On and Off Target']
    option = st.radio('Calculation Options', c1_names, index=0)
    submitButton = st.form_submit_button(label='Choose Options')

# UserInput Form from text input
text_form = st.form("text")
text_input = text_form.text_input(
    label='Enter a target transcript:',
    #value='ATGCAGGACGCGGAGAACGTGGCGGTGCCCGAGGCGGCCGAGGAGCGCGC',
    placeholder='Upper or lower case')
if text_input:
    # input is too short
    if len(text_input) < TARGET_LEN:
        transcript_len = len(text_input)
        text_form.write('Transcript length ({:d}) must be at least {:d} bases.'.format(transcript_len, TARGET_LEN))
    else:
        st.session_state["text_seq"] = text_input
text_calc = text_form.form_submit_button(label="calculate")
#status bar
status_text_textform = text_form.empty()
status_bar_textform = text_form.progress(0)


# UserInput Form from file
fasta_form = st.form("fasta")
fasta = fasta_form.file_uploader(label="upload fasta file") 
if fasta:
    if os.path.exists("temp"):
        shutil.rmtree("temp")
    os.makedirs("temp")
    fname = fasta.name 
    st.write(fname)
    fpath = os.path.join("temp", fname)
    with open(fpath, "w") as f:
        f.write(fasta.getvalue().decode("utf-8"))
    transcript_tbl = load_transcripts([fpath])
    fasta_form.text("fasta file contents")
    fasta_form.write(transcript_tbl)
    seq = transcript_tbl['seq'][0]
    st.session_state["fasta_seq"] = seq
fasta_calc = fasta_form.form_submit_button(label="calculate")
status_text_fastaform = fasta_form.empty()
status_bar_fastaform = fasta_form.progress(0)
#st.write(text_calc)
#st.write(fasta_calc)

#Calculation
if text_calc:
    src_seq = st.session_state["text_seq"]
    status_text = status_text_textform
    status_bar= status_bar_textform
elif fasta_calc:
    src_seq = st.session_state["fasta_seq"]
    status_text = status_text_fastaform
    status_bar= status_bar_fastaform
else:
    src_seq = ""
#st.write(src_seq)

# valid input
if src_seq and all([True if nt.upper() in NUCLEOTIDE_TOKENS.keys() else False for nt in src_seq]):
    on_target, off_target = tiger_exhibit(pd.DataFrame(dict(id=['ManualEntry'], seq=[src_seq])),
            status_bar, status_text, check_off_targets=option == 'On and Off Target')
    on_target.rename(columns={"Guide":"23 nt guide sequence"}, inplace=True)
    if len(on_target)>0:
        if on_target.iloc[0]["On-target ID"] == 0:
            on_target.drop(["On-target ID"], axis=1, inplace=True)
    st.write('On-target predictions: ', on_target)
    st.download_button(label='Download', data=convert_df(on_target), file_name='on_target.csv', mime='text/csv')
    if len(off_target) > 0:
        off_target.rename(columns={"Guide":"23 nt guide sequence"}, inplace=True)
        st.write('Off-target predictions: ', off_target)
        st.download_button(label='Download', data=convert_df(off_target), file_name='off_target.csv', mime='text/csv')
    else:
        st.write('We did not find any off-target effects!')

# invalid input
#else:
#    st.write('Nucleotides other than ACGT detected!')