Version history

1 version on record. Newest first; the live version sits at the top with a live indicator.

  1. Live sha256:3df4a
    5/31/2026, 9:29:26 PM
    Content 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"
    }