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

「部門/ROOT/TTree/CSVをTTreeに入れる」の編集履歴(バックアップ)一覧はこちら

部門/ROOT/TTree/CSVをTTreeに入れる」(2012/02/27 (月) 19:08:23) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

&color(red){追記(2012.02.27):入力ファイルはカンマを含まないほうが読み込みがかなり早くなるようです。あと、fprintfではなくC++らしくfstreamを使いましょう。fprintfは一度に12個くらいしか読み取れないし。} たとえばGeantで、 #highlight(csv){{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>http://root.cern.ch/drupal/content/users-guide]]([[邦訳>http://www.dw-sapporo.co.jp/technology/root_cint_dw_documents/]])のTTreeの章に出てくる最初の例を参考にしたようで実はそうでもない。http://www47.atwiki.jp/cscd/pages/95.html に書いたことプラス、CSVの扱い方をhttp://simd.jugem.jp/?eid=49 で習ってあとは細かい作業だけでできた。TTreeの扱い方慣れてきたんじゃね? コードはこんな感じ。 #highlight(c++){{#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"); } }}
&color(red){追記(2012.02.27):入力ファイルはカンマを含まないほうが読み込みが劇的に速くなるようです。あと、fprintfではなくC++らしくfstreamを使いましょう。fprintfは一度に12個くらいしか読み取れないし。} たとえばGeantで、 #highlight(csv){{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>http://root.cern.ch/drupal/content/users-guide]]([[邦訳>http://www.dw-sapporo.co.jp/technology/root_cint_dw_documents/]])のTTreeの章に出てくる最初の例を参考にしたようで実はそうでもない。http://www47.atwiki.jp/cscd/pages/95.html に書いたことプラス、CSVの扱い方をhttp://simd.jugem.jp/?eid=49 で習ってあとは細かい作業だけでできた。TTreeの扱い方慣れてきたんじゃね? コードはこんな感じ。 #highlight(c++){{#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"); } }}

表示オプション

横に並べて表示:
変化行の前後のみ表示: