Buckets:

illusion-brain/brain-domains / scripts /build_unit_registry.py
redmingwei's picture
download
raw
3.1 kB
#!/usr/bin/env python3
"""build_unit_registry — 统一逐单元区登记表。
输入(都在 /domains 内):
steinmetz/units.parquet 24,029 单元,region 为 Allen 缩写
framework/allen_region_map.csv 73 个小鼠区 → Allen MBA id / UBERON 唯一性
framework/macaque_unit_region.csv 13,126 单元,PMd/M1/S1/DMFC
输出:
framework/unit_region_registry.parquet / .csv
这是框架里唯一"每个单元都有真实解剖标签"的表,区级分析应当只用它。
"""
from __future__ import annotations
from pathlib import Path
import pandas as pd
ROOT = Path("/domains")
OUT = ROOT / "framework"
# ---------- 小鼠
u = pd.read_parquet(ROOT / "steinmetz/units.parquet")
m = pd.read_csv(OUT / "allen_region_map.csv")
mouse = u.merge(m[["acronym", "allen_mba", "uberon_id", "uberon_status"]],
left_on="region", right_on="acronym", how="left")
mouse = mouse.rename(columns={"allen_mba": "allen_mba_id",
"uberon_id": "uberon_id_raw",
"uberon_status": "region_uberon_status"})
mouse["uberon_id_unique"] = mouse.apply(
lambda r: r.uberon_id_raw if r.region_uberon_status == "unique" else None, axis=1)
mouse["member"] = "steinmetz"
mouse["species"] = "mus_musculus"
mouse["slice"] = mouse["session"].astype(str)
mouse["region_label"] = mouse["region"]
mouse["region_assignment"] = "per_unit"
mouse["region_confidence"] = "anatomical"
mouse["label_source"] = "allen_acronym"
mouse["source_file"] = "steinmetz/units.parquet"
# ---------- 猕猴
mac = pd.read_csv(OUT / "macaque_unit_region.csv")
mac["member"] = "primate_macaque_nlb"
mac["species"] = "macaca_mulatta"
mac["slice"] = mac["file"].str.replace(".npz", "", regex=False) # 一个 session 可含多个片段
mac["region_label"] = mac["region_unit"]
mac["allen_mba_id"] = None
mac["uberon_id_unique"] = None
mac["region_uberon_status"] = "not_applicable"
mac["region_assignment"] = "per_unit"
mac["region_confidence"] = "anatomical"
mac["label_source"] = "dandi_000070_electrodes"
mac["source_file"] = "primate/macaque_nlb/" + mac["file"]
COLS = ["member", "species", "slice", "unit_idx", "region_label",
"region_assignment", "region_confidence", "allen_mba_id",
"region_uberon_status", "uberon_id_unique", "label_source", "source_file"]
reg = pd.concat([mouse[COLS], mac[COLS]], ignore_index=True)
reg["unit_idx"] = reg["unit_idx"].astype(int)
reg = reg.sort_values(["member", "slice", "unit_idx"]).reset_index(drop=True)
reg.to_parquet(OUT / "unit_region_registry.parquet", index=False)
reg.to_csv(OUT / "unit_region_registry.csv", index=False)
print(f"rows={len(reg)}")
print(reg.groupby(["member", "region_label"]).size().to_string())
print(f"\n每单元唯一键检查: {not reg.duplicated(['member','slice','unit_idx']).any()}")
print(f"region_label 空值: {int(reg.region_label.isna().sum())}")
print(f"\n小鼠区数: {reg[reg.member=='steinmetz'].region_label.nunique()},"
f"有 MBA id 的单元: {int(reg[reg.member=='steinmetz'].allen_mba_id.notna().sum())}")

Xet Storage Details

Size:
3.1 kB
·
Xet hash:
7115ddf134ddedcf1b6854e22ddd0f563d576379c2835cbd3874184e156d53b4

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.