File size: 3,037 Bytes
4d886f4
a0a18a3
acd0d36
4d886f4
 
acd0d36
4d886f4
acd0d36
 
4d886f4
 
acd0d36
 
 
 
 
4d886f4
 
 
 
 
 
 
 
 
 
acd0d36
 
 
 
 
4d886f4
 
34e8e2b
 
 
4d886f4
34e8e2b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4d886f4
 
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
"""
FateFormer Explorer: interactive analysis hub.
Run: streamlit run streamlit_hf/app.py (repo root) or streamlit run app.py (from streamlit_hf/).
"""

from __future__ import annotations

import sys
from pathlib import Path

_APP_DIR = Path(__file__).resolve().parent
_REPO_ROOT = _APP_DIR.parent
if str(_REPO_ROOT) not in sys.path:
    sys.path.insert(0, str(_REPO_ROOT))

import streamlit as st
_ICON_PATH = _APP_DIR / "static" / "app_icon.svg"
_page_icon_kw = {"page_icon": str(_ICON_PATH)} if _ICON_PATH.is_file() else {}

st.set_page_config(
    page_title="FateFormer Explorer",
    layout="wide",
    initial_sidebar_state="expanded",
    **_page_icon_kw,
)

# Preload shared UI helpers before page scripts. Streamlit's file watcher can
# delete watched modules from sys.modules on save; if that happens mid-import,
# importlib may raise KeyError on the module name. Loading here narrows the race.
import streamlit_hf.lib.ui as _streamlit_ui_preload  # noqa: F401, E402

_home = str(_APP_DIR / "home.py")
_p1 = str(_APP_DIR / "pages" / "1_Single_Cell_Explorer.py")
_fi = _APP_DIR / "pages" / "feature_insights"
_flux = _APP_DIR / "pages" / "flux_analysis"
_ge = _APP_DIR / "pages" / "gene_expression"

pages = {
    "": [
        st.Page(_home, title="Home", icon=":material/home:", default=True),
        st.Page(_p1, title="Single-Cell Explorer", icon=":material/scatter_plot:"),
    ],
    "Feature Insights": [
        st.Page(str(_fi / "1_Global_overview.py"), title="Global overview", icon=":material/dashboard:"),
        st.Page(str(_fi / "2_Modality_spotlight.py"), title="Modality spotlight", icon=":material/view_column:"),
        st.Page(str(_fi / "3_Shift_vs_attention.py"), title="Shift vs attention", icon=":material/scatter_plot:"),
        st.Page(str(_fi / "4_Attention_vs_prediction.py"), title="Attention vs prediction", icon=":material/psychology:"),
        st.Page(str(_fi / "5_Full_table.py"), title="Full table", icon=":material/table:"),
    ],
    "Flux Analysis": [
        st.Page(str(_flux / "5_Interactive_map.py"), title="Metabolic map", icon=":material/map:"),
        st.Page(str(_flux / "1_Pathway_map.py"), title="Pathway map", icon=":material/hub:"),
        st.Page(str(_flux / "2_Differential_fate.py"), title="Differential & fate", icon=":material/compare_arrows:"),
        st.Page(str(_flux / "3_Reaction_ranking.py"), title="Reaction ranking", icon=":material/format_list_numbered:"),
        st.Page(str(_flux / "4_Model_metadata.py"), title="Model metadata", icon=":material/schema:"),
    ],
    "Gene Expression & TF": [
        st.Page(str(_ge / "1_Pathway_enrichment.py"), title="Pathway enrichment", icon=":material/bubble_chart:"),
        st.Page(str(_ge / "2_Motif_activity.py"), title="Motif activity", icon=":material/biotech:"),
        st.Page(str(_ge / "3_Gene_table.py"), title="Gene table", icon=":material/table_rows:"),
        st.Page(str(_ge / "4_Motif_table.py"), title="Motif table", icon=":material/table_chart:"),
    ],
}
nav = st.navigation(pages)
nav.run()