Interactive 3D viewer for finding data in the DANDI Archive by brain region. Regions come from standard reference atlases and are shaded by how much data covers them, and selecting one lists the dandisets, subjects, and sessions that recorded there. Where a session provides electrode coordinates, the individual contacts are drawn in the same 3D space.
Live at atlas.dandiarchive.org. There is a blog post introducing the project, and a demo video walking through what the viewer can do.
The landing page offers a card per atlas, and the selector in the left sidebar switches between them without a reload.
| Atlas | Species | Source |
|---|---|---|
| Allen CCF v3 | Mouse | Allen Institute Common Coordinate Framework |
| D99 v2.0 | Macaque | Saleem and Logothetis |
| NMT v2.0 sym | Macaque | D99 labels warped into NMT space |
| MEBRAINS | Macaque | EBRAINS macaque parcellation |
| WHS-SD v4 | Rat | Waxholm Space Sprague Dawley |
Coverage differs a great deal between them, and the Allen CCF is by far the most populated. Current per-atlas counts of dandisets, files, and regions with data are in data/atlases_index.json, which the landing page reads directly. They are not repeated here because the nightly job changes them.
- Renders atlas region meshes with Three.js, colored by the atlas convention and shaded by how many files are associated with each region.
- Lets you click a region to isolate it, dimming everything else, and shows the associated dandisets in the right sidebar with direct links to DANDI.
- Provides a searchable, collapsible hierarchy tree in the left sidebar, with badges for direct and total counts per structure.
- Drills from a dandiset down to its subjects and then to individual sessions, filtering the tree as you go.
- Draws electrode positions as points for sessions that record them, with separate opacity sliders for regions and electrodes so contacts inside a structure stay visible.
- Snaps the camera to dorsal, ventral, anterior, posterior, left, and right views.
The current view lives in the URL hash, so any state can be linked or bookmarked and the browser back button works:
#region=672 region view
#dandiset=000017 dandiset view
#dandiset=000017®ion=672 dandiset filtered by region
#dandiset=000017&subject=sub-M1 subject view
#dandiset=000017&subject=sub-M1&session=<assetId> session view
The viewer is static. Three.js loads from a CDN through an import map, so there is no build step and no npm install. The data files are already committed, including the meshes, so a clone is all you need. Note that this makes the clone large, on the order of 400 MB.
git clone https://github.com/dandi/dandi-atlas.git
cd dandi-atlas
python -m http.server 8000Then open http://localhost:8000. A server is required rather than opening index.html from disk, because the app uses ES modules and fetch.
A nightly GitHub Actions workflow runs at 03:00 UTC, refreshes each atlas in turn, rebuilds the landing-page index, and commits any changes. Each atlas is allowed to fail without taking the others down, and the run is only marked failed if every atlas fails. You can also trigger it manually from the Actions tab and choose full instead of incremental for a complete rebuild.
The same scripts run locally:
pip install -r scripts/requirements.txt
python scripts/update_data.py --mode incremental # Allen CCF
python scripts/update_macaque_data.py --atlas d99 # also nmt, mebrains
python scripts/update_rat_data.py --mode incremental # WHS-SD
python scripts/build_atlases_index.py # landing-page indexThese only refresh the DANDI-derived files. They read the committed structure_graph.json for each atlas and never touch the meshes, which is what lets them run on a CI runner with nothing but the repository checked out.
The rat atlas draws on an embargoed dandiset that CI cannot reach, so its previously committed records are preserved rather than dropped on each run.
Regenerating the structure graph and meshes needs the upstream atlas packs, which are not committed. Download them and place them under atlas_sources/, which is gitignored. The WHS-SD pack comes from NITRC; the macaque sources are described in the header of each build script.
python scripts/build_macaque_atlas.py --atlas d99 # also nmt, mebrains
python scripts/build_rat_atlas.pyBoth orchestrators accept --skip-meshes and --skip-dandi so you can iterate on one stage at a time, and both wrap focused sub-scripts you can call directly.
The Allen pipeline predates this arrangement. update_data.py --mode full rebuilds everything derived from DANDI, which is normally what you want. build_data.py and convert_meshes.py were the original bootstrap, downloading OBJ meshes from the Allen API and converting them to GLB, and they have not been fully migrated to the per-atlas layout; build_data.py also expects a label_results_full.json from dandi-location-analysis via LABEL_RESULTS_PATH. The Allen meshes are committed, so this path is rarely needed.
├── index.html # Landing page and viewer shell
├── style.css
├── app.js # Three.js scene, hierarchy tree, panels, routing
├── data/
│ ├── atlases_index.json # Landing-page summary, one record per atlas
│ ├── last_updated.json # Timestamps and counts from the last nightly run
│ └── atlases/<atlas>/
│ ├── structure_graph.json # Region hierarchy
│ ├── dandi_regions.json # Per-region dandiset and file counts
│ ├── dandiset_assets.json # Per-asset region assignments
│ ├── mesh_manifest.json # Which regions have meshes
│ ├── meshes/*.glb # Region meshes (committed)
│ └── electrodes/*.json # Electrode coordinates per dandiset
└── scripts/ # Build and update pipeline
Region assignments are derived from the metadata inside the NWB files themselves rather than from dandiset-level annotation, which is why coverage grows as the archive does. Meshes and hierarchies come from the atlas providers listed above, and the Allen CCF meshes come from the Allen Brain Atlas API.
Built by CatalystNeuro and maintained under the DANDI organization.
