= ROOT演習2022 = <> == ROOTとは == [[https://root.cern.ch/|ROOT]]というのは素粒子、原子核、宇宙物理等の分野でよく使われるデータ解析と描画のためのソフトウェアである。C++言語で書かれていて、提供されるライブラリを自分で書いたC++プログラムの一部として利用することができる。また、コマンドラインでライブラリに実装された機能を直接利用することもできる。データをどのように描画できるかは[[https://root.cern/gallery/|ギャラリ]]で見るとよい。 == ヒストグラムとグラフ == == 大規模データを扱う(TTree) == 素粒子の実験では、粒子散乱のデータ(散乱事象)を多数記録して、それらを基にいろいろな分布を作って、理論的に予言される分布と比較することが多い。散乱事象というミクロなスケールで起こっている現象を一つ一つ積み重ねて、マクロな観測量に対応させる訳である。ROOTでは、このような構造のデータを扱うのに便利なTTreeという機能が提供されている。データ全体の中に多数の事象が含まれていて、それぞれの事象には散乱前後の粒子の情報が複数あって、各粒子の情報というのは、エネルギー・運動量・スピン・電荷等から構成されている。このように大きなデータが枝分かれして小さなデータに分解されるようなものを計算機科学の用語で木構造という。TTreeではこのような木構造になったデータを効率的に扱えるようになっている。 == 演習 == === 演習1: C++マクロを実行する === abc.Cという名前のテキストファイルを作成して、以下の内容を記述する。(ファイル名は何でもよいが、ファイルの中の関数名と同じにする必要がある。) {{{ #include int abc() { std::cout << "Executing the function abc()" << std::endl; return 0; } }}} ターミナルでROOTを起動して、ROOTのプロンプトが表示されたら{{{.x abc.C}}}と入力する。 {{{ % root root [0] .x abc.C root [1] std::cout << "Print abc from interactive ROOT" << std::endl; }}} これで、ファイルに記述されたabc()というC++関数が実行されたことが分かる。このファイルのように、ROOTから直接呼び出せるC++コードを記述したファイルのことをマクロと呼ぶ。 ROOTを対話的に起動したときには、上の例のようにファイルに記述したC++コード(マクロ)の関数を呼び出して実行することもできるし、C++のコードを直接入力・実行することもできる。 指定したマクロを呼び出すには、上の例のように行の先頭に{{{.x}}}のようなROOT独自のコマンドを指定して実行する。ROOT独自のコマンドとして以下のものはよく使用する。 || '''コマンド''' || '''機能''' || || .q || 対話的なROOTセッションを終了する || || .x || 指定したファイル名のマクロを実行する || || .L || 指定したファイル名のマクロを読み込む(ROOTの機能の一部として組み込む) || || .ls || 現在のROOTフォルダの内容を表示する || || .? || ヘルプ || マクロを簡単にC++の関数を実行する仕組みとして利用することもできる。main関数を書いたり、コンパイルしたりする必要がなく、ROOTのインタプリタがコードを1行ずつ読み込んで解釈して順番に実行してくれる。 演習:自分で好きな計算をするマクロを書いて実行する。 === 演習2: 有限個のデータを生成してヒストグラムを作成する === ヒストグラムとは、ある範囲を有限個の区間に分割して、それぞれの区間に含まれるものの数を表すものである。ヒストグラムの各区間のことをビンとも呼ぶ。 * 大勢の人の身長の分布: 範囲[100, 200] cmを100分割(各区間の幅は1 cm)して、身長が[100, 101), [101, 102), ..., [199, 200)の区間に入る人の数 * ある人が一日に歩いた歩数: 予め決めた範囲より下(上)に含まれるものをアンダーフロー(オーバーフロー)という。 1~6の整数値を取る一様乱数を10000回生成して、それぞれの数が出る回数の分布を作る。(ファイル名:makeHist.C) {{{ #include "TH1.h" #include "TRandom3.h" void makeHist() { const int nbins = 6; unsigned int seed = 12345678; TH1* hist = new TH1F("hist", "", nbins, 0.5, 6.5); TRandom3 random(seed); for (int i=0; i(random.Uniform(0.0, 6.0)); hist->Fill(number); } hist->SetMinimum(0.0); hist->Draw(); } }}} ROOTを起動して、以下のコマンドを実行する。 {{{ root [0] .x makeHist.C }}} === 演習3: ヒストグラムを関数でフィットする === 演習3-1: * 平均0、標準偏差sigmaのガウス分布に従う乱数を10000回生成して、その値をヒストグラムに詰めて分布を描く。 * そのヒストグラムをガウス分布でフィットする。(hist->Fit("gaus")でできる) 演習3-2: * 好きな1変数関数y=f(x)を一つ決めて、ヒストグラムの各ビンにおける値(度数)がビンの中心の値xに対してf(x)となるようなヒストグラムを作る。 * このとき、y軸の値をf(x)から少しずらすために、平均0、標準偏差sigmaのガウス分布に従う乱数dyを生成して、各ビンの値をf(x)+dyとする。] * ヒストグラムに値を一つ一つ詰めるのではなく、各ビンの値を強制的に設定したい場合はTH1::SetBinContent(i)で設定できる。 * あるxが属するビンを探すためには、Int_t TH1::FindBin(Double_t x)を使用できる。これはビン番号(1...N)を返す。0, N+1はアンダーフローとオーバーフローのビンに対応する。 * 作成したヒストグラムを関数f(x)でフィットする。 === 演習4: 2次元データを散布図で表示する === TGraph, TGraphErrors, TGraphAsymmErrorsを使う。 === 演習5: 木構造データを生成してTTreeを使う === 既にあるTTreeを使ってみる。演習6~10で使うデータ。 === 演習6: 直線状を運動する多数の粒子の振る舞い(1) === * 1次元の粒子の運動と衝突前後のエネルギーと運動量の変化を計算する。 * 各時刻の粒子の状態を指定する方法を考える。物理過程を計算、計算結果をファイルに保存、保存されたデータを解析するために、どのようなデータを保存するべきか。 * TTreeにデータを保存する。 === 演習7: 直線状を運動する多数の粒子の振る舞い(2) === 剛体球の場合 === 演習8: 直線状を運動する多数の粒子の振る舞い(3) === 粒子間にポテンシャルが働く場合 === 演習9: 直線状を運動する多数の粒子の振る舞い(4) ===