Integrated analysis of open human spaceflight blood transcriptomics, reframed as a natural accelerated model of terrestrial immune aging. Built for the Built with Claude: Life Sciences hackathon (Anthropic × Gladstone).
One-line finding. The conserved human spaceflight blood signature — reproduced across two independent missions and validated out-of-sample in a mission the SOMA atlas never used — most closely resembles terrestrial immune aging / inflammaging, and a dual-evidence countermeasure screen (transcriptional reversal × independent lifespan-extension) nominates oral, human-safe geroprotectors that oppose it.
SOMA (Overbey et al., Nature 2024) characterized the conserved spaceflight signature but did not disease-map it or test it in independent commercial missions. Building on that:
- Disease-signature mapping (rank-based GSEA; two confound nulls) → immune-aging resemblance.
- Out-of-sample replication in Axiom Ax-1 (OSD-903), a mission SOMA did not include.
- Dual-evidence countermeasures → compounds that (a) transcriptionally REVERSE the signature
(XSum connectivity over LINCS L1000) AND (b) independently extend lifespan (HAGR DrugAge),
ranked by mission-pharmacy feasibility. Top actionable hits: taxifolin, ursolic acid, curcumin,
everolimus. Hypothesis-generating only — see
docs/countermeasure_report.md.
See docs/RELATED_WORK.md for honest positioning against 2025–2026 near-neighbor papers.
Pointing an AI agent at this repo? See
AGENTS.mdfor the full runbook.
pip install -r requirements.txt # or: conda env from environment.yml
FIG_16X9=1 python src/make_space_figures.py # regenerates the committed figures/ (all six, 16:9)make_space_figures.py reads only data/processed/ and data/gene_sets/ — no network, no controlled
data. fig1–3 and fig6 use the live pipeline; fig4 runs GSEA prerank + a 5× scrambled-signature null
live over data/gene_sets/reference_signatures.json (needs gseapy, already in requirements.txt) and
fig5 rebuilds from the committed dual-evidence table. Every figure is deterministic (fixed seeds), so
the committed figures/ regenerate byte-for-byte on the same platform (they were rendered on macOS
with Helvetica Neue; other machines fall back to DejaVu Sans — visually equivalent, numbers unchanged).
The shared deep-space theme is in src/spacetheme.py;
drop FIG_16X9 for the default aspect. src/make_figures.py + src/figstyle.py are the original
plain-style generators (fig1–4; fig4 there is a simpler rank plot without the scrambled-null control);
they write to a separate figures_plain/ so they never overwrite the committed demo set in figures/.
The supplementary + schematic figures regenerate the same way, all space-themed 16:9:
python src/make_supp_singlecell.py # single-cell OXPHOS-compartment supp (from docs/singlecell_celltype_anchors.csv)
python src/make_supp_frailty.py # frailty-panel corroboration supp (from docs/frailty_convergence.csv)
python src/make_workflow.py # end-to-end analysis-workflow schematic (incl. the closed loop)fig5 (countermeasures) has two external inputs not committed here (large / separately licensed):
the Enrichr LINCS L1000 Chem-Pert GMTs and HAGR DrugAge. Fetch them once with:
bash data/gene_sets/fetch_lincs_drugage.sh # → lincs_chempert_{up,down}.gmt + drugage.csvThe derived result tables fig5 plots are already committed in docs/ (ranked_reversers.csv,
dual_evidence_candidates.csv), so the figure itself is reproducible without the download — the fetch
is only needed to rerun the reversal step from scratch.
The disease-mapping method generalizes beyond spaceflight to any directional signature. pipeline.py
turns it into a reusable engine — point it at a folder of signature CSVs (symbol,score) and it maps
each against the 131-set versioned reference library:
python src/pipeline.py map --signatures ./signatures --out ./atlas_out # runs today, no API keyThree ready-to-run example signatures ship in signatures/ (see signatures/README.md) — the
combined conserved signature and each mission alone; both single-mission inputs independently land on
human immune-aging sets. This step is live and reproduces the fig4 result on our own signature. A second, scaffolded step
(run --annotate) uses the Anthropic Batches API to interpret every top hit at scale and is built
to ingest each new OSDR/disease dataset as it publishes — the living atlas. That step needs an
ANTHROPIC_API_KEY; without one, pipeline.py assembles and writes the batch requests but does not
submit them. No API credits were consumed in this hackathon build — the analysis ran interactively
on the Claude Max plan; the annotation half is the concrete "what we'd build with API access" component.
atlas_loop.py makes the atlas self-updating. It watches the three external sources the project
depends on and re-runs only the affected stage when one changes:
python src/atlas_loop.py check # detect changes, write atlas_change_report.json, no re-run
python src/atlas_loop.py refresh # detect + re-run affected stage + DIFF vs committed output- ① OSDR hook — polls osdr.nasa.gov for new human transcriptomic studies (filtered on organism + assay + material); a new mission is flagged for harmonization, then map+screen re-run.
- ② DrugAge hook / ③ LINCS hook — fingerprint the geroprotector table and the L1000 library; on
change, re-run the XSum × DrugAge dual-evidence filter (
connectivity.py— the same logic behindfig5) and diff the candidate list, so you see exactly which drugs were promoted or dropped.
Runs today, no key: the hooks, the countermeasure re-screen, and the diff/report. Scaffold
(honestly labelled): scheduling (--watch is a demo poll loop, not a real scheduler — wire to cron
or a GitHub Action) and the optional LLM change-annotation (--annotate, needs ANTHROPIC_API_KEY).
Re-deriving the signature from a new mission still needs that mission's counts harmonized first; the
hook flags the mission, a human wires the counts, and the rest is automatic. This is the closed loop
drawn in figures/project_workflow.png (teal right rail).
| File | What it shows |
|---|---|
figures/fig1_pca.png |
Cross-mission PCA before/after ComBat — platform ≡ mission perfect confound |
figures/fig2_reproducibility.png |
Signal is conserved at the pathway level, not gene level |
figures/fig3_ax1_replication.png |
Held-out Ax-1 replication: inflammatory + OXPHOS replicate; telomere n.s. |
figures/fig4_disease_map.png |
Ranked disease-similarity map vs a scrambled-signature null floor (immune aging on top) |
figures/fig5_countermeasures.png |
Money shot — dual-evidence countermeasure map (reversal × geroprotector × feasibility) |
figures/fig6_three_mission.png |
Immune-aging anchors replicate across three missions (I4 · Ax-1 · JAXA cfRNA) |
figures/supp_frailty_convergence.png |
Supp — our signature vs the Camera et al. 2024 frailty panel (immune subset 7/7 up; src/make_supp_frailty.py; see docs/independent_corroboration.md) |
figures/supp_singlecell_compartment.png |
Supp — OXPHOS compartment paradox: up in bulk whole-blood/cfRNA but suppressed in every PBMC immune cell type (src/make_supp_singlecell.py; see docs/singlecell_supplementary.md) |
figures/project_workflow.png |
End-to-end analysis workflow, orbit → medicine cabinet, incl. the self-updating closed loop (hand-laid schematic; src/make_workflow.py) |
NASA OSDR human data is two-tier: processed/derived matrices are OPEN; raw individual-level sequence is CONTROLLED (dbGaP-style IRB). This project uses OPEN/processed data only. Exactly what was used:
| Mission | OSDR / GLDS | Modality | Compartment | n subj | Access | Used here |
|---|---|---|---|---|---|---|
| Inspiration4 | OSD-569 / GLDS-561 | nanopore direct-RNA-seq (featureCounts) | whole blood | 4 | OPEN processed | ✅ gene×sample counts |
| Axiom Ax-1 | OSD-903 / GLDS-732 | Illumina bulk RNA-seq (STAR) | whole blood | 2 | OPEN (raw+processed) | ✅ processed STAR counts |
| JAXA CFE | OSD-530 / GLDS-530 | cfRNA | plasma cell-free | 6 | OPEN processed (group-level) | ➖ separate cfRNA layer |
| Inspiration4 PBMC | OSD-570 / GLDS-562 | snRNA-seq | PBMC | 4 | OPEN (DE tables only) | ➖ DE reference (no counts) |
| NASA Twins | Garrett-Bakelman 2019 | multi-omics | blood | 2 | published summary tables | ➖ reference layer |
Raw FASTQ for Ax-1 is open (ENA PRJNA1157458 / OSD-903); we used the GeneLab-processed count
matrix for reproducibility. A complete from-raw path — the exact GeneLab pipeline
(GL-DPPD-7101-G: Trim Galore → STAR 2.7.11b → RSEM 1.3.3, Ensembl 112/GRCh38), the 6 ENA run
accessions, and a matrix-verification snippet — is documented in
docs/process_ax1_from_fastq.md. To fetch any other file, see
docs/orientation_report.md and the nasa-osdr-census helper.
data/processed/ harmonized_cellular.h5ad, count + metadata parquets, cfRNA layer, crosswalk
data/gene_sets/ 131 versioned reference signatures + spaceflight query/leading-edge
src/ spaceflight_disease.py (analysis), pipeline.py (living-atlas engine),
connectivity.py (XSum reversal), atlas_loop.py (closed-loop new-data hooks),
make_space_figures.py + spacetheme.py (space-themed figures),
make_supp_singlecell.py, make_supp_frailty.py, make_workflow.py;
make_figures.py + figstyle.py (plain)
figures/ fig1..fig6 + supp_frailty + supp_singlecell + project_workflow — 16:9 deep-space set
docs/ orientation, QC, disease-mapping + corroboration reports + all scored tables
orientation_report.md— SOMA deep-read, dataset census, gap analysis, OSDR scanqc_report.md— acquisition/harmonization QC + judgment-call logdisease_mapping_report.md— the disease-similarity result, both nulls, and honest limitationsprocess_ax1_from_fastq.md— from-raw processing path for the open Ax-1 setindependent_corroboration.md— honest positioning vs 2024–2026 spaceflight-as-aging papers (frailty biomarkers, Nat Aging review) + thesupp_frailty_convergencefigureREFERENCES_SLIDE.md— condensed citation list (full detail inCITATIONS.md)
- Tiny n (I4 n=4, Ax-1 n=2). Validation currency is replication across missions, not within-mission p-values.
- Platform ≡ mission perfect confound → within-mission contrasts only, never a merged batch-corrected embedding for inference.
- Conserved signal is pathway-level, weak at the gene level (genome-wide cross-mission ρ≈−0.04).
- Disease similarity is signature-level (rank-based), not cohort co-embedding; ~half the raw GSEA hits are attributable to gene-set size/expression base-rate (see the matched null) — the immune-aging + OXPHOS core is what survives.
- Countermeasure candidates (LINCS) are hypothesis-generating only (cancer-cell-line data).
- Human vs mouse kept distinct throughout; the one rodent aging set is flagged and excluded from the human claim.
Code in this repository is released under the MIT License (see LICENSE).
Data. Everything included here — processed count matrices, group-level summary tables, and
reference gene sets — comes entirely from open, public sources: NASA OSDR / GeneLab, published
summary tables (e.g. the NASA Twins Study), MSigDB, HAGR (GenAge / CellAge), and Enrichr. No
controlled-access or individual-level raw sequence data is included (see Data access above).
Redistributed datasets and gene sets remain under their original licenses / terms of use; full
sources and citations are in docs/CITATIONS.md. NASA GeneLab / OSDR data are
used under NASA's open-data terms with attribution.
Not medical advice. This is a research / hypothesis-generating resource; the countermeasure candidates are computational prioritizations from cell-line perturbation data and are not clinical or dosing recommendations.