메인 프로그램에서 해주어야 할 일을 각 단계별로 나누어서 보자.
1. 헤더파일
1 2 3 4 5 6 7 8 9 10 11 12 | #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에게 어떤 초기화 클래스와 액션 클래스를 사용할지를 알려주어야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 | 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 세팅
1 2 | G4VisManager* visManager = new G4VisExecutive; visManager -> Initialize(); |
4. 시뮬레이션 커맨드 라인을 위한 G4UImanager와 매크로 세팅
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 시뮬레이션을 돌리는 방법에는 두가지 방법이 있다.
- 시뮬레이션을 돌리기 위해서 미리 만들어 둔 매크로 파일을 사용해서 한번에 돌리는 방법.
- 커맨드 라인을 열어서 직접 시뮬레이션을 돌리는 방법. 매크로와 함께 사용 가능.
미리 만들어 둔 매크로 파일을 사용해서 한번에 돌리는 방법은 프로그램이 완성되어 별다른 확인을 하지 않고 돌릴 수 있을 때 사용한다. 위 코드에서
1 2 3 4 5 6 | if (argc != 1) { G4String command = "/control/execute "; G4String fileName = argv[1]; UImanager -> ApplyCommand(command+fileName); } |
부분에 해당된다. 이 코드는 프로그램을 돌릴 때
처럼 run.mac 이라는 매크로를 사용 하면 이 매크로에 들어있는 명령을 실행하고 시뮬레이션을 종료하도록 한다.
커맨드 라인을 열어서 시뮬레이션을 돌리는 방법은 프로그램이 완성되기 전에 어떻게 돌아가는지 확인을 할 때 많이 사용한다. 코드에서는 다음 부분에 해당한다.
1 2 3 4 5 6 7 | else { G4UIExecutive* ui = new G4UIExecutive(argc, argv); UImanager -> ApplyCommand("/control/execute vis.mac"); ui -> SessionStart(); delete ui; } |
프로그램을 다음와 같이 매크로없이 돌렸을 때
커맨드 라인을 실행한다. 위 코드에서
1 | UImanager -> ApplyCommand("/control/execute vis.mac"); |
는 커맨드 라인을 실행하기 전에 vis.mac 이라는 매크로를 찾아서 실행하라는 명령이다. 매크로를 사용하기 싫다면 이 줄을 지우면 된다. 많은 경우 이벤트 디스플레이를 열어서 시뮬레이션의 진행상황을 확인 해보고 싶기 때문에 디스플레이 매크로를 넣어둔다.
이벤트 디스플레이를 사용하게 되면 시뮬레이션이 어떻게 돌아가는지 눈으로 확인 할 수 있지만 실행 시간이 몇배 이상 길어지게 되므로 오래걸리는 시뮬레이션을 돌릴 때는 사용하지 않도록 주의해야 한다.
참고