G4Tool은 histogram을 만들고 저장하거나 Ntuple을 생성하고 여러 파일 포멧으로 저장할 수 있는 분석 툴이다. 이는 Genat4 클래스 G4AnalysisManager로 구현되어 있다. 그렇다면 Ntuple이 무엇인지 그리고 G4AnalysisManager를 통하여 어떻게 사용되는지 알아보자.
NTuple
Ntuple은 간단히 말해서 정렬된 원소의 리스트이다. 가령 우리가 보고자 하는 스텝의 정보 중 eventID, volumeID, energy deposit을 저장하고 싶다고 하자. 이 경우에 NTuple은 (eventID, volumeID, energy deposit)의 리스트가 될 것이다. 이때 하나의 (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,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"를 사용한다.
#include "g4root.hh"
G4Analysismanager의 Ntuple 생성과 저장은 런을 통틀어 한번만 실행하므로 Run Action 에 추가한다.
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의 한줄을 확정짓는다. 엔트리를 채울 때는 매 step 마다 저장하므로 Stepping Action에 추가한다.
두개 이상의 Ntuple 생성과 저장
두번째 ntuple 부터는 첫번째 ntuple 과 구분하기 위해서 Ntuple-id 를 사용한다. 첫번째 Ntuple-id 는 0 이며 이후에 생성되는 순서로 1씩 늘어난다.
두번째 Ntuple 생성 (id=1)
FinishNtuple()에 Ntuple-id 를 넣어준다.
//... analysisManager -> FinishNtuple(); analysisManager -> CreateNtuple("primary", "primary"); analysisManager -> CreateNtupleIColumn("mag"); analysisManager -> CreateNtupleIColumn("theta"); analysisManager -> CreateNtupleIColumn("phi"); analysisManager -> FinishNtuple(1);
두번째 Ntuple 저장 (id=1)
모든 함수의 첫번째 변수로 id=1을 추가로 넣어준다.
analysisManager -> FillNtupleIColumn(1, 0, mag); analysisManager -> FillNtupleIColumn(1, 1, theta); analysisManager -> FillNtupleDColumn(1, 2, phi); analysisManager -> AddNtupleRow(1);