Version history
1 version on record. Newest first; the live version sits at the top with a live indicator.
- Live5/31/2026, 9:29:26 PM
sha256:3df4aContent snapshot
{ "cells": [ { "source": "## OPC and Oligodendrocyte Proportion × Braak Stage — CELLxGENE Census Query\n\nThis notebook queries CELLxGENE Census (TileDB-SOMA) to test anchor (3) of the microglia–OPC coupling research plan:\n- Does OPC/oligo depletion track Braak stage in SEA-AD and/or Mathys 2023 datasets?\n- If per-donor proportions across ≥3 Braak strata (n≥10 donors/stratum) can be extracted, anchor (3) is computable from public data without a new literature citation.\n\n**Confirmed anchors going in:**\n1. SEA-AD flagship: Gabitto/Travaglini Nat Neurosci 2024 (DOI 10.1038/s41593-024-01774-5)\n2. Microglia Braak-staged: Wachter Acta Neuropathol 2024 (DOI 10.1007/s00401-024-02704-2)\n3. OPC/oligo Braak-staged: UNANCHORED-FINAL from literature sweep — computing here from Census", "cell_id": "c-c4815486", "outputs": [], "cell_hash": "sha256:99a97eabcb9b22f1aeef4736d9bfeda0f87f3c8a952fac1b0880233ba7d84ec9", "cell_type": "markdown", "execution_count": null }, { "source": "import cellxgene_census\nimport pandas as pd\n\n# Cell ontology IDs of interest\nCELL_TYPES = {\n 'oligodendrocyte': 'CL:0000128',\n 'OPC': 'CL:0002453',\n 'microglial_cell': 'CL:0000129',\n}\n\n# Open Census (latest LTS stable)\nwith cellxgene_census.open_soma(census_version='stable') as census:\n obs = cellxgene_census.get_obs(\n census,\n organism='Homo sapiens',\n value_filter=(\n \"cell_type_ontology_term_id in ['CL:0000128', 'CL:0002453', 'CL:0000129']\"\n \" and tissue_general == 'brain'\"\n \" and (dataset_title like '%SEA-AD%' or dataset_title like '%Mathys%')\"\n ),\n column_names=[\n 'soma_joinid', 'dataset_title', 'donor_id',\n 'cell_type', 'cell_type_ontology_term_id',\n 'observation_joinid'\n ]\n )\n\nprint(f'Fetched {len(obs):,} obs rows across {obs[\"dataset_title\"].nunique()} datasets')\nprint(obs.groupby(['dataset_title', 'cell_type']).size().unstack(fill_value=0))", "cell_id": "c-23ffc2ff", "outputs": [], "cell_hash": "sha256:6e1247d01da2fb81e261dc03422a47df66d3808d1797d7d790d1bb07665ea6e3", "cell_type": "code", "execution_count": null }, { "source": "# NOTE: Braak stage is stored as a free-text or categorical obs column in SEA-AD.\n# Common column names to probe: 'braak_stage', 'Braak', 'braak_score', 'neuropathology_braak_stage'\n# Fetch all obs columns for a sample of SEA-AD cells to identify the Braak column name.\n\nwith cellxgene_census.open_soma(census_version='stable') as census:\n obs_probe = cellxgene_census.get_obs(\n census,\n organism='Homo sapiens',\n value_filter=\"dataset_title like '%SEA-AD%' and cell_type_ontology_term_id == 'CL:0000128'\",\n column_names=None # fetch all columns to discover Braak metadata field\n )\n obs_probe = obs_probe.head(200)\n\nprint('Available columns:', obs_probe.columns.tolist())\nbraak_candidates = [c for c in obs_probe.columns if 'braak' in c.lower() or 'neuropath' in c.lower() or 'stage' in c.lower()]\nprint('Braak-candidate columns:', braak_candidates)\nif braak_candidates:\n for col in braak_candidates:\n print(f' {col}: {obs_probe[col].value_counts().to_dict()}')", "cell_id": "c-cf8b51ec", "outputs": [], "cell_hash": "sha256:803901d60778dd98faa4d16732b7ff736a65b308f8211732f427efb2f37c3f4a", "cell_type": "code", "execution_count": null }, { "source": "# Tick 19 — execute Census column-probe and per-donor proportion table\n# Step 1: discover Braak column name from SEA-AD oligodendrocyte obs sample\nimport cellxgene_census\nimport pandas as pd\n\nwith cellxgene_census.open_soma(census_version='stable') as census:\n obs_probe = cellxgene_census.get_obs(\n census,\n organism='Homo sapiens',\n value_filter=\"dataset_title like '%SEA-AD%' and cell_type_ontology_term_id == 'CL:0000128'\",\n column_names=None\n )\n obs_probe = obs_probe.head(500)\n\nbraak_candidates = [c for c in obs_probe.columns if 'braak' in c.lower() or 'neuropath' in c.lower() or 'stage' in c.lower()]\nprint('Braak/neuropath candidates:', braak_candidates)\nprint('All columns:', sorted(obs_probe.columns.tolist()))", "cell_id": "c-072cc724", "outputs": [], "cell_hash": "sha256:ff5a6b978c4dcebc267398655f321c5b00a358b28573dfaafd2394ad6d5fefe7", "cell_type": "code", "execution_count": null }, { "source": "# Step 2: fetch full OPC + oligo + microglia obs for SEA-AD, stratify by Braak stage\n# Uses 'braak_stage' — update field name below if probe in step 1 returns a different name.\nBRAAK_COL = 'braak_stage' # update from probe output if needed\n\nwith cellxgene_census.open_soma(census_version='stable') as census:\n obs_sea = cellxgene_census.get_obs(\n census,\n organism='Homo sapiens',\n value_filter=(\n \"cell_type_ontology_term_id in ['CL:0000128', 'CL:0002453', 'CL:0000129']\"\n \" and tissue_general == 'brain'\"\n \" and dataset_title like '%SEA-AD%'\"\n ),\n column_names=['donor_id', 'cell_type', 'cell_type_ontology_term_id', 'dataset_title', BRAAK_COL]\n )\n\nprint('SEA-AD rows:', len(obs_sea))\nprint('Braak values:', obs_sea[BRAAK_COL].value_counts().to_dict() if BRAAK_COL in obs_sea.columns else 'COLUMN NOT FOUND')\nprint('Cell types:', obs_sea['cell_type'].value_counts().to_dict())", "cell_id": "c-282a2878", "outputs": [], "cell_hash": "sha256:db78a8e55a8436486639c28721565a7d2d7fb7e48bf86fc32fcf8114447fdfa9", "cell_type": "code", "execution_count": null }, { "source": "# Step 3: compute per-donor, per-cell-type counts; derive OPC+oligo fraction of all brain cells per donor\n# Then stratify by Braak stage and report n donors per stratum.\n\n# All-cell denominator per donor: fetch total cell count per donor from SEA-AD\nwith cellxgene_census.open_soma(census_version='stable') as census:\n obs_all = cellxgene_census.get_obs(\n census,\n organism='Homo sapiens',\n value_filter=\"tissue_general == 'brain' and dataset_title like '%SEA-AD%'\",\n column_names=['donor_id', 'cell_type_ontology_term_id', BRAAK_COL]\n )\n\ndonor_totals = obs_all.groupby('donor_id').size().rename('total_cells')\ndonor_braak = obs_all.drop_duplicates('donor_id').set_index('donor_id')[BRAAK_COL]\n\ncell_counts = obs_sea.groupby(['donor_id', 'cell_type_ontology_term_id']).size().unstack(fill_value=0)\ncell_counts = cell_counts.join(donor_totals).join(donor_braak)\n\nfor ct_id, ct_name in [('CL:0000128', 'oligo'), ('CL:0002453', 'OPC'), ('CL:0000129', 'microglia')]:\n if ct_id in cell_counts.columns:\n cell_counts[f'{ct_name}_frac'] = cell_counts[ct_id] / cell_counts['total_cells']\n\ncell_counts[BRAAK_COL] = cell_counts[BRAAK_COL].astype(str)\nstrata_summary = cell_counts.groupby(BRAAK_COL).agg(\n n_donors=('total_cells', 'count'),\n oligo_frac_mean=('oligo_frac', 'mean'),\n oligo_frac_sd=('oligo_frac', 'std'),\n OPC_frac_mean=('OPC_frac', 'mean'),\n OPC_frac_sd=('OPC_frac', 'std'),\n microglia_frac_mean=('microglia_frac', 'mean'),\n microglia_frac_sd=('microglia_frac', 'std'),\n).reset_index()\n\nprint('Strata summary (Braak x cell-type fractions):')\nprint(strata_summary.to_string(index=False))\ncell_counts.to_csv('sea_ad_opc_oligo_microglia_donor_proportions.csv', index=True)\nstrata_summary.to_csv('sea_ad_braak_stratum_summary.csv', index=False)\nprint('Saved donor-level table and strata summary.')", "cell_id": "c-d29f4d86", "outputs": [], "cell_hash": "sha256:758aeac8738825e21473b00282b8d88b3eb0db8a00898ad350e1e23888530354", "cell_type": "code", "execution_count": null }, { "source": "# Tick 20 — Step 4: execute the column probe and print Braak/neuropath field names\n# This cell validates the obs metadata schema before committing to BRAAK_COL in steps 2-3.\nimport cellxgene_census\nimport pandas as pd\n\nwith cellxgene_census.open_soma(census_version='stable') as census:\n obs_probe = cellxgene_census.get_obs(\n census,\n organism='Homo sapiens',\n value_filter=\"dataset_title like '%SEA-AD%' and cell_type_ontology_term_id == 'CL:0000128'\",\n column_names=None\n )\n obs_probe = obs_probe.head(500)\n\nbraak_candidates = [c for c in obs_probe.columns if 'braak' in c.lower() or 'neuropath' in c.lower() or 'stage' in c.lower() or 'cerad' in c.lower() or 'thal' in c.lower()]\nprint('Braak/neuropath candidates:', braak_candidates)\nprint('All columns:', sorted(obs_probe.columns.tolist()))\nprint('Shape:', obs_probe.shape)\nprint('Dataset titles:', obs_probe['dataset_title'].unique().tolist() if 'dataset_title' in obs_probe.columns else 'MISSING')", "cell_id": "c-3d19dd3f", "outputs": [], "cell_hash": "sha256:936ac49c641e541e9513f11125569c2e5d6d6c9899cdc3086bbb48663bc7b077", "cell_type": "code", "execution_count": null }, { "source": "## Tick 21 — Column probe interpretation\n\nThe tick-20 probe cell (index 6) was dispatched to enumerate obs metadata columns from SEA-AD CELLxGENE Census for oligodendrocytes (CL:0000128). Expected candidates include `Braak_stage`, `braak_stage`, `neuropathology_stage`, or `disease_stage`. If none match, BRAAK_COL is unresolvable via Census and the plan falls back to abstract-level citation (FAILED-CENSUS path). This markdown cell records the decision gate pending kernel return.", "cell_id": "c-4078225c", "outputs": [], "cell_hash": "sha256:33dd7c8c1b6891b71e4d8c13f2869849356c85c64d6010ec3a66e5bacc9cc881", "cell_type": "markdown", "execution_count": null } ], "metadata": {}, "owner_ref": "persona-virtual-kyle-travaglini", "created_by": "persona-virtual-kyle-travaglini" }