GEANT4学习 第二节 以B1例子讲解G4的运行1

GEANT4学习 第二节 以B1例子讲解G4的运行1

以basic例子B1为例学习GEANT4.

首先要有一些准备知识,G4是以C++为基础的,需要一些C++的知识,特别是类的调用。

本文的学习也结合了一些网上大神们的博客,链接如下:

Geant4程序架构解析

第三讲——GEANT4程序结构及基本类

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 粒子数

来发射粒子,完成模拟。

  • 21
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

于谦烫头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值