Spaces:
Running
Running
File size: 6,959 Bytes
8643122 21d9b75 8643122 21d9b75 8643122 21d9b75 8643122 21d9b75 8643122 21d9b75 8643122 21d9b75 8643122 21d9b75 8643122 21d9b75 8643122 21d9b75 8643122 ab204cc 8643122 ab204cc 8643122 21d9b75 8643122 | 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 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | """CortexLab Dashboard - Futuristic Landing Page."""
import streamlit as st
import numpy as np
from theme import inject_theme, hero_header, glow_card, section_header, feature_card
from session import init_session, show_analysis_log
from utils import make_roi_indices
from brain_mesh import load_fsaverage_mesh, generate_sample_activations, render_interactive_3d
st.set_page_config(page_title="CortexLab", page_icon="🧠", layout="wide", initial_sidebar_state="collapsed")
init_session()
inject_theme()
# --- Hero ---
hero_header(
"CortexLab",
"Enhanced multimodal fMRI brain encoding toolkit built on Meta's TRIBE v2",
)
# --- 3D Brain Hero ---
st.markdown("<div style='height: 0.5rem'></div>", unsafe_allow_html=True)
with st.spinner("Rendering brain..."):
coords, faces = load_fsaverage_mesh("left", "fsaverage5")
n_verts = coords.shape[0]
roi_indices, _ = make_roi_indices()
mesh_roi = {name: np.clip((idx * n_verts // 580).astype(int), 0, n_verts - 1) for name, idx in roi_indices.items()}
activations = generate_sample_activations(n_verts, mesh_roi, "multimodal", seed=42)
fig = render_interactive_3d(
coords, faces, activations, cmap="Inferno", vmin=0, vmax=0.8,
bg_color="#050510", initial_view="Lateral Left",
roi_indices=mesh_roi, show_labels=False,
)
if fig is not None:
fig.update_layout(
height=500,
margin=dict(l=0, r=0, t=0, b=0),
)
st.plotly_chart(fig, use_container_width=True)
# --- Stats Bar ---
st.markdown("<div style='height: 0.5rem'></div>", unsafe_allow_html=True)
c1, c2, c3, c4, c5 = st.columns(5)
with c1: glow_card("Tests", "89", "All passing", "#10B981")
with c2: glow_card("Analysis Modules", "10", "Brain encoding", "#7C3AED")
with c3: glow_card("ROIs", "29", "HCP MMP1.0", "#3B82F6")
with c4: glow_card("Contributors", "4", "Open source", "#EC4899")
with c5: glow_card("License", "CC BY-NC", "Non-commercial", "#F59E0B")
# --- Feature Grid ---
st.markdown("<div style='height: 1.5rem'></div>", unsafe_allow_html=True)
section_header("Analysis Tools", "Everything you need for computational neuroscience research")
col1, col2, col3 = st.columns(3)
with col1:
st.markdown(feature_card(
"🎯", "Brain Alignment Benchmark",
"Score any AI model against brain responses. RSA, CKA, Procrustes with permutation tests, bootstrap CIs, and FDR correction.",
"#7C3AED"
), unsafe_allow_html=True)
st.page_link("pages/1_Brain_Alignment.py", label="Open Brain Alignment")
with col2:
st.markdown(feature_card(
"📊", "Cognitive Load Scorer",
"Predict cognitive demand across visual, auditory, language, and executive dimensions with confidence bands.",
"#3B82F6"
), unsafe_allow_html=True)
st.page_link("pages/2_Cognitive_Load.py", label="Open Cognitive Load")
with col3:
st.markdown(feature_card(
"⏱️", "Temporal Dynamics",
"Peak response latency, lag correlations, sustained vs transient decomposition, cross-ROI lag matrix.",
"#06B6D4"
), unsafe_allow_html=True)
st.page_link("pages/3_Temporal_Dynamics.py", label="Open Temporal Dynamics")
col4, col5, col6 = st.columns(3)
with col4:
st.markdown(feature_card(
"🔗", "ROI Connectivity",
"Functional connectivity, partial correlation, network clustering, modularity, degree and betweenness centrality.",
"#10B981"
), unsafe_allow_html=True)
st.page_link("pages/4_Connectivity.py", label="Open Connectivity")
with col5:
st.markdown(feature_card(
"🧠", "3D Brain Viewer",
"Interactive rotatable brain surface with activation overlays, publication-quality multi-view panels, ROI highlighting.",
"#EC4899"
), unsafe_allow_html=True)
st.page_link("pages/5_Brain_Viewer.py", label="Open Brain Viewer")
with col6:
st.markdown(feature_card(
"🔴", "Live Inference",
"Real-time brain prediction from webcam, screen capture, or video. All metrics update live. Works in simulation mode or with full CortexLab + GPU.",
"#EF4444"
), unsafe_allow_html=True)
st.page_link("pages/6_Live_Inference.py", label="Open Live Inference")
# --- Data Config (collapsed) ---
st.markdown("<div style='height: 1rem'></div>", unsafe_allow_html=True)
with st.expander("Data Configuration", expanded=False):
from session import data_summary_widget, upload_npy_widget
col_src, col_params = st.columns([1, 2])
with col_src:
source = st.radio("Data source", ["Synthetic (realistic)", "Upload your data"], index=0)
st.session_state["data_source"] = "synthetic" if "Synthetic" in source else "uploaded"
with col_params:
if st.session_state["data_source"] == "synthetic":
c1, c2, c3, c4 = st.columns(4)
st.session_state["stimulus_type"] = c1.selectbox("Stimulus", ["visual", "auditory", "language", "multimodal"])
st.session_state["n_timepoints"] = c2.slider("TRs", 30, 200, 80)
st.session_state["tr_seconds"] = c3.slider("TR (s)", 0.5, 2.0, 1.0, 0.1)
st.session_state["seed"] = c4.number_input("Seed", value=42, min_value=0)
roi_indices_full, n_vertices = make_roi_indices()
st.session_state["roi_indices"] = roi_indices_full
st.session_state["n_vertices"] = n_vertices
from synthetic import generate_realistic_predictions
predictions = generate_realistic_predictions(
st.session_state["n_timepoints"], roi_indices_full,
st.session_state["stimulus_type"], st.session_state["tr_seconds"],
seed=st.session_state["seed"],
)
st.session_state["brain_predictions"] = predictions
else:
uploaded = upload_npy_widget("Upload predictions (.npy)", "upload_home")
if uploaded is not None:
st.session_state["brain_predictions"] = uploaded
roi_indices_full, _ = make_roi_indices()
st.session_state["roi_indices"] = roi_indices_full
preds = st.session_state.get("brain_predictions")
roi_idx = st.session_state.get("roi_indices")
if preds is not None and roi_idx is not None:
data_summary_widget(preds, roi_idx)
# --- Footer ---
show_analysis_log()
st.markdown("""
<div style="text-align: center; padding: 2rem 0 1rem 0; color: #475569; font-size: 0.75rem;">
Built on <a href="https://github.com/facebookresearch/tribev2" style="color: #7C3AED; text-decoration: none;">Meta's TRIBE v2</a>
•
<a href="https://github.com/siddhant-rajhans/cortexlab" style="color: #3B82F6; text-decoration: none;">GitHub</a>
•
<a href="https://huggingface.co/SID2000/cortexlab" style="color: #06B6D4; text-decoration: none;">HuggingFace</a>
•
CC BY-NC 4.0
</div>
""", unsafe_allow_html=True)
|