忍者ブログ
物理学者(ポスドク)による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)

ROOTを使ったプログラムをコンパイルして実行してたら、
symbol lookup error: /lib64/libAfterImage.so.0: undefined symbol:

ってエラーが出だした
計算機のライブラリが新しくなったせいっぽい

解決策は -lpng ってコンパイル時につければいいだけっぽい

■ 参考 : libpngを正しくインストールするにはどうすればいいですか?

こういうときは一応lddコマンドを使って問題点を切り分けるのがセオリー







PR
1行のデータを読み込む方法は「猿でもわかるROOT」に書いてあった
この例はヒストグラムを作る方法だけど、自分が本当にやりたいのは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>という書き方は古いらしくてエラーが出た
今は#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;
}
みたいにして、やると複数行読み込めるらしい
ただ、このままコードを書いて実行すると、なぜか最後の行に空の行が追加されてしまい
配列が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");



(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を使いこなす


もしこの読み込んだデータの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();

最後の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");

ヒストグラムを作るときに、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);
}
}

普通の累積分布は左から足していくようなものらしい(参考リンクにある方法)
今は右端の領域に興味があったので左から足していく累積分布にんなってるので注意・・・

■ 参考 : 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);
みたいな感じらしい
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.



書いたヒストグラムを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");

■ 参考リンク : [ROOT] Fit









同期より寄せられた情報です
#splitline{foo}{hoge}
こんな感じで書くと、タイトルの中で改行できるらしいです
3行目まで行くのかはしらん・・・

■ 参考 : Splitting Lines










ここにまとめられている↓
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).

正の無限大から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];
}


これをスクリプトとして用意して、
root -b root_gumble.cc
とかで次のようなグラフができるはず↓

root_gumble_op







ソースコードについて補足
TCanvas *c1 = new TCanvas("name", "title", 0, 0, 1080, 720);
でcanvasを作る

c1->SetGridx();
c1->SetGridy();
でgridを表示

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つのグラフを描く

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];
}
のところで関数の定義をしている
なんでこんな書き方をしているかというと、
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");
みたいな感じで"..."の中に式を書くことができる
ただ、この書き方をしてしまうと、10とか5といったパラメーターを手で毎回書き換える必要が出てくるので、関数で書いた方がかなりお手軽で、今回のように5種類のパラメーターセットで同じ関数を描くときに色々と手間が省ける。(上記の"10*sin(2*5*x)"で実際にプロットできるかは未確認)

■ 参考
TF1の諸々






そういえばROOTでヒストグラムのfittingをするためのメモ書きがなかったのでまとめておく
だいたい参考リンクを見れば解決すると思う
あと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がうまくいった
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);



あと、fitting後のパラメーターをROOTの中で取得する方法は、

■ 参考 : fit_parameterの取得
double para0 = f1->GetParameter(0);
double para1 = f1->GetParameter(1);
double para2 = f1->GetParameter(2);
通し番号は0から始まる


(2019/02/01 追記)

chi^2の値、dofの値を取得するには
TF1 *fit = h2->GetFunction("f1");
Double_t chi2 = fit->GetChisquare();
Int_t dof = fit->GetNDF();
h2はヒストグラムの名前, f1はフィットした関数の名前

■ 参考 : 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));
みたいな感じ

しフィットしてないときはパラメーターの値がセットされていないはずなので、
SetParametersで手でセットする必要がある
f5->SetParameters(1.2, 500);
fprintf(stderr, "f(%f) = %f\n", x, f5->Eval(x));







備忘録メモ

ROOTでヒストグラムを書くと、デフォルトだと右上にそのヒストグラムに関する情報が書かれた箱ができる(名前がわからない・・・・)
今回2つのヒストグラムを重ね書きするグラフを書いてみて、その箱に関する情報だけでは不足なので新しく、TLegendというのを導入してみた
つまり↓
result_for_blog1
では微妙で

こんなのがが欲しい↓
result_for_blog2

ソースコードはこんな感じ(こんな感じで良いのかわからんけど、ひとまずかけているから良し、で・・・)

{
#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軸の場合、
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.);





Y軸はbin詰めされた値ではないので、設定方法がX軸とは異なる(ヒストグラムもTGraphも同じ)
TH1D *h1 = new TH1D("a", "; b", 100, 0 ,1);
h1 -> SetMaximum(ymax);
h1 > SetMinimum(ymin);
みたいな感じでOK


■ 参考 : [ROOT] set Y axis limits of a TH1F ??








まずはこういうヒストグラムを描いてみる
TH1D *h1 = new TH1D("name","title",nbins,xmin,xmax);


-> 描いたヒストグラムに関する量を使って、さらに計算をしたい

どんな数字が使えるか?



既に存在しているヒストグラムの ビンの数や、上下限を知るには、

  nxbins = h1->GetXaxis()->GetNbins();
  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



平均値, RMSの取得は
     
h1->GetMean();
h1->GetRMS();


ある値が入っているビンを知りたい(この場合は500)
h1->FindBin(500);





■ 参考リンク

研究に必須のROOTというソフトウェアについての覚書

カテゴリ「ROOT」にあるページ







参考リンクを読んで、知らなかったこととかをメモしてるだけー




■ 2 ROOT事始め

キャンパス(クラス TCanvas)はパッド(クラス TPad)で分割できる
実はキャンパスはウィンドウ全体に広がるパッド
TPadクラスはTCanvasクラスの親である

すべてのobjectは描画するという仮想メソッドDrawを持つ
object.Draw()
とすればobjectを描写してくれる
このときCanvasがなければc1がデフォルトで生成されるようになっている


例:
TF1 f1("hoge", "sin(x)/x", 0, 10)
f1.Draw()

できるのは次のような絵


上のメニューバーのView -> Editorをクリック
表れたGUIで色々と調整できる、線の色を変えたりlogスケールにしたり
別にGUIを用いなくてもコマンドラインでもおーけー
logスケールにする方法は昔わからなくて記事を書きました

f1.Draw() 以外にもいろいろとobjectに対して使えるメソッドはあるっぽい
TF1クラスのobjectに対しては次のようなのがある(ほんの一例)
root [2] f1.Eval(3)
(const Double_t)4.70400026866224022e-02
root [3] f1.Derivative(3)
(const Double_t)(-3.45677499760626061e-01)
root [4] f1.Integral(0,3)
(Double_t)1.84865252799946811e+00


Eval(x)はxでのf1の値がわかる 要するにf1(x)みたいな感じ(わかりにく)
f1(x)でもわかるみたい

返り値をどこかに代入することも可能
double a
a = f1.Eval(3)
みたいな使い方かな?

#ところで文末にセミコロンがなくてもエラーにならないけど、これはいいんだろうか・・・?
#追記
#Mathematicaとかoctaveとかと同じでセミコロンを文末に付けると、返り値が表示されなくなるのか・・・・

次のメソッド.
Derivative(a)はaでの導関数を計算する
Integral(a,b)はaからbまでの積分値を計算する

f1.SetNpx() を使って、描画のための店の数を決めれる
デフォルトでは100個


例:描画点の数を変えて比較してみる。
root [13] TF1 f1("hoge", "sin(x)/x", 0, 100)
root [14] f1.SetNpx(200);
root [15] f1.Draw()
root [16] f1.SetNpx(20000);
root [17] f1.Draw()

左が200点、右が20000点
滑らかさが違いますよ

「どうです、滑らかでしょう?余裕の描画だ、馬力が違いますよ」




■ マクロで保存
GUIでいろいろといじったあとに、FILE -> Save/*.Cで保存するとマクロができあがる
あら、便利・・・・





■ 複数のパッドを持つキャンパスの作成

root [] TCanvas *MyC = new TCanvas("MyC", "Test Canvas", 1);
root [] MyC -> Divide(2,2);
root [] MyC->cd(1)
で、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 で遊んでみろと書かれているようだ・・・・

実行方法は
root -l demos.C
もしくは
root
.x demos.C

GUIが出てきて色々とクリックすると表示される
こんな感じ↓(ほんの一部です)


この右の図は何かの検出器っぽいのですが、これドラッグしたら回転します・・・・
え?CAD?

これを見て思ったのが、あれgnuplotいらなくね・・・?

もうひとつのbenchmarks.Cはマシンの性能みたいなのを数値評価してくれるスクリプト


他にはこういう例が用意されているらしい。
-fft: Fast Fourier Transform with the fftw package
-fit: Several examples illustrating minimization/fitting
-foam: Random generator in multi-dimensional space
-geom: Examples of use of the geometry package (TGeo classes)
-gl: Visualisation with OpenGL
-graphics: Basic graphics
-graphs: Use of TGraph, TGraphErrors, etc
-gui: Scripts to create Graphics User Interface
-hist: Histograming
-image: Image Processing
-io: Input/Output
-math: Maths and Statistics functions
-matrix: Matrices (TMatrix) examples
-mlp: Neural networks with TMultiLayerPerceptron
-net: Network classes (client/server examples)
-physics: LorentzVectors, phase space
-pyroot: python tutorials
-pythia: Example with pythia6
-quadp: Quadratic Programming
-ruby: ruby tutorials
-smatrix: Matrices with a templated package
-spectrum: Peak finder, background, deconvolutions
-splot: Example of the TSplot class (signal/background estimator)
-sql: Interfaces to SQL (mysql, oracle, etc)
-thread: Using Threads
-tmva: Examples of the MultiVariate Analysis classes
-tree: Creating Trees, Playing with Trees
-unuran: Interface with the unuram random generator library
-xml: Writing/Reading xml files



■ 参考
ROOT/CINT 自社翻訳ドキュメント




TCanvas c1;
c1->SetGrid(1);


x軸、y軸それぞれだけ表示したいときは
c1->SetGridx(1);
c1->SetGridy(1);


消すときは
c1->SetGrid(0, 0);
gnuplot同様、ROOTにも例が用意されてるらしい

詳しくは
$ROOTSYS/test以下
makeしたら、全部コンパイルしてくれる
TF1 *f5 = new TF1("", "sin(x)",0,5);
f5->Draw();
TText *t = new TText(0.5, 0.5, "hogeee");
t->SetTextSize(0.04);
t->Draw();


t->SetNDC(0);
で、(0.5, 0.5)はグラフ上の座標


t->SetNDC(1);
で、(0.5, 0.5)は相対位置になる
グラフ全体の50%, 50%の場所
必要になったわけではないけど、色々と調べてたら出て来たのでメモ

TF1 *f1 = new TF1("f1", "sin(x)", -10, 10);
f1->Draw();


画像に落としたいときは
c1->Printf("hoge.png")
hoge.pngを他のフォーマットに変える事も可能



3次元のグラフも
TF3 *f3 = new TF3("f3","x*x+y*y+z*z-1",-2,2,-2,2,-2,2);
f3->Draw();

なんでf3になってるかはお察し



Double_t TMath::Prob(Double_t chi2, Int_t ndf)
これを使う

printf("%f¥n", TMath::Prob(10, 9));
0.440493
とかなるはず


実は
gStyle->SetOptFit(1111)
としておくと改めて計算しなくても表示される


これは仮説に対する珍しさの指標になるらしい


追記
gStyle->SetOptStat();
gStyle->SetOptFit(11);
gStyle->SetStatFontSize(0.06);
で箱の中の文字サイズを大きくできる






(2017/09/05 追記)

こっちの記事にもう少し詳しく書いてある

■ 参考 : 【ROOT】fittingに関するメモ






そういえばROOTに関する記事を全然書いてなかった・・・
と、言っても自分が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();


ちなみに上記の方法のgPadというのは分割したキャンパスの今いる場所の設定を変更する、という意味らしいので
結局やってることは一緒っぽい・・・


また、キャンパス全体のデフォルトの設定を変更する場合は、
gStyle->SetOptLogx(1);
gStyle->SetOptLogy(1);
って感じらしい

■ 参考 : 軸をLogにする










#include
してから
M_PIで円周率が使えると思ってたけどうまくいかない。

調べてみたら
TMath::Pi()
で出せるらしい。

そのままROOTの上で打ってみたら
3.14159265358979312e+00
と出て来た
ROOTに関するプログラムを作ってみたくて、下の2つのページを参考にして、書いてあるソースをそのままコンパイルしてみた・・・
C++ソースコードの作成
Makefileの作成とコンパイル

が、

色々エラーでた・・・

メモってたのはこれだけ↓
(10個ほど出てた)
ld: warning: in sample_gaus.o, file was built for i386 which is not the architecture being linked (x86_64)


たぶん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
カウンター
カウンター カウンター
ブログ内検索
ツイートするボタン
リンク
相互リンク募集中です (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報の 英語論文から,例文を検索するための検索エンジン)


Template "simple02" by Emile*Emilie
忍者ブログ [PR]