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의 한줄을 확정짓는다.

댓글

댓글 본문
작성자
비밀번호
  1. Kain Kim
    자세히 설명해주셔서 감사합니다!
    대화보기
    • ejungwoo
      안녕하세요.
      매 이벤트마다 특정 볼륨안에 누적된 energy loss를 저장하려고 하는것이 맞나요?

      개인적으로는 Geant4 시뮬레이션에서 나온 데이터 파일을 다시 분석하는 방법이 더 쉽고 빠르다고 생각합니다. 하지만 Geant4 안에서 해결해야 할 상황이라면 다음 링크를 참고하세요.

      https://github.com......cac

      위 프로그램은 second_program에서 조금의 변화를 준 케이스 입니다. 간단하게 설명을 하면
      1) 우리가 보고싶은 볼륨의 volumeID가 '1'이라고 합시다.
      2) Run Action 클래스에서 edep 이라는 새로운 ntuple을 만들고 edep1 column을 생성합니다.
      3) 이후 Event Action 클래스를 만들고 한 이벤트 동안 누적된 energy loss를 저장할 edep1이라는 변수를 만들고 Stepping Action에서 더해줄 수 있도록 AddEnergyLoss1 이라는 함수를 만들어 줍니다.
      4) Stepping Action에서 볼륨1이 확인이 될때마다 AddEnergyLoss1 함수를 이용해서 energy loss를 더해주고
      5) Event Action에서는 매 이벤트가 끝날 때 마다 edep1을 저장하고 매 이벤트가 시작할 때 마다 edep1의 값을 0으로 초기화니다.

      만약에 한 개 이상의 볼륨에 대해서 energy loss를 보고 싶다면 edep1과 같은 변수과 함수, 그리고 tuple 안에 새로운 column을 만들어 주면 되겠죠.
      대화보기
      버전 관리
      ejungwoo
      현재 버전
      선택 버전
      graphittie 자세히 보기