TEXTデータを抽出してCERN ROOT でヒストグラムを描写する
学部生と一緒にデータを取得して中身を確認するときに、
テキストデータとしてスペースで区切られた数値データを
パッと1列目のみヒストグラムに詰めて表示したい時があったので、
ここにサンプルコードを置いておこうと思います。
読み込むデータのイメージはこんな感じです。 横方向がチャンネル番号、一行が1イベントに対応しているというデータです。
192 284 1391 31985 1933 ... 415 135 1531 15131 51531 ... . . .
修士の頃から、テキストファイル読み込んでヒストグラム表示とか数え切れないほどやってきましたが、
簡単なマクロのソースコードを一からコードを書くのは煩わしく、時間かかるってことで、
今回を機にスニペットとして保存しました。
普段スニペットとかはClipyに保存しています。メールのテンプレとか一括で置いておけるので、
よく使うマクロのソースコードのテンプレも一緒に置いてます。
ROOTでのマクロの実行は以下のファイルのような物用意して
root Show_data.C
で実行されます。
rootの使い方等は、以下のサイトを参考にしてもらうのが間違えないかなと思います。 僕も今回のような具体例のある問題やTipsなどを小出しに記事にする予定です。
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(); }
変数名とかは適当なので、適宜自分の対応する物に変更してつかってください。