ROOT 가이드

4.1 ROOT 파일과 TFile 클래스

TFile은 TObject의 파생클래스를 (아마도 TDirectoryFile 파생클래스를 제외하고) 모두 저장할 수 있는 파일 클래스이다. TFile을 통해서 읽고 쓰는 파일을 루트 파일이라고 하며 '.root' 확장자를 사용하여 구분한다. TFile의 정의는 다음과 같다.

 

읽기/쓰기 모드로 파일 열기
TFile *file = new TFile("file.root","read"); 
TFile *file = new TFile("file.root","recreate");

첫번째 인수는 파일의 이름, 두번째 인수는 "recreate" (쓰기모드) "read" (읽기모드) 를 사용한다.

 

파일 닫기
file -> Close();

 

TFile에 TObject 쓰기

생성된 모든 TObject를 저장할 때는 TFile 클래스의 Write() 함수를 사용한다. 예를 들어서 히스토그램을 두개 만들고 두 히스토그램 모두를 파일에 저장할 때는 다음과 같다.

void writeRootFile() {
    TFile *file = new TFile("file.root","recreate");
    
    TH1D *hist1 = new TH1D("histogram1","first histogram",10,0,10);
    TH1D *hist2 = new TH1D("histogram2","second histogram",20,-10,10);
    
    ...
    
    file -> Write();
    file -> Close();
}

개별적으로 TObject를 저장하고자 할 때는 TObject의 Write() 함수를 사용한다. 위 예제에서 hist1만을 파일에 저장할 때는 다음과 같다.

void writeRootFile2() {
    TFile *file = new TFile("file.root","recreate");
    
    TH1D *hist1 = new TH1D("histogram1","first histogram",10,0,10);
    TH1D *hist2 = new TH1D("histogram2","second histogram",20,-10,10);
    
    ...
    
    hist1 -> Write();
    file -> Close();
}

일을 하다보면 TFile을 두개 이상 열 때도 있다. 이때 TObject를 저장할 파일을 지정하기 위해서 TFile 의 cd() 함수를 사용한다.

void writeRootFile3() {
    TFile *file1 = new TFile("file1.root","recreate");
    TFile *file2 = new TFile("file2.root","recreate");
    
    TH1D *hist1 = new TH1D("histogram1","first histogram",10,0,10);
    TH1D *hist2 = new TH1D("histogram2","second histogram",20,-10,10);
    ...
    
    file1 -> cd();
    hist1 -> Write();
    
    file2 -> cd();
    hist2 -> Write();
    
    file1 -> Close();
    file2 -> Close();
}

 

TFile에서 TObject 읽기

ROOT 커맨드 라인에서 파일을 읽을 때는 매크로를 읽을 때와 마찬가지로 'root' 명령어 후에 파일 이름을 쓴다.

> root file.root 
root [0] 
Attaching file file.root as _file0...
(TFile *) 0x7f953a32a440
root [1] .ls
TFile **                   file.root 
  TFile*                   file.root
    KEY: TH1D         histogram1;1     first histogram

    KEY: TH1D         histogram2;1     second histogram
root [2]

이후에 '.ls' 명령어를 사용하면 파일안의 내용을 볼 수 있다. 자세한 내용은 생략하도록 하고 파일에 저장된 TObject는 'KEY:' 라는 문구로 시작하는 줄에서 확인할 수 있다. 그 이후에 따라오는 정보는 - [클래스] [이름];[싸이클 번호] [타이틀] - 순이다. [싸이클 번호]는 몇번을 저장했는지에 따라서 결정되는 숫자다. 커맨드 라인에서는 TObject의 [이름]을 c++에서 하나의 변수처럼 그대로 사용할 수 있다.

root [2] histogram1 -> Draw()
Info in <TCanvas::MakeDefCanvas>:  created default TCanvas with name c1
root [3]

그래픽 인터페이스인 TBrowser를 이용하여 탐색하는 것도 가능하다.

root [4] TBrowser b
(TBrowser &) Name: Browser Title: ROOT Object Browser
root [5] 

TBrowser는 상당히 직관적이므로 설명은 생략한다.

매크로를 이용해서 파일을 읽고 TObject를 가져올때는 TFile의 Get([이름]) 함수를 이용한다. 이때 주의할 점은 Get() 함수가 객체를 TObject의 형태로 반환하므로 형변환을 해 주어야 한다는 점이다. TH1D를 가져오는 경우 다음과 같다.

void readFile() {
    TFile *file = new TFile("file.root","read");
    TH1D *hist = (TH1D*) file -> Get("histogram1");
    hist -> Draw();
}

Get() 함수에 매개변수로 들어가는 이름은 저장할 때의 TH1D 이름과 같다.

 

참고자료

댓글

댓글 본문
  1. ejungwoo
    geant4 에서 csv 포멧으로 데이터를 저장하면 히스토그램을 텍스트 형식으로 볼 수 있습니다.
    root 포멧을 csv 포멧으로 바꾸는 것은 헤더파일만 바꾸면 됩니다.
    analysisManager 헤더를 추가 할 때 g4root.hh 를 사용하고 계셨다면 모든 g4root.hh 를 g4csv.hh 로 바꾸시고
    G4RootAnalysisReader.hh 를 사용하고 계셨다면 모두 G4CsvAnalysisReader.hh 로 바꾸시면 됩니다.
    대화보기
    • 천명선
      geant4에서 생성된 root파일의 히스토그램 말고 그 안의 데이터를 txt 파일로 저장해서 볼 수 있는 방법 없나요?? 히스토그램 속 데이터를 보고 싶은데 방법을 모르겠네요 ㅠ.ㅠ