部門 > ROOT > TTree > CSVをTTreeに入れる


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

追記(2012.02.27):入力ファイルはカンマを含まないほうが読み込みが劇的に速くなるようです。あと、fprintfではなくC++らしくfstreamを使いましょう。fprintfは一度に12個くらいしか読み取れないし。

たとえばGeantで、
2.312,123,6643,7456,3554,3434.65,7346.45
1,2,3,4,5,6
426,432.6,767.9,3459.04,325.53,367.02
 
みたいなCSVファイルを出力したとする。で、これは1行ごとに左から順に1番目、2番目、・・・、6番目の検出器からの信号を表しているとする。これを1行ずつ読み込んで、TTreeに変換して、ROOTファイルとして保存して、ROOTで扱えるようにするマクロを書いた。ROOT User's Guide(邦訳)のTTreeの章に出てくる最初の例を参考にしたようで実はそうでもない。http://www47.atwiki.jp/cscd/pages/95.html に書いたことプラス、CSVの扱い方をhttp://simd.jugem.jp/?eid=49 で習ってあとは細かい作業だけでできた。TTreeの扱い方慣れてきたんじゃね? コードはこんな感じ。
#include<fstream>
#include<TH1.h>
#include<TH2.h>
#include<TFile.h>
#include<TTree.h>
#include<TCanvas.h>
#include<parameter20111003.h>
#include<math.h>
//#include<iostream>
 
#include<iostream> using namespace std;
 
 
#include<stdio.h>
void geant_test(){
 
 
  //  gStyle->SetOptFit(0001);
  gStyle->SetOptFit(0000);
 
  char inname[100],outname[100];
  sprintf(inname,"output.dat");//入力ファイル名
  //  sprintf(inname,"caf2-20111005-21.root");//入力ファイル名
  sprintf(outname,"tree_geant.root");//出力ファイル名
 
 
 
 
  //making TTree
  TFile ftree(outname,"recreate");
  TTree *tree2= new TTree("h40","Coincidence");
 
  Float_t Naiadc[6],Naitdc[6];
  tree2->Branch("Naiadc",&Naiadc,"Naiadc[6]/F");
  tree2->Branch("Naitdc",&Naitdc,"Naitdc[6]/F");
 
  // http://simd.jugem.jp/?eid=49
 
  FILE *fp;
  fp = fopen( inname, "r" );
  if( fp == NULL ){
    printf( "%sファイルが開けません¥n", fname );
    return -1;
  }
  Float_t f1,f2,f3,f4,f5,f6;  
 
  while( ( ret = fscanf( fp, "%f,%f,%f,%f,%f,%f", &f1, &f2, &f3, &f4, &f5, &f6 ) ) != EOF ){
    printf( "%f %f %f %f %f %f\n", f1, f2, f3, f4, f5, f6 );
    Naiadc[0]=f1;
    Naiadc[1]=f2;
    Naiadc[2]=f3;
    Naiadc[3]=f4;
    Naiadc[4]=f5;
    Naiadc[5]=f6;
    tree2->Fill(); 
 }
 
 
  fclose( fp );
 
  tree2->Write();
  //  tree2->Print();
  //  tree2->Show(200);
  ftree.Close();
 
 
  //ここまででROOTファイルが完成
  //ついでにつくってTTreeからヒストグラムを生成してみる
 
  //ヒストグラムの準備
  TH1F *adc[6];
  char histname[6][99],histtitle[6][99];
  for (Int_t id=0; id<6; id++){
    sprintf(histname[id],"h10%d",id+1);
    sprintf(histtitle[id],"Geant Simulation for ADC %d",id+1);
    adc[id] = new TH1F(histname[id],histtitle[id],2000,0,4000);
  }
 
 
  TFile *file1 = new TFile(outname);
 
  Float_t Nadc[6];
  h40->SetBranchAddress("Naiadc",&Nadc);
 
  Int_t nevent =h40->GetEntries();
 
  for (Int_t nev=1; nev<nevent; nev++){
    printf("%dth loop out of%d events\n",nev,nevent);
    h40->GetEntry(nev);
    for (Int_t id=0;id<6;id++){
      adc[id]->Fill(Nadc[id]);
    }
  }
 
  TCanvas *c1 = new TCanvas();
  c1->Divide(2,3);
 
  c1_1->SetLogy();
  c1_2->SetLogy();
  c1_3->SetLogy();
  c1_4->SetLogy();
  c1_5->SetLogy();
  c1_6->SetLogy();
 
 
  for (Int_t id=0;id<6;id++){
    c1->cd(id+1);
    adc[id]->Draw();
  } 
  c1->Print("geant_test.pdf");
}