こばりょ・ぶろぐ

実験物理専攻のゆるーい技術ブログ

TEXTデータを抽出してCERN ROOT でヒストグラムを描写する

学部生と一緒にデータを取得して中身を確認するときに、
テキストデータとしてスペースで区切られた数値データを
パッと1列目のみヒストグラムに詰めて表示
したい時があったので、
ここにサンプルコードを置いておこうと思います。

読み込むデータのイメージはこんな感じです。 横方向がチャンネル番号、一行が1イベントに対応しているというデータです。

192 284 1391 31985 1933 ...
415 135  1531 15131 51531 ...
.
.
.

修士の頃から、テキストファイル読み込んでヒストグラム表示とか数え切れないほどやってきましたが、
簡単なマクロのソースコードを一からコードを書くのは煩わしく、時間かかるってことで、
今回を機にスニペットとして保存しました。
普段スニペットとかはClipyに保存しています。メールのテンプレとか一括で置いておけるので、
よく使うマクロのソースコードのテンプレも一緒に置いてます。

qiita.com

koba-ryo.hatenablog.com

ROOTでのマクロの実行は以下のファイルのような物用意して

root Show_data.C

で実行されます。

rootの使い方等は、以下のサイトを参考にしてもらうのが間違えないかなと思います。 僕も今回のような具体例のある問題やTipsなどを小出しに記事にする予定です。

ROOT Manual - ROOT

cern root 入門 - meuのblog

https://www-he.scphys.kyoto-u.ac.jp/member/n.kamo/wiki/doku.php?id=study:software:root

Show_data.C

 {
//read data value
  std::string filename = "./run0028.dat";
  const int ChannelOfInterest = 0;
  
  std::ifstream file(filename);
  std::string line;
  std::vector<std::vector<int>> h;
  while (std::getline(file, line)) {
    int value;
    std::stringstream ss(line);
    h.push_back(std::vector<int>());
    while (ss >> value) {
      h[h.size()-1].push_back(value);
    }
  }

 //fill histgram 

  int max_x = 1000;
  int min_x = 0;
  int nBin = (max_x - min_x) / 10;

  auto hist = new TH1F("test",Form("%s ch = %d",filename.c_str(),ChannelOfInterest),nBin,min_x,max_x); 

  for (int i = 0; i < h.size(); i++) {

    hist->Fill(h[i].at(ChannelOfInterest));
  
}

  hist->Draw();

}

変数名とかは適当なので、適宜自分の対応する物に変更してつかってください。

f:id:koba_ryo:20210202132126g:plain