Bus errorとSegmentation faultに困ったら見るブログ

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

【ROOT】複数行のデータを一度に読み込む

(2019年の過去記事)

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");


読み込んだデータのサンプル点数をする方法は、

graph->GetN()

データの値を見たいとき

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

ランキング参加中です

↓クリックしていただけると嬉しいです〜