G4UserEventAction 클래스는 이벤트가 시작할 때 사용되는 BeginOfEventAction(const G4Event *) 와 이벤트가 끝날 때 사용되는 EndOfEventAction(const G4Event *) 함수를 이용할 수 있다.
이 예제에서 Event Action 클래스(OTEventAction)는 볼륨1의 에너지 축적량을 초기화, 업데이트, 그리고 저장을 관리한다. 먼저 볼륨1의 에너지 축적량인 edep1을 OTEventAction.hh 에 정의한다.
private: G4double edep1;
변수의 초기화는 이벤트의 시작인 BeginOfEventAction 함수에서 해준다(OTEventAction.cc).
void OTEventAction::BeginOfEventAction(const G4Event*) { edep1 = 0.; }
변수의 업데이트를 위해서 다음과 같은 함수를 정의 한다(OTEventAction.hh).
void AddEnergyDeposit1(G4double edep) { edep1 += edep; }
위 함수는 볼륨1에서 발생한 매 스텝마다 에너지를 추가하기 위해서 정의하였으며 OTSteppingAction의 UserSteppingAction 함수에서 사용한다.
OTEventAction *eventAction = (OTEventAction *) G4EventManager::GetEventManager() -> GetUserEventAction(); if (volumeID == 1) eventAction -> AddEnergyDeposit1(totalEdep);
Stepping Action에서 이벤트 아이디를 받아왔던 것 과 같이 G4EventManager::GetEventManager()를 통해서 지금 사용하고 있는 Action 클래스의 주소를 받아 올 수 있다. 여기서는 OTEventAction 클래스의 AddEnergyDeposit1() 함수를 용 하기 위해서 EventAction을 불러오는데 사용하였다.
마지막으로 이벤트가 끝날 때 Ntuple에 값을 저장한다.
void OTEventAction::EndOfEventAction(const G4Event*) { G4AnalysisManager* analysisManager = G4AnalysisManager::Instance(); analysisManager -> FillNtupleDColumn(1, 0, edep1); analysisManager -> AddNtupleRow(1); }
이 전 토픽에서 주의했던 것 과 같이 ntuple 번호 1을 적어주는 것을 잊지 말자.