ROOT でお遊びしてみました。
自分用メモです。
ROOT とは
CERN が開発している C++ ライブラリ群で、高エネルギー物理業界では標準的に用いられています。
その機能は実に膨大で、その上だれでも無料でインストールすることができます *1。
ただ、私自身 ROOT に全然明るくないので、ROOT を知らないよという方は
などを参照してください。ごめんなさい。
この記事では私が手探り状態で書いたコードとその出力を置いておきます。
後に私の勉強が進み、かつその気になれば ROOT 関連の更なる記事を書いていきたいとは思いますが、CERN の公式マニュアルを読めば (多分) 大抵何とかなるのでまぁまずそんな未来はないでしょう。
書いたもの
に対して のグラフを重ねて描くだけのコードです。
なんでこんな関数のグラフをこんな強力な ROOT を用いてまでして描こうとしたのかには深ぁい訳があるんです。
( X 線回折のラウエによる議論の中でこんな感じの関数が出てくるのですが、それについてはいつか気が向いたときに話そうと思います。 )
以下にコードを示しますが、これは ROOT がないとコンパイルできないので念のためそこだけ注意願います。
using namespace TMath; // TMath::Pi(), TMath::Abs() void graph() { gROOT -> Reset(); TCanvas *c1 = new TCanvas("name", "title", 0, 0, 900, 700); TLegend *leg = new TLegend(0.78, 0.65, 0.89, 0.85); Int_t n = 5000; // required n >= 2 Double_t N[3] = {20.0, 10.0, 5.0}; Double_t x[3][n], y[3][n]; Double_t a = -3, b = 3; // plot n points from a to b c1 -> SetGrid(); // grid of x, y axes for(Int_t i = 0; i < 3; i++) { for(Int_t j = 0; j < n; j++) { x[i][j] = a + (b - a) * j / (n - 1); y[i][j] = Abs( sin(N[i] * Pi() * x[i][j]) / sin(Pi() * x[i][j]) ); } TGraph *g = new TGraph(n, x[i], y[i]); g -> SetTitle("y = |sin(N pi x)/sin(pi x)|; x; y"); g -> GetXaxis() -> SetLimits(a, b); // min x, max x g -> SetMaximum(22); // max y g -> SetMinimum(0); // min y g -> SetLineWidth(2); switch (i) { case 0: g -> SetLineColor(6); // purple g -> Draw("AC"); break; case 1: g -> SetLineColor(4); // blue g -> Draw("C"); break; case 2: g -> SetLineColor(2); // red g -> Draw("C"); } leg -> AddEntry(g, Form( " N = %2.0f", N[i] )); leg -> SetBorderSize(1); } leg -> Draw(); // c1 -> Print("graph.pdf"); }
あぁ^~グラフがぴょんぴょんするんじゃぁ^~
備忘録
以下 クッソ汚ねぇ コードの クッソ汚ねぇ 説明です。
-
using namespace TMath;
-
gROOT -> Reset();
-
TCanvas *c1 = new TCanvas("name", "title", 0, 0, 900, 700);
-
TLegend *leg = new TLegend(0.78, 0.65, 0.89, 0.85);
-
Int_t n = 5000;
-
Double_t N[3] = {20.0, 10.0, 5.0};
-
Double_t x[3][n], y[3][n];
-
Double_t a = -3, b = 3;
-
c1 -> SetGrid();
-
x[i][j] = a + (b - a) * j / (n - 1);
-
y[i][j] = Abs( sin(N[i] * Pi() * x[i][j]) / sin(Pi() * x[i][j]) );
-
TGraph *g = new TGraph(n, x[i], y[i]);
- ここから数行でグラフのタイトル, 描画領域, 線の太さを設定しています。
-
switch
文について g -> SetLineColor(~);
円周率 Pi()
や絶対値 Abs()
が名前空間 TMath
上にあるっぽい。
よくわかりません。ごめんなさい。
キャンバスを用意するにはこう書くらしいです。1, 2 つめの引数は正直分かりませんが、そこから先は左下と右上の座標を にしろと言っています。
TLegend
クラスでグラフの凡例を用意します。引数が意味不明ですが後で説明します *2。
プロットする点の個数。今回は 個にしました。
パラメーター の配列。 がでかいほどグラフがぐちゃぐちゃになって見づらいので先に描いておきたい。だから降順。
プロットする点の 座標。本当は x
を 2 次元にする意味はないんだけど、面倒なので y
に合わせた。これはよくない。
グラフの定義域。今回は から までの 点をプロットする戦略です。
これでグラフにグリッドを敷ける。
ここだけちょっと算数。閉区間 を 等分するとき、両端と分点の 座標はどうあらわされるか。 です。Python や MATLAB みたいに「ここからここまで、~点の配列」を取れる仕様があればこんなこと考えなくてもいいんだけどね。まぁ ROOT にもあるのかもしれないけど。あと上でも言ったけど 座標は の値に関係ないから 2次元配列にする意味もない。これはよくない。
直前で得た の配列を当初の関数に入れているだけです。ROOT では円周率 Pi()
と絶対値 Abs()
は名前空間 TMath
に定義されているみたいです。便利。
グラフの作成。TGraph
クラスを使います。引数は順に、点の個数 , 座標, 座標。
ここで の値によって線の色と描画オプションを分岐させています。
線の色です。 ~
の数値で色が変わります。
ただ、数値だと訳が分からないから ROOT に列挙型として EColor
が次のように定義されているらしい。
enum EColor { kWhite =0, kBlack =1, kGray=920, kRed =632, kGreen =416, kBlue=600, kYellow=400, kMagenta=616, kCyan=432, kOrange=800, kSpring=820, kTeal=840, kAzure =860, kViolet =880, kPink=900 };
なので、例えば g -> SetLineColor(KRed)
と書けば赤色になってくれる。特に新たに #include
する必要もなし。
g -> Draw("~");
グラフ描画。オプションについて、このページ に書いてあるのをコピペしておくと
"AH"
: 軸を表示しない"E"
:エラーバーを表示"C"
:滑らかな線で結ぶ"L"
:折れ線グラフで表示"P"
:点をプロットする
ただ、どこかの記事に、1回目は "AC"
にしておいて、2回目以降は "A"
を付けない方が良いと書いてあった気がするのでそれに従った。どこのサイトだっけ。
leg -> AddEntry(g, Form( " N = %2.0f", N[i] ));
これで凡例を追加できる。Form()
を使うことで の値によって表示を変えることができる。
leg -> SetBorderSize(1);
凡例の枠線の太さ。 leg -> SetBorderSize(0);
にすると線がなくなる。
leg -> Draw();
凡例を描画。
c1 -> Print("graph.pdf");
pdf として保存したいなら Print()
を使う。
感想等
ここまで結構苦労してしまいましたが何とか ROOT でグラフを描けて感無量です。
これからもっと ROOT ちゃんと戯れていきたいです。
参考にしたサイト達
すべてを挙げることはできませんが、今回のコードを書くにあたり大いに活用させて頂いたサイトを以下に列挙しておきます。
ありがとうございました。そしてこれからもよろしくお願いします。
- 高エネルギー宇宙物理学のための ROOT 入門 第1回
- GitHub - akira-okumura/RHEA: 高エネルギー宇宙物理学のための ROOT 入門 – ROOT for High-Energy Astrophysics (RHEA)
- ROOT: analyzing petabytes of data, scientifically. - ROOT
- https://www-he.scphys.kyoto-u.ac.jp/member/n.kamo/wiki/doku.php?id=study:software:root:main
- https://www-he.scphys.kyoto-u.ac.jp/member/n.kamo/wiki/doku.php?id=study:software:root:graphic
- 見栄えを整える--ROOT
- TLegendの使い方(注釈) | 覚え書きブログ