[CERN ROOT] シンプルなヒストグラムのテンプレート

更新日:2022年11月20日(初版作成日:2020年8月17日)

サンプルヒストグラム ©SKラボラ

目的

外枠とヒストグラムの枠と軸ラベルを自由に調整できるテンプレートです。
sample.cc、Makefile、sample_data.txtをそのままコピペ+実行でグラフができます。
細かい調整は、ソースコードを参照ください。

実行

% make
% ./sample sample_data.txt

プログラムとMakefile

#include <iostream>
#include <fstream>
#include "TApplication.h"
#include "TCanvas.h"
#include "TH2D.h"
#include "TPaletteAxis.h"
#include "TGraph2D.h"
#include "TLatex.h"
#include "TROOT.h"
#include "TStyle.h"

int main (int argc, char **argv)
{
  using namespace std;
  TApplication app("app", &argc, argv);
  //
  cout << "Reading data file..." << endl;
  //
  ifstream fin;
  fin.open (app.Argv(1));
  if (fin.fail()){
    cout << "No data file" << endl;
    exit(-1);
  }
  //
  int data_size      = 20000;
  int read_data_size = 0;
  //
  double x;
  double x_array[data_size];
  //
  fin >> x; // This is important to use "fin.eof()".
  for (int i=0;i<data_size;i++) {
    if (fin.eof()) {
      cout << "Last data was read. Not completed data." << endl;
      cout << i << endl;
      read_data_size = i;
      break;
    }
    //
    cout << x << endl;
    x_array[i] = x;
    cout << i+1 << " data stored." << endl;
    read_data_size = i+1;

    // This depdends on the data format.
    fin >> x;
  }

  cout << "Drawing graphs." << endl;

  gROOT->SetStyle("Plain");
  gStyle->SetFrameFillColor(0);
  gStyle->SetCanvasColor(0);
  // gStyle->SetOptStat(0);      // without stat info
  gStyle->SetOptStat(111111111); // with stat info (following 9 info (0 means remove))
  // (kurtosis, skewness, bins, overflow, underflow, RMS(SDev), average, number of data, hist name)
  gStyle->SetPaperSize(40, 52);  // for pdf
  gStyle->SetPalette(1);
  //
  //
  //////////////////////////////////////////////////////////////////////////////////////
  // canvas size
  int canvas_y_size = 500;
  double silver_ratio = 1.4142;
  //
  TCanvas *c = new TCanvas("c", "c", 0, 0, (int)(double)canvas_y_size*silver_ratio, canvas_y_size);
  TPad *p = new TPad("p", "p", 0.05, 0.05, 1.0, 1.0);
  p->SetFillStyle(4000);
  p->Draw();
  p->cd();
  //
  //
  TH1I *h1 = new TH1I("hist xxx", "hist xxx", 100, 3000, 8000);
  int n = 0;
  while(n < read_data_size){
    h1->Fill(x_array[n]);
    n++;
  }
  h1->Draw();

  h1->SetTitle("");
  c->Update();
  p->Update();

  TAxis *x_axis = h1->GetXaxis();
  x_axis->SetLabelSize(0.03);
  x_axis->SetLabelOffset(0.02);
  TAxis *y_axis = h1->GetYaxis();
  y_axis->SetLabelSize(0.03);

  h1->SetFillColor(4);
  h1->Draw();

  c->cd();
  TLatex *c_title = new TLatex (0.03, 0.95, Form("Title XXX"));
  c_title->Draw();
  //
  TLatex *x_axis_title = new TLatex (0.45, 0.03, Form("X axis title xxx"));
  x_axis_title->Draw();
  //
  TLatex *y_axis_title = new TLatex (0.07, 0.51, Form("Y axis title xxx"));
  y_axis_title->SetTextAngle(90);
  y_axis_title->Draw();

  c->Update();
  p->cd();
  p->Update();
  //
  app.Run();
}

sample.cc

source = sample.cc
object = sample.o
target = sample

CC = g++ -O2
CFLAGS = -Wall

ROOTCONFIG   := root-config
ROOTCFLAGS   := $(shell $(ROOTCONFIG) --cflags)
ROOTLDFLAGS  := $(shell $(ROOTCONFIG) --ldflags)
ROOTLIBS     := $(shell $(ROOTCONFIG) --libs)
ROOTGLIBS    := $(shell $(ROOTCONFIG) --glibs)

ALLROOTLIBS =  $(ROOTLIBS) $(ROOTGLIBS) $(HASTHREAD)
ALLROOTFLAGS = $(ROOTCFLAGS) $(ROOTLDFLAGS)

$target : $(object)
	$(CC) -o $(target) $(ALLROOTLIBS) -lRooFit -lRooFitCore -lFoam -lMinuit -lGui $(object)

$(object): $(source)
	$(CC) -c $(CFLAGS) $(ALLROOTFLAGS) $(source)

.PHONY: clean
clean:
	rm $(target) $(object)

Makefile (コピペの場合は、行頭のタブに注意)

データファイル

5000付近に散らばる、2万データ。

5261
5036
6096
5200
...
5126
5066
5435
5176

sample_data.txt

プログラムの備考

データは、数字のテキストデータ。
前半の部分がデータの読込、後半はグラフの描画。
データが足らなくてもグラフを描画。
データは、fin.eof()を読むまで読み込む、fin.eof()の仕様上、一回先読みしている。
白銀比で枠を作成。グラフは、canvasで枠を作成し、padでグラフ部分を作成。
統計情報は、setOptStat()で設定。一桁目から順にトグルスイッチになっているので、必要無い部分は”1″から”0″に変更する。
1桁目から順に
“hist xxx”、ヒストグラムの名前
“Entries”、使用したデータの数
“Mean”、平均
“Std Dev”、標準偏差
“Underflow”、グラフの枠に入り切らない小さすぎるデータ数
“Overflow”、グラフの枠に入り切らない大きすぎるデータ数
“Integral”、枠内の積分値
“Skewness”、歪度(わいど)、歪み具合(正規分布で0)
“Kurtosis”、尖度(せんど)、尖り具合(正規分布で0)

参考資料

ROOT
TColor(色情報)

改訂履歴

2022年11月20日:参考追加、体裁調整
2022年09月11日:code-prettifyに変更
2022年08月13日:WordPress用に色とタグを変更
2020年08月17日:初版作成
通し番号:010(管理用)

タイトルとURLをコピーしました