메인 프로그램에서 해주어야 할 일을 각 단계별로 나누어서 보자.
1. 헤더파일
#include "globals.hh" #include "G4RunManager.hh" #include "G4VisExecutive.hh" #include "G4UImanager.hh" #include "G4UIExecutive.hh" #include "QGSP_BERT.hh" #include "OTDetectorConstruction.hh" #include "OTPrimaryGeneratorAction.hh" #include "OTEventAction.hh" #include "OTSteppingAction.hh"
위에서 추가한 globals.hh, G4RunManager.hh, G4VisExecutive.hh, G4UImanager.hh 그리고 G4UIExecutive.hh는 거의 모든 메인 프로그램에 사용되므로 그대로 두자. 나머지는 사용자가 어떤 클래스를 이용할지에 따라 달라진다. QGSP_BERT는 우리 프로그램에 사용 할 Geant4에서 제공하는 기본 PhysicsList 중에 하나다.
2. G4RunManager 세팅
Geant4에는 시뮬레이션을 총괄하는 G4RunManager라는 것이 있다. 우리는 메인 프로그램에서 G4RunManager에게 어떤 초기화 클래스와 액션 클래스를 사용할지를 알려주어야 한다.
int main(int argc, char** argv) { G4RunManager* runManager = new G4RunManager; G4VModularPhysicsList* physicsList = new QGSP_BERT; runManager -> SetUserInitialization(physicsList); runManager -> SetUserInitialization(new OTDetectorConstruction()); runManager -> SetUserAction(new OTPrimaryGeneratorAction()); runManager -> SetUserAction(new OTEventAction()); runManager -> SetUserAction(new OTSteppingAction()); runManager -> Initialize(); ...
G4RuManager를 생성하고 PhysicsList, 그리고 우리가 만들어 볼 클래스들을 추가하였다. 마지막으로 Initialize()를 하면 초기화 클래스를 돌려서 시뮬레이션 준비를 마친다.
메인 프로그램에서 가장 중요한 부분이며 사용자가 다른 메인 프로그램을 작성 하더라도 이 부분만을 변경할 가능성이 크다.
3. 디스플레이를 위한 G4VisManager 세팅
G4VisManager* visManager = new G4VisExecutive; visManager -> Initialize();
4. 시뮬레이션 커맨드 라인을 위한 G4UImanager와 매크로 세팅
G4UImanager* UImanager = G4UImanager::GetUIpointer(); if (argc != 1) { G4String command = "/control/execute "; G4String fileName = argv[1]; UImanager -> ApplyCommand(command+fileName); } else { G4UIExecutive* ui = new G4UIExecutive(argc, argv); UImanager -> ApplyCommand("/control/execute vis.mac"); ui -> SessionStart(); delete ui; } delete visManager; delete runManager; return 0; }
Geant4 시뮬레이션을 돌리는 방법에는 두가지 방법이 있다.
- 시뮬레이션을 돌리기 위해서 미리 만들어 둔 매크로 파일을 사용해서 한번에 돌리는 방법.
- 커맨드 라인을 열어서 직접 시뮬레이션을 돌리는 방법. 매크로와 함께 사용 가능.
미리 만들어 둔 매크로 파일을 사용해서 한번에 돌리는 방법은 프로그램이 완성되어 별다른 확인을 하지 않고 돌릴 수 있을 때 사용한다. 위 코드에서
if (argc != 1) { G4String command = "/control/execute "; G4String fileName = argv[1]; UImanager -> ApplyCommand(command+fileName); }
부분에 해당된다. 이 코드는 프로그램을 돌릴 때
처럼 run.mac 이라는 매크로를 사용 하면 이 매크로에 들어있는 명령을 실행하고 시뮬레이션을 종료하도록 한다.
커맨드 라인을 열어서 시뮬레이션을 돌리는 방법은 프로그램이 완성되기 전에 어떻게 돌아가는지 확인을 할 때 많이 사용한다. 코드에서는 다음 부분에 해당한다.
else { G4UIExecutive* ui = new G4UIExecutive(argc, argv); UImanager -> ApplyCommand("/control/execute vis.mac"); ui -> SessionStart(); delete ui; }
프로그램을 다음와 같이 매크로없이 돌렸을 때
커맨드 라인을 실행한다. 위 코드에서
UImanager -> ApplyCommand("/control/execute vis.mac");
는 커맨드 라인을 실행하기 전에 vis.mac 이라는 매크로를 찾아서 실행하라는 명령이다. 매크로를 사용하기 싫다면 이 줄을 지우면 된다. 많은 경우 이벤트 디스플레이를 열어서 시뮬레이션의 진행상황을 확인 해보고 싶기 때문에 디스플레이 매크로를 넣어둔다.
이벤트 디스플레이를 사용하게 되면 시뮬레이션이 어떻게 돌아가는지 눈으로 확인 할 수 있지만 실행 시간이 몇배 이상 길어지게 되므로 오래걸리는 시뮬레이션을 돌릴 때는 사용하지 않도록 주의해야 한다.
참고