Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -244,7 +244,7 @@ def create_kmer_shap_csv(kmers, shap_values):
|
|
| 244 |
temp_path = os.path.join(temp_dir, f"kmer_shap_values_{os.urandom(4).hex()}.csv")
|
| 245 |
kmer_df.to_csv(temp_path, index=False)
|
| 246 |
|
| 247 |
-
return temp_path
|
| 248 |
|
| 249 |
def analyze_sequence(file_obj, top_kmers=10, fasta_text="", window_size=500):
|
| 250 |
if fasta_text.strip():
|
|
@@ -1000,11 +1000,12 @@ def load_example_fasta():
|
|
| 1000 |
return example_text
|
| 1001 |
except Exception as e:
|
| 1002 |
return f">example_sequence\nACGTACGT...\n\n(Note: Could not load example.fasta: {str(e)})"
|
| 1003 |
-
|
| 1004 |
###############################################################################
|
| 1005 |
# 14. BUILD GRADIO INTERFACE
|
| 1006 |
###############################################################################
|
| 1007 |
|
|
|
|
| 1008 |
css = """
|
| 1009 |
.gradio-container {
|
| 1010 |
font-family: 'IBM Plex Sans', sans-serif;
|
|
@@ -1031,37 +1032,42 @@ with gr.Blocks(css=css) as iface:
|
|
| 1031 |
file_input = gr.File(label="Upload FASTA file", file_types=[".fasta", ".fa", ".txt"], type="filepath")
|
| 1032 |
text_input = gr.Textbox(label="Or paste FASTA sequence", placeholder=">sequence_name\nACGTACGT...", lines=5)
|
| 1033 |
|
|
|
|
| 1034 |
with gr.Row():
|
| 1035 |
example_btn = gr.Button("Load Example FASTA", variant="secondary")
|
| 1036 |
|
| 1037 |
top_k = gr.Slider(minimum=5, maximum=30, value=10, step=1, label="Number of top k-mers to display")
|
| 1038 |
win_size = gr.Slider(minimum=100, maximum=5000, value=500, step=100, label="Window size for 'most pushing' subregions")
|
| 1039 |
analyze_btn = gr.Button("Analyze Sequence", variant="primary")
|
|
|
|
| 1040 |
with gr.Column(scale=2):
|
| 1041 |
results_box = gr.Textbox(label="Classification Results", lines=12, interactive=False)
|
| 1042 |
kmer_img = gr.Image(label="Top k-mer SHAP")
|
| 1043 |
genome_img = gr.Image(label="Genome-wide SHAP Heatmap (Blue=neg, White=0, Red=pos)")
|
| 1044 |
|
| 1045 |
-
|
| 1046 |
-
|
| 1047 |
-
|
| 1048 |
|
| 1049 |
seq_state = gr.State()
|
| 1050 |
header_state = gr.State()
|
| 1051 |
|
| 1052 |
# Event handlers
|
|
|
|
| 1053 |
example_btn.click(
|
| 1054 |
load_example_fasta,
|
| 1055 |
inputs=[],
|
| 1056 |
outputs=[text_input]
|
| 1057 |
)
|
| 1058 |
|
|
|
|
| 1059 |
analyze_btn.click(
|
| 1060 |
analyze_sequence,
|
| 1061 |
inputs=[file_input, top_k, text_input, win_size],
|
| 1062 |
outputs=[results_box, kmer_img, genome_img, seq_state, header_state, download_results, download_kmer_shap]
|
| 1063 |
)
|
| 1064 |
|
|
|
|
| 1065 |
with gr.Tab("2) Subregion Exploration"):
|
| 1066 |
gr.Markdown("""
|
| 1067 |
**Subregion Analysis**
|
|
|
|
| 244 |
temp_path = os.path.join(temp_dir, f"kmer_shap_values_{os.urandom(4).hex()}.csv")
|
| 245 |
kmer_df.to_csv(temp_path, index=False)
|
| 246 |
|
| 247 |
+
return temp_path, "kmer_shap_values.csv"
|
| 248 |
|
| 249 |
def analyze_sequence(file_obj, top_kmers=10, fasta_text="", window_size=500):
|
| 250 |
if fasta_text.strip():
|
|
|
|
| 1000 |
return example_text
|
| 1001 |
except Exception as e:
|
| 1002 |
return f">example_sequence\nACGTACGT...\n\n(Note: Could not load example.fasta: {str(e)})"
|
| 1003 |
+
|
| 1004 |
###############################################################################
|
| 1005 |
# 14. BUILD GRADIO INTERFACE
|
| 1006 |
###############################################################################
|
| 1007 |
|
| 1008 |
+
|
| 1009 |
css = """
|
| 1010 |
.gradio-container {
|
| 1011 |
font-family: 'IBM Plex Sans', sans-serif;
|
|
|
|
| 1032 |
file_input = gr.File(label="Upload FASTA file", file_types=[".fasta", ".fa", ".txt"], type="filepath")
|
| 1033 |
text_input = gr.Textbox(label="Or paste FASTA sequence", placeholder=">sequence_name\nACGTACGT...", lines=5)
|
| 1034 |
|
| 1035 |
+
# Add example FASTA button in a row
|
| 1036 |
with gr.Row():
|
| 1037 |
example_btn = gr.Button("Load Example FASTA", variant="secondary")
|
| 1038 |
|
| 1039 |
top_k = gr.Slider(minimum=5, maximum=30, value=10, step=1, label="Number of top k-mers to display")
|
| 1040 |
win_size = gr.Slider(minimum=100, maximum=5000, value=500, step=100, label="Window size for 'most pushing' subregions")
|
| 1041 |
analyze_btn = gr.Button("Analyze Sequence", variant="primary")
|
| 1042 |
+
|
| 1043 |
with gr.Column(scale=2):
|
| 1044 |
results_box = gr.Textbox(label="Classification Results", lines=12, interactive=False)
|
| 1045 |
kmer_img = gr.Image(label="Top k-mer SHAP")
|
| 1046 |
genome_img = gr.Image(label="Genome-wide SHAP Heatmap (Blue=neg, White=0, Red=pos)")
|
| 1047 |
|
| 1048 |
+
# Make both download buttons visible
|
| 1049 |
+
download_kmer_shap = gr.File(label="Download k-mer SHAP Values (CSV)", visible=True)
|
| 1050 |
+
download_results = gr.File(label="Download Results", visible=True, elem_classes="download-button")
|
| 1051 |
|
| 1052 |
seq_state = gr.State()
|
| 1053 |
header_state = gr.State()
|
| 1054 |
|
| 1055 |
# Event handlers
|
| 1056 |
+
# Connect the example button
|
| 1057 |
example_btn.click(
|
| 1058 |
load_example_fasta,
|
| 1059 |
inputs=[],
|
| 1060 |
outputs=[text_input]
|
| 1061 |
)
|
| 1062 |
|
| 1063 |
+
# Important: Make sure we have 7 outputs to match the 7 values returned by analyze_sequence
|
| 1064 |
analyze_btn.click(
|
| 1065 |
analyze_sequence,
|
| 1066 |
inputs=[file_input, top_k, text_input, win_size],
|
| 1067 |
outputs=[results_box, kmer_img, genome_img, seq_state, header_state, download_results, download_kmer_shap]
|
| 1068 |
)
|
| 1069 |
|
| 1070 |
+
|
| 1071 |
with gr.Tab("2) Subregion Exploration"):
|
| 1072 |
gr.Markdown("""
|
| 1073 |
**Subregion Analysis**
|