#!/usr/bin/env python3 """Download Allen Human Brain Atlas meshes and pre-compute the voxel label grid. This script MUST be run once before using mindVisualizer. It: 1. Downloads the Allen Human Brain Atlas (500um) via brainglobe 2. Copies OBJ mesh files to data/meshes/ 3. Copies structures.json (region name mappings) to data/ 4. Pre-computes a 100^3 voxel label grid for fast point-in-region queries and saves it to data/label_grid_cache.npz Usage: pip install brainglobe-atlasapi python setup_brain_data.py """ import shutil import json from pathlib import Path import numpy as np PROJECT_ROOT = Path(__file__).resolve().parent DATA_DIR = PROJECT_ROOT / "data" MESH_DIR = DATA_DIR / "meshes" ALIGNMENT_FILE = DATA_DIR / "brain_alignment.json" GRID_CACHE = DATA_DIR / "label_grid_cache.npz" def main(): # ---- Step 1: Download atlas ---- print("[setup] Downloading Allen Human Brain Atlas (500um)...") print(" (This is a one-time download, ~269 MB)") from brainglobe_atlasapi import BrainGlobeAtlas atlas = BrainGlobeAtlas("allen_human_500um") atlas_dir = Path.home() / ".brainglobe" / "allen_human_500um_v1.0" src_meshes = atlas_dir / "meshes" if not src_meshes.exists(): print(f"[setup] ERROR: Atlas meshes not found at {src_meshes}") return # ---- Step 2: Copy meshes to both meshes/ and meshes_obj/ ---- MESH_OBJ_DIR = DATA_DIR / "meshes_obj" MESH_DIR.mkdir(parents=True, exist_ok=True) MESH_OBJ_DIR.mkdir(parents=True, exist_ok=True) obj_files = list(src_meshes.glob("*.obj")) print(f"[setup] Copying {len(obj_files)} OBJ meshes...") copied = 0 for obj in obj_files: for target_dir in (MESH_DIR, MESH_OBJ_DIR): dst = target_dir / obj.name if not dst.exists() or dst.stat().st_size != obj.stat().st_size: shutil.copy2(obj, dst) copied += 1 print(f"[setup] Copied meshes ({len(obj_files)} files to meshes/ and meshes_obj/)") # ---- Step 3: Copy structures.json ---- structs_src = atlas_dir / "structures.json" structs_dst = DATA_DIR / "structures.json" if structs_src.exists(): shutil.copy2(structs_src, structs_dst) print(f"[setup] Copied structures.json") else: print(f"[setup] WARNING: structures.json not found at {structs_src}") # ---- Step 4: Build and cache label grid ---- print(f"\n[setup] Building voxel label grid (this takes ~30-60 seconds)...") import vtk from src.mesh_overlay import FlowMeshOverlay ren = vtk.vtkRenderer() win = vtk.vtkRenderWindow() win.SetOffScreenRendering(1) win.AddRenderer(ren) overlay = FlowMeshOverlay(ren=ren, win=win, mesh_dir=MESH_DIR, alignment_file=ALIGNMENT_FILE) n_regions = len(overlay.get_all_region_keys()) print(f"[setup] Loaded {n_regions} region meshes") overlay.build_label_grid() overlay.save_label_grid(GRID_CACHE) # ---- Summary ---- print(f"\n{'='*50}") print(f" Setup complete!") print(f" Meshes: {MESH_DIR}/ ({len(obj_files)} files)") print(f" Structures: {structs_dst}") print(f" Label grid: {GRID_CACHE}") print(f" Regions: {n_regions}") print(f"{'='*50}") print(f"\n You can now run:") print(f" python -m src.main") print(f" python examples/rdcim_propagation.py") if __name__ == "__main__": main()