加速キッチンbasics
実習講座 / Simulation CORSIKA 8

空気シャワーを計算する

宇宙線が大気に飛び込むと、たった1個の粒子から何百万個もの粒子が生まれます。 その様子は誰も直接は見られません。地上の検出器に届くのは、シャワーのいちばん下の断面だけだからです。 見えない部分を埋めるための道具が空気シャワーシミュレーション—— つまり、大気の中で起きるはずのことを1粒ずつ計算機の中で追いかける方法です。 この講座では、その世界標準である CORSIKA 8 を、 ビルドせずコンテナ1個で、構築済みの RustDesk リモート環境か手元の Windows PC で動かし、 ブラウザのコンソールからシャワーを1本撃ち、出てきた図を読めるところまで一気に進みます。

Level大学1・2年〜
所要RustDesk 数分/ローカル 40〜60分+実行
前提「宇宙線の基礎」5章
方式
Apptainer コンテナビルドしない
対象バージョン
icrc2025-beta2DOI 10.5281/zenodo.18195386
必要なもの
RustDesk クライアントまたは Windows 11 + 空き 5 GB(WSL2)
最終確認
2026-09-06配布 .sif の実機で確認
01

CORSIKA 8 とは何か

CORSIKA(COsmic Ray SImulations for KAscade)は、 高エネルギーの粒子が大気に飛び込んだあと何が起きるかを、粒子1個ずつ追いかけて計算するプログラムです。 1989年に KASCADE 実験のために作られてから30年以上、世界中の宇宙線実験が標準的に使ってきました。 その全面書き直し版が CORSIKA 8 です。[1]

なぜ「計算する」必要があるのか

宇宙線が大気の原子核とぶつかると、そこから雪崩のように粒子が増えていきます。これが空気シャワーです (宇宙線の基礎 5章)。 ところが私たちが地上で測れるのは、この巨大な雪崩のいちばん下の一断面—— しかも検出器が置いてある数 m² だけです。もとの宇宙線が 陽子だったのか鉄の原子核だったのか、エネルギーはいくつだったのか、どの高さで最初にぶつかったのか。 どれも直接は見えません。

そこで、「もし 100 TeV の陽子が垂直に飛び込んだら、地表にはどんな粒子が何個くるか」を計算機の中で先に作っておき、 実際の観測とつき合わせるという手順を踏みます。この「先に作っておく」役をするのがシミュレーションです。 宇宙線実験のエネルギー決定も、粒子の種類(質量組成)の推定も、検出器の設計も、 ほぼすべてがこの対応表の上に成り立っています。

🎲 モンテカルロ法 ——「サイコロを振って1本ずつ作る」

粒子がいつ・どこで・どうぶつかるかは確率で決まります。CORSIKA は乱数を振って 「この粒子は 87 g/cm² 進んだところで相互作用した。そこから π 中間子が 23 個出た」——というふうに、 起こりうる一例を最後まで作り上げます。これをモンテカルロ法といいます。 大事なのは、出てくるのは「平均的なシャワー」ではなく「あり得たシャワーの1本」だということ。 同じ設定でも乱数が変われば別の図になります(→9章)。

シミュレーションの中で起きていること

設定項目の意味を理解するには、中で何が起きているかを先に押さえておくのが近道です。 空気シャワーは、大きく3つの成分に分かれて進みます。

一次粒子 p, He, Fe, γ … 💥 第一相互作用 λ ≈ 50〜90 g/cm² π⁰ 寿命 10⁻¹⁶ 秒 π±, K± 崩壊 or 再衝突 電磁成分 γ, e⁻, e⁺ 粒子数の 9 割以上 ハドロン成分 p, n, π, K シャワーの「幹」 ミューオン成分 μ⁻, μ⁺, ν 地表まで届く → γγ → μν 再衝突 ハドロンは何度もぶつかり、そのたび新しい π を作る(=雪崩)
図1-1 空気シャワーの3成分。 π⁰ は生まれた瞬間に光子2個へ崩壊して電磁シャワーの種になり、 π± は「もう一度ぶつかる」か「μ に崩壊する」かの競争をします。 この分岐点が、あとで出てくる設定項目のほとんどに対応します。
  • ハドロン成分が幹。ぶつかるたびに π 中間子を作って枝分かれし、シャワー全体を駆動します。-M(ハドロン相互作用モデル)が効くのはここ。
  • 電磁成分が葉。π⁰ → γγ から始まる対生成と制動放射の連鎖で、粒子数の9割以上を占めます。計算時間の大半もここ。--emcut が効くのはここ。
  • ミューオン成分が地上に届く主役。π± / K± の崩壊で生まれ、ほとんど何とも反応せずに地面まで到達します(宇宙線の基礎 7章)。

CORSIKA 7 と CORSIKA 8

論文でよく見る「CORSIKA」は、多くの場合 Fortran で書かれた CORSIKA 7 です。 CORSIKA 8 は 2018 年に始まった現代的な C++ による全面書き直しで、 大気だけでなく氷や岩の中のカスケード、媒質をまたぐシャワーまで扱えるように設計されています。[1] CORSIKA 7 との比較検証では主要な観測量が数%以内で一致することが示されています。

⚠️ CORSIKA 8 はまだ beta 段階です

この講座で使う icrc2025-beta2 も名前のとおり beta 版で、開発は活発に続いています。 バージョンが変われば結果も変わりうる段階なので、 解析結果には「どのコンテナを使ったか」を必ず残してください(→12章)。 本番の物理解析で CORSIKA 7 を使い続けている実験もまだ多くあります。

この講座のやり方 —— ビルドしない

CORSIKA 8 はソースからビルドすると1〜2時間かかり、ディスクも 10〜20 GB 使います。 しかも失敗の大半はそのビルド区間で起きます。 シミュレーションを回して解析するだけなら、それは全部不要です。 公式が動作確認済みのバイナリを Apptainer コンテナ(.sif ファイル1個)で Zenodo に置いてくれているので、それを落として実行します。[2]

やること

.sif を落とす

Zenodo から corsika8-icrc2025.sif(2.5 GB)を1個。OS ごと固まっているので、手元の環境に依存しません。

やらないこと

ビルド

conan・cmake・gcc・FLUKA の準備は一切不要。C++ を書き換える段階になって初めてソースビルドを検討します。

効いてくる場面

やり直しが効く

環境は .sif 1個に閉じています。おかしくなったら消して落とし直すだけ。同じ MD5 のファイルを置けば同じ環境に戻せます。

全体の構図

登場するのは4つだけです。計算は WSL の中の Apptainer が回し、画面は Windows のブラウザで見ます。 Windows 側には(VS Code を除いて)何もインストールしません。 RustDesk のリモート環境(2章)では、この図の中身がすべて相手のマシンに用意済みで、使うのはブラウザの画面だけです。

Windows WSL2 / Ubuntu ブラウザ localhost:8765 コンソール server.py Apptainer + .sif c8_air_shower 出力 Parquet ~/corsika8/runs/ PNG 図 設定 ログ・図 起動 書き出し plot 読み出して画面へ返す
図1-2 コンソールを使うときの流れ。 ブラウザは設定を送ってログを受け取るだけで、計算もファイルもすべて WSL の中で完結します。
表1-1 4つの層と、それぞれどこで用意するか
層中身どこで用意するか
OS 基盤WSL2 / UbuntuWindows に一度だけ(3章)
コンテナ実行基盤ApptainerWSL の中に apt で(4章)
CORSIKA 8corsika8-icrc2025.sif —— これ1個で本体・物理モデル・FLUKA まで全部Zenodo から落とす(4章)
解析Python venv + corsika ライブラリ + pandas / matplotlibWSL の中に pip で(5章)。コンソールのプロット生成が使う
操作ブラウザのコンソール(git clone で入れる)コンソールは WSL の中へ、画面だけ Windows のブラウザで見る(5章・6章)。自分でスクリプトを書くなら VS Code も(10章)

やることの順番

一度だけ —— 合計 40〜60 分 毎回くり返す WSL2 3章 · 15 分 Apptainer 4章 · 3 分 .sif 取得 4章 · 10 分 解析環境 5章 · 5 分 コンソール 5章 · 5 分 シャワーを撃つ6〜8章 · 14 秒〜 図にする 9章 条件を変えて次の1本へ RustDesk なら左の5つは用意済み。右の2つだけです
図1-3 導入は一度きり、以降は右の2つのくり返しです。時間の大半は 2.5 GB のダウンロードと、撃つシャワーの計算そのものです。
📍 コマンドをどこで打つかは、必ずブロック左上のラベルで確認

この手順では Windows 側と WSL 側を行き来します。取り違えが一番よくある事故なので、 すべてのコマンドブロックに実行場所を書いてあります。

Windows / PowerShell WSL の Ubuntu ファイルの中身 出力例

1章のまとめ

  • 空気シャワーは地上で「下の断面」しか見えない。埋めるのがシミュレーション。
  • CORSIKA はモンテカルロ法で1本ずつ作る。出てくるのは平均ではなく一例。
  • シャワーはハドロン・電磁・ミューオンの3成分。設定項目はこの3つのどれに効くかで整理できる。
  • CORSIKA 8 はコンテナ1個で動く。ビルドはしない。ただし beta なのでバージョンを必ず記録する。
02

始め方を選ぶ

道は2つあります。どちらを選んでも、シャワーを撃つのは同じブラウザのコンソールです。 迷ったら、まず RustDesk で1本撃ってみてください。

A · Remote

RustDesk で入る

環境構築済みのマシンに遠隔で入ります。コンソールも用意済み。必要なのは RustDesk のアプリだけで、準備は数分。6章へ直行します。

B · Local

自分の PC に入れる

Windows 11 の WSL2 に CORSIKA 8 とコンソールを入れます。準備は 40〜60 分。3章から順に進みます。

A —— RustDesk のリモート環境を使う

すでに環境構築済みの RustDesk というリモート環境を用意しました。 こちらのアドレスやパスワードを知りたい人は、メンター等に連絡して教えてもらうようにしてください。 接続先のデスクトップでは、ブラウザのコンソールが使える状態になっています。

  1. RustDesk を入れる

    公式サイトから、自分の OS 用のクライアントを入れます(Windows / Mac / Linux いずれも可)。 rustdesk.com

  2. メンターに聞いたアドレスとパスワードで接続する

    RustDesk を起動し、接続先の欄に教わったアドレス(ID)を入れて接続、パスワードを入力します。 相手側のデスクトップが表示されれば成功です。

  3. ブラウザのコンソールを開く

    リモートのデスクトップにあるブラウザで、コンソールを開きます。 ヘッダのピルが緑なら、そのまま6章に進んでシャワーを撃てます。 見当たらないとき、ピルが赤いときは、自分で直そうとせずメンターに連絡してください。

🤝 共用のマシンです

アドレスとパスワードは他の人に渡さないでください。 実行名やメモには自分の名前を入れて、他の人の実行と区別できるようにしておきます(6章)。 他の人の実行を消したり、コンソールのサーバを止めたりしないでください。

B —— 自分の PC に入れる

3章(WSL2)→ 4章(Apptainer とコンテナ)→ 5章(解析環境とコンソール)の順に進めます。 どれも一度きりの作業で、終われば A と同じコンソールが自分の PC で動きます。

03

準備1 —— WSL2 を用意する

Windows PC のみ。所要 15 分(再起動を含む)。すでに WSL2 で Ubuntu が動いている人は4章へ。 Mac / Linux をお使いの場合はこの章を飛ばし、4章の Apptainer 導入から始めてください。

  1. Ubuntu 22.04 を入れる

    PowerShell を管理者として実行し、バージョンを明示して入れます。

    PowerShell(管理者)
    wsl --install -d Ubuntu-22.04

    すでに WSL を使っている場合は、既定を WSL2 にしてから追加します。

    PowerShell(管理者)
    wsl --set-default-version 2
    wsl --list --online          # 入手できるディストリビューションの一覧
    wsl --install -d Ubuntu-22.04

    終わったら Windows を再起動。再起動後に Ubuntu が自動で立ち上がり、 ユーザー名とパスワードを聞かれます。このパスワードは以降 sudo のたびに使うので忘れないでください。

    🤔 なぜ 22.04 を名指しするのか

    wsl --install をバージョン指定なしで打つと最新の LTS が入ります。 コンテナ方式ならホスト側の Ubuntu バージョンの影響はほぼ受けませんが、 CORSIKA 8 の CI が回っているのは 22.04 系で、将来ソースビルドに手を出すときも 22.04 が一番揃っています。 Apptainer の PPA も 22.04 で素直に通ります。

  2. メモリとディスクの上限を決めておく

    WSL は既定でホスト搭載メモリの 50% まで使います。ここを明示しておくと、 あとで「突然 Killed される」系のトラブルを避けられます。Windows 側で %UserProfile%\.wslconfig を作ります。

    C:\Users\<ユーザー名>\.wslconfig
    [wsl2]
    memory=8GB
    swap=8GB
    processors=4

    数値は搭載メモリとコア数に合わせてください。目安は memory = 搭載量の 50〜70%。 編集したら PowerShell で wsl --shutdown を実行し、Ubuntu を開き直すと反映されます。

  3. ここまでの確認

    PowerShell
    wsl -l -v                    # NAME=Ubuntu-22.04 / VERSION=2 になっていること
    WSL の Ubuntu
    lsb_release -a               # Ubuntu 22.04.x LTS
    free -h                      # .wslconfig の memory / swap が効いていること
    df -h /                      # 空きが 5 GB 以上あること
04

準備2 —— Apptainer とコンテナ

📦 Apptainer とは

HPC(スパコン・計算機クラスタ)向けのコンテナ実行基盤です(旧称 Singularity)。 Docker と違って常駐デーモンも root 権限も要らず、 コンテナが .sif という1個のファイルになるのが特徴。 研究機関のクラスタにはたいてい入っていて、CORSIKA 8 の公式配布もこの形式です。 公式ドキュメント

  1. 公式 PPA から Apptainer を入れる

    WSL の Ubuntu
    sudo apt-get update
    sudo apt-get install -y software-properties-common wget
    sudo add-apt-repository -y ppa:apptainer/ppa
    sudo apt-get update
    sudo apt-get install -y apptainer

    Debian や、PPA が使えない環境では、公式リリースの .deb を直接入れます。

    WSL の Ubuntu(PPA が使えない場合)
    cd /tmp
    wget https://github.com/apptainer/apptainer/releases/download/v1.5.3/apptainer_1.5.3_amd64.deb
    sudo apt-get install -y ./apptainer_1.5.3_amd64.deb

    バージョン番号は GitHub の Releases で最新を確認してください。RHEL / Rocky / AlmaLinux 系には EPEL に apptainer の RPM があります。 導入手順の正典は Apptainer Admin Guide — Installation です。

    WSL の Ubuntu
    apptainer --version

    バージョンが表示されれば成功です。

    ⚠️ user namespace のエラーが出たら

    WSL2 のカーネルは非特権 user namespace が有効なので通常は起きませんが、 Failed to create user namespace のようなエラーが出る環境では setuid 版に切り替えます。

    WSL の Ubuntu
    sudo apt-get install -y apptainer-suid
  2. Linux 側のホームに作業場所を作る

    WSL の Ubuntu
    mkdir -p ~/corsika8
    cd ~/corsika8
    🚫 重要 —— /mnt/c/... の下では作業しないこと

    WSL から Windows 側ドライブ(/mnt/c)へのアクセスはファイル I/O が桁違いに遅く、 パーミッションの扱いも Linux とは違います。.sif の置き場所も、シャワーの出力先も、 必ず Linux 側のホーム(~/ = /home/<ユーザー名>)にしてください。 Windows のエクスプローラからは \\wsl.localhost\Ubuntu-22.04\home\<ユーザー名>\ で普通に開けます(ディストリ名は wsl -l -v に出る名前に読み替え)。

  3. Zenodo からコンテナをダウンロード

    WSL の Ubuntu
    wget -c -O corsika8-icrc2025.sif \
      "https://zenodo.org/records/18195386/files/corsika8-icrc2025.sif?download=1"

    -c を付けておくと、途中で切れても同じコマンドで続きから再開できます。 配布元は Zenodo record 18195386 (CORSIKA 8, icrc2025-beta2, 2026-04-01 公開, DOI 10.5281/zenodo.18195386)。 GitLab の Releases ページからも辿れます(アカウント登録は不要)。

    ブラウザで落とした場合は Linux 側へ移してください。

    WSL の Ubuntu
    mv /mnt/c/Users/<Windowsユーザー名>/Downloads/corsika8-icrc2025.sif ~/corsika8/
  4. 壊れていないか確かめる

    2.5 GB のダウンロードは静かに途中で切れることがあります。公開されている MD5 と突き合わせてください。

    WSL の Ubuntu
    cd ~/corsika8
    ls -lh corsika8-icrc2025.sif
    md5sum corsika8-icrc2025.sif
    項目期待値
    サイズ約 2.5 GB(ls -lh で 2.4G 前後)
    MD579ad7707ef31009bb132c0e0ff2bc836

    この MD5 は Zenodo のレコードに記載されている値です。一致しなければダウンロードのやり直し。 ここで確認しておかないと、あとで出る不可解なエラーの原因がここだったと気づくのに時間を溶かします。

  5. コンテナの中身を覗く

    WSL の Ubuntu
    apptainer inspect corsika8-icrc2025.sif              # ラベル・ビルド日時
    apptainer inspect --runscript corsika8-icrc2025.sif  # run で何が起動するか
    apptainer exec corsika8-icrc2025.sif ls /opt         # インストール先の確認

    --runscript の出力に c8_air_shower が現れれば、 apptainer run でそのままシミュレーションが起動する構成です。ここまで通れば CORSIKA 8 の導入は完了で、 あとは5章でコンソールを入れれば準備が終わります。

    🧰 この .sif 1個に何が入っているか

    実機で中を確認すると、CORSIKA 8 本体(/opt/corsika8/install/bin/c8_air_shower)のほかに、 低エネルギーのハドロン相互作用を担当する FLUKA 2025.1.3、 崩壊とハドロン化を担当する Pythia 8.315、τ 崩壊の TAUOLA C++ 1.1.8、 そして電磁カスケードを担当する PROPOSAL の物理テーブル (/opt/corsika8/src/modules/data/PROPOSAL に 1142 ファイル・194 MB)が同梱されていました。 テーブルが事前生成済みなので、既定のカット値なら初回から待ち時間なしで走ります。

05

準備3 —— 解析環境とコンソール

ローカルの人だけ。所要 10 分。RustDesk の人は6章へ。

長いコマンドを毎回組むかわりに、フォームで設定してボタンで回せるコンソールを使います。 実行・中止・ログ・履歴・プロットまでブラウザで完結します。 加速キッチンが GitHub で公開しているので、WSL の中に git clone して起動するだけです。[15] サーバ本体は Python 3 の標準ライブラリだけで書かれていますが、 プロットを作るときに解析用の Python 環境 ~/venv/corsika8 を裏で呼ぶので、先にそちらを用意します。

🧭 構図をひとことで

サーバは WSL の中で動き、画面は Windows のブラウザで見ます。 シミュレーション本体は WSL 側の Apptainer が回すので、 Windows には何もインストールしません(図1-2)。

  1. venv を作る

    WSL の Ubuntu
    sudo apt-get install -y python3 python3-pip python3-venv git
    python3 -m venv ~/venv/corsika8
    source ~/venv/corsika8/bin/activate
    💡 venv はターミナルを開くたびに読み込む

    毎回 source ~/venv/corsika8/bin/activate が必要です。忘れがちなら ~/.bashrc の末尾に書いておくと自動化できます。 Ubuntu 23.04 以降ではシステム Python への pip install が PEP 668 で拒否されるので、 venv は推奨ではなく実質必須です。

  2. 読み出しライブラリを入れる —— コンテナと同じバージョンで

    Zenodo には .sif と一緒に、同じリリースのソース corsika-icrc2025.tar.gz(3.8 MB)が置いてあります。 読み出しライブラリはこちらから入れるのが安全です。 main ブランチから入れるとコンテナ(icrc2025-beta2)と世代がずれる可能性があります。

    WSL の Ubuntu
    cd ~/corsika8
    wget -O corsika-icrc2025.tar.gz \
      "https://zenodo.org/records/18195386/files/corsika-icrc2025.tar.gz?download=1"
    tar -xf corsika-icrc2025.tar.gz     # 展開先は corsika-icrc2025/
    
    source ~/venv/corsika8/bin/activate
    pip install ./corsika-icrc2025/python

    pip 上のパッケージ名は corsika(corsika8 ではありません)。 依存する numpy / pyyaml / pyarrow / pandas / particle も一緒に入ります。

    解析側のライブラリもまとめて入れます。

    WSL の Ubuntu
    pip install pandas numpy matplotlib boost_histogram mplhep particle jupyterlab

    公式のチュートリアルとサンプルが使うのはこの一式です。

  3. コンソールを取ってくる(一度だけ)

    まず git があることを確かめます。

    WSL の Ubuntu
    sudo apt-get install -y git   # 入っていなければ
    git --version

    置き場所は ~/corsika8 の下にします。.sif や runs/ と同じところにまとまり、 あとで消したくなったらこのディレクトリごと消すだけで済みます。

    WSL の Ubuntu
    cd ~/corsika8
    git clone https://github.com/accel-kitchen/corsika-simulation-console.git
    cd corsika-simulation-console
    ls
    出力例
    README.md  assets  index.html  plot_shower.py  server.py

    これで全部です。ビルドも pip install もありません。中身はこうなっています。

    表5-1 取ってきたものの中身
    ファイル役割
    server.py本体。apptainer の起動・ログの受け渡し・中止・削除・プロット生成を受け持つ。Python 3 の標準ライブラリだけで書かれている
    index.html画面そのもの。ブラウザが読むのはこの1枚
    plot_shower.py作図。CORSIKA 8 の Parquet を読んで図と CSV にする。コンソールを使わず単体でも動く
    assets/フォームの組み立てとオプション定義(app.js / app.css / options.js)
    README.md必要なもの・既定のパス・環境変数。この章と同じことが手短にまとめてある
    🔄 更新するとき

    コンソールは手が入り続けます。この講座の説明と画面が食い違うと感じたら、まずこれを実行してください。

    WSL の Ubuntu
    cd ~/corsika8/corsika-simulation-console
    git pull
    📛 このリポジトリのライセンスは未定です

    手元で使う分にはかまいませんが、再配布や改変版の公開を考えているなら先に確認してください。 なお CORSIKA 8 本体は BSD 3-Clause、.sif に同梱されている FLUKA は独自ライセンスで、 こちらはコンソールとは別の話です。

  4. WSL 側でサーバを起動する

    WSL の Ubuntu
    cd ~/corsika8/corsika-simulation-console
    python3 server.py

    こう出れば起動しています。このターミナルは開いたままにしておきます(閉じるとサーバも止まります)。

    出力例
    CORSIKA 8 Console  →  http://localhost:8765
      .sif       : /home/<ユーザー名>/corsika8/corsika8-icrc2025.sif  (OK)
      apptainer  : apptainer version 1.5.3
      runs       : /home/<ユーザー名>/corsika8/runs
      同時実行数 : 2(環境変数 C8_MAX_CONCURRENT で変更)
      Ctrl+C で停止(実行中のシミュレーションは止まらずに続きます)

    ターミナルを占有したくない場合や、閉じても動かし続けたい場合は tmux の中で起動するか、バックグラウンドへ回します。

    WSL の Ubuntu
    mkdir -p ~/corsika8/logs
    cd ~/corsika8/corsika-simulation-console
    nohup python3 server.py > ~/corsika8/logs/console.log 2>&1 &
    tail -f ~/corsika8/logs/console.log     # 様子を見る(Ctrl+C で見るのをやめるだけ)

    同時に走らせる本数の上限は既定で 2 本です。CPU に余裕があるなら C8_MAX_CONCURRENT=4 python3 server.py のように環境変数で増やせます。 上限を超えた分は捨てられるのではなく、順番待ちになります。

  5. Windows のブラウザで開く

    Edge でも Chrome でもかまいません。アドレスバーに次を入れるだけです。

    Windows のブラウザ
    http://localhost:8765

    8765 番が他とぶつかるなら python3 server.py 8080 のように起動時に変えられます (ブラウザ側の番号も同じだけ変えてください)。

    画面上部のヘッダのピルがすべて緑になっていれば準備完了です。 使い方は6章で説明します(赤いときは下の表5-2)。

    🌉 なぜ localhost で WSL の中に届くのか

    WSL2 にはポート転送が入っていて、WSL 内で 127.0.0.1 の待ち受けが立つと、 Windows 側の同じポートに自動で橋渡しされます。設定は要りません。

  6. PowerShell から一発で立ち上げる

    毎回 WSL のターミナルを開くのが面倒なら、Windows 側から直接起動できます。

    PowerShell
    wsl -d Ubuntu -- bash -lc "cd ~/corsika8/corsika-simulation-console && python3 server.py"

    -d に渡すのはディストリビューション名です。wsl -l -v で確認してください(既定のままなら Ubuntu)。 ショートカット化するなら、次の2行を corsika-console.bat という名前でデスクトップに保存します。

    corsika-console.bat
    start "" http://localhost:8765
    wsl -d Ubuntu -- bash -lc "cd ~/corsika8/corsika-simulation-console && python3 server.py"

    ブラウザのほうが先に開くので、最初は「接続できません」と出るかもしれません。数秒待って再読み込みしてください。 閉じるときはこの黒い窓で Ctrl+C。

  7. 出力ファイルを Windows から開く

    コンソールの実行結果は ~/corsika8/runs/<実行名>/ に入ります。エクスプローラのアドレスバーに次を入れれば開けます。

    エクスプローラ
    \\wsl.localhost\Ubuntu\home\<ユーザー名>\corsika8\runs

    Ubuntu の部分は wsl -l -v に出る名前に読み替えてください。 読み出しは問題ありませんが、シミュレーションの出力先を /mnt/c/... にするのは避けてください(4章)。

  8. 止める

    サーバを起動したターミナルで Ctrl+C。nohup で回した場合は次のとおりです。

    WSL の Ubuntu
    pkill -f 'python3 server.py'
    🏃 サーバを止めてもシミュレーションは止まりません

    実行中のシャワーはサーバとは別のプロセスとして走り続けます。次にサーバを起動すれば、履歴にちゃんと結果が並びます。 走っているものを本当に止めたいときは、コンソールの「中止」ボタンを使ってください。

表5-2 コンソールに繋がらないとき
症状原因対処
ブラウザが「接続できません」サーバが起動していないWSL 側のターミナルを確認。curl -s localhost:8765/api/env が WSL 内で通るかまず試す
WSL 内では通るが Windows から届かないポート転送が効いていない(.wslconfig で networkingMode を変えている等)WSL の IP を hostname -I で調べ、http://<その IP>:8765 で開く。あわせて python3 server.py 8765 0.0.0.0 と第2引数で待ち受けアドレスを渡します(ファイルの書き換えは不要)。認証が無いので、信頼できるネットワークでだけ
Address already in use8765 番を他が使っている/前のサーバが残っているpython3 server.py 8080 のように別のポートで起動する(ブラウザ側の番号も変える)
ヘッダのピルが赤い.sif か apptainer が見つからない4章を確認。パスは ~/corsika8/corsika8-icrc2025.sif 固定です
「同じ名前の実行が既にあります」-f は既存ディレクトリを受け付けない(8章)実行名を変える。既存の結果を消したいなら WSL 側で手動削除する
git: command not foundgit が入っていないsudo apt-get install -y git
シミュレーションは走るのに、プロット生成だけ失敗する解析用の venv が無い/場所が違うコンソールが呼ぶのは ~/venv/corsika8/bin/python 固定です。5章の手順でこのパスに作ってください
画面に説明どおりの項目が無い/挙動が違うコンソールが古いcd ~/corsika8/corsika-simulation-console && git pull
Windows のファイアウォールが尋ねてくる—localhost で使う分には許可は不要。閉じて構いません

サーバは 127.0.0.1 にしか待ち受けを作りません。同じ PC のブラウザからは見えますが、LAN の他のマシンからは見えない設定です。

06

コンソールで撃つ

ここからは RustDesk でもローカルでも同じです。画面の見方を押さえて、1 TeV の陽子を1本撃ちます。

設定を入れるフォーム 実行 順番待ち → 計算 ログを見る 1 秒ごと追記 プロット生成図と CSV 履歴に残る メモ・再実行・DL 投入 開始 完了 表示 「再実行」で設定を戻して種だけ変える 中止すると途中で止まる
図6-1 コンソールでの1回分の流れ。 同時に走らせる本数には上限があり、超えた分は自動で順番待ちになります。 最後の折り返しが「再実行」——過去の設定をそのまま呼び戻して種だけ変えるのに使います。
  1. 画面の全体

    ブラウザで開くと、次の画面になります。左が設定、右がコマンドとログ、 下へスクロールすると「まとめて流す」「プロット設定」「実行履歴」が続きます。 以下、上から順に1つずつ見ていきます。

    コンソールの上半分。上端に状態ピル、その下にシミュレーション条件の帯、左にプリセットと一次粒子のフォーム、右にコマンドとログのカードが並ぶ。
    図6-2 開いた直後の画面(上半分)。 この例ではプリセット「1 TeV 動作確認」を選び、実行名 demo_proton・乱数種 2026 を入れてあります。
  2. ヘッダ —— 状態ピルで準備を確かめる

    ヘッダ。サーバ接続中、.sif 2.53 GB、apptainer 1.4.5、空き 37.73 GB · runs 0 B の4つのピルと、マニュアルへのリンク。
    図6-3 ヘッダの状態ピル。緑の点が付いていれば問題なしです。

    右上の4つの「ピル」は、コンソールが計算を始められる状態かどうかを表しています。まずここを見る習慣を付けてください。

    表6-1 状態ピルの読み方
    表示の例意味赤・黄のとき
    サーバ接続中画面の裏のサーバ(server.py)と通信できているサーバ未接続 になり、画面上部に黄色い帯が出る。実行ボタンは押せない
    .sif 2.53 GBCORSIKA 8 のコンテナが所定の場所にあり、その大きさ.sif 無し。ローカルなら4章のダウンロードを確認
    apptainer 1.4.5Apptainer が見つかり、そのバージョン見つからない。ローカルなら4章の導入を確認
    空き 37.73 GB · runs 0 Bディスクの空き容量と、これまでの出力の合計サイズ空きが 5 GB を切ると黄色になる。不要な実行を削除する

    RustDesk の環境でピルが赤・黄のときは、自分で直そうとせずメンターに連絡してください。 ローカルの場合は5章の表5-2 も参照してください。

  3. シミュレーション条件 —— 変えられない前提

    ヘッダのすぐ下の帯「シミュレーション条件」を押すと開きます。

    シミュレーション条件を開いた状態。大気モデル、地磁気、屈折率、プロファイルのビン幅、電波観測点、電波の時間窓の6項目。
    図6-4 シミュレーション条件。配布 .sif のプログラムに埋め込まれていて、コンソールからもコマンドからも変えられません。
    表6-2 固定されている条件
    項目表示意味
    大気モデルUS-Std (Keilhauer)米国標準大気。高さごとの空気の密度がこれで決まり、スラント深さ X の換算にも効く
    地磁気uniform 50 µT along +xどこでも同じ 50 µT の磁場が +x 向き。実際の場所の地磁気(WMM)は読み込まれるが使われていない
    屈折率1.000327空気の屈折率。電波(--ring)の計算にだけ使う
    プロファイルのビン幅10 g/cm²縦方向発達(9.1)を数える深さの刻み
    電波観測点ring N = single ring at N×25 m, 8 azimuths--ring N を指定すると、コアから N×25 m の円周上 8 方向に観測点が置かれる(8.5)
    電波の時間窓400 ns @ 1 GHz電波波形を記録する長さとサンプリング
    🔒 結果の解釈に直結するので、記録に残します

    たとえば「地磁気が一様 50 µT」という前提は、ミューオンの曲がり方や電波の強さに効きます。 コンソールは実行のたびにこの条件を記録し、図にも書き込むようにしてあります。 レポートや発表でも必ず書いてください(12章)。

  4. プリセット —— よく使う設定を一発で入れる

    プリセットのカード。1 TeV 動作確認、鉄核 30°、スペクトル、軽量の4つのボタンと、現在の設定を保存・整理のボタン。
    図6-5 プリセット。押すとフォームに値が入るだけで、まだ実行はされません。
    表6-3 はじめから入っているプリセット
    名前入る設定目安
    1 TeV 動作確認陽子・1 TeV・鉛直・1 本十数秒。最初の1本はこれ
    鉄核 30°鉄(Z=26, A=56)・100 TeV・天頂角 30°・10 本数時間かかる
    スペクトル陽子・1〜100 TeV を E−2.7 で抽選・100 本長い。宇宙線スペクトルに近い混ぜ方
    軽量陽子・100 TeV・--emcut 1e-2・5 本電磁成分のカットを上げて速くした版。低エネルギーの成分は落ちる(8.1)
    • 実行名と乱数種は、プリセットを押しても変わりません。種はプリセットに含まれない設計です。
    • 現在の設定を保存:いまのフォームの内容に名前と説明を付けてプリセットに加えます(種は保存されません)。
    • 整理:番号を指定してプリセットを消します。
    🤝 RustDesk の環境では、プリセットは全員で共有です

    保存・整理した結果は他の人の画面にも反映されます。他の人が作ったプリセットは消さないでください。

  5. フォーム① —— 一次粒子・エネルギー・到来方向

    設定フォーム。一次粒子(粒子 PDG / 原子核 Z/A の切り替え)、エネルギー(単一 / 範囲)、天頂角と方位角、出力の欄、3つの折りたたみ。
    図6-6 設定フォーム。上半分が「何を撃つか」、下半分が「出力」、いちばん下に詳しい設定の折りたたみが3つあります。
    一次粒子
    「粒子(PDG)」と「原子核(Z / A)」を切り替えます。粒子はプルダウンで選ぶと、右の欄に PDG コード(陽子 2212、光子 22 など)が入ります。 右の数字が実際にコマンドへ渡る値で、直接打ち込むこともできます。 原子核は原子番号 Z(0〜26)と質量数 A(1〜58)で指定します。鉄なら Z=26, A=56。→7.1
    エネルギー
    「単一エネルギー」では一次エネルギーを GeV 単位で入れます。1e3 が 1 TeV(十数秒)、1e5 が 100 TeV(40 分前後)。 「範囲からサンプリング」では下限・上限・べき指数 eslope を入れると、本数ぶんのエネルギーが Eeslope の分布から抽選されます。→7.2
    天頂角・方位角
    度で入れます。天頂角 0 が真上から、90 が真横から。方位角は 0〜360。→7.3
  6. フォーム② —— 出力(実行名・本数・乱数種)

    実行名(出力ディレクトリ名)
    結果を入れるフォルダの名前です。開いた時点では run_20260923_2318 のように日時から自動で付きます。 使えるのは英数字と _ . - だけ(日本語は不可)で、既にある名前は使えません。 RustDesk の共用環境では yamada_p1tev のように自分の名前を入れておくと、履歴で見分けられます。
    シャワー本数 N
    同じ設定で何本撃つか。時間は本数に比例して伸びます。
    乱数種
    開いた時点で大きな数が自動で入っています。同じ種・同じ設定なら同じシャワーが再現できるので、この値は記録に残してください。 横の ↻ で振り直せます。0 は「固定の種」ではなく「毎回ランダム」の意味なので、入れないでください。→8.6
    ログの詳細度
    warn / info(既定)/ debug / trace。ふだんは info のままで十分です。
    出力を tarball に固める/相互作用ヒストグラムを出さない
    出力を小さくしたいときのチェック。最初は付けなくてかまいません(11章)。
    🔁 「実行」を押すと、実行名と種は次の1本用に振り直されます

    同じ名前・同じ種で二重に投入してしまう事故を防ぐためです。 押した直後にフォームの実行名と種が変わっていても、投入した実行はその前の値で走っています(履歴で確認できます)。

  7. フォーム③ —— 詳しい設定の折りたたみ

    フォームの下の3つの帯は、押すと開きます。表示されている値は既定値で、変えなければコマンドにも出てきません。 ラベルの横の灰色の数字は入力できる範囲です。各項目の物理的な意味は8章で1つずつ説明します。

    物理モデルの折りたたみ。高エネルギーハドロンモデル、高低エネルギーモデルの切替、ニュートリノ相互作用、ニュートリノも追跡、最初の相互作用点を固定、一次粒子を即座に崩壊させる。
    図6-7 物理モデル(-M / -T ほか)。衝突をどの理論で計算するか。→8.2
    カットとジオメトリの折りたたみ。電磁成分カット 0.0005、ハドロンカット 0.3、ミューオンカット 0.3、タウカット 0.3、最大偏向角 0.2、観測面の高さ 0、入射点の高さ 112750。
    図6-8 カットとジオメトリ(--emcut ほか)。どのエネルギーまで粒子を追うか、どこからどこまでを計算するか。→8.1・7.4 電磁成分カットは計算時間にいちばん効きます。
    間引きと電波の折りたたみ。間引き開始の割合、重みの上限、間引いた粒子を重み 0 で残す、電波観測点のリング数。
    図6-9 間引きと電波(--emthin / --ring)。高エネルギーで粒子を間引く設定と、電波の観測点。→8.4・8.5
  8. コマンド —— 入力がそのまま命令文になる

    コマンドのカード。apptainer run から始まるコマンド全文、1 本あたり約 14 秒という見積り、実行・中止ボタン、終わったら通知のチェック。
    図6-10 コマンドのカード。フォームを書き換えるたびに、その場で組み直されます。
    • コマンド欄:いまのフォームの内容を apptainer run … の命令文にしたものです。 既定値から変えた項目だけが並ぶので、図の例には天頂角 0(既定値)の -z が出ていません。 「コピー」で写し取れるので、実験ノートに貼っておくと設定の記録になります。
    • 見積り:「1 本あたり約 14 秒」のような目安です。1 TeV で 14 秒、100 TeV で 39 分という実測から大まかに外挿しているだけなので、 桁が合っているかの確認に使ってください。
    • 実行/中止:実行はすぐ始まります。中止は、実行中や順番待ちの実行を止めます(確認あり)。
    • 終わったら通知:チェックすると、終わったときにブラウザの通知が出ます(初回は通知の許可を聞かれます)。

    入力が範囲の外だと、その欄が赤くなり、コマンド欄の下にエラーの一覧が出て、実行ボタンが押せなくなります。

    入力エラーの例。天頂角: 90 以下にしてください、という赤い帯が出て、実行ボタンが薄くなり押せない。
    図6-11 入力エラーの例(天頂角に 999 を入れた場合)。直すと元に戻ります。
    💡 入力できる範囲は --help の出力が「正」です

    フォームの範囲と、この講座の7章・8章の表は、配布 corsika8-icrc2025.sif (icrc2025-beta2)で実際に --help を実行し、その出力と突き合わせたものです(2026-09-04 確認)。 公式ドキュメントは main ブランチ基準で書かれているため、 配布 beta 版とは選択肢が一致しないことがあります(実例は8.2)。

  9. 最初の1本を撃つ

    ここまでの説明どおりに、次の手順で1本撃ってみます。

    1. プリセット「1 TeV 動作確認」を押す(陽子・1 TeV・鉛直・1 本が入る)
    2. 実行名を test_自分の名前 にする(英数字で)
    3. 乱数種を 2026 にする
    4. コマンド欄が … -p 2212 -E 1e3 -N 1 -s 2026 … になっていることを確かめて「実行」
    表6-4 最初の1本の設定
    項目値コマンド上の表記と意味
    一次粒子陽子-p 2212。PDG コード 2212(→7.1)
    エネルギー1e3 GeV-E 1e3。1000 GeV = 1 TeV(→7.2)
    天頂角0既定値なので表記なし。鉛直入射(→7.3)
    本数1-N 1。シャワー1本
    乱数種2026-s 2026。同じ種なら同じ結果を再現できる(→8.6)
    実行名test_名前-f …/runs/test_名前。出力ディレクトリ
    ⏱️ 既定のカット値なら数十秒で終わります

    PROPOSAL の物理テーブルがコンテナに同梱済みなので、既定のカット値であれば初回からテーブル生成は走りません。 実測では 1 TeV 陽子・鉛直・1本が約 14 秒で完了しました。

    ただし --emcut に同梱テーブルと違う値を渡した場合は、その値用のテーブルが新たに生成され、 初回は長時間無反応になる可能性があります。カット値を変えて長く止まったら、フリーズではないので待ってください。

  10. ログ —— 計算の実況を見る

    実行すると、右下の「ログ」に CORSIKA 8 の出力が 1 秒ごとに追記されます。 見出しの横には、いま表示している実行名が出ます。過去の実行のログは、履歴の「ログ」ボタンで呼び出せます。

    • 絞り込み:正規表現で行を絞ります。seed と入れれば実際に使われた乱数種の行、Shower で何本目を計算中かが拾えます。× で解除。
    • 保存:ログ全文をファイルとしてダウンロードします。
    • 追従:チェック中は、新しい行が来るたびにいちばん下までスクロールします。途中を読みたいときは外します。

    履歴の状態が「完了」になれば成功です。 「失敗」になったときは、ログの最後の数行が原因の手がかりです(11章)。

  11. まとめて流す —— 種だけ変えて何本も

    まとめて流すのカード。バッチモードにチェックが入り、本数 10、開始の種 1、種の刻み 1、同時実行 2 本まで同時、の欄が出ている。
    図6-12 まとめて流す(バッチモード)。チェックを入れると欄が開き、実行ボタンが「まとめて実行」に変わります。

    1本のシャワーだけで物理を語ってはいけません(9.5)。同じ条件で種だけ変えた複数本を流すのがこの機能です。 上のフォームの設定のまま、「本数」だけ実行が作られ、名前は 実行名_001、_002…、 種は「開始の種」から「種の刻み」ずつ増えていきます。 同時に走るのは上限(既定 2 本)までで、残りは自動で順番待ちになります。

  12. 実行履歴 —— 結果の一覧

    実行履歴の表。名前・一次粒子・エネルギー・種・状態・所要時間・地表の粒子数・サイズと操作ボタンが並び、1 件を展開して 8 枚の図が表示されている。
    図6-13 実行履歴。1 行が1回の実行です。「表示」で展開すると図・メモ欄・実行したコマンド全文・固定条件が出ます。
    表6-5 履歴の列
    列中身
    (チェック)比較に使う実行を選ぶ。完了した実行だけ選べる
    名前実行名。下にメモとタグが出る。「手動」と付くのはコンソール以外で作られた実行
    一次粒子・エネルギー・天頂角何を撃ったか。原子核は Fe-56 核 のように出る
    種実際に使われた乱数種
    状態順番待ち/実行中/完了/失敗/中止。実行中は所要の欄に進捗バー(何本目か)が出る
    所要かかった時間
    地表の粒子観測面に届いた粒子数。括弧内は電磁成分(em)とミューオン(μ)の内訳
    サイズ出力の大きさ
    操作ログ/プロット(再生成)/表示・閉じる/再実行/DL/メモ/中止/削除

    履歴は 3 秒ごとに自動で更新されます。

  13. プロット設定と図の生成

    履歴の「プロット」を押すと、その実行の図が作られ、行が展開されて図が並びます(図の読み方は9章)。 どんな図をどう描くかは、履歴の上の「プロット設定」を開いて決めます。設定は次に「プロット」「再生成」を押したときに効きます。

    プロット設定のパネル。作る図の種類、粒子種、CSV 書き出し、足跡の表示範囲、横方向分布のビン、軸、画像の解像度と大きさ、3D の視点が並ぶ。
    図6-14 プロット設定(既定値)。迷ったら「既定に戻す」。
    作る図
    8 種類から選びます。既定は「縦方向発達 N(X)」「地表の足跡」「横方向分布」「3D 全体図」の4つ。 ほかに「エネルギー損失 dE/dX」「生成点プロファイル」「最初の相互作用」「3D(発達部分に寄る)」があります。
    粒子種
    光子/e⁻ + e⁺/μ±/ハドロン。既定ではハドロンだけ外れています。
    数値の書き出し
    チェックすると、図に使った数値を CSV でも出します。9章の読み取りを自分の手で確かめたいときに。
    地表の足跡
    表示範囲(パーセンタイル、既定 97)。小さくすると中心部を拡大します。範囲から外れた粒子の数は図に書き込まれます。
    横方向分布
    内側の打ち切り半径(既定 1 m)、ビン数(13)、ビンに最低何個の粒子が要るか(3)。→9.3
    軸
    各図の縦軸・横軸の対数/線形と、縦方向発達の X の範囲(空欄なら自動)。
    画像・3D
    解像度(dpi)・大きさ・形式(PNG / PDF / SVG)・点の大きさと透明度、3D 図の視点(仰角・方位角)・高度の上限・到達方向の線の本数。

    展開した行にはメモとタグの欄もあります。「何のために回したか」を書いて「保存」すると、履歴の名前の下に出ます。 実験ノートの代わりになるので、毎回書く習慣を付けてください(12章)。

  14. 比較 —— 条件を変えた実行を重ねる

    履歴の左端のチェックを2 件以上入れると、右上のボタンが「選択した N 件を比較」になります。 押すと、選んだ実行を1枚に重ね描きした図が履歴の下に出ます。 陽子と鉄核、鉛直と斜め入射のように条件を1つだけ変えた実行を並べると違いがはっきり見えます(7章の「まず試すならこの4本」)。

  15. 再実行・DL・削除

    再実行を押した直後の画面。フォームが原子核 Z=26 A=56 に切り替わり、コマンド欄が -Z 26 -A 56 に更新され、demo_iron の設定を読み込みました(種は振り直し)と表示されている。
    図6-15 「再実行」を押した直後。過去の実行の設定がフォームに戻り、実行名と種だけが新しくなります。
    • 再実行:その実行の設定をフォームに読み込みます。種は振り直され、実行名も新しくなるので、そのまま「実行」すれば「同じ条件の別の1本」になります。少しだけ条件を変えて比べたいときも、ここから始めると楽です。
    • DL:出力一式を tar.gz で自分の PC にダウンロードします。RustDesk の環境からは、リモート先のブラウザのダウンロード先に保存されます。
    • 削除:出力とログを消します。消える容量が表示され、元に戻せません。消せるのはコンソールで作った実行だけです。
    🤝 共用の環境では、他の人の実行を消さない

    RustDesk の環境の履歴には全員の実行が並びます。自分のもの以外の「削除」「中止」は押さないでください。

  16. 出力の中身

    ローカルの場合、ファイルそのものは ~/corsika8/runs/<実行名>/ にあります(→5章)。 出力は Apache Parquet 形式(列指向のデータ形式)で、内容ごとにサブディレクトリに分かれます。 各ディレクトリには必ず config.yaml(設定と単位)と summary.yaml(実行結果の要約)が付きます。 単位の定義は config.yaml に書いてあるので、自分で図を描くときは必ずそこを見てください。 出力の公式解説

    表6-6 既定設定(--ring 0)で実際に出てくるもの
    ディレクトリ / ファイル中身
    profile/profile.parquet縦方向発達(longitudinal profile)。最初に見るのはここ(→9.1)
    production_profile/生成点ベースの縦方向発達。「そこに居た数」ではなく「そこで生まれた数」
    particles/particles.parquet観測面に到達した粒子。足跡と横方向分布の材料(→9.2)
    energyloss/dEdX.parquet大気中でのエネルギー損失の分布。蛍光望遠鏡が見ているのは実質これ
    interactions/相互作用の記録。第一相互作用の高さなどが取れる
    interaction_hist/相互作用ヒストグラム。.npz 形式。「相互作用ヒストグラムを出さない」で止められる
    primary/一次粒子の情報(config.yaml と summary.yaml のみ)
    CoREAS/, ZHS/電波放射。--ring 0(既定)では観測点が無いので中身は空(→8.5)
    config.yaml / summary.yaml実行時の設定・バージョン・実際に使われた乱数種・所要時間などのメタデータ
    plots/コンソールで作った図(と CSV)
    🧭 飛跡(tracks)は出ません

    粒子の飛跡出力は icrc2025-beta2 の c8_air_shower では有効になっておらず、 tracks ディレクトリは作られません。出力が巨大化する主因は本数とエネルギーです。

    🎉 ここまで来れば準備は終わりです

    あとは7章・8章で「何をどう変えられるか」を覚え、 9章で出てきた図を読みます。

07

設定項目① —— 何を撃つか

ここからが本題です。c8_air_shower の引数は「何を撃つか」と「どう計算するか」に分かれます。 この章は前者 —— 一次粒子・エネルギー・到来方向・ジオメトリ。 それぞれの数字が物理的に何を意味するのかまで踏み込みます。

7.1 一次粒子 —— 何が飛び込んでくるか

-p, --pdg PDG code 既定 なし

一次粒子を PDG コード(素粒子に振られた国際的な通し番号)で指定します。 陽子 2212、光子 22、電子 11、ミューオン 13、中性子 2112。 原子核を撃つときは -Z/-A を使い、-p とは排他です。

物理的には 一次粒子の種類は、地上で観測されるシャワーの形をがらりと変えます。 陽子・原子核はハドロン相互作用から始まるのでミューオンをたくさん作りますが、 光子は最初から電磁カスケードなのでミューオンがほとんど出ません。 ガンマ線望遠鏡(CTAO など)がガンマ線と宇宙線背景を区別できるのは、まさにこの差を使っているからです。 教材としては「陽子・鉄・光子を同じエネルギーで撃って並べる」のが一番わかりやすい実習になります。

-Z-A 原子番号 / 質量数 Z: 0〜26 / A: 1〜58

原子核を一次粒子にするときの指定。ヘリウム核なら -Z 2 -A 4、 鉄核なら -Z 26 -A 56。2つセットで指定します。

物理的には 原子核のシャワーは、おおまかには 「エネルギー $E_0/A$ の陽子シャワーが $A$ 本重なったもの」として理解できます (重ね合わせモデルsuperposition model。核子1個ずつが独立にシャワーを起こすと近似する古典的な描像。定量的には粗いが、傾向を理解するには十分。)。 ここから2つの効果が出ます。

  • シャワーが浅くなる —— 1本あたりのエネルギーが $1/A$ になるので、最大に達する深さ $X_{\max}$ が浅く(上空側に)ずれます。鉄($A=56$)では陽子より およそ 150 g/cm² 浅いと見積もれます(→9.1)。
  • ミューオンが増える —— ミューオン数は $N_\mu \propto E_0^{\beta}$($\beta \simeq 0.9$)に従うため、$A$ 本に分けると $A^{1-\beta}$ 倍になります。鉄なら $56^{0.1} \simeq 1.5$ 倍。

この「浅くてミューオンが多い」対「深くてミューオンが少ない」の差が、 超高エネルギー宇宙線の質量組成を測る唯一の手がかりです。[3]

7.2 エネルギー —— どれくらいの勢いか

-E, --energy GeV 既定 0

一次エネルギーを GeV 単位で指定します。単一エネルギーで撃つときはこれ。 -E 1e3 なら 1 TeV、-E 1e5 なら 100 TeV、-E 1e9 なら 1018 eV。

物理的には シャワーの粒子数はほぼエネルギーに比例します($N_{\max} \simeq E_0/\xi_c$、 空気の臨界エネルギー $\xi_c \approx 85$ MeV)。 つまり エネルギーを10倍にすると、計算量もだいたい10倍になります。 手元の WSL で1本を待てるのは、おおよそ 1e3〜1e5 GeV まで。 実測では 1 TeV 陽子が 14 秒、100 TeV 陽子が 39 分 25 秒でした。 本物の超高エネルギー宇宙線(1020 eV = 1e11 GeV)を素直に撃つと、 間引きなしでは現実的な時間で終わりません(→8.4)。

--energy_range GeV GeV 値を2つ

エネルギーの下限と上限を渡すと、その範囲からベキ乗分布に従ってランダムに一次エネルギーを引きます。 --energy_range 1e3 1e5 で 1〜100 TeV。-E の代わりに使います。

物理的には 実際の宇宙線は特定のエネルギーで来るのではなく、 「エネルギーが高いほど数が少ない」ベキ乗のスペクトルで降ってきます (宇宙線の基礎 4章)。 検出器の応答を現実に近い形で見積もりたいときは、単一エネルギーではなくこちらを使います。

--eslope 指数 既定 -1.0

--energy_range でサンプリングするときのベキ指数。$\mathrm{d}N/\mathrm{d}E \propto E^{\text{eslope}}$ です。

物理的には 観測される宇宙線スペクトルの指数は、knee より下でおよそ $-2.7$、 knee(約 $3\times10^{15}$ eV)より上で $-3.1$ 程度です。[4] 現実を模したいなら --eslope -2.7 を使ってください。 既定の $-1.0$ は「エネルギーの対数について一様」($\mathrm{d}N/\mathrm{d}\ln E$ が一定)で、 広いエネルギー帯を効率よく埋めたいとき(=あとで重みを付け直して使う前提のとき)に向いた値です。 現実のスペクトルではないことに注意してください。

7.3 到来方向 —— どちらから来るか

大気の上端 地表(観測面) θ = 0° X ≈ 1030 g/cm² θ = 45° X ≈ 1460 g/cm² X(θ) ≈ X(鉛直) ÷ cos θ (θ ≲ 60° で有効な平面近似)
図7-1 天頂角とスラント深さ。 斜めから来るほど、粒子は厚い大気を通ります。シャワーが「早く老ける」ので、地表に届く粒子は減ります。
-z, --zenith 度 既定 0(0〜90)

天頂角。0 が真上からの鉛直入射、90 が水平です。

物理的には 空気シャワーの物理で本質的なのは高度[m]ではなく スラント深さ $X$ —— 通ってきた大気の量(g/cm²)です。 鉛直方向の全大気量が約 1030 g/cm² なので、天頂角 $\theta$ で入ると $X \simeq 1030/\cos\theta$。 45° で約 1.4 倍、60° で約 2 倍、70° で約 3 倍の大気を通ることになります。

  • 斜めのシャワーは地表で「痩せて」いる —— 電磁成分は $X_{\max}$ を過ぎると急速に減るので、余分に大気を通った分だけ減衰します。
  • 足跡は楕円に伸びる —— 円錐を斜めに切るので、地表のパターンが到来方向に沿って引き伸ばされます(→9.2)。
  • ミューオンの割合が上がる —— μ はほとんど減衰しないので、天頂角が大きいほど「ミューオンだけのシャワー」に近づきます。

なお $1/\cos\theta$ は平面大気の近似で、$\theta \gtrsim 60°$ では地球の丸みが効いて破綻します。 CORSIKA 8 の c8_air_shower は最初から球面(curved)大気で解いているので、 シミュレーション自体は大天頂角でも正しく走ります。近似が破綻するのは手計算の見積もりのほうです。

-a, --azimuth 度 既定 0(0〜360)

方位角。どちら向きから来るか。

物理的には 大気は方位に対して一様なので、粒子数の発達には効きません。 効くのは地磁気です。荷電粒子はローレンツ力で曲がるので、 磁力線に対する入射方向によって足跡の形がわずかに歪み、 電波放射の強さと偏光は方位角で大きく変わります(→8.5)。 電波を扱わないなら、既定のままで構いません。

7.4 ジオメトリ —— どこからどこまで

--observation-level m 既定 0

観測面の高さ(地球半径からの高さ)。ここに置いた平面を通過した粒子が particles/particles.parquet に記録されます。

物理的には 「実験装置がどこにあるか」を入れる場所です。 標高が高いほど $X_{\max}$ に近いところで切ることになるので、 同じシャワーでも地表に届く粒子数が大きく変わります。 Telescope Array(ユタ州、標高約 1400 m)、Pierre Auger(アルゼンチン、約 1400 m)、 チベットの ASγ(4300 m)——高地に置くのは、シャワーがまだ太いうちに捕まえるためです。 日本の海抜0 m 付近で測るなら 0、乗鞍(2770 m)なら 2770 を入れます。

--injection-height m 既定 112750(−1000〜1e+06)

一次粒子を大気に「置く」高さ。既定は約 113 km、事実上の大気の上端です。

物理的には この高さの空気はほとんど真空なので、入射直後は何も起きません。 陽子が最初にぶつかる(第一相互作用)のはだいたい高度 20〜30 km 付近です。 3D 全体図(→9.4)で「上のほうは細い線がまっすぐ伸びているだけ」に見えるのは、そのためです。 触る必要はまずありません。触るのは、たとえば 「地下・水中・氷中に飛び込む粒子を扱いたい」ときに負の値を入れるような、特殊な場合だけです。

🧪 まず試すならこの4本

コンソールのフォームにこの4本を順に入れて流します(6章)。1本目を撃ったら、履歴の「再実行」で設定を呼び戻し、1か所だけ変えて種を 2026 に戻すと速いです。100 TeV は1本 40 分ほどかかります。

プリセット設定見どころ
① 基準陽子・100 TeV・鉛直・種 2026比べるときの基準
② 鉄核鉄(Z=26, A=56)・100 TeV・鉛直・種 2026浅くなり、ミューオンが増える
③ ガンマ線光子・100 TeV・鉛直・種 2026ミューオンがほとんど出ない
④ 斜め入射陽子・100 TeV・天頂角 45°・種 2026足跡が楕円に伸びる

4本とも同じ種 2026 にしてあるのがポイントです。 種を揃えても物理過程が違うので同じシャワーにはなりませんが、 「条件だけを1つ変えた比較」という実験ノートの書き方が身につきます。

08

設定項目② —— どう計算するか

こちらは「物理そのもの」ではなく、どこまで真面目に計算するかを決める設定です。 計算時間・ファイルサイズ・結果の正しさが、ここで一気にトレードオフになります。 論文に書くときに必ず報告しなければならないのは、この章の値です。

8.1 カット —— どこで追うのをやめるか

シャワーの中の粒子はどんどんエネルギーを失っていきます。 エネルギーが十分低くなった粒子まで律儀に追いかけると計算が終わらないので、 「この運動エネルギーを下回ったら追跡をやめる」という下限を決めます。これがカットです。

--emcut GeV(運動エネルギー) 既定 0.0005

光子・電子・陽電子を追跡する下限。既定は 0.5 MeV。計算時間にもっとも効く設定です。

物理的には シャワーの粒子数の9割以上は電磁成分で、しかもその大半は低エネルギーです。 つまり --emcut を上げると粒子数=計算量が劇的に減ります。 ただし捨てているのは主に低エネルギーの光子と電子なので、 縦方向発達の山($N_{\max}$)が低くなり、$X_{\max}$ の位置もわずかにずれます。 「速くなった」の裏で何を捨てたかを必ず把握してください。

  • 0.5 MeV(既定) —— 電子の静止質量 0.511 MeV とほぼ同じ。物理的に意味のある下限で、コンテナに同梱の PROPOSAL テーブルもこの値向けに作られています。
  • 10 MeV(--emcut 1e-2) —— 大幅に速い。地上で電磁成分の絶対数を問題にしない探索的な実行向け。
  • 変えたら初回が遅くなる —— 同梱テーブルと違う値を渡すと、その値用の物理テーブルが生成されます。長時間止まってもフリーズではありません。
--hadcut--mucut--taucut GeV いずれも既定 0.3

それぞれハドロン・ミューオン・τ レプトンの追跡下限。既定 300 MeV。

物理的には これらの粒子はもともと数が少ないので、 --emcut ほど計算時間には効きません。とはいえ意味は重要です。 ミューオンの静止質量は 106 MeV、地上に届く典型的なミューオンは数 GeV なので、 既定の 300 MeV は「検出器に届くミューオンはすべて残す」線として妥当な値です。 ミューオン計数実験の応答を見たいなら、ここを検出器の閾値に合わせるのが筋です (例:厚いコンクリートの下なら、そこに届くエネルギーより下は端から要らない)。

--track-neutrinos フラグ 既定 off

ニュートリノも追跡します。

物理的には ニュートリノは大気をほぼ素通りするので、 空気シャワーの発達には何の影響もありません。既定で追跡しないのはただの無駄だからです。 オンにするのは、大気ニュートリノのフラックスを自分で計算したいときなど、 ニュートリノ自体が目的の場合だけです(出力は当然重くなります)。

8.2 物理モデル —— どの理論で衝突を解くか

ここがシミュレーションでもっとも「不確かさ」を含む部分です。 陽子と窒素原子核が 100 TeV でぶつかったとき何個の π が出るか—— これは第一原理から計算できず、加速器実験のデータに合わせた現象論モデルで扱うしかありません。 公式:Interaction Models

-M, --hadronModel 既定 SIBYLL-2.3d

高エネルギー側のハドロン相互作用モデル。 配布 .sif(icrc2025-beta2)が受け付ける文字列はこの5つだけで、 大文字小文字・ハイフンまで厳密です。

文字列性格と一次資料
SIBYLL-2.3d既定。宇宙線分野で広く使われる。チャーム生成を扱えるのが特徴。Riehn et al., PRD 102 (2020) 063002
QGSJet-II.04くり込み群にもとづくポメロン模型。LHC データで調整済み。Ostapchenko, PRD 83 (2011) 014018
QGSJet-III上記の次世代版
EPOS-LHC原子核衝突の集団効果を取り込む。ミューオン数がやや多めに出る傾向。Pierog et al., PRC 92 (2015) 034906
Pythia8加速器実験の標準汎用イベント生成器。スペースを入れない綴りに注意。pythia.org

物理的には どのモデルを選ぶかで $X_{\max}$ はおおむね 20〜30 g/cm²、 地上のミューオン数は1〜2割程度ずれます(エネルギーや一次粒子によります)。 これは実験の系統誤差の主要因のひとつで、 「モデルを変えて走らせて差を見る」こと自体が系統誤差の評価になります。 逆にいえば、1つのモデルの結果だけを見て「これが正解」と言うことはできません。

さらに未解決の問題として、観測される地上ミューオン数がどのモデルの予測よりも多いという 「ミューオン超過問題(Muon Puzzle)」が知られています。[5] シミュレーションを絶対的な真実として扱ってはいけない、いい実例です。

🔀 公式ドキュメントと配布 beta 版で選択肢が違います

公式ドキュメント(main ブランチ基準)には EPOS-LHC-R も載っており、--track-charm というオプションも説明されています。 しかし配布 icrc2025-beta2 の --help にはどちらも現れません。 こういうときは手元の --help が正です。 ドキュメントは常に開発版を先取りしている、と覚えておいてください。

-T, --hadronModelTransitionEnergy GeV 既定 79.4328

高エネルギーモデルと低エネルギーモデルを切り替える境目。 既定値は $10^{1.9}$ GeV ≈ 79.4 GeV です。 この下は FLUKA が担当します(コンテナに FLUKA 2025.1.3 が同梱されています)。

物理的には SIBYLL や QGSJet のような高エネルギーモデルは、 数十 GeV より下では精度が落ちます。逆に FLUKA のような低エネルギー用コードは、 核破砕や共鳴状態を丁寧に扱える反面、高エネルギーには向きません。 その得意分野の境目がこの値です。 シャワーの後半(=地表付近)の粒子はほとんどが低エネルギー側にいるので、 地上のミューオン数や粒子数の絶対値は、この境目の設定にも敏感です。 公式は「本番の計算では、高エネルギーモデルと遷移エネルギーの両方を報告せよ」と明記しています。

--force-interaction--force-decay フラグ 既定 off

前者は最初の相互作用点を固定し、後者は一次粒子を即座に崩壊させます。

物理的には 空気シャワーのばらつきの最大要因は 「一次粒子がどこで最初にぶつかったか」です(→9.5)。 --force-interaction はその揺らぎを止めるので、 「第一相互作用の深さの違い」と「それ以外の揺らぎ」を切り分ける系統評価に使います。 通常の物理計算では使いません。

--neutrino-interaction-type 既定 both

一次粒子がニュートリノのときの相互作用のしかた。 charged(荷電カレント CC)/ neutral(中性カレント NC)/ both。

物理的には CC ではニュートリノが対応する荷電レプトン(e, μ, τ)に変わり、 NC ではニュートリノのまま残ります。τ ニュートリノの CC は τ を作り、 その崩壊が二次シャワーを起こすため、 地平線すれすれのニュートリノ探索(Auger や IceCube の話題)ではこの区別が決定的です。 一次粒子がニュートリノでないなら関係ありません。

8.3 追跡の精度

--max-deflection-angle rad 既定 0.2

追跡1ステップあたりに許す最大の偏向角。小さくするほど、飛跡を細かく刻んで追います。

物理的には 荷電粒子は地磁気の中で曲がるので、 直線で近似できる長さには限度があります。既定の 0.2 rad は粒子数の計算には十分ですが、 電波放射を計算するときは全く足りません。 電波の強さは飛跡の各区間から出た放射の位相の重ね合わせで決まるため、 刻みが粗いと位相を取り違えるからです。 公式の電波検証では、この値を 0.2 → 0.001 rad に下げてはじめて CoREAS と ZHS という2つの独立な計算方法が一致した、と報告されています。 公式:Radio Emission 当然、刻みを細かくすると計算時間は増えます。

8.4 間引き(thinning)—— 全部は追えないとき

1019 eV の宇宙線は 1011 個規模の粒子を作ります。1個ずつ追うのは不可能です。 そこで「代表を選んで、選ばれた粒子に重みを付ける」という手を使います。 A. M. Hillas が 1981 年に提案した方法で、いまも標準的に使われています。[6]

--emthin 一次エネルギーに対する割合 既定 1e-6

粒子のエネルギーが「一次エネルギー × この値」を下回ったところから間引きを始めます。 100 TeV のシャワーで 1e-6 なら、100 MeV 以下の電磁粒子が間引きの対象です。

物理的には CORSIKA 8 の間引きは 電磁的な 1→2 分岐(電磁粒子が電磁粒子2個を生む場合)にのみ適用されます。 閾値より下では代表を統計的に選び、期待値が保たれるように重みを割り当てます。 その結果、CPU 時間と出力サイズは減りますが、統計的なゆらぎが増えます。 解析側でも必ず重みを掛けて数える必要があります(重みを無視して数えると答えが狂います)。 公式:Thinning

--max-weight 既定 0(=自動)

間引きで付く重みの上限。既定の 0 は「上限なし」ではなく、 Kobal の最適重みの 1/2 を自動的に選ぶという意味です。[7]

物理的には 重みが大きくなりすぎると、「重み 105 の粒子が1個だけ検出器に当たった」というような、 物理的に無意味な結果が出てしまいます(人工的なスパイク)。上限はそれを防ぐための安全弁です。 公式の電波検証では --emthin 1e-6 --max-weight 50 が使われました。 ただし公式自身が「これはその比較のための値であって、 新しい設定での収束性の確認を代替するものではない」と釘を刺しています。

--multithin フラグ 既定 off

間引かれた粒子を、重み 0 のまま出力に残します。

物理的には 「捨てた粒子の履歴も追跡したい」という解析上の都合のためのオプションです。 重み 0 なので物理量には寄与しませんが、間引きが何を落としたのかを検証できます。 出力サイズは当然増えます。

8.5 電波観測点(--ring)

--ring 同心円の数 既定 0(0〜20)

電波の観測点を星形(同心円状)に並べるときの、円の数。 既定の 0 では観測点が1つも置かれないので、 CoREAS/ と ZHS/ のディレクトリは作られても中身は空です。

物理的には 空気シャワーは電波(数十 MHz 帯)を出します。原因は2つ。

  • 地磁気放射 —— 電子と陽電子が地磁気で逆向きに曲げられ、横向きの電流が生まれる。偏光はおおむね $\mathbf{v}\times\mathbf{B}$ 方向。
  • 電荷超過放射 —— シャワー前面が正味で負に帯電することによる放射。偏光はシャワー軸に対して放射状。

CORSIKA 8 はこれを CoREAS(端点法)と ZHS(飛跡区間法)という 2つの独立な定式化で同時に計算できます。 同じシャワーに対する2つの答えが一致するかどうかが、そのまま設定の検証になるという優れた設計です。 電波を本気で扱うなら --max-deflection-angle 0.001 とセットで使ってください(→8.3)。 Alameddine+ 2025

8.6 実行の制御と再現性

-s, --seed 既定 0(=自動)

乱数の種。既定の 0 は「固定種 0」ではなく「毎回ランダムに決める」という意味です。 実際に使われた種は出力の summary.yaml の seed: に記録されます。

物理的には 1章で見たとおり、CORSIKA はモンテカルロ法です。 種が違えば別のシャワーになります。 -s を省いて走らせた図は、二度と再現できません。 気に入った図ができても、あとから条件を1つだけ変えて比べることができなくなります。 可視化用こそ必ず種を固定してください。 逆に、統計を貯めたいときは種を変えて何本も走らせます。

表8-1 残りの実行制御オプション
オプション既定説明
-f, --filenamecorsika_library出力ディレクトリ名。必須。絶対パスで書くのが安全。既存のディレクトリを渡すとエラーで即終了する(PATH(non-existing) 指定なので、うっかり上書きされる心配は無い)
-N, --nevent1走らせるシャワーの本数。ばらつきを見るならここを増やす
--compressoff出力ディレクトリを tarball に固める(フラグ)。ディスクを節約したいとき
--disable-interaction-histogramsoff相互作用ヒストグラムの出力を止める(フラグ)。出力を軽くしたいとき
-v, --verbosityinfowarn / info / debug / trace。挙動を追いたいときは debug
🔒 コマンドラインからは変えられない条件があります

大気モデル(米国標準大気)、地磁気(一様 50 µT)、 縦方向プロファイルのビン幅(10 g/cm²)などは、 この .sif のソースに埋め込まれていて c8_air_shower のオプションでは変更できません。 結果の解釈に直結する条件なので、実行のたびに記録に残してください(→12章)。 どうしても変えたい場合はソースからのビルドが必要になります。

7〜8章のまとめ —— 論文に必ず書く項目

  • 一次粒子の種類とエネルギー(-p / -Z -A / -E / --energy_range --eslope)
  • 到来方向と観測面の高さ(-z / --observation-level)
  • ハドロン相互作用モデルと遷移エネルギー(-M / -T)
  • カット値(--emcut ほか)と間引きの設定(--emthin / --max-weight)
  • 実際に使われた乱数種(summary.yaml の seed:)とコンテナのバージョン・MD5
09

図の読み方

ここからが、この講座でいちばん大事な部分です。 以下はすべて 100 TeV の陽子を鉛直に1本撃った結果(-s 2026、実行時間 39 分 25 秒、 地表に届いた粒子 14,199 個)。図の形ひとつひとつに、ちゃんと物理の理由があります。

9.1 縦方向発達 —— シャワーの一生

スラント深さに対する粒子数のグラフ。光子が最も多く、次が電子・陽電子。ミューオンはほぼ平ら。300〜500 g/cm2 付近に山がある。
図9-1 shower_longitudinal.png —— 100 TeV 陽子・鉛直入射・1本。 山の頂上が $X_{\max}$(この例で約 450 g/cm²)。ミューオンだけほぼ平らなまま地表まで届いている。

横軸はスラント深さ $X$ —— 大気を突き抜けてきた物質量(g/cm²)。鉛直入射なら地表がおよそ 1030 g/cm² です。 高度[km]ではなく物質量で測るのは、粒子にとって「どれだけ物質と出会ったか」が本質だからです。 縦軸はその深さに存在した粒子数。

  • 光子がいちばん多く、次が e⁻+e⁺ —— 空気シャワーの粒子数の大半は電磁成分です。光子が電子・陽電子を数倍上回るのは、電子は電離損失でどんどんエネルギーを失って止まってしまうのに対し、光子は相互作用するまでの距離が長く、低エネルギーでも生き残りやすいからです(対生成の平均自由行程は放射長の $9/7$ 倍)。
  • 山の頂上が $X_{\max}$ —— シャワーがもっとも育った深さ。一次粒子の種類とエネルギーで決まるので、宇宙線の正体を推定する主要な観測量です。
  • ミューオンだけ減らない —— 電磁成分が急激に減衰しても、μ はほぼ平らなまま地表まで届きます。これが地上でミューオンばかり観測される理由です。

なぜ山ができるのか —— Heitler モデル

この山の形は、驚くほど簡単なモデルで説明できます。[3]

Xmax 1粒あたり ξc ≈ 85 MeV スラント深さ X → 地表 1030 g/cm² 1個 d = X₀ ln2 ≈ 25 g/cm² ごとに倍 増えるのをやめて減衰へ
図9-2 Heitler モデル。粒子が一定の深さごとに倍々に増え、 1粒あたりのエネルギーが臨界エネルギーを切ったところで増加が止まる。これだけで山ができます。

電磁カスケードでは、光子が対生成で $e^+e^-$ になり、電子が制動放射で光子を出す—— という「1個が2個になる」過程がくり返されます。 空気の放射長を $X_0 = 36.6$ g/cm² とすると、粒子数は深さ $d = X_0\ln 2 \approx 25$ g/cm² ごとに倍になるので、

Heitler $$N(X) = 2^{X/d}, \qquad E_{\text{1粒あたり}} = \frac{E_0}{N(X)}$$

1粒あたりのエネルギーが空気の臨界エネルギー $\xi_c \approx 85$ MeV (電離損失が制動放射に勝ちはじめる境目)を切ると、粒子はもう新しい粒子を作れず、増加が止まります。ここが山の頂上です。

結論 $$N_{\max} \simeq \frac{E_0}{\xi_c}, \qquad X_{\max} \simeq X_0 \ln\!\left(\frac{E_0}{\xi_c}\right)$$
  • 粒子数はエネルギーに比例する —— $N_{\max}\propto E_0$。だから地表の粒子数からエネルギーを測れます。空気シャワー実験のエネルギー決定はこの関係が土台です。
  • $X_{\max}$ はエネルギーの対数で深くなる —— エネルギー10倍で $X_{\max}$ は一定量だけ深くなります。この「10倍あたりの増分」を伸長率elongation rate。dXmax/dlog10(E)。純粋な電磁シャワーなら X₀ln10 ≈ 84 g/cm²/decade、ハドロンシャワーでは 55〜60 g/cm²/decade 程度。といい、実測では 55〜60 g/cm²/decade です。本書の実測でも 1 TeV 陽子で約 250、100 TeV 陽子で約 450 g/cm² と、2桁で約 200 g/cm² 深くなっています。
  • 重い原子核ほど浅い —— 5.1 で見たとおり $X_{\max}^{A} \simeq X_{\max}^{p} - X_0\ln A$。鉄なら約 150 g/cm² 浅くなります。
📐 実際のフィットには Gaisser–Hillas 関数を使う

Heitler モデルは理解のための粗い模型です。実測データや詳細シミュレーションの縦方向発達を数式で表すときは、 Gaisser と Hillas が 1977 年に導入した次の関数を当てはめるのが標準です。[8]

$$N(X) = N_{\max}\left(\frac{X-X_1}{X_{\max}-X_1}\right)^{\frac{X_{\max}-X_1}{\lambda}} \exp\!\left(\frac{X_{\max}-X}{\lambda}\right)$$

$X_1$ が第一相互作用の深さ、$\lambda$ が減衰の長さ(およそ 70 g/cm²)。 蛍光望遠鏡(Auger や Telescope Array)は、大気が光る様子を横から撮影してこの曲線を直接測っています。 $N_{\max}$ からエネルギー、$X_{\max}$ から質量組成。あなたがいま見ている図は、彼らが測っているものそのものです。

9.2 地表の足跡 —— シャワーが地面に描く模様

地表に到達した粒子の x-y 散布図。中心に密集し、外に行くほど疎になる。青い光子が広く散り、緑のミューオンはコア付近に集中している。
図9-3 shower_footprint.png —— 同じシャワーが地面に届いた 14,199 個の粒子。 97 パーセンタイルで切っているので、外に出た 313 個は図に無い。

観測面に到達した粒子の $x$, $y$ をそのまま撒いた図です。単位は m (particles/config.yaml の units に書いてあります)。 地表アレイ型の実験(Telescope Array、Pierre Auger、そして教室に置く検出器も)が見ているのは、この図の一部分だけです。

  • 中心に密集し、外へ行くほど疎 —— シャワーの広がりを決めているのは、電子の多重クーロン散乱物質中で荷電粒子が原子核のクーロン場によって少しずつ向きを変えられる現象。個々の散乱角は小さいが、積み重なって横方向の広がりを生む。です。この広がりの目安がモリエール半径で、海面付近の空気ではおよそ 70〜80 m、シャワー最大付近の高度(数 km、空気が薄い)では 100 m を超えます。
  • 光子(青)がもっとも広く散る —— 電磁成分は散乱をくり返すので横に広がります。密度そのものはどの半径でも光子が最大です。
  • ミューオン(緑)はコア付近に集中 —— μ は大気とほとんど反応せず、生まれた向きにほぼ直進するからです。
  • 数個だけ極端に遠くへ飛ぶ —— 高エネルギーのミューオンです。そのまま描くと中心がつぶれるので、パーセンタイルで切って外れた個数を副題に出す、という処理を入れています。「切った」ことを図に明記するのは、データ可視化の基本作法です。
🔬 この図が答えてくれる実験の問い

「検出器を2台、何 m 離して置けば同時計数が取れるか?」—— 足跡の粒子密度がわかれば、その距離での同時計数率が見積もれます。 検出器のしくみで扱うコインシデンス測定の設計を、 このシミュレーションで先に検討できるということです。 斜め入射(-z 45)にすると足跡が到来方向に沿って楕円に伸びるのも、実際に見て確かめてください。

9.3 横方向分布(LDF)—— 密度をどう測るか

コアからの距離に対する粒子密度の両対数グラフ。なだらかに落ちていき、遠方でミューオンが電子・陽電子を上回る。
図9-4 shower_ldf.png —— コアからの距離に対する粒子密度(lateral distribution function)。 遠方で μ± が e⁻+e⁺ を上回るのが、地上でミューオンが観測の主役になる理由。

足跡を、コアからの距離 $r$ でリング状に区切り、各リングの面積で割って密度にしたものです。 両対数で見ると、コア近傍では平らで、外側へ行くほど急に落ちていきます。

📊 標準的な当てはめ関数 —— NKG

電磁成分の横方向分布は、西村・鎌田・Greisen による NKG 関数でよく表せます。[9]

$$\rho(r) = \frac{N_e}{r_M^{2}}\,C(s)\left(\frac{r}{r_M}\right)^{s-2}\left(1+\frac{r}{r_M}\right)^{s-4.5}$$

$r_M$ がモリエール半径、$N_e$ が全電子数、$s$ がシャワー年齢($s=1$ が $X_{\max}$ ちょうど、 $s>1$ は「老いた」=最大を過ぎたシャワー)。 地表アレイ実験は、離散的に置いた検出器の測定値にこの関数を当てはめて、 コアの位置・全粒子数・エネルギーを同時に推定します。 Pierre Auger がエネルギー指標に使う $S(1000)$(コアから 1000 m での信号)も、この曲線上の1点です。

  • なぜ「密度」にするのか —— 検出器は面積を持つので、測っているのは個数ではなく個数密度です。散布図(8.2)を実験と比べるには、この形に直す必要があります。
  • 遠方で μ が e を上回る —— 電磁成分は外側で急速に落ちますが、ミューオンはゆるやかにしか落ちません。だからコアから遠い検出器はミューオンを測っていることになります。地上の宇宙線測定がミューオン計数になるのは、この交差のためです。
  • コアのごく近傍は信用しない —— 内側のリングは面積が極端に小さく、粒子1個で密度が跳ね上がって意味のない点になります。内側を打ち切り、粒子数の少ないビンは描かない、という処理が必要です。

9.4 3D 全体図 —— 形をつかむ

一次粒子が大気に入ってから地表に届くまでを1枚にした図です。軸に沿った線の太さが粒子数 $N(X)$ を表します。

  • 入射してすぐには何も起きない —— 113 km で入った陽子が最初の相互作用を起こすのは 30 km 前後。それより上はただ飛んでいるだけなので、軸が細いまま伸びます。陽子と空気の相互作用長は 50〜90 g/cm² 程度で、その深さになるのが 20〜30 km 付近だからです。
  • 膨らんでいるのが $X_{\max}$ 付近 —— 数 km の高さで一気に太くなり、地表までに萎みます。
  • 縦と横で縮尺が違う —— 図の副題に「横を ×6 誇張」のように書きます。実際の空気シャワーは、この図で見えるよりはるかに細長い形です。高さ 20 km・半径 100 m ですから、実寸で描くとほとんど1本の線になってしまいます。

9.5 いちばん大事な注意 —— 1本のシャワーで語らない

🎯 1本のシャワーは「ゆらぎの一例」でしかありません

空気シャワーの形は、一次粒子が最初にどこでぶつかったかで大きくばらつきます。 相互作用長が 50〜90 g/cm² ということは、 $X_{\max}$ そのものが1本ごとに ±50 g/cm² 程度は平気で揺れるということです。 鉄と陽子の差(約 150 g/cm²)と同じオーダーのゆらぎが、同じ陽子どうしでも起きます。

つまり 1本の図から「陽子だ」「鉄だ」と言うことはできません。 本書の実測でも 1 TeV で約 250、100 TeV で約 450 g/cm² という2点が得られていますが、 この2点から伸長率を語ることはできない——それが正しい態度です。

傾向を見るなら -N を増やすか、種を変えて何本も走らせて分布として扱ってください。 「何本走らせれば足りるか」は統計の基礎の問題です。

9章のまとめ —— 図から読むべきこと

  • 縦方向発達:山の高さ $N_{\max}$ = エネルギー、山の位置 $X_{\max}$ = 一次粒子の種類。
  • 足跡:広がりはモリエール半径で決まる。光子は広く、μ はコア付近。
  • 横方向分布:NKG で当てはめてコアとエネルギーを推定する。遠方は μ が主役。
  • 3D:形は極端に細長い。縮尺の誇張に注意。
  • そして1本は1本。物理を語るには分布が要る。
10

VS Code と開発環境

ローカル環境で、コンソールに加えて自分で解析スクリプトを書くようになったら、エディタを整えます。Windows 側に入れて、WSL の中を編集するのが定石です。

  1. 本体は Windows 版だけ

    code.visualstudio.com/download から Windows 版を入れます。WSL の中に Linux 版を入れる必要はありません。

  2. 拡張機能

    拡張ID用途
    WSLms-vscode-remote.remote-wsl手元の WSL に接続する。これが必須
    Pythonms-python.pythonPython の実行と補完
    Jupyterms-toolsai.jupyterNotebook を VS Code 内で動かす
  3. WSL に接続する

    Ubuntu のターミナルで作業ディレクトリに移動して code . と打つのが一番速いです。

    WSL の Ubuntu
    cd ~/corsika8
    code .

    初回は VS Code Server が自動で入ります。ウィンドウ左下に WSL: Ubuntu-22.04 と出れば接続成功です。

  4. Python インタプリタを venv に向ける

    Ctrl+Shift+P → Python: Select Interpreter → ~/venv/corsika8/bin/python を選択。Notebook のカーネルにも同じものを指定します。 これをやらないと corsika が import できません。

11

うまくいかないとき

症状から引いてください。よくある事故はだいたいこの表に入っています。RustDesk のリモート環境で困ったときは、自分で直そうとせずメンターに連絡してください。

表11-1 症状 → 原因 → 対処
症状原因対処
apptainer: command not foundPPA 追加後の apt-get update を飛ばした4章をやり直す
Failed to create user namespace非特権 user namespace が使えない環境sudo apt-get install -y apptainer-suid
Failed to open image / invalid SIFダウンロードが途中で切れているmd5sum が 79ad7707ef31009bb132c0e0ff2bc836 と一致するか確認。違えば wget -c で再開
10 分以上ログが止まっている(初回)--emcut を既定から変えたことによる PROPOSAL の物理テーブル生成待つ。フリーズではありません。既定カットならテーブルは同梱済みなので、そもそも止まりません
2 回目以降も毎回遅い--emcut を毎回変えている/キャッシュが書けない場所にいるカット値を固定する。ホームの書き込み権限とディスク空き容量を確認
-f を指定したのに即エラーで終わる出力先のディレクトリが既に存在する-f は非存在パスしか受け付けない。別名にするか、既存の出力を消してから流す
同じコマンドなのに毎回結果が変わる-s(乱数種)を指定していない。既定の 0 は固定種ではなく「自動=毎回ランダム」-s を明示する。過去の実行の種は出力の summary.yaml の seed: から回収できる
動作が異様に遅い、ファイル操作が重い/mnt/c/... の下で作業しているLinux 側ホーム(~/)に移す
error: externally-managed-environmentPEP 668。Ubuntu 23.04 以降でシステム Python への pip が禁止されているsudo apt-get install -y python3-venv → python3 -m venv ~/venv/corsika8
No module named 'corsika8'モジュール名の間違い。corsika8 というモジュールは存在しないfrom corsika.io import Library(または import corsika)に直す
No module named 'corsika'venv を読み込んでいない/VS Code のインタプリタが違う/ライブラリ未インストールsource ~/venv/corsika8/bin/activate。VS Code は Ctrl+Shift+P → Python: Select Interpreter。それでも出るなら 5章の pip install ./corsika-icrc2025/python をやり直す
読み出し時に RadioProcess の警告が出る--ring 0(既定)で電波観測点が無い出力を読んでいる無視してよい。電波を使うなら --ring を 1 以上にして流し直す
VS Code が WSL に繋がらないWSL 拡張が入っていないms-vscode-remote.remote-wsl を入れる(10章)
C ドライブの空きが減り続けるWSL の仮想ディスク(ext4.vhdx)は自動で縮まない不要ファイルを消してから wsl --shutdown → PowerShell で Optimize-VHD、または diskpart の compact vdisk
出力が巨大でディスクを食い潰すイベント数とエネルギーが大きい--disable-interaction-histograms で相互作用ヒストグラムを止める。--compress で固める。不要な実行はコンソールから削除する

環境ごと退避したいとき

WSL ディストリビューションは丸ごと書き出せます。PC の載せ替えや、同じ環境を後輩に配る用途に使えます。

PowerShell
wsl --export Ubuntu-22.04 D:\backup\corsika8-env.tar          # 書き出し
wsl --import Corsika8 D:\wsl\Corsika8 D:\backup\corsika8-env.tar  # 別マシンへ取り込み

--import した環境は既定ユーザーが root になります。 wsl -d Corsika8 -u <ユーザー名> で切り替えるか、/etc/wsl.conf に既定ユーザーを書いてください。

ローカル環境ができたあと、毎回使うのはこれだけ

WSL の Ubuntu
# 1. コンソールを起動する(ふだんはこれだけ)
cd ~/corsika8/corsika-simulation-console && python3 server.py
#    → Windows のブラウザで http://localhost:8765 を開く

# 2. コンソールを最新にする
cd ~/corsika8/corsika-simulation-console && git pull
12

記録と引用

あとから自分(と他人)が再現できるように。ここを怠ると、半年後に同じ図が作れなくなります。

🧾 シミュレーション結果は「実験データ」と同じ扱いをする

実際に測定したデータに測定条件を書くのと同じで、シミュレーション結果にも 「どのコードの、どのバージョンを、どの設定で走らせたか」が付いていなければ意味を持ちません。 とくに CORSIKA 8 は beta 段階で、バージョンによって結果が変わりうる状況です。 研究倫理の観点でも、再現できない結果は主張できません。

実験ノートに残しておく項目

項目今回の値 / 取得方法
コンテナのファイル名corsika8-icrc2025.sif
コンテナの MD579ad7707ef31009bb132c0e0ff2bc836
バージョン / DOIicrc2025-beta2 / 10.5281/zenodo.18195386
実行したコマンド全文出力の config.yaml の args: にそのまま残っているので、それを保存するのが確実
乱数種出力の summary.yaml の seed: を見ること。-s を省略すると 0 ではなく毎回ランダムな値が使われるので、コマンドを見ても分からない
ハドロン相互作用モデル既定なら SIBYLL-2.3d。-M で変えたなら明記。-T の遷移エネルギーも一緒に
カット値--emcut / --hadcut / --mucut。既定から変えたものだけでよい
間引きの設定--emthin / --max-weight。使ったなら必ず。解析側で重みを掛けたことも書く
固定されている条件大気モデル・地磁気・プロファイルのビン幅(8章)。コマンドに出ないので明示的に書く
本数-N。1本なのか100本なのかで、主張できることが変わる

論文・発表で引用するもの

  • CORSIKA 8 本体 —— J. M. Alameddine et al., Astropart. Phys. 182 (2026) 103265(arXiv:2604.01850)
  • フレームワークの設計 —— R. Engel et al., Comput. Softw. Big Sci. 3 (2019) 2
  • 電波放射を使ったなら —— J. M. Alameddine et al., Astropart. Phys. 166 (2025) 103072
  • 使ったコンテナそのもの —— Zenodo の DOI(10.5281/zenodo.18195386)
  • 使った物理モデル —— SIBYLL / EPOS-LHC / QGSJet / FLUKA / PROPOSAL それぞれの原論文(参考文献)

CORSIKA 8 は BSD 3-Clause ライセンスで公開されています。KIT が調整する community effort として開発されているので、 使ったモデルについても、それぞれの原論文の引用が必要かどうか確認してください。

この講座の記述をどこまで信じてよいか

本文中の数値・オプション・出力構成は、次のとおり実機で確認したものです(2026-09-04、WSL2 / Ubuntu、Apptainer 1.5.3)。 それでも「手元の --help が正」であることは変わりません。

表12-1 記述の出どころ
記述出典
コンテナの配布・ファイル名・サイズ・MD5・DOIZenodo record 18195386(icrc2025-beta2, 2026-04-01)
c8_air_shower のオプション一覧と既定値配布 corsika8-icrc2025.sif の --help 実出力(2026-09-04 取得)
間引き・電波・相互作用モデルの設計意図と推奨値CORSIKA 8 公式ドキュメント Thinning / Radio Emission / Interaction Models
出力ディレクトリの構成と Python APIOutput / python/README.md
Apptainer の導入手順Apptainer Admin Guide — Installation
FLUKA 2025.1.3・Pythia 8.315・TAUOLA 1.1.8・PROPOSAL テーブルの同梱配布 .sif の中身を apptainer exec で確認(2026-09-04)
実行時間(1 TeV 陽子 約14秒/100 TeV 陽子 39分25秒)と $X_{\max}$ の実測値本講座の実行環境での実測。1本ずつの値なのでゆらぎを含みます(9.5)

未検証:--emcut を既定から変えた場合に PROPOSAL のテーブル生成がどこに書かれるかは確認していません。

13

一次資料・参考文献

迷ったら、まずここに挙げた一次資料に戻ってください。 この講座の記述はすべて、以下のいずれか(または手元の実機確認)に由来します。

CORSIKA 8 Simulation Console — 5・6章で使うコンソール 加速キッチンが公開しているローカル用の Web コンソール。git clone して python3 server.py で起動します。必要なもの・既定のパス・環境変数は README にまとまっています。ライセンスは未定です。 github.com/accel-kitchen/corsika-simulation-console CORSIKA 8 公式ドキュメント(最優先の一次資料) 物理モジュール(相互作用モデル・電磁カスケード・電波・間引き)、出力形式、Python ライブラリ、フレームワーク設計まで。ただし main ブランチ基準なので、配布 beta 版と差があります。 corsika-8.readthedocs.io Zenodo record 18195386 — 配布コンテナそのもの corsika8-icrc2025.sif(2.5 GB)と同じリリースのソース corsika-icrc2025.tar.gz。MD5 と DOI もここに。引用すべきはこの DOI です。 DOI 10.5281/zenodo.18195386 GitLab — CORSIKA 8 本体リポジトリ ソース・Issue・Wiki・Releases。applications/c8_air_shower.cpp を読むと、コマンドラインから触れない固定条件(大気モデル・地磁気)が何かも確かめられます。アカウント登録なしで閲覧できます。 gitlab.iap.kit.edu/AirShowerPhysics/corsika KIT — CORSIKA 公式ページ CORSIKA 7 と 8 の位置づけ、引用すべき文献の一覧、ライセンス。CORSIKA 7 のマニュアル(いまも現役の実験が多数)もここから。 iap.kit.edu/corsika/
  1. CORSIKA 8 本体: J. M. Alameddine et al., “CORSIKA 8: A General Framework for Particle Cascade Simulations”, Astropart. Phys. 182 (2026) 103265. arXiv:2604.01850/設計思想は R. Engel et al., Comput. Softw. Big Sci. 3 (2019) 2. doi:10.1007/s41781-018-0013-0
  2. 配布コンテナ: CORSIKA 8 Collaboration, CORSIKA 8, version icrc2025-beta2, Zenodo (2026). doi:10.5281/zenodo.18195386
  3. Heitler–Matthews モデル($X_{\max}$・ミューオン数・重ね合わせ): J. Matthews, “A Heitler model of extensive air showers”, Astropart. Phys. 22 (2005) 387. doi:10.1016/j.astropartphys.2004.09.003
  4. 宇宙線スペクトルの指数・組成・地表フラックス: Particle Data Group, Review of Particle Physics — “Cosmic Rays” レビュー。pdg.lbl.gov
  5. ミューオン超過問題: J. Albrecht et al., “The Muon Puzzle in cosmic-ray induced air showers and its connection to the Large Hadron Collider”, Astrophys. Space Sci. 367 (2022) 27. doi:10.1007/s10509-022-04054-5
  6. 間引き(thinning)の原論文: A. M. Hillas, Proc. 17th ICRC (Paris) 8 (1981) 193.
  7. 最適重み: M. Kobal (Pierre Auger Collab.), “A thinning method using weight limitation for air-shower simulations”, Astropart. Phys. 15 (2001) 259. doi:10.1016/S0927-6505(00)00158-4
  8. 縦方向発達の当てはめ関数: T. K. Gaisser & A. M. Hillas, Proc. 15th ICRC (Plovdiv) 8 (1977) 353.
  9. 横方向分布(NKG): K. Kamata & J. Nishimura, Prog. Theor. Phys. Suppl. 6 (1958) 93;K. Greisen, Ann. Rev. Nucl. Sci. 10 (1960) 63.
  10. ハドロン相互作用モデル: SIBYLL 2.3d — F. Riehn et al., Phys. Rev. D 102 (2020) 063002 doi/QGSJET-II-04 — S. Ostapchenko, Phys. Rev. D 83 (2011) 014018 doi/EPOS-LHC — T. Pierog et al., Phys. Rev. C 92 (2015) 034906 doi/Pythia 8 — pythia.org
  11. 低エネルギー側と輸送: FLUKA — fluka.cern/PROPOSAL(電磁カスケードと高エネルギーレプトン輸送) — J.-H. Koehne et al., Comput. Phys. Commun. 184 (2013) 2070 doi
  12. 電波放射: J. M. Alameddine et al., “Simulating radio emission from particle cascades with CORSIKA 8”, Astropart. Phys. 166 (2025) 103072 doi/端点法 — C. W. James et al., Phys. Rev. E 84 (2011) 056602/ZHS — E. Zas, F. Halzen, T. Stanev, Phys. Rev. D 45 (1992) 362.
  13. 実行基盤: Apptainer User Guide/Admin Guide — Installation/GitHub Releases
  14. WSL2: Microsoft — WSL ドキュメント(.wslconfig の設定項目・ポート転送・--export/--import)
  15. 5・6章のコンソール: 加速キッチン, CORSIKA 8 Simulation Console, GitHub. github.com/accel-kitchen/corsika-simulation-console(最終参照 2026-09-09)