Geant4

Ntuple & Analysis Manager

NTuple

Ntuple은 간단히 말해서 정렬된 원소의 리스트이다. 가령 우리가 보고자 하는 스텝의 정보 중 eventID, volumeID, energy deposit을 저장하고 싶다고 하자. 이 경우에 NTuple은 (eventID, volumeID, energy deposit)의 리스트가 될 것이다. 예를 들어 다음과 같은 형태를 가진다.

0 0 0.02
0 1 4.89
0 1 4.54
1 0 0.01
1 1 3.78

CSV는 Comma Saparated Values의 약자로 데이터를 저장하는 하나의 형식이다. 한 줄이 하나의 데이터 세트를 이루며 각 원소는 쉼표(,)로 구분한다. 따라서 위 Ntuple을 CSV 형식으로 저장한다면 다음과 같다.

0,0,0.02
0,1,4,89
0,1,4.54
1,0,0.01
1,1,3.78

G4AnalysisManager

Geant4는 G4AnalysisManager로 부터 Ntuple을 생성하고 저장할 수 있다. G4AnalaysisManager의 이점은 코드를 완성한 시점에서 헤더 파일만 변경하면 데이터 저장 형식을 자유롭게 바꿀 수 있다는데에 있다. CSV의 경우 "g4csv.hh", XML의 경우 "g4xml.hh", 그리고 ROOT 파일의 경우 "g4root.hh"를 사용한다.

G4AnalysisManager 생성
G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
analysisManager -> OpenFile("data");

OpenFile(이름) 함수에 들어가는 이름은 확장자를 제외한 파일의 이름이다.

G4AnalysmsManager 저장
G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
analysisManager -> Write();
analysisManager -> CloseFile();

위 코드는 G4AnalysisManager에서 만들어진 모든 데이터를 저장하고 파일을 닫는다.

NTuple 생성
G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
analysisManager -> CreateNtuple("step", "step");
analysisManager -> CreateNtupleIColumn("eventID");
analysisManager -> CreateNtupleIColumn("volumeID");
analysisManager -> CreateNtupleDColumn("edep");
analysisManager -> FinishNtuple();

Ntuple을 CreateNtuple(이름, 타이틀) 함수로 생성하고 데이터 세트의 각 원소를 CreateNtuple[X]Column(이름) 함수로 생성한다. 여기서 [X]는 알파벳 I(int), F(float), D(double) 중 하나이며 변수의 데이터 타입에 따라 사용자가 설정할 수 있다. eventID와 volumeID는 int 타입으로 충분하므로 I를 사용하고 잃어버린 에너지의 경우 double 타입이기 때문에 D를 사용하였다. 데이터 세트의 각 변수에는 생성된 순서대로 0번 부터 번호가 붙는다. 마지막에 FinishNtuple() 함수를 불러와서 데이터 세트가 완성되었다는 것을 알려주면 Ntuple이 생성된다. Ntuple의 타이틀 그리고 각 변수의 이름은 ROOT 파일로 저장할 경우 저장되지만 CSV 형식에서는 저장되지 않는다.

Ntuple 저장
G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
analysisManager -> FillNtupleIColumn(0, eventID);
analysisManager -> FillNtupleIColumn(1, volumeID);
analysisManager -> FillNtupleDColumn(2, edep);
analysisManager -> AddNtupleRow();

데이터 값은 FillNtuple[X]Column(변수ID, 값) 함수로 지정한다. 변수ID는 위 Ntuple 생성때 부여된 변수의 번호와 같다. 변수의 값  AddNtupleRow() 함수를 불러와서 Ntuple의 한줄을 확정짓는다.

댓글

댓글 본문
작성자
비밀번호
버전 관리
ejungwoo
현재 버전
선택 버전
graphittie 자세히 보기