Spaces:
Sleeping
Sleeping
import streamlit as st | |
from pathlib import Path | |
from utils.results_manager import ResultsManager | |
from utils.errors import ErrorHandler | |
from config import SAMPLE_DATA_DIR | |
def init_session_state(): | |
"""Keep a persistent session state""" | |
defaults = { | |
"status_message": "Ready to analyze polymer spectra π¬", | |
"status_type": "info", | |
"input_text": None, | |
"filename": None, | |
"input_source": None, # "upload", "batch" or "sample" | |
"sample_select": "-- Select Sample --", | |
"input_mode": "Upload File", # controls which pane is visible | |
"inference_run_once": False, | |
"x_raw": None, | |
"y_raw": None, | |
"y_resampled": None, | |
"log_messages": [], | |
"uploader_version": 0, | |
"current_upload_key": "upload_txt_0", | |
"active_tab": "Details", | |
"batch_mode": False, | |
} | |
if "uploader_key" not in st.session_state: | |
st.session_state.uploader_key = 0 | |
for k, v in defaults.items(): | |
st.session_state.setdefault(k, v) | |
for key, default_value in defaults.items(): | |
if key not in st.session_state: | |
st.session_state[key] = default_value | |
# ==Initialize results table== | |
ResultsManager.init_results_table() | |
def log_message(msg: str): | |
"""Append a timestamped line to the in-app log, creating the buffer if needed.""" | |
ErrorHandler.log_info(msg) | |
def on_sample_change(): | |
"""Read selected sample once and persist as text.""" | |
sel = st.session_state.get("sample_select", "-- Select Sample --") | |
if sel == "-- Select Sample --": | |
return | |
try: | |
text = Path(SAMPLE_DATA_DIR / sel).read_text(encoding="utf-8") | |
st.session_state["input_text"] = text | |
st.session_state["filename"] = sel | |
st.session_state["input_source"] = "sample" | |
# π§ Clear previous results so right column resets immediately | |
reset_results("New sample selected") | |
st.session_state["status_message"] = f"π Sample '{sel}' ready for analysis" | |
st.session_state["status_type"] = "success" | |
except (FileNotFoundError, IOError) as e: | |
st.session_state["status_message"] = f"β Error loading sample: {e}" | |
st.session_state["status_type"] = "error" | |
def on_input_mode_change(): | |
"""Reset sample when switching to Upload""" | |
if st.session_state["input_mode"] == "Upload File": | |
st.session_state["sample_select"] = "-- Select Sample --" | |
st.session_state["batch_mode"] = False # Reset batch mode | |
elif st.session_state["input_mode"] == "Sample Data": | |
st.session_state["batch_mode"] = False # Reset batch mode | |
# π§ Reset when switching modes to prevent stale right-column visuals | |
reset_results("Switched input mode") | |
def reset_ephemeral_state(): | |
"""Comprehensive reset for the entire app state.""" | |
current_version = st.session_state.get("uploader_version", 0) | |
# Define keys that should NOT be cleared by a full reset | |
keep_keys = {"model_select", "input_mode"} | |
for k in list(st.session_state.keys()): | |
if k not in keep_keys: | |
st.session_state.pop(k, None) | |
# Manurally re-establish a clean state | |
# Re-seed essential state | |
st.session_state["status_message"] = "Ready to analyze polymer spectra" | |
st.session_state["status_type"] = "info" | |
st.session_state["batch_files"] = [] | |
st.session_state["inference_run_once"] = True | |
st.session_state[""] = "" | |
# CRITICAL: Increment the preserved version and re-assign it | |
st.session_state["uploader_version"] = current_version + 1 | |
st.session_state["current_upload_key"] = ( | |
f"upload_txt_{st.session_state['uploader_version']}" | |
) | |
def on_model_change(): | |
"""Force the right column back to init state when the model changes""" | |
reset_results("Model changed") | |
def reset_results(reason: str = ""): | |
"""Clear previous inference artifacts so the right column returns to initial state.""" | |
st.session_state["inference_run_once"] = False | |
st.session_state["x_raw"] = None | |
st.session_state["y_raw"] = None | |
st.session_state["y_resampled"] = None | |
# ||== Clear batch results when resetting ==|| | |
if "batch_results" in st.session_state: | |
del st.session_state["batch_results"] | |
# ||== Clear logs between runs ==|| | |
st.session_state["log_messages"] = [] | |
# ||== Always reset the status box ==|| | |
st.session_state["status_message"] = ( | |
f"βΉοΈ {reason}" if reason else "Ready to analyze polymer spectra π¬" | |
) | |
st.session_state["status_type"] = "info" | |
def clear_batch_results(): | |
"""Callback to clear only the batch results and the results log table.""" | |
if "batch_results" in st.session_state: | |
del st.session_state["batch_results"] | |
# Also clear the persistent table from the ResultsManager utility | |
ResultsManager.clear_results() | |
# --- END: BUG 2 FIX (Callback Function) --- | |
def reset_all(): | |
# Increment the key to force the file uploader to re-render | |
st.session_state.uploader_key += 1 | |
def trigger_run(): | |
"""Set a flag so we can detect button press reliably across reruns""" | |
st.session_state["run_requested"] = True | |