目次
  1. 前提環境
  2. セットアップ (初回のみ)
  3. 仮想環境の有効化 / 無効化
  4. CAVE 認証トークンの取得・保存
  5. メッシュダウンローダーの起動 (3 パターン)
  6. 対話プロンプト 5 ステップの解説
  7. normalize モード (重要)
  8. 出力ファイル
  9. シナプス / 細胞体クエリ (microns_DB.py)
  10. 結合錐体細胞の抽出と役割分け (microns_connect.py)
  11. Blender で入力 / 起点 / 出力を区別する
  12. テスト実行
  13. トラブルシューティング

1. 前提環境

項目内容
OSWindows 11 (PowerShell 想定)
Python3.13 以上 (uv 管理)
パッケージマネージャuv
プロジェクトパスC:\Users\lunel\Projects\Programming\Python\MICrONS data

2. セットアップ (初回のみ)

2-1. uv のインストール確認

本プロジェクトは uv (高速な Python パッケージマネージャ) を前提とする。インストール済みかは PowerShell で確認:

uv --version

未インストールなら公式手順でインストール:

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

2-2. 依存パッケージのインストール

プロジェクトフォルダに移動して uv sync を実行する。

cd "C:\Users\lunel\Projects\Programming\Python\MICrONS data"
uv sync

uv sync の動作:

  1. pyproject.tomluv.lock を読む
  2. プロジェクト直下に .venv\ を作成 (なければ)
  3. Python 3.13 を .venv\Scripts\python.exe に配置
  4. caveclient / cloud-volume / numpy / pandas.venv\Lib\site-packages\ に展開

完了後の重要なディレクトリ:

パス用途
.venv\Scripts\python.exeプロジェクト専用 Python
.venv\Scripts\Activate.ps1PowerShell 用の有効化スクリプト
.venv\Scripts\activate.batcmd.exe 用の有効化スクリプト
.venv\Lib\site-packages\依存パッケージ本体
Note: .venv 内の DLL を別プロセス (IDE / エクスプローラー / 実行中の Python 等) が開いていると uv sync が失敗する。その場合は該当プロセスを閉じてから再実行。Windows でパッケージ dist-info が読み取り専用属性になっていて Access is denied が出ることもある (トラブルシューティング参照)。

3. 仮想環境の有効化 / 無効化

uv で作った .venv は通常の Python venv と同じく、PowerShell から手動で有効化できる。有効化しなくても uv run 経由で実行できるが、対話的に複数コマンドを試したい場合は有効化すると便利。

3-1. 有効化 (PowerShell)

cd "C:\Users\lunel\Projects\Programming\Python\MICrONS data"
.\.venv\Scripts\Activate.ps1

成功するとプロンプトの左に環境名が付く:

(microns-data) PS C:\Users\lunel\Projects\Programming\Python\MICrONS data>

有効化されている間は python / pip が自動で .venv\Scripts\ 配下のものを指す。python --version で 3.13 が返ってくれば成功。

PowerShell 実行ポリシーで失敗する場合: .\.venv\Scripts\Activate.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル ... を読み込むことができません というエラーが出たら、現在のユーザだけ実行を許可する:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
Y で承認して、再度 Activate.ps1 を実行。

3-2. 無効化

環境を抜けるときは:

deactivate

プロンプトから (microns-data) が消えれば成功。PowerShell ウィンドウを閉じれば自動的に無効化される。

3-3. 環境を作り直したいとき

依存が壊れた / Python バージョンを変えたい場合:

deactivate                  # 有効化中なら先に抜ける
Remove-Item -Recurse -Force .venv
uv sync                     # 作り直し

4. CAVE 認証トークンの取得・保存

MICrONS データへアクセスするには CAVE のアカウント認証トークンが必要。初回のみ下記を実行する。

4-1. ブラウザでトークンを取得

uv run python get_token.py

ブラウザが開いて Google ログインを求められる。ログイン後、トークン文字列 (英数字 32 桁前後) が表示されるのでコピーする。

4-2. ローカルに保存

取得したトークンを環境変数 CAVE_TOKEN にセットしてから save_token.py を実行する:

$env:CAVE_TOKEN = "<your-token-here>"
uv run python save_token.py

成功すると次のように表示される:

Token saved. Verified connection to datastack 'minnie65_public'.
セキュリティ: トークンはスクリプトに直接書き込まないこと。save_token.py は環境変数からしか読まない。PowerShell を閉じれば $env:CAVE_TOKEN は消えるので、トークン文字列はパスワードマネージャ等に別途保管する。

5. メッシュダウンローダーの起動 (3 パターン)

同じスクリプト microns_DL.py を走らせる方法は 3 通りある。状況に応じて使い分ける。

パターンコマンド仮想環境の有効化こんなとき
A. uv run (推奨) uv run python microns_DL.py 不要 (裏で uv が自動処理) 1 回だけ実行する。最も簡潔
B. activate 経由 python microns_DL.py (要事前 activate) 必要 (.\.venv\Scripts\Activate.ps1) 連続で複数コマンドを試す。python --versionpip list も走らせたい
C. 直接 .venv の python を呼ぶ .\.venv\Scripts\python.exe microns_DL.py 不要 uv 経由の依存解決を飛ばして純粋に既存 .venv で走らせたい (uv sync が再構築でロックしているとき等)

5-1. パターン A: uv run (もっとも簡単)

cd "C:\Users\lunel\Projects\Programming\Python\MICrONS data"
$env:PYTHONIOENCODING = "utf-8"
uv run python microns_DL.py

または PowerShell 全体を UTF-8 にしてから:

chcp 65001
uv run python microns_DL.py

5-2. パターン B: 仮想環境を有効化してから python で実行

ユーザが想定する「UV エンバイロメントを起動 → Python でスクリプト」のパターン:

cd "C:\Users\lunel\Projects\Programming\Python\MICrONS data"
.\.venv\Scripts\Activate.ps1

# 環境名が付いたら成功
(microns-data) PS> python --version
Python 3.13.x

# スクリプト実行
(microns-data) PS> $env:PYTHONIOENCODING = "utf-8"
(microns-data) PS> python microns_DL.py

# 終わったら抜ける
(microns-data) PS> deactivate

この方法だと、有効化中は python microns_DL.pypython が自動で .venv\Scripts\python.exe に解決されるので、システム Python と混ざる事故が起きない。

5-3. パターン C: 直接 .venv の python を叩く

cd "C:\Users\lunel\Projects\Programming\Python\MICrONS data"
.\.venv\Scripts\python.exe microns_DL.py

uv の依存解決サイクルを完全に飛ばすので、uv sync がロックエラー等で失敗している状況でも既存 .venv を使って動かせる。

5-4. パッケージとしてインストールした場合

uv pip install -e . を一度実行すると、コンソールスクリプト microns-data が登録される (pyproject.toml[project.scripts] で定義済み)。これで:

(microns-data) PS> microns-data

とだけ打てば main.py が呼ばれ、内部で microns_DL.process_microns_data() が起動する。

どれを使えばいい? 普段は パターン A (uv run python ...) が最短で安全。複数のコマンドを連続で打つ・対話的に試す場合だけ パターン B (activate) に切り替える。パターン C は uv が機嫌を損ねたとき用の保険。

6. 対話プロンプト 5 ステップの解説

起動すると次の順で質問される。Enter でデフォルト値を採用できる。

#質問選択肢 / デフォルト意味
1 Select segment ID input method 1 = キーボード入力 / 2 = デフォルト ID 84 件 処理するニューロンの ID を指定する方法
2 LOD (Level of Detail) 整数。デフォルト 3 メッシュの詳細度。大きいほどポリゴン少 (軽い)、小さいほど多 (重い)。推奨 3〜4
3 Normalize mode n / i / g。デフォルト n 座標変換モード。詳細は次節
4 Scale mesh (x20000)? y / n。デフォルト y y: 1e-9 × 20000 倍 (nm → m → ×20000、Blender で見やすいサイズ) / n: 1.0 倍 (nm 単位そのまま)
5 Add X, Y, Z scale bars? y / n。デフォルト n y の場合、赤色の X/Y/Z 軸スケールバーを線分として書き出す

例: ID を 2 つだけ手動指定して全部デフォルト

Choice (1 or 2): 1
ID: 864691135572530981,864691135977309763
LOD (default: 3): Enter
Normalize mode [n/i/g] (default: n): Enter
Scale mesh (x20000)? (y/n) [y]: Enter
Add X, Y, Z scale bars? (y/n) [n]: Enter

7. normalize モード (重要)

3 ステップ目の normalize は出力結果の意味を大きく変える。複数ニューロンを 1 ファイルに連結する場合は特に注意

モード動作用途
n (デフォルト) 無変換。元の脳座標をそのまま保持 絶対座標で複数ニューロンを表示したいとき。脳全体スケールで見ると原点から遠い位置に出る
i 各メッシュを個別に自身の重心で原点中心化 単一ニューロン形状を観察したい場合のみ
g 全メッシュ共通の重心で全体を原点付近に平行移動 複数ニューロンの相対位置関係を維持しつつ原点付近に集めて Blender で扱いやすくしたいとき
注意: i モードで複数ニューロンを処理すると、各メッシュが個別に原点中心化されるため、すべてのニューロンが原点付近に重なって出力される。脳内の相対位置情報は完全に失われる。コネクトミクス可視化用途では n または g を使うこと。

8. 出力ファイル

カレントディレクトリ直下の mesh_out_precomputed2/ に書き出される。

ファイル内容
merged_keep_layout.obj連結された頂点 / 面データ。Blender / MeshLab で File > Import > OBJ から読み込める
merged_keep_layout.mtlマテリアル定義。各ニューロンに HSV 自動着色 (黄金角分布)。microns_connect.py 経由で役割を渡した場合は役割ごとの色になる

OBJ 内では各ニューロンが o オブジェクトとして分離されている。オブジェクト名は通常 seg_<id> だが、microns_connect.py から役割情報 (id_groups) を渡すと <役割>__<id> (例 input__864...) になり、Blender 側でグループ分けに使える。

Blender で開く例:

  1. Blender を起動
  2. FileImportWavefront (.obj)
  3. mesh_out_precomputed2\merged_keep_layout.obj を選択

9. シナプス / 細胞体クエリ (microns_DB.py)

あるニューロン (root_id) の細胞体位置と入力シナプスを取得したい場合:

uv run python microns_DB.py

デフォルトでは microns_DB.py 末尾の SAMPLE_TARGET_ID を対象に実行される。別の ID を調べる場合はその定数を書き換えるか、Python から関数を直接呼ぶ:

from microns_DB import report
report(864691135572530981)

出力には次が含まれる:

3.2 億行を全部取らないために: synapses_pni_2 は約 3.2 億行あるが、get_input_synapses()filter_in_dict={"post_pt_root_id": [target_id]} を渡しているため、CAVE サーバ側でフィルタされ、起点ニューロン 1 個分のシナプス (数千行) しか降ってこない。テーブル全体をダウンロードする必要はない。次節の結合抽出もこの仕組みに乗っている。

10. 結合錐体細胞の抽出と役割分け (microns_connect.py)

microns_connect.py は、ある起点ニューロンにシナプス結合している錐体細胞 (pyramidal cell) だけを集め、入力 / 起点 / 出力に役割タグと色を付けて 1 つの OBJ に書き出す橋渡しモジュール。microns_DB.py (シナプスクエリ) と microns_DL.py (メッシュ書き出し) を内部で連結している。

入力 input 前シナプス側 起点 target 出力 output 後シナプス側 シナプス → シナプス →
図 1. 役割の定義。起点に入力する錐体細胞を input (青、前シナプス)、起点が出力する先を output (赤、後シナプス) とする。両方向に結合していれば both (紫)。

10-1. 基本の使い方

from microns_connect import get_connected_pyramidal_meshes

# 起点ニューロンに対し、入力(前シナプス)と出力(後シナプス)の
# 錐体細胞を両方集めて 1 つの OBJ に書き出す
get_connected_pyramidal_meshes(
    864691135572530981,
    direction="both",   # "input" / "output" / "both"
    max_partners=20,    # 方向ごとの上限
    lod=3,
)

または末尾の __main__ をそのまま使う:

uv run python microns_connect.py

10-2. 引数

引数既定意味
direction"both""input" = 起点に入力する細胞 / "output" = 起点が出力する細胞 / "both" = 両方
max_partners20取得するパートナー数の上限 (方向ごとに適用)
lod3メッシュ詳細度。大きいほど軽い
normalize"g"相対位置を保ったまま原点付近にまとめる (7 節)
scaleTrue×20000 スケール

10-3. 処理フロー

起点ニューロン root_id 864691135572530981 シナプスを起点で絞って取得 synapses_pni_2 / post・pre_pt_root_id filter パートナー root_id リスト 数百〜数千件 錐体細胞だけに絞り込む aibs_metamodel_celltypes_v661 / pt_root_id filter 役割を割り当てる input / target / output / both メッシュ DL & OBJ 書き出し process_microns_data(id_groups=...) 役割名・色付き OBJ + MTL
図 2. 処理フロー。シナプステーブルも細胞型テーブルも起点・パートナーで server-side フィルタするため、巨大テーブルを丸ごと落とさない。

10-4. 錐体細胞の判定基準

細胞型は CAVE の aibs_metamodel_celltypes_v661 テーブルで判定する (列 classification_system / cell_type)。このボリュームでは興奮性ニューロンの cell_type は次の 7 種で、すべて錐体細胞 (末尾 P = pyramidal):

23P, 4P, 5P-ET, 5P-IT, 5P-NP, 6P-CT, 6P-IT

したがって「classification_system == "excitatory_neuron"」と「錐体細胞」はこのデータセットでは実質同義。microns_connect.PYRAMIDAL 集合でこの 7 種を保持しており、フィルタに使っている。

11. Blender で入力 / 起点 / 出力を区別する

microns_connect.py が書き出した OBJ では、各ニューロンが役割ごとに (1) オブジェクト名のプレフィックス(2) 色 (MTL)(3) OBJ グループ (g) の 3 重で区別されている。色の対応は次のとおり:

これらは microns_DL.DEFAULT_GROUP_COLORS で定義されており、group_colors 引数で上書きできる。

11-1. Blender の「オブジェクトグループ」= コレクション

Blender でオブジェクトをまとめる仕組みは コレクション (Collection) だが、OBJ インポートではコレクションは自動生成されない。そこで付属の blender_organize.py を Blender 内で実行し、オブジェクト名のプレフィックス (input__ / target__ / output__ / both__) から自動でコレクションへ振り分ける。

Scene Collection ▸ target target__864691135572530981 ▾ input input__864691135013881494 input__864691135066013508 … ▸ output output__864691135100073504 … ▸ both
図 3. 振り分け後の Outliner イメージ。各コレクションは目アイコンで個別に表示 / 非表示を切り替えられる。

11-2. 手順

  1. get_connected_pyramidal_meshes(...) で OBJ を書き出す
  2. Blender で File → Import → Wavefront (.obj) から merged_keep_layout.obj を読み込む (色は MTL 経由で付く)
  3. 上部の Scripting タブを開く
  4. Openblender_organize.py を開き、Run Script (▷ ボタン)
  5. Outliner に input / target / output / both コレクションが現れ、各ニューロンが振り分けられる
スクリプトを使わない手動派: ビューポートで Select → Select Patterninput__* 等を入力すれば役割ごとに一括選択できる (オブジェクト名にプレフィックスが入っているため)。選択後 M で任意のコレクションへ移動も可能。

12. テスト実行

リファクタが壊れていないか確認するには:

uv run python -m unittest verify_refactor -v

6 件全て ok なら正常。テストは cloudvolume をモック化しているのでネットワーク不要・トークン不要で走る。

Tip: 仮想環境を直接叩いて実行することもできる。 .venv\Scripts\python.exe -m unittest verify_refactor -v

13. トラブルシューティング

症状原因 / 対処
error: failed to remove directory ... Access is denied .venv 内のファイルが他プロセスでロックされている、または読み取り専用属性が付いている。IDE / エクスプローラー / 実行中の Python を閉じてから uv sync を再実行。読み取り専用が原因の場合は属性を一括解除する (下記)。それでも詰むときは起動パターン C (.venv\Scripts\python.exe 直接呼び出し) で当面しのぐ
ImportError: cannot import name 'CloudVolume' / パッケージの __init__.py が消えている uv run の途中失敗で cloud-volume / boto3 等が部分破損 (dist-info の METADATA / RECORD 欠損) した可能性。壊れた dist-info とパッケージ本体を削除 → 読み取り専用属性を解除 → uv sync で復元する。Python から一括で属性解除する例:
import os, stat
for dp, dns, fns in os.walk(".venv"):
    for n in dns + fns:
        p = os.path.join(dp, n)
        m = os.stat(p).st_mode
        if not (m & stat.S_IWRITE):
            os.chmod(p, m | stat.S_IWRITE)
Activate.ps1 ... このシステムではスクリプトの実行が無効になっているため PowerShell の実行ポリシーが Restricted。Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned を 1 度だけ実行
uv : 用語 'uv' は ... uv 未インストール。powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" でインストール
有効化したのに python --version が古い Python を返す 別の Python が PATH 先頭にいる。where.exe python で確認し、.venv\Scripts\python.exe が先頭でなければ activate を再度実行。または起動パターン A (uv run) に切り替える
Error: environment variable CAVE_TOKEN is not set 同じ PowerShell セッションで $env:CAVE_TOKEN = "..." を実行してから save_token.py を起動する
文字化け (日本語が表示されない) $env:PYTHONIOENCODING = "utf-8" または chcp 65001 を実行してから起動
cv.mesh.get でタイムアウト ネットワーク接続を確認。MICrONS のサーバが一時的に重い可能性もある。LOD を 45 に上げると軽量化される
OBJ が空 / 頂点が 0 指定 ID が古い / フラグメント / 静的メッシュ未生成の可能性。microns_DB.pynucleus_detection_v0 に該当があるか確認
結合抽出で錐体細胞が 0 件 パートナーが aibs_metamodel_celltypes_v661 に登録されていない / 抑制性ばかりの可能性。direction を変える、max_partners を増やす、別の起点 ID を試す
複数ニューロンが原点で重なっている normalize モードを i で実行している。n または g に変更
Blender にインポートしたら巨大すぎ / 小さすぎ Scale 設定で調整。y の場合は ×20000 されている。n なら nm 単位 (Blender 上では極端に大きい数値)