📓

Gene expression changes in aging mouse brain predicting neurodegenerative vulnerability — Notebook Stub

notebook Created: 2026-04-06T11:04:56 By: orchestra-ci Quality: 75% ✓ SciDEX ID: notebook-SDA-2026-04-03-gap-aging-mouse-
📓 Notebook Preview Open Full Notebook →
SciDEX Notebook — Gene expression changes in aging mouse brain predicting neurodegenerative vulnerability

Gene Expression Changes in Aging Mouse Brain Predicting Neurodegenerative Vulnerability

Analysis ID: SDA-2026-04-03-gap-aging-mouse-brain-v3-20260402

Domain: Neurodegeneration

Hypotheses generated: 34

Knowledge graph edges: 216

Debate rounds: 4 | Quality score: 0.50

Research Question

What gene expression changes in the aging mouse brain predict neurodegenerative vulnerability?
Use Allen Aging Mouse Brain Atlas data. Cross-reference with human AD datasets.
Produce hypotheses about aging-neurodegeneration mechanisms.

This notebook presents a comprehensive, Forge-tool-powered analysis of the aging mouse brain,

integrating data from PubMed, STRING protein interactions, Allen Brain Atlas, Open Targets,

and ClinVar to validate and contextualize 28 AI-generated hypotheses.

%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.patches import FancyBboxPatch
from scipy import stats
import json, sqlite3, warnings
from pathlib import Path
warnings.filterwarnings('ignore')

# SciDEX dark theme
plt.rcParams.update({
    'figure.facecolor': '#0a0a14',
    'axes.facecolor': '#151525',
    'axes.edgecolor': '#333',
    'axes.labelcolor': '#e0e0e0',
    'text.color': '#e0e0e0',
    'xtick.color': '#888',
    'ytick.color': '#888',
    'legend.facecolor': '#151525',
    'legend.edgecolor': '#333',
    'figure.dpi': 120,
    'savefig.dpi': 120,
})

ANALYSIS_ID = 'SDA-2026-04-03-gap-aging-mouse-brain-v3-20260402'
DB = Path('/home/ubuntu/scidex/scidex.db')
print('Environment ready: numpy, pandas, matplotlib, scipy')
Environment ready: numpy, pandas, matplotlib, scipy

1. Hypothesis Landscape

The multi-agent debate system generated 34 hypotheses spanning microglial senescence,

ferroptosis, white matter vulnerability, proteasome dysfunction, and complement-mediated synaptic pruning.

Below we visualize the scoring distribution across four dimensions.

# Load hypothesis data from database
db = sqlite3.connect(str(DB))
hyps = pd.read_sql_query('''
    SELECT title, target_gene, composite_score,
           confidence_score as confidence, novelty_score as novelty,
           feasibility_score as feasibility, impact_score as impact
    FROM hypotheses
    WHERE analysis_id = ?
    ORDER BY composite_score DESC
''', db, params=[ANALYSIS_ID])
db.close()

print(f'Loaded {len(hyps)} hypotheses from analysis SDA-2026-04-03-gap-aging-mouse-brain-v3-20260402')
print(f'\nTop 5 by composite score:')
for i, row in hyps.head(5).iterrows():
    print(f'  {i+1}. {row["title"][:55]} (target: {row["target_gene"]}, score: {row["composite_score"]:.3f})')

print(f'\nScore ranges: confidence [{hyps.confidence.min():.2f}\u2013{hyps.confidence.max():.2f}], '
      f'novelty [{hyps.novelty.min():.2f}\u2013{hyps.novelty.max():.2f}], '
      f'impact [{hyps.impact.min():.2f}\u2013{hyps.impact.max():.2f}]')

# Visualize hypothesis landscape
fig, axes = plt.subplots(1, 3, figsize=(20, 7))

# 1. Composite score bar chart (top 15)
ax1 = axes[0]
top15 = hyps.head(15)
labels = [t[:30] + '...' if len(t) > 30 else t for t in top15['title']]
colors = ['#4fc3f7' if s > 0.5 else '#81c784' if s > 0.4 else '#ffd54f'
          for s in top15['composite_score']]
ax1.barh(range(len(labels)), top15['composite_score'], color=colors, alpha=0.85, edgecolor='#333')
ax1.set_yticks(range(len(labels)))
ax1.set_yticklabels(labels, fontsize=7)
ax1.set_xlabel('Composite Score', fontsize=11)
ax1.set_title('Top 15 Hypotheses by Composite Score', fontsize=12, color='#4fc3f7', fontweight='bold')
ax1.invert_yaxis()

# 2. Confidence vs Novelty scatter
ax2 = axes[1]
sc = ax2.scatter(hyps['confidence'], hyps['novelty'], c=hyps['impact'],
                 cmap='YlOrRd', s=80, alpha=0.8, edgecolors='#333')
for i, row in hyps.head(5).iterrows():
    ax2.annotate(row['target_gene'], (row['confidence'], row['novelty']),
                 fontsize=7, color='#e0e0e0', xytext=(5, 5), textcoords='offset points')
ax2.set_xlabel('Confidence', fontsize=11)
ax2.set_ylabel('Novelty', fontsize=11)
ax2.set_title('Confidence vs Novelty (color = Impact)', fontsize=12, color='#4fc3f7', fontweight='bold')
plt.colorbar(sc, ax=ax2, shrink=0.7).set_label('Impact', fontsize=9, color='#e0e0e0')

# 3. Score distribution boxplots
ax3 = axes[2]
bp = ax3.boxplot([hyps['confidence'], hyps['novelty'], hyps['feasibility'], hyps['impact']],
                 labels=['Confidence', 'Novelty', 'Feasibility', 'Impact'], patch_artist=True)
for patch, c in zip(bp['boxes'], ['#4fc3f7', '#81c784', '#ffd54f', '#ef5350']):
    patch.set_facecolor(c); patch.set_alpha(0.6)
for el in ['whiskers', 'caps', 'medians']:
    for line in bp[el]: line.set_color('#888')
ax3.set_ylabel('Score', fontsize=11)
ax3.set_title('Score Dimension Distributions', fontsize=12, color='#4fc3f7', fontweight='bold')

plt.tight_layout()
plt.show()
Loaded 34 hypotheses from analysis SDA-2026-04-03-gap-aging-mouse-brain-v3-20260402

Top 5 by composite score:
  1. TREM2-Dependent Microglial Senescence Transition (target: TREM2, score: 0.692)
  2. TREM2-Dependent Astrocyte-Microglia Cross-talk in Neuro (target: TREM2, score: 0.639)
  3. TREM2-Mediated Astrocyte-Microglia Cross-Talk in Neurod (target: TREM2, score: 0.612)
  4. TREM2-ASM Crosstalk in Microglial Lysosomal Senescence (target: SMPD1, score: 0.612)
  5. TREM2-Mediated Astrocyte-Microglia Crosstalk in Neurode (target: TREM2, score: 0.607)

Score ranges: confidence [0.00–0.82], novelty [0.00–0.95], impact [0.00–0.91]

2. Evidence Mining: PubMed Literature

Using the SciDEX Forge pubmed_search tool to retrieve recent publications on aging mouse brain

gene expression and neurodegenerative vulnerability.

import sys
sys.path.insert(0, '/home/ubuntu/scidex')
from tools import pubmed_search

# Search PubMed for relevant literature
papers = pubmed_search('aging mouse brain gene expression neurodegeneration vulnerability', max_results=10)
print(f"PubMed search: 'aging mouse brain gene expression neurodegeneration vulnerability'")
print(f'Found {len(papers)} papers\n')

for i, p in enumerate(papers[:8], 1):
    print(f'[{i}] {p.get("title", "Untitled")}')
    print(f'    PMID: {p.get("pmid", "")} | {p.get("journal", "")} ({p.get("year", "")})')
    print()
PubMed search: 'aging mouse brain gene expression neurodegeneration vulnerability'
Found 10 papers

[1] Atlas of the aging mouse brain reveals white matter as vulnerable foci.
    PMID: 37591239 | Cell (2023)

[2] Human striatal glia differentially contribute to AD- and PD-specific neurodegeneration.
    PMID: 36993867 | Nat Aging (2023)

[3] Spatial enrichment and genomic analyses reveal the link of NOMO1 with amyotrophic lateral sclerosis.
    PMID: 38643019 | Brain (2024)

[4] Amyloid-β Pathology-Specific Cytokine Secretion Suppresses Neuronal Mitochondrial Metabolism.
    PMID: 37811007 | Cell Mol Bioeng (2023)

[5] Alzheimer's disease-specific cytokine secretion suppresses neuronal mitochondrial metabolism.
    PMID: 37066287 | bioRxiv (2023)

[6] Stra8 links neuronal activity to inhibitory circuit protection in the adult mouse brain.
    PMID: 41187062 | Cell Rep (2025)

[7] The sinister face of heme oxygenase-1 in brain aging and disease.
    PMID: 30009872 | Prog Neurobiol (2019)

[8] Selective vulnerability of the aging cholinergic system to amyloid pathology revealed by induced APP overexpression.
    PMID: 41495755 | J Neuroinflammation (2026)

3. Gene Information & Protein Interactions

Querying gene annotations via get_gene_info and protein-protein interactions via

string_protein_interactions (STRING-DB) for the top target genes.

from tools import get_gene_info, string_protein_interactions

top_genes = ["TREM2", "SMPD1", "SIRT1", "CYP46A1", "GPX4", "PSMC"]

# Get gene annotations
print('Gene annotations for top targets:\n')
gene_data = {}
for g in top_genes[:5]:
    info = get_gene_info(g)
    if info:
        gene_data[g] = info
        summary = info.get('summary', '')[:120]
        print(f'  {g}: {info.get("name", "—")}')
        if summary:
            print(f'    {summary}...')
        print()

# Query STRING protein interactions (mouse = 10090)
interactions = string_protein_interactions(top_genes[:6], species=10090, score_threshold=400)
print(f'\nSTRING protein interactions ({len(interactions)} found, species: mouse 10090):\n')
for s in interactions[:10]:
    print(f'  {s["protein1"]} <-> {s["protein2"]}  score: {s.get("score", 0)}')
Gene annotations for top targets:

  TREM2: triggering receptor expressed on myeloid cells 2
    This gene encodes a membrane protein that forms a receptor signaling complex with the TYRO protein tyrosine kinase bindi...

  SMPD1: sphingomyelin phosphodiesterase 1
    The protein encoded by this gene is a lysosomal acid sphingomyelinase that converts sphingomyelin to ceramide. The encod...

  SIRT1: sirtuin 1
    This gene encodes a member of the sirtuin family of proteins, homologs to the yeast Sir2 protein. Members of the sirtuin...

  CYP46A1: cytochrome P450 family 46 subfamily A member 1
    This gene encodes a member of the cytochrome P450 superfamily of enzymes. The cytochrome P450 proteins are monooxygenase...

  GPX4: glutathione peroxidase 4
    The protein encoded by this gene belongs to the glutathione peroxidase family, members of which catalyze the reduction o...


STRING protein interactions (6 found, species: mouse 10090):

  APOE <-> TREM2  score: 0.986
  APOE <-> APP  score: 0.995
  TYROBP <-> CSF1R  score: 0.56
  TYROBP <-> TREM2  score: 0.998
  APP <-> TREM2  score: 0.491
  CSF1R <-> TREM2  score: 0.402
# Visualize STRING protein interaction network
fig, ax = plt.subplots(figsize=(10, 8))
nodes = set()
edge_list = []
for s in interactions[:20]:
    p1 = s['protein1'].split('.')[-1] if '.' in s['protein1'] else s['protein1']
    p2 = s['protein2'].split('.')[-1] if '.' in s['protein2'] else s['protein2']
    nodes.add(p1); nodes.add(p2)
    edge_list.append((p1, p2, s.get('score', 0)))

nodes = list(nodes)
angles = np.linspace(0, 2*np.pi, len(nodes), endpoint=False)
pos = {n: (np.cos(a)*3, np.sin(a)*3) for n, a in zip(nodes, angles)}

for p1, p2, sc in edge_list:
    ax.plot([pos[p1][0], pos[p2][0]], [pos[p1][1], pos[p2][1]],
            '-', color='#4fc3f7', alpha=min(sc/1000, 0.9), linewidth=max(1, sc/300))
for node in nodes:
    x, y = pos[node]
    color = '#ef5350' if node in top_genes[:3] else '#81c784'
    ax.scatter(x, y, s=200, c=color, zorder=5, edgecolors='#333')
    ax.annotate(node, (x, y), fontsize=8, color='#e0e0e0', ha='center',
                va='bottom', xytext=(0, 10), textcoords='offset points')

print(f'Plotting 6 STRING interactions...')
ax.set_title('STRING Protein Interaction Network (Mouse)', fontsize=13,
             color='#4fc3f7', fontweight='bold')
ax.axis('off')
plt.tight_layout()
plt.show()
Plotting 6 STRING interactions...
Content truncated for performance.
Parent Context
Metadata
notebook_id📓 nb-SDA-2026-04-03-gap-aging-mouse-brain-v3-20260402
stubTrue
file_pathsite/notebooks/SDA-2026-04-03-gap-aging-mouse-brain-v3-20260402.ipynb
rendered_html_pathsite/notebooks/SDA-2026-04-03-gap-aging-mouse-brain-v3-20260402.html
🌍 Provenance Graph 2 nodes, 1 edges
Linked Artifacts (2)

💬 Discussion