드디어 데이터를 가지고 올 시간이다. 앞서 eventID, volumeID, energy deposit 정보를 Stepping Action에서 어떻게 가지고 오는지 알아보자.
G4Step
앞서, 기본 개념 - 틀 토픽에서 스텝에 관하여 다루었다. 시뮬레이션 상에서 스텝은 가장 작은 단위이고 결과와 직접적으로 연관되어 있기 때문에 사용자가 가장 관심있게 다루는 부분이다. Geant4 시뮬레이션은 하나의 스텝이 생성될 때 마다 G4UserSteppingAction 클래스의 UserSteppingAction(const G4Step*) 함수를 불러오며 G4Step 이라는 클래스로 스텝 정보에 접근 할 수 있다. G4Step은 요약하면 다음과 같은 정보를 가지고 있다.
- PreStepPoint, PostStepPoint의 포인터
- 스텝이 속한 G4Track의 포인터
- 스텝의 길이와 소요된 시간
- 스텝에서 잃은 에너지
이중에서 우리가 관심있는 잃은 에너지 정보는 G4Step의 GetTotalEnergyDeposit() 함수로 가져올 수 있다.
step -> GetTotalEnergyDeposit();
G4StepPoint
G4Step을 이해하기 위해서는 G4StepPoint 개념도 중요하다. G4StepPoint 는 스텝의 양 끝점인 스텝점이며 요약하면 다음과 같은 정보를 가지고 있다.
- 위치와 시간
- 운동량과 에너지
- Physical volume 포인터
여기서 가장 중요한 정보는 Physical volume이다. 하나의 스텝에서 나온 두 스텝점은 같은 물질에 속해있을 수도 있고 다른 물질에 속해있을 수도 있다. 이때 이 스텝이 어느 물질에서 일어난 스텝인지 의문을 가질 수 있다. 트랙은 물질의 경계에 닿았을 때 무조건 스텝이 끝나고 새로운 스텝이 시작된다. 즉, 스텝은 시작 스텝점이 속해있는 물질에서 일어난 스텝이라고 할 수 있다. 따라서 우리에게 중요한 volumeID는 preStepPoint가 속한 물질의 ID가 된다. 이는 다음과 같이 가져올 수 있다.
step -> GetPreStepPoint() -> GetPhysicalVolume() -> GetCopyNo();
CopyNo는 우리가 앞서 Detector Construction에서 Physical volume을 생성할 때 부여한 번호이다. 이때 각 Physical volume에 다른 번호를 부여하였다면 지금과 같이 물질을 구분할 때 도움이 된다.
G4Event
마지막으로 이벤트 번호가 남았다. 이벤트 번호는 G4Event 포인터가 가지고 있으며 GetEventNo() 함수로 가지고 올 수 있다. 하지만 문제는 G4Step으로 부터 G4Event 포인터를 가지고 올 수 없다. 다른 G4Event에 접근 방법은 G4UserEventAction을 이용하는 등의 방법도 있으나 더 우리는 G4RunManager를 이용해보도록 하자. 메인 프로그램을 만들때 G4RunManager라는 것을 만든 기억이 있을 것이다. G4RunManager는 어디서든 불러올 수 있으며 현재 시뮬레이션에 관한 정보에 접근 할 수 있다. 즉, 현재 G4Event 포인터에도 접근하여 이벤트 번호를 가지고 올 수 있다.
G4RunManager::GetRunManager() -> GetCurrentEvent() -> GetEventID();
이렇게 세가지 정보를 OTSteppingAction의 UserSteppingAction(G4Step*) 함수에서 불러와 G4AnalysisManager에 Ntuple 형태로 저장하면 드디어 두번째 프로그램이 완성된다.