物理学者(ポスドク)による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)
【ROOT6】symbol lookup error: /lib64/libAfterImage.so.0: undefined symbol: エラー解決メモ
2019.08.07 Wed 05:02 | ROOT
2019.08.07 Wed 05:02 | ROOT
ROOTを使ったプログラムをコンパイルして実行してたら、
symbol lookup error: /lib64/libAfterImage.so.0: undefined symbol:
ってエラーが出だした
計算機のライブラリが新しくなったせいっぽい
解決策は -lpng ってコンパイル時につければいいだけっぽい
■ 参考 : libpngを正しくインストールするにはどうすればいいですか?
こういうときは一応lddコマンドを使って問題点を切り分けるのがセオリー
PR
1行のデータを読み込む方法は「猿でもわかるROOT」に書いてあった
この例はヒストグラムを作る方法だけど、自分が本当にやりたいのはTGraphでグラフを書くこと
今は#include <fstream>らしい
で、これを複数行のデータに置き換えたい
■ 参考 : Reading in data in columns from a file (C++)
ただ、このままコードを書いて実行すると、なぜか最後の行に空の行が追加されてしまい
配列が1つ多くなってしまった
それを手で消すような処理をしてもよかったけどなんか気持ち悪いので他の方法を探した
結局動かすのはROOTのうえなので、ROOTの機能でそんなのがないかどうか調べてみた
■ 参考 : 4.1 Read Graph Points from File
自分が必要だったのはまさにこれ
データのフォーマットに合わせて"%lg %lg"の部分は置き換える
3行なら%lgを増やす
(2019/03/28 追記)
読み込んだデータのサンプル点数をする方法は、
(2019/04/01 追記)
データの値を見たいときは
また、データを直接いじりたいときはGetXなどを使って取ってくる
もしこの読み込んだデータのy座標のデータを100倍したい場合は、
■ 参考 : TGraph and Scale()?
■ 複数のTGraphのデータをプロットしたいときはTMultiGraphを使う
最後のBuildLegend()はなくてもいい
もしつけたら、自動的にlegendを作成してくれる
legendに一覧される名前は
graph1->SetTitle("Graph legend1");
graph2->SetTitle("Graph legend2");
みたいにして付ける
■ 参考 : Multigraph legends
ツイート
この例はヒストグラムを作る方法だけど、自分が本当にやりたいのはTGraphでグラフを書くこと
#include <fstream>
TH1S h1(”name”, ”title”, 150, -10, 20);
ifstream data(”filename.dat”);
double x;
while (data >> x) h1.Fill(x);
data.close();
#include <fstream.h>という書き方は古いらしくてエラーが出たTH1S h1(”name”, ”title”, 150, -10, 20);
ifstream data(”filename.dat”);
double x;
while (data >> x) h1.Fill(x);
data.close();
今は#include <fstream>らしい
で、これを複数行のデータに置き換えたい
■ 参考 : Reading in data in columns from a file (C++)
double cola, colb, colc;
ifstream in(file);
while(!in.eof()){
in >> cola;
in >> colb;
in >> colc;
}
みたいにして、やると複数行読み込めるらしいifstream in(file);
while(!in.eof()){
in >> cola;
in >> colb;
in >> colc;
}
ただ、このままコードを書いて実行すると、なぜか最後の行に空の行が追加されてしまい
配列が1つ多くなってしまった
それを手で消すような処理をしてもよかったけどなんか気持ち悪いので他の方法を探した
結局動かすのはROOTのうえなので、ROOTの機能でそんなのがないかどうか調べてみた
■ 参考 : 4.1 Read Graph Points from File
自分が必要だったのはまさにこれ
データのフォーマットに合わせて"%lg %lg"の部分は置き換える
3行なら%lgを増やす
TGraphErrors *graph = new TGraphErrors("hoge.txt", "%lg %lg");
graph->SetMarkerStyle(kCircle);
graph->SetMarkerColor(2);
graph->SetTitle("simulation data dayo");
graph->GetXaxis()->SetTitle("Xaxis-no-label");
graph->GetYaxis()->SetTitle("Yaxis-no-label");
graph->Draw("AP");
c1->Print("hoge.png");
graph->SetMarkerStyle(kCircle);
graph->SetMarkerColor(2);
graph->SetTitle("simulation data dayo");
graph->GetXaxis()->SetTitle("Xaxis-no-label");
graph->GetYaxis()->SetTitle("Yaxis-no-label");
graph->Draw("AP");
c1->Print("hoge.png");
(2019/03/28 追記)
読み込んだデータのサンプル点数をする方法は、
graph->GetN()
(2019/04/01 追記)
データの値を見たいときは
graph->Print()
で画面に出力できるまた、データを直接いじりたいときはGetXなどを使って取ってくる
for(int index = 0;index < double >GetN();index++){
double x = graph->GetX()[index];
double xerr = graph->GetErrorX(index);
double y = graph->GetY()[index];
double yerr = graph->GetErrorY(index);
}
■ 参考 : TGraphErrorsを使いこなすdouble x = graph->GetX()[index];
double xerr = graph->GetErrorX(index);
double y = graph->GetY()[index];
double yerr = graph->GetErrorY(index);
}
もしこの読み込んだデータのy座標のデータを100倍したい場合は、
for (int i=0; i>graph->GetN();i++) graph>GetY()[i] *= 100;
■ 参考 : TGraph and Scale()?
■ 複数のTGraphのデータをプロットしたいときはTMultiGraphを使う
TMultiGraph *mg = new TMultiGraph();
mg->Add(graph1);
mg->Add(graph2);
mg->Draw("LP");
c1->BuildLegend();
mg->Add(graph1);
mg->Add(graph2);
mg->Draw("LP");
c1->BuildLegend();
最後のBuildLegend()はなくてもいい
もしつけたら、自動的にlegendを作成してくれる
legendに一覧される名前は
graph1->SetTitle("Graph legend1");
graph2->SetTitle("Graph legend2");
みたいにして付ける
■ 参考 : Multigraph legends
gStyle->SetPalette(1);
1の部分の数字を変えることで、他の色に変更できるROOT v6からデフォルトの色が淡い色に変更になった
2015年の記事なので、少し古いけど例
この通りにやってみたけど、この図はできなかった・・・
たぶんなんか仕様が変わったんだと思う
■ 参考 : ROOTのColor Paletteはどれを使うのがよいのか
TH1D *h2 = new TH1D("hoge","", nbin, min, max);
h2->SetName("NameNamaName");
h2->SetTitle("TitleTitleTitle");
h2->SetName("NameNamaName");
h2->SetTitle("TitleTitleTitle");
ヒストグラムを作るときに、hogeと書いてしまったところをあとで書き換えるには、
SetNameを使う
また、左上に箱を用意して何か書く場合はsetTitleを使う
■ 参考 : ヒストグラムを規格化(Scale)して、さらにエラーバーをつけたい
やりたいことはすべて上記(神)ページに書かれていたので、そちらを参考にどうぞ
一つ詰まった箇所としては、ヒストグラムを2つ書かないといけないこと
一番下にあるサンプルコードを見れば一目瞭然だが次のような手順になる
1. データをヒストグラムに詰める
2. ヒストグラムh1をコピーしてh1eを作る
3. scaleする(h1とh1eを両方個別にしないといけない)
4. h1->Draw(); h1e->Draw("same e1");
エラーバーは何種類かあるので、それも先ほどのページにまとめられている
エラーバーはそのbinのサンプル数がNだとすると\sqrt{N}
検索したら、まずGetCumulativeという関数が見つかった
■ 参考 : TH1 Class Reference
けど使い方がよくわからん・・・(アフォですいません・・・)
とりあえず次のサンプルコードを見つけたので動かしてみる
■ 参考 : cumulative.C: illustrate use of the TH1::GetCumulative method
しかし「GetCumulativeという関数が見つからない」というエラーで動かない・・・
試しに /usr/local/root/include/TH1.h を見てみると、確かにGetCumulativeという関数がない・・・・
たぶん、この関数がroot v6.0以降で追加されたので、
自分が使ってるroot v5.34にはないんだろう・・・(ダメじゃん)
しょうがないので今回は次のように、手でbinの中身を数え上げるコードで対応する・・・
(最初にこれを思いついたけど、ROOTならさぞ素晴らしい関数があると思って調べてみたかったんだよ・・・ いや、あったけど・・・・)
TH1D *cdf = new TH1D("cdf","", nbin, min*0.99, max*1.01);
int total = 0;
for (int i=nbin-1;i>0;i--){
total += h1->GetBinContent(i);
for (int k=0;k<total;k++){
cdf->AddBinContent(i);
}
}
int total = 0;
for (int i=nbin-1;i>0;i--){
total += h1->GetBinContent(i);
for (int k=0;k<total;k++){
cdf->AddBinContent(i);
}
}
普通の累積分布は左から足していくようなものらしい(参考リンクにある方法)
今は右端の領域に興味があったので左から足していく累積分布にんなってるので注意・・・
■ 参考 : Re: [ROOT] Cumulative histogram
TH1D *h1 = new TH1D("histogram","", nbin, min*0.99, max*1.01);
h1->SetLineColor(2);
h1->SetLineWidth(2);
h1->GetXaxis()->SetLabelSize(0.08);
h1->GetYaxis()->SetLabelSize(0.08);
みたいな感じらしいh1->SetLineColor(2);
h1->SetLineWidth(2);
h1->GetXaxis()->SetLabelSize(0.08);
h1->GetYaxis()->SetLabelSize(0.08);
GetXaxis()という関数を間に挟まないと、x軸だけに設定が反映されてy軸はそのままなので注意
■ 参考 : ROOTは軸をdatetime表記に簡単に出来てとっても便利!、、、、、え?
図があるので、対応関係が見やすい!
■ 参考 : TGaxis Class Reference - Basic definition
なんかデフォルトのサイズがあまりに小さいので
できればこの0.08をデフォルトに置き換えたいまである
デフォルトの設定をいじるにはどうすればいいか調べたら以下の記事を見つけた
■ 参考 : ROOT ~環境設定~
$ROOTSYS/macros/rootlogon.C ってファイルはなかったわ・・・
2007年の記事なので、設定が変わったんだろう
たぶん ~/.rootなんとか を作ればいいっぽいけど、今回はいいや・・・
ROOTでヒストグラムを書いてfitしたときに色々と調整したのでメモ・・・・
ヒストグラムの線の太さを調整するときは、
TH1D h1("","", 40, min*0.99, max*1.01);
h1->SetLineWidth(6);
■ 参考リンク : [ROOT] Histogram line and legend line width.h1->SetLineWidth(6);
書いたヒストグラムをfittingして、そのfittingの線の色と太さを変更したいときは
TF1 f1("f1","TMath::Power(x, [0]/2.0-1) * exp(-x/2.0) / TMath::Power(2.0, [0]/2.0) / TMath::Gamma([0]/2.0) * [1] + [2]");
f1.SetParameters(max/2, 8000);
f1->SetLineColor(2);
f1->SetLineWidth(2);
h1.Fit("f1");
f1.SetParameters(max/2, 8000);
f1->SetLineColor(2);
f1->SetLineWidth(2);
h1.Fit("f1");
■ 参考リンク : [ROOT] Fit
ここにまとめられている↓
namespace ROOT::Math
gaussianのcdfが知りたい場合は、
double ROOT::Math::normal_cdf_c (double x, double sigma=1, double x0=0)
Complement of the cumulative distribution function of the normal (Gaussian) distribution (upper tail).
double ROOT::Math::normal_cdf (double x, double sigma=1, double x0=0)
Cumulative distribution function of the normal (Gaussian) distribution (lower tail).
Complement of the cumulative distribution function of the normal (Gaussian) distribution (upper tail).
double ROOT::Math::normal_cdf (double x, double sigma=1, double x0=0)
Cumulative distribution function of the normal (Gaussian) distribution (lower tail).
正の無限大からxまでと、負の無限大からxまでの2種類用意されている
xは下限値(上限値)
sigmaは正規分布の標準偏差
x0は正規分布の平均値
(一応ソースコードで確認)
gnuplot版は1つ前の記事を参照↓
【gnuplot】ガンベル分布の書き方
void root_gumble(){
gROOT->Reset();
TCanvas *c1 = new TCanvas("name", "title", 0, 0, 1080, 720);
c1->SetGridx();
c1->SetGridy();
Double_t xmin = -5.0;
Double_t xmax = 20.0;
TF1 *f1 = new TF1("f1", pdfgumble, xmin,xmax, 4);// xmin, xmax, number of parameter
f1->SetParameters(1, 2, 1, 0.0);
f1->SetNpx(500);
f1->SetLineColor(1);
f1->Draw("L");
TF1 *f2 = new TF1("f2", pdfgumble, xmin,xmax, 4); // xmin, xmax, number of parameter
f2->SetParameters(0.5, 2.0, 1, 0);
f2->SetNpx(500);
f2->SetLineColor(2);
f2->Draw("Same");
TF1 *f3 = new TF1("f3", pdfgumble, xmin,xmax, 4); // xmin, xmax, number of parameter
f3->SetParameters(1.5, 3.0, 1, 0);
f3->SetNpx(500);
f3->SetLineColor(3);
f3->Draw("Same");
TF1 *f4 = new TF1("f4", pdfgumble, xmin,xmax, 4); // xmin, xmax, number of parameter
f4->SetParameters(3.0, 4.0, 1, 0);
f4->SetNpx(500);
f4->SetLineColor(4);
f4->Draw("Same");
TF1 *f5 = new TF1("f5", pdfgumble, xmin,xmax, 4); // xmin, xmax, number of parameter
f5->SetParameters(3.0, 6.0, 1, 0);
f5->SetNpx(500);
f5->SetLineColor(6);
f5->Draw("Same");
// set TLegend
leg = new TLegend(0.6, 0.7, 0.9, 0.89, "Legend");
//leg->SetFillStyle(0); // or leg->SetFillColor(0); // white paint
leg->SetFillColor(0);
leg->SetTextSize(0.04);
leg->AddEntry(f1, "a=0.5, b=2.0", "l");
leg->AddEntry(f2, "a=1.0, b=2.0", "l");
leg->AddEntry(f3, "a=1.5, b=3.0", "l");
leg->AddEntry(f4, "a=3.0, b=4.0", "l");
leg->AddEntry(f5, "a=3.0, b=6.0", "l");
leg->Draw();
f1->SetTitle("pdf of Gumble distribution");
c1->Print("root_gumble_op.pdf");
}
//definition of myfunc
Double_t pdfgumble (Double_t *x, Double_t *para){
return para[2]/para[1]*exp(-(x[0]-para[0])/para[1])*exp(-exp(-(x[0]-para[0])/para[1])) + para[3];
}
gROOT->Reset();
TCanvas *c1 = new TCanvas("name", "title", 0, 0, 1080, 720);
c1->SetGridx();
c1->SetGridy();
Double_t xmin = -5.0;
Double_t xmax = 20.0;
TF1 *f1 = new TF1("f1", pdfgumble, xmin,xmax, 4);// xmin, xmax, number of parameter
f1->SetParameters(1, 2, 1, 0.0);
f1->SetNpx(500);
f1->SetLineColor(1);
f1->Draw("L");
TF1 *f2 = new TF1("f2", pdfgumble, xmin,xmax, 4); // xmin, xmax, number of parameter
f2->SetParameters(0.5, 2.0, 1, 0);
f2->SetNpx(500);
f2->SetLineColor(2);
f2->Draw("Same");
TF1 *f3 = new TF1("f3", pdfgumble, xmin,xmax, 4); // xmin, xmax, number of parameter
f3->SetParameters(1.5, 3.0, 1, 0);
f3->SetNpx(500);
f3->SetLineColor(3);
f3->Draw("Same");
TF1 *f4 = new TF1("f4", pdfgumble, xmin,xmax, 4); // xmin, xmax, number of parameter
f4->SetParameters(3.0, 4.0, 1, 0);
f4->SetNpx(500);
f4->SetLineColor(4);
f4->Draw("Same");
TF1 *f5 = new TF1("f5", pdfgumble, xmin,xmax, 4); // xmin, xmax, number of parameter
f5->SetParameters(3.0, 6.0, 1, 0);
f5->SetNpx(500);
f5->SetLineColor(6);
f5->Draw("Same");
// set TLegend
leg = new TLegend(0.6, 0.7, 0.9, 0.89, "Legend");
//leg->SetFillStyle(0); // or leg->SetFillColor(0); // white paint
leg->SetFillColor(0);
leg->SetTextSize(0.04);
leg->AddEntry(f1, "a=0.5, b=2.0", "l");
leg->AddEntry(f2, "a=1.0, b=2.0", "l");
leg->AddEntry(f3, "a=1.5, b=3.0", "l");
leg->AddEntry(f4, "a=3.0, b=4.0", "l");
leg->AddEntry(f5, "a=3.0, b=6.0", "l");
leg->Draw();
f1->SetTitle("pdf of Gumble distribution");
c1->Print("root_gumble_op.pdf");
}
//definition of myfunc
Double_t pdfgumble (Double_t *x, Double_t *para){
return para[2]/para[1]*exp(-(x[0]-para[0])/para[1])*exp(-exp(-(x[0]-para[0])/para[1])) + para[3];
}
これをスクリプトとして用意して、
root -b root_gumble.cc
とかで次のようなグラフができるはず↓ソースコードについて補足
TCanvas *c1 = new TCanvas("name", "title", 0, 0, 1080, 720);
でcanvasを作るc1->SetGridx();
c1->SetGridy();
でgridを表示c1->SetGridy();
TF1 *f1 = new TF1("f1", pdfgumble, xmin,xmax, 4);// xmin, xmax, number of parameter
// SetParameters と SetParameter は別
f1->SetParameters(1, 2, 1, 0.0);
f1->SetNpx(500);
f1->SetLineColor(1);
f1->Draw("L");
で1つのグラフを描く// SetParameters と SetParameter は別
f1->SetParameters(1, 2, 1, 0.0);
f1->SetNpx(500);
f1->SetLineColor(1);
f1->Draw("L");
SetParameterとSetParametersは全然違う
SetParameter(parNo,value);
SetParameters(val1,val2,…);
前者は1つめの引数に、パラメーターの番号(0, 1, ..)を入れて、2番目にパラメーターの値を入れる
後者は1つ目の引数がそのまま0番目のパラメーターに代入され、2つめの引数がそのまま1番目のパラメーターに代入される(以下繰り返し)
また、TF1の3, 4, 5番目の引数はそれぞれxの最小値, 最大値, 関数のパラメーターの数
今回の場合はpdfgumbleのパラメーターは4つ固定なので、4でOK
TLegendのところは過去の記事を参考にどうぞ
【ROOT】ヒストグラムを重ね書きして、TLegendを使ってみる
最後に
//definition of myfunc
Double_t pdfgumble (Double_t *x, Double_t *para){
return para[2]/para[1]*exp(-(x[0]-para[0])/para[1])*exp(-exp(-(x[0]-para[0])/para[1])) + para[3];
}
のところで関数の定義をしているDouble_t pdfgumble (Double_t *x, Double_t *para){
return para[2]/para[1]*exp(-(x[0]-para[0])/para[1])*exp(-exp(-(x[0]-para[0])/para[1])) + para[3];
}
なんでこんな書き方をしているかというと、
TF1 *f1 = new TF1("f1", "10*sin(2*5*x)", xmin,xmax, 4);// xmin, xmax, number of parameter
f1->SetParameters(1, 2, 1, 0.0)
f1->SetNpx(500);
f1->SetLineColor(1);
f1->Draw("L");
みたいな感じで"..."の中に式を書くことができるf1->SetParameters(1, 2, 1, 0.0)
f1->SetNpx(500);
f1->SetLineColor(1);
f1->Draw("L");
ただ、この書き方をしてしまうと、10とか5といったパラメーターを手で毎回書き換える必要が出てくるので、関数で書いた方がかなりお手軽で、今回のように5種類のパラメーターセットで同じ関数を描くときに色々と手間が省ける。(上記の"10*sin(2*5*x)"で実際にプロットできるかは未確認)
■ 参考
TF1の諸々
そういえばROOTでヒストグラムのfittingをするためのメモ書きがなかったのでまとめておく
だいたい参考リンクを見れば解決すると思う
あとROOTのdocument
■ 参考 : ROOT:便利なコマンド表と使い方の例
: とてつもなく、分かりやすい。必要な情報はすべてここにあるだろう
■ 参考 : TF1の諸々
: fittingしたあとの処理について、色々とまとめられていた
そのうち、追記するかも
(2017/05/26 追記)
■ 参考 : TF1の諸々
ここの一番したに便利な関数が載っていたのでメモ
ギリシャ文字を使うときはTeXの\の代わりに#を付ける
統計情報の文字サイズを大きくするときは
(2017/09/05 追記)
上記の
gStyle->SetStatFontSize(0.06);
を打っても箱の大きさを大きくならないことがあった・・・・
ググってみたら、以下のような中国語の記事がヒットした
■ 参考 : ROOT: Why TStyle::SetStatFontSize() doesn't work?
要するに、
gStyle->SetStatFontSize(0.06);
とした後で、箱の大きさを変更しないと文字サイズも変更されないというバグ(?)らしい
あと、fitting後のパラメーターをROOTの中で取得する方法は、
■ 参考 : fit_parameterの取得
(2019/02/01 追記)
chi^2の値、dofの値を取得するには
■ 参考 : TF1 Class Reference
(2019/02/04 追記)
フィット後に、この関数のあるxでの値が知りたいときはEval()を使う
しフィットしてないときはパラメーターの値がセットされていないはずなので、
SetParametersで手でセットする必要がある
ツイート
だいたい参考リンクを見れば解決すると思う
あとROOTのdocument
■ 参考 : ROOT:便利なコマンド表と使い方の例
: とてつもなく、分かりやすい。必要な情報はすべてここにあるだろう
■ 参考 : TF1の諸々
: fittingしたあとの処理について、色々とまとめられていた
そのうち、追記するかも
(2017/05/26 追記)
■ 参考 : TF1の諸々
ここの一番したに便利な関数が載っていたのでメモ
f.FixParameter(1, 5.0); //パラメーターを動かさない
// 1はparameterの通し番号
// そのパラメーターを5.0に固定する
f.SetParLimits(1, 1.0, 3.0); //パラメーターの変化させる範囲を指定できる
1は通し番号、1.0, 3.0はそれぞれ最小値と最大値
これで、今までうまくいかなかったfittingがうまくいった// 1はparameterの通し番号
// そのパラメーターを5.0に固定する
f.SetParLimits(1, 1.0, 3.0); //パラメーターの変化させる範囲を指定できる
1は通し番号、1.0, 3.0はそれぞれ最小値と最大値
f5.SetParNames("A", "#theta", "#mu", "#gamma");
みたいな感じで、fittingに用いるパラメーターに名前をつけることができるギリシャ文字を使うときはTeXの\の代わりに#を付ける
統計情報の文字サイズを大きくするときは
gStyle->SetStatFontSize(0.06);
(2017/09/05 追記)
上記の
gStyle->SetStatFontSize(0.06);
を打っても箱の大きさを大きくならないことがあった・・・・
ググってみたら、以下のような中国語の記事がヒットした
■ 参考 : ROOT: Why TStyle::SetStatFontSize() doesn't work?
要するに、
gStyle->SetStatFontSize(0.06);
とした後で、箱の大きさを変更しないと文字サイズも変更されないというバグ(?)らしい
//To make sure SetStatFontSize() does work, you need next statement:
gStyle->SetStatW(0.7);
gStyle->SetStatW(0.7);
あと、fitting後のパラメーターをROOTの中で取得する方法は、
■ 参考 : fit_parameterの取得
double para0 = f1->GetParameter(0);
double para1 = f1->GetParameter(1);
double para2 = f1->GetParameter(2);
通し番号は0から始まるdouble para1 = f1->GetParameter(1);
double para2 = f1->GetParameter(2);
(2019/02/01 追記)
chi^2の値、dofの値を取得するには
TF1 *fit = h2->GetFunction("f1");
Double_t chi2 = fit->GetChisquare();
Int_t dof = fit->GetNDF();
h2はヒストグラムの名前, f1はフィットした関数の名前Double_t chi2 = fit->GetChisquare();
Int_t dof = fit->GetNDF();
■ 参考 : TF1 Class Reference
(2019/02/04 追記)
TF1 *f5 = new TF1("f5","[0] * x + [1]");
みたいな感じの関数をフィットに使ったとするフィット後に、この関数のあるxでの値が知りたいときはEval()を使う
double x=5;
fprintf(stderr, "f(%f) = %f\n", x, f5->Eval(x));
みたいな感じfprintf(stderr, "f(%f) = %f\n", x, f5->Eval(x));
しフィットしてないときはパラメーターの値がセットされていないはずなので、
SetParametersで手でセットする必要がある
f5->SetParameters(1.2, 500);
fprintf(stderr, "f(%f) = %f\n", x, f5->Eval(x));
fprintf(stderr, "f(%f) = %f\n", x, f5->Eval(x));
備忘録メモ
ROOTでヒストグラムを書くと、デフォルトだと右上にそのヒストグラムに関する情報が書かれた箱ができる(名前がわからない・・・・)
今回2つのヒストグラムを重ね書きするグラフを書いてみて、その箱に関する情報だけでは不足なので新しく、TLegendというのを導入してみた
つまり↓
では微妙で
こんなのがが欲しい↓
ソースコードはこんな感じ(こんな感じで良いのかわからんけど、ひとまずかけているから良し、で・・・)
{
#include <fstream.h>
#include <string.h>
#include <TMath.h>
TCanvas *c1 = new TCanvas("name", "title", 0, 0, 1080, 720);
gROOT->SetStyle("Plain");
char fname_mic[80] = "data_gauss.txt";
char fname_mic_bg[80] = "data_rayleigh.txt";
char fname_picture[80] = "result_for_blog.png";
Int_t nbin = 50;
Double_t mic, mic_bg;
Double_t x, y;
TH1D *h1 = new TH1D("a", "", nbin, -5, 5);
TH1D *h2 = new TH1D("b", "", nbin, 0, 5);
ifstream fp(fname_mic);
while(fp >> x){
h1 -> Fill(x);
}
fp.close();
ifstream fp(fname_mic_bg);
while(fp >> y){
h2 -> Fill(y);
}
fp.close();
// set y maximum
//h2 -> SetMaximum(40);
// show histogram
h1 -> SetLineColor(2);
h1 -> Draw();
h2 -> SetLineColor(4);
h2 -> Draw("Same");
// remove right profile box
gStyle->SetOptStat(0);
// set TLegend
leg = new TLegend(0.6, 0.7, 0.9, 0.89, "Legend");
leg->SetFillStyle(0); // or leg->SetFillColor(0); // white paint
leg->SetTextSize(0.04);
leg->SetHeader("The Legend Title");
leg->AddEntry(h1, "gauss data","fl");
leg->AddEntry(h2, "rayleigh data", "lf");
leg->Draw();
c1.Print(fname_picture);
exit(0);
}
■ ソースコードの簡単な説明
右上にあった箱を非表示にする
gStyle->SetOptStat(0);
TLegend(0.6, 0.7, 0.9, 0.89);
の後の4つの引数はそれぞれxmin, ymin, xmax, ymaxに相当
値はそれぞれ
グラフの左上の軸の交点が(0, 0)
グラフの左下の軸の交点が(0, 1)
グラフの右下の軸の交点が(1, 0)
グラフの左下の軸の交点が(1, 1)
ただしおそらくこれでは不足に思うと思う
なぜなら、デフォルトのフォントが小さいから
leg->SetTextSize(0.04);
で調整する
これをいじると、軸の外にもLegendが出てくれるようになる
leg = new TLegend(0.6, 0.7, 0.9, 0.89, "Legend");
の最後の引数はLegendのタイトル
下のような方法でも後付け可能
leg->SetHeader("The Legend Title");
でタイトルが付けられる
leg->AddEntry(h1, "gauss data","f");
leg->AddEntry(h2, "rayleigh data", "f");
leg->Draw();
で、Legendをセットして、描画する
AddEntryの第3引数は
L: draw line associated with TAttLine if obj inherits from TAttLine
P: draw polymarker associated with TAttMarker if obj inherits from TAttMarker
F: draw a box with fill associated wit TAttFill if obj inherits TAttFill
E: draw vertical error bar if option "L" is also specified
みたいな選択肢があるらしい
参考 :
class TLegend: public TPave, public TAttText
また箱の色がデフォルトでは灰色なので、白く、もしくは透明にしておく
透明にする場合
leg->SetFillStyle(0);
白塗りする場合
leg->SetFillColor(0);
ちなみに、ここで使っているデータはGSLがインストールされていれば簡単に再現できるだろう
gsl-randist 0 1000 gaussian 1 > data_gauss.txt
gsl-randist 0 1000 rayleigh 1 > data_rayleigh.txt
でOK
GSLをデフォルトの場所にインストールしていれば
/usr/local/bin/gsl-randist
があるはず
gsl-randistの使い方は以前書いた記事を参考にどうぞ
参考 :
【シェルコマンド】gsl-randistを使うとお手軽に乱数データを生成できる
(2019/02/08 追記)
グラフからわかる結果や数値などをTLegentでグラフ内に書きたい場合は、AddEntryでグラフの各データとテキストを紐づけすることはできない
そういうときは
legend->AddEntry((TObject*)0,"hoge","");
凡例の部分が空白になって左に変な空白ができてしまう
これが嫌な場合は
legend->AddEntry((TObject*)0,"#kern[-0.3]{hoge}","");
■ 参考 : 凡例(TLegend)
(2019/02/04 2つの記事の内容をまとめた)
■ ヒストグラムのX軸の場合、
実際の範囲は ビン[0] から ビン[2000] になる
■ 参考 : Cern ROOT quick reference for paw users
■ TGraphのX軸の場合、
Y軸はbin詰めされた値ではないので、設定方法がX軸とは異なる(ヒストグラムもTGraphも同じ)
■ 参考 : [ROOT] set Y axis limits of a TH1F ??
ツイート
■ ヒストグラムのX軸の場合、
h1->GetXaxis()->SetRange(0, 2000);
0と2000はx軸の値ではなくて、ビンの通し番号(int)なので注意実際の範囲は ビン[0] から ビン[2000] になる
■ 参考 : Cern ROOT quick reference for paw users
■ TGraphのX軸の場合、
TGraphErrors *graph = new TGraphErrors("hoge.txt", "%lg %lg");
graph->GetXaxis()->SetLimits(0.,5.);
graph->GetXaxis()->SetLimits(0.,5.);
Y軸はbin詰めされた値ではないので、設定方法がX軸とは異なる(ヒストグラムもTGraphも同じ)
TH1D *h1 = new TH1D("a", "; b", 100, 0 ,1);
h1 -> SetMaximum(ymax);
h1 > SetMinimum(ymin);
みたいな感じでOKh1 -> SetMaximum(ymax);
h1 > SetMinimum(ymin);
■ 参考 : [ROOT] set Y axis limits of a TH1F ??
まずはこういうヒストグラムを描いてみる
-> 描いたヒストグラムに関する量を使って、さらに計算をしたい
どんな数字が使えるか?
既に存在しているヒストグラムの ビンの数や、上下限を知るには、
また、ビンの中心値や、ビンのエントリーの数を知るには
平均値, RMSの取得は
ある値が入っているビンを知りたい(この場合は500)
■ 参考リンク
研究に必須のROOTというソフトウェアについての覚書
カテゴリ「ROOT」にあるページ
ツイート
TH1D *h1 = new TH1D("name","title",nbins,xmin,xmax);
-> 描いたヒストグラムに関する量を使って、さらに計算をしたい
どんな数字が使えるか?
既に存在しているヒストグラムの ビンの数や、上下限を知るには、
nxbins = h1->GetXaxis()->GetNbins();
xmin = h1->GetXaxis()->GetXmin();
xmax = h1->GetXaxis()->GetXmax();
xmin = h1->GetXaxis()->GetXmin();
xmax = h1->GetXaxis()->GetXmax();
また、ビンの中心値や、ビンのエントリーの数を知るには
xc = h1->GetXaxis()->GetBinCenter(i); // center of i-th bin
z = h1->GetBinContent(i) // content of i-th bin
z = h1->GetBinContent(i) // content of i-th bin
平均値, RMSの取得は
h1->GetMean();
h1->GetRMS();
h1->GetRMS();
ある値が入っているビンを知りたい(この場合は500)
h1->FindBin(500);
■ 参考リンク
研究に必須のROOTというソフトウェアについての覚書
カテゴリ「ROOT」にあるページ
参考リンクを読んで、知らなかったこととかをメモしてるだけー
■ 2 ROOT事始め
キャンパス(クラス TCanvas)はパッド(クラス TPad)で分割できる
実はキャンパスはウィンドウ全体に広がるパッド
TPadクラスはTCanvasクラスの親である
すべてのobjectは描画するという仮想メソッドDrawを持つ
object.Draw()
とすればobjectを描写してくれる
このときCanvasがなければc1がデフォルトで生成されるようになっている
例:
できるのは次のような絵
上のメニューバーのView -> Editorをクリック
表れたGUIで色々と調整できる、線の色を変えたりlogスケールにしたり
別にGUIを用いなくてもコマンドラインでもおーけー
logスケールにする方法は昔わからなくて記事を書きました
f1.Draw() 以外にもいろいろとobjectに対して使えるメソッドはあるっぽい
TF1クラスのobjectに対しては次のようなのがある(ほんの一例)
Eval(x)はxでのf1の値がわかる 要するにf1(x)みたいな感じ(わかりにく)
f1(x)でもわかるみたい
返り値をどこかに代入することも可能
みたいな使い方かな?
#ところで文末にセミコロンがなくてもエラーにならないけど、これはいいんだろうか・・・?
#追記
#Mathematicaとかoctaveとかと同じでセミコロンを文末に付けると、返り値が表示されなくなるのか・・・・
次のメソッド.
Derivative(a)はaでの導関数を計算する
Integral(a,b)はaからbまでの積分値を計算する
f1.SetNpx() を使って、描画のための店の数を決めれる
デフォルトでは100個
例:描画点の数を変えて比較してみる。
左が200点、右が20000点
滑らかさが違いますよ
「どうです、滑らかでしょう?余裕の描画だ、馬力が違いますよ」
■ マクロで保存
GUIでいろいろといじったあとに、FILE -> Save/*.Cで保存するとマクロができあがる
あら、便利・・・・
■ 複数のパッドを持つキャンパスの作成
で、1のPadに移動できる
root [] TF1 f1("hoge", "sin(x)/x", 0, 100);
root [] f1.Draw();
で、1のPadに描画できる。
あとで続きを書く。
■ 参考
ROOT/CINT 自社翻訳ドキュメント
ツイート
■ 2 ROOT事始め
キャンパス(クラス TCanvas)はパッド(クラス TPad)で分割できる
実はキャンパスはウィンドウ全体に広がるパッド
TPadクラスはTCanvasクラスの親である
すべてのobjectは描画するという仮想メソッドDrawを持つ
object.Draw()
とすればobjectを描写してくれる
このときCanvasがなければc1がデフォルトで生成されるようになっている
例:
できるのは次のような絵
上のメニューバーのView -> Editorをクリック
表れたGUIで色々と調整できる、線の色を変えたりlogスケールにしたり
別にGUIを用いなくてもコマンドラインでもおーけー
logスケールにする方法は昔わからなくて記事を書きました
f1.Draw() 以外にもいろいろとobjectに対して使えるメソッドはあるっぽい
TF1クラスのobjectに対しては次のようなのがある(ほんの一例)
Eval(x)はxでのf1の値がわかる 要するにf1(x)みたいな感じ(わかりにく)
f1(x)でもわかるみたい
返り値をどこかに代入することも可能
みたいな使い方かな?
#ところで文末にセミコロンがなくてもエラーにならないけど、これはいいんだろうか・・・?
#追記
#Mathematicaとかoctaveとかと同じでセミコロンを文末に付けると、返り値が表示されなくなるのか・・・・
次のメソッド.
Derivative(a)はaでの導関数を計算する
Integral(a,b)はaからbまでの積分値を計算する
f1.SetNpx() を使って、描画のための店の数を決めれる
デフォルトでは100個
例:描画点の数を変えて比較してみる。
左が200点、右が20000点
滑らかさが違いますよ
「どうです、滑らかでしょう?余裕の描画だ、馬力が違いますよ」
■ マクロで保存
GUIでいろいろといじったあとに、FILE -> Save/*.Cで保存するとマクロができあがる
あら、便利・・・・
■ 複数のパッドを持つキャンパスの作成
で、1のPadに移動できる
root [] TF1 f1("hoge", "sin(x)/x", 0, 100);
root [] f1.Draw();
で、1のPadに描画できる。
あとで続きを書く。
■ 参考
ROOT/CINT 自社翻訳ドキュメント
${ROOTSYS}/tutorials 以下にいろいろと楽しめるものが用意されている。
まずは ${ROOTSYS}/tutorials/README に目を通してみる
demos.C と benchmarks.C で遊んでみろと書かれているようだ・・・・
実行方法は
GUIが出てきて色々とクリックすると表示される
こんな感じ↓(ほんの一部です)
この右の図は何かの検出器っぽいのですが、これドラッグしたら回転します・・・・
え?CAD?
これを見て思ったのが、あれgnuplotいらなくね・・・?
もうひとつのbenchmarks.Cはマシンの性能みたいなのを数値評価してくれるスクリプト
他にはこういう例が用意されているらしい。
■ 参考
ROOT/CINT 自社翻訳ドキュメント
ツイート
まずは ${ROOTSYS}/tutorials/README に目を通してみる
demos.C と benchmarks.C で遊んでみろと書かれているようだ・・・・
実行方法は
GUIが出てきて色々とクリックすると表示される
こんな感じ↓(ほんの一部です)
この右の図は何かの検出器っぽいのですが、これドラッグしたら回転します・・・・
え?CAD?
これを見て思ったのが、あれgnuplotいらなくね・・・?
もうひとつのbenchmarks.Cはマシンの性能みたいなのを数値評価してくれるスクリプト
他にはこういう例が用意されているらしい。
■ 参考
ROOT/CINT 自社翻訳ドキュメント
x軸、y軸それぞれだけ表示したいときは
消すときは
c1->SetGrid(0, 0);
gnuplot同様、ROOTにも例が用意されてるらしい
詳しくは
$ROOTSYS/test以下
makeしたら、全部コンパイルしてくれる
ツイート
詳しくは
$ROOTSYS/test以下
makeしたら、全部コンパイルしてくれる
これを使う
とかなるはず
実は
gStyle->SetOptFit(1111)
としておくと改めて計算しなくても表示される
これは仮説に対する珍しさの指標になるらしい
追記
(2017/09/05 追記)
こっちの記事にもう少し詳しく書いてある
■ 参考 : 【ROOT】fittingに関するメモ
ツイート
とかなるはず
実は
gStyle->SetOptFit(1111)
としておくと改めて計算しなくても表示される
これは仮説に対する珍しさの指標になるらしい
追記
gStyle->SetOptStat();
gStyle->SetOptFit(11);
gStyle->SetStatFontSize(0.06);
で箱の中の文字サイズを大きくできるgStyle->SetOptFit(11);
gStyle->SetStatFontSize(0.06);
(2017/09/05 追記)
こっちの記事にもう少し詳しく書いてある
■ 参考 : 【ROOT】fittingに関するメモ
そういえばROOTに関する記事を全然書いてなかった・・・
と、言っても自分がROOTを使うときってのはヒストグラムを作るときくらい・・・
他にも色々便利な機能はあるらしいが、なにぶん英語なので敷居が高い・・・
今回は軸をlogスケールにしたいとき。
1でlogスケールに、0でリニアスケール
x軸も同様にして
他の方法だとROOTでグラフ書いてから、Editorでいじってもオーケーだけど
マクロだけで画像を作りたいときは、この方法で。
(2017/2/6 追記)
上記の方法でもできるけど、他の方法もあったのでメモしておく
キャンパスを分割したときは次のようにして分割したキャンパスごとにlogスケールを設定できる
括弧の中の1という数字はそれぞれのキャンパスの番号に置き換える(キャンパス番号は1から始まる)
ちなみに上記の方法のgPadというのは分割したキャンパスの今いる場所の設定を変更する、という意味らしいので
結局やってることは一緒っぽい・・・
また、キャンパス全体のデフォルトの設定を変更する場合は、
■ 参考 : 軸をLogにする
ツイート
と、言っても自分がROOTを使うときってのはヒストグラムを作るときくらい・・・
他にも色々便利な機能はあるらしいが、なにぶん英語なので敷居が高い・・・
今回は軸をlogスケールにしたいとき。
gPad->SetLogy(1);
1でlogスケールに、0でリニアスケール
x軸も同様にして
gPad->SetLogx(1);
他の方法だとROOTでグラフ書いてから、Editorでいじってもオーケーだけど
マクロだけで画像を作りたいときは、この方法で。
(2017/2/6 追記)
上記の方法でもできるけど、他の方法もあったのでメモしておく
キャンパスを分割したときは次のようにして分割したキャンパスごとにlogスケールを設定できる
括弧の中の1という数字はそれぞれのキャンパスの番号に置き換える(キャンパス番号は1から始まる)
c1->GetPad(1)->SetLogy();
または
c1->cd(1)->SetLogy();
または
c1->cd(1)->SetLogy();
ちなみに上記の方法のgPadというのは分割したキャンパスの今いる場所の設定を変更する、という意味らしいので
結局やってることは一緒っぽい・・・
また、キャンパス全体のデフォルトの設定を変更する場合は、
gStyle->SetOptLogx(1);
gStyle->SetOptLogy(1);
って感じらしいgStyle->SetOptLogy(1);
■ 参考 : 軸をLogにする
#include
してから
M_PIで円周率が使えると思ってたけどうまくいかない。
調べてみたら
で出せるらしい。
そのままROOTの上で打ってみたら
と出て来た
ツイート
してから
M_PIで円周率が使えると思ってたけどうまくいかない。
調べてみたら
で出せるらしい。
そのままROOTの上で打ってみたら
と出て来た
ROOTに関するプログラムを作ってみたくて、下の2つのページを参考にして、書いてあるソースをそのままコンパイルしてみた・・・
C++ソースコードの作成
Makefileの作成とコンパイル
が、
色々エラーでた・・・
メモってたのはこれだけ↓
(10個ほど出てた)
たぶん64bitに対応してないよ?
って言われてるのかと思って、ROOTを入れ直してみた・・・
ROOT公式 から
Mac OS X 10.6 x86-64 with gcc 4.2.1, version 5.32.00 (46 MB)
これを落としてきた。
README読んだけど、よくわからない・・・
解凍して、sudo root /usr/local/
パスを通したりする必要はあるけど、以前したので大丈夫だったっぽい。
ちなみに一番上にあったソースは無事に動きました。
参考画像
ツイート
C++ソースコードの作成
Makefileの作成とコンパイル
が、
色々エラーでた・・・
メモってたのはこれだけ↓
(10個ほど出てた)
たぶん64bitに対応してないよ?
って言われてるのかと思って、ROOTを入れ直してみた・・・
ROOT公式 から
Mac OS X 10.6 x86-64 with gcc 4.2.1, version 5.32.00 (46 MB)
これを落としてきた。
README読んだけど、よくわからない・・・
解凍して、sudo root /usr/local/
パスを通したりする必要はあるけど、以前したので大丈夫だったっぽい。
ちなみに一番上にあったソースは無事に動きました。
参考画像
プロフィール
HN:coffee
職業:物理屋(自称)
趣味:映画鑑賞、登山
出身:大阪府の南の田舎
自己紹介:
import MyProfile
import coffee_pote from TWITTER
import amazonのほしい物リスト from WISH_LIST
print "先月子供が産まれました!"
# 最終更新 2022/10/25
職業:物理屋
趣味:映画鑑賞、登山
出身:大阪府の南の田舎
自己紹介:
import MyProfile
import coffee_pote from TWITTER
import amazonのほしい物リスト from WISH_LIST
print "先月子供が産まれました!"
# 最終更新 2022/10/25
カテゴリー
ブログ内検索
リンク
相互リンク募集中です
(Twitterにてお知らせください)
Demo scripts for gnuplot version 5 (gnuplotのさまざまなデモ画像と作り方がまとめられている、眺めているだけでできるようになった気分になれる)
gnuplotスクリプトの解説 (米澤進吾さんの個人ページ、gnuplotと言えばこのかた)
gnuplot のページ (Takeno Lab、うちのブログがリンクされていたのでリンク返し)
Twitterから映画の評価が分かる & 映画の鑑賞記録が残せる coco (映画の感想をまとめられるサイト、いつもお世話になっています)
Astronomy Picture of the Day Archive (天文や宇宙関連の最新の話題について画像とともにNASAが説明しているページ)
今日のほしぞら (任意の時刻の空で見える星を表示してくれる、国立天文台が管理している)
GNUPLOTとアニメーション (応用の項目の「見せてあげよう!ラピュタの雷を!!」あたりからすごすぎる)
読書メーター (読んだ本をリストできる便利なサイト)
flickr難民の写真置き場 (20XX年、flickrは有料化の炎に包まれた。あらゆるflickr無料ユーザーは絶滅したかに見えた。 しかし、tumblr移住民は死に絶えてはいなかった。)
教授でもできるMac OS X へのLaTeX, X11, gccのインストレーションと環境設定 (阪大の山中卓さんのwebページ、タイトルにセンスが溢れている、内容は超充実してる、特にTeX関連、学振DCとかPDの申請書類作成時にはお世話になっております)
英語論文執筆用の例文検索サービス (とんでもないものを見つけてしまった・・・・ arXivに収録されている 811,761報の 英語論文から,例文を検索するための検索エンジン)
Demo scripts for gnuplot version 5 (gnuplotのさまざまなデモ画像と作り方がまとめられている、眺めているだけでできるようになった気分になれる)
gnuplotスクリプトの解説 (米澤進吾さんの個人ページ、gnuplotと言えばこのかた)
gnuplot のページ (Takeno Lab、うちのブログがリンクされていたのでリンク返し)
Twitterから映画の評価が分かる & 映画の鑑賞記録が残せる coco (映画の感想をまとめられるサイト、いつもお世話になっています)
Astronomy Picture of the Day Archive (天文や宇宙関連の最新の話題について画像とともにNASAが説明しているページ)
今日のほしぞら (任意の時刻の空で見える星を表示してくれる、国立天文台が管理している)
GNUPLOTとアニメーション (応用の項目の「見せてあげよう!ラピュタの雷を!!」あたりからすごすぎる)
読書メーター (読んだ本をリストできる便利なサイト)
flickr難民の写真置き場 (20XX年、flickrは有料化の炎に包まれた。あらゆるflickr無料ユーザーは絶滅したかに見えた。 しかし、tumblr移住民は死に絶えてはいなかった。)
教授でもできるMac OS X へのLaTeX, X11, gccのインストレーションと環境設定 (阪大の山中卓さんのwebページ、タイトルにセンスが溢れている、内容は超充実してる、特にTeX関連、学振DCとかPDの申請書類作成時にはお世話になっております)
英語論文執筆用の例文検索サービス (とんでもないものを見つけてしまった・・・・ arXivに収録されている 811,761報の 英語論文から,例文を検索するための検索エンジン)
最新記事
(11/20)
(03/05)
(02/29)
(02/21)
(02/21)
(02/21)
(02/21)
(01/13)
(01/05)
(01/05)