GEANT4学习 第二节 以B1例子讲解G4的运行1
以basic例子B1为例学习GEANT4.
首先要有一些准备知识,G4是以C++为基础的,需要一些C++的知识,特别是类的调用。
本文的学习也结合了一些网上大神们的博客,链接如下:
1. B1有哪些文件
在B1的文件夹里,一共有如下文件:
|——include
|————B1ActionInitialization.hh
|————B1DetectorConstruction.hh
|————B1EventAction.hh
|————B1PrimaryGeneratorAction.hh
|————B1RunAction.hh
|————B1SteppingAction.hh
|——src
|————B1ActionInitialization.cc
|————B1DetectorConstruction.cc
|————B1EventAction.cc
|————B1PrimaryGeneratorAction.cc
|————B1RunAction.cc
|————B1SteppingAction.cc
|——CMakeLists.txt
|——exampleB1.cc
|——exampleB1.in
|——exampleB1.out
|——G4History.macro
|——GNUmakefile
|——History
|——init_vis.mac
|——run1.mac
|——run2.mac
|——vis.mac
|——README
|——.README.txt
下面我们每个文件的分门别类的学习下:
首先是编译文件,包括
|——CMakeLists.txt
G4是用CMake编译的,该文件为编译的组态档文件
cmake和CMakeLists.txt是什么
|——GNUmakefile
Makefile是make执行时读取的规则文件
GNUmake与Makefile的简介
模拟控制文件,主要包括:
|——run1.mac
|——run2.mac
含一批命令,设置模拟的条件,控制实际的运行
可使用终端命令 /control/execute run1.mac 以及 /control/execute run2.mac 调用
|——vis.mac
控制图形显示界面的产生和各类参数(一般通过OPENGL)
关于vis的语法,可以学习学习
调用:
/control/execute vis.mac
|——exampleB1.in
|——exampleB1.out
在B1里面是用作test的,也可以通过这两个文件来运行程序
可以在终端通过 ./exampleB1 exampleB1.in > exampleB1.out 命令调用
|——init_vis.mac
宏文件,同样也是运行控制文件,B1例子里面就是直接调用这个文件来初始化内核、运行的。
B1用来调用的代码
UImanager->ApplyCommand("/control/execute init_vis.mac");
其他文件
|——History
该文件主要是注明各个版本的改版,是B1的历史文件
|——README
|——.README.txt
帮助学习的说明文件
|——G4History.macro
我猜测是宏文件运行时候的历史文件
源码文件
|——exampleB1.cc
这个是B1例子的主程序
终端编译之后,通过 exampleB1 命令调用
|——include
include文件夹里面是编码文件的头文件,.hh是GEANT4的头文件文件名,其实就是在.h后面加了一个>h。这些头文件和.cc文件其实可以和主程序写到一个文件里。但是那样结构不清晰,GEANT4这样,把>头文件写到include文件夹,.cc文件写到src文件夹,结构非常清晰。
|————B1ActionInitialization.hh
|————B1DetectorConstruction.hh
|————B1PrimaryGeneratorAction.hh
这三个是强制类,是模拟运行的基础
|————B1EventAction.hh
|————B1RunAction.hh
|————B1SteppingAction.hh
这三个类是提取信息的类
之后会仔细的讲解这些类的调用
|——src
这个文件夹是include里对应的函数源码文件。
|————B1ActionInitialization.cc
|————B1DetectorConstruction.cc
|————B1EventAction.cc
|————B1PrimaryGeneratorAction.cc
|————B1RunAction.cc
|————B1SteppingAction.cc
2. B1的运行逻辑
很多人在学习G4的时候,都是在别人已经写好的例子或者class上改一些代码,来实现自己想要的功能。
但很多时候,自己模拟想获取的东西,找不到合适的例子,我想,弄清楚一个G4程序是如何运行的,对我们实现想做的模拟工作,是十分有帮助的。
首先,如何运行B1的例子呢?
在B1路径下打开终端
输入命令
make -j
回车,编译,编译会读取 |——GNUmakefile 文件
完成编译会出现如下反馈:
Linking exampleB1
... Done!
再输入命令
exampleB1
即可运行exampleB1.cc文件
|——exampleB1.cc
我们先看主文件部分
第1、2部分,是在判断UI模式和选择随机数生成器:
// Detect interactive mode (if no arguments) and define UI session
//
G4UIExecutive* ui = 0;
if ( argc == 1 ) {
ui = new G4UIExecutive(argc, argv);
}
// Choose the Random engine
G4Random::setTheEngine(new CLHEP::RanecuEngine);
第3部分是申明 G4RunManager 类,这一步是必须的,RunManager是G4的关键,是整个程序的串联。
在B1里面,做了多核运算的判断。多核运算的时候,需要申明 G4MTRunManager 类。
// Construct the default run manager
//
#ifdef G4MULTITHREADED
G4MTRunManager* runManager = new G4MTRunManager;
#else
G4RunManager* runManager = new G4RunManager;
#endif
第4部分也是必须的,强制初始化类,这三个类的初始化是必须的,这三个类分别是几何、物理过程和用户动作初始化。在用户动作初始化B1ActionInitialization类里面,必须要申明初始粒子生成器。
B1里面的物理过程使用的是QBBC
// Set mandatory initialization classes
//
// Detector construction
runManager->SetUserInitialization(new B1DetectorConstruction());
// Physics list
G4VModularPhysicsList* physicsList = new QBBC;
physicsList->SetVerboseLevel(1);
runManager->SetUserInitialization(physicsList);
// User action initialization
runManager->SetUserInitialization(new B1ActionInitialization());
第5部分 可视化的初始化及UI指针申明
// Initialize visualization
//
G4VisManager* visManager = new G4VisExecutive;
// G4VisExecutive can take a verbosity argument - see /vis/verbose guidance.
// G4VisManager* visManager = new G4VisExecutive("Quiet");
visManager->Initialize();
// Get the pointer to the User Interface manager
G4UImanager* UImanager = G4UImanager::GetUIpointer();
第6部分 调用 init_vis.mac 宏文件
// Process macro or start UI session
//
if ( ! ui ) {
// batch mode
G4String command = "/control/execute ";
G4String fileName = argv[1];
UImanager->ApplyCommand(command+fileName);
}
else {
// interactive mode
UImanager->ApplyCommand("/control/execute init_vis.mac");
ui->SessionStart();
delete ui;
}
这里面,使用UImanager的命令调用宏文件,即:
UImanager->ApplyCommand("/control/execute init_vis.mac");
我们下一节来看宏文件
第7部分 删除visManager、runManager,释放内存。
// Job termination
// Free the store: user actions, physics_list and detector_description are
// owned and deleted by the run manager, so they should not be deleted
// in the main() program !
delete visManager;
delete runManager;
|——init_vis.mac
exampleB1 主程序里面 调用了这个宏文件。这个宏文件的代码如下:
在G4里面有一个必须做的事,就是内核的初始化,在B1里面,该步在这个宏文件里面实现了内核的初始化。
# Macro file for the initialization of example B1
# in interactive session
#
# Set some default verbose
/control/verbose 2
/control/saveHistory
/run/verbose 2
#
# Change the default number of threads (in multi-threaded mode)
#/run/numberOfThreads 4
#
# Initialize kernel
/run/initialize
#
# Visualization setting
/control/execute vis.mac
在这个宏文件里,调用 vis.mac 文件调出openGL可视化界面,在可视化界面,我们需要使用:
/run/beamOn 粒子数
来发射粒子,完成模拟。