Geant4学习——入门(基本概念、Geant4工具包的结构、强制类、可选类)

Geant4是由欧洲核子研究组织基于C++面向对象技术开发的蒙特卡罗应用软件包,用于模拟粒子在物质中输运的物理过程。由于具有良好的通用性和扩展能力,Geant4在涉及微观粒子与物质相互作用的诸多领域获得了广泛应用。
Geant4学习——入门(基本概念、Geant4工具包的结构、强制类、可选类)

Geant4的基本概念

HEP中的模拟是“虚拟现实”。仿真既可用于在研发阶段帮助设计探测器,又可用于物理研究中了解探测器的响应。为了创建这样的虚拟现实,我们需要对粒子间的相互作用几何形状材料进行建模,以便将基本粒子传播到检测器中。我们还需要描述检测器生成原始数据的灵敏度。
Geant4是面向对象的工具包,它提供了在高能物理和其他领域进行仿真所需的功能。面向对象的好处有:

  1. 易于开发和维护
  2. 很好的模块化
  3. 协作者方便阅读和理解

讲述Geant4概念之前,先来看一个示例(B1):

int main(int argc,char** argv)  //程序开始
{
  // Detect interactive mode (if no arguments) and define UI session
  // 如果执行文件后面没有脚本文件,则开启可视化界面
  G4UIExecutive* ui = 0;    
  if ( argc == 1 ) {
    ui = new G4UIExecutive(argc, argv);
  }

  // Optionally: choose a different Random engine...
  // G4Random::setTheEngine(new CLHEP::MTwistEngine);
  
  // Construct the default run manager
  // 产生一个运行管理对象runManager,采用默认类型
  auto* runManager =
    G4RunManagerFactory::CreateRunManager(G4RunManagerType::Default);

  // Set mandatory initialization classes
  //
  // Detector construction
  // 用定义的运行管理对象
  runManager->SetUserInitialization(new B1DetectorConstruction());

  // Physics list
  // 创建物理过程对象physicsList
  G4VModularPhysicsList* physicsList = new QBBC;
  physicsList->SetVerboseLevel(1);  // 设置物理过程的详细级别为1级
  runManager->SetUserInitialization(physicsList); // 初始化运行管理对象runManager的物理过程
    
  // User action initialization
  runManager->SetUserInitialization(new B1ActionInitialization());  // 初始化B1示例中行为类
  
  // Initialize visualization
  // 初始化可视化管理对象visManager
  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();   // 获取指向可视化界面管理器的指针

  // 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;  // 释放执行对象ui内存
  }

  // 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;  // 释放运行管理对象内存
}

从B1示例的主函数中我们可以看到,Geant4的运行是依靠RunEventTrackStep这几个部分组成的:
Geant4学习——入门(基本概念、Geant4工具包的结构、强制类、可选类)
具体的运行过程为:
Geant4学习——入门(基本概念、Geant4工具包的结构、强制类、可选类)
下面开始逐个介绍其每部分的作用以及含义:

Run

和现实中我们做实验一样,run表示在实验中发射一束粒子。当运行一个run后,以下信息在这个run结束前不能更改:

  • 几何体结构
  • 定义的物理过程

某种意义上讲,一个run是一系列相同情况下event的集合。

Event

在开始运行之前,一个event包含了某种被定义的粒子,每个粒子被存入stack中,当粒子发射完,stack为空时,该event结束。
G4Event类表示一个event。 在结束时有以下能够收集以下信息:

  • 主要顶点和粒子列表
  • 轨迹信息(可选)
  • 探测器敏感区域中轨道物理交互信息
  • 探测器输出信息(例如ADC / TDC计数,触发信号)(可选)

Track

Track是存放每个粒子的信息,StepTrack的小段信息,但是Track不是Step的集合。Track在以下情况被析构(Delete):

  • 粒子离开World
  • 粒子物理消失(例如衰变)
  • 粒子的动能降至0并且不会发生其他的物理过程
  • 用户自定义

Track在以下三个类中产生:

  • G4Track
    – 位置、 粒子信息、径迹长度、 粒子飞行时间
    – 它的ID以及母ID
  • G4DynamicParticle
    – 动能、能量、时间、极化
    – 固定衰减通道
  • G4ParticleDefinition
    – 由相同类型的所有G4DynamicParticle共享
    – 质量、寿命、电荷、其他物理量
    – 衰减表

Step

Step具有两个点(Begin of step point,End of step point),还有粒子的“增量”信息(Step的能量损失,Step所花费的飞行时间等)。
每个点都知道粒子信息,如果步骤受体积边界限制,则端点物理上位于边界上,并且逻辑上属于下一个体积。
Geant4学习——入门(基本概念、Geant4工具包的结构、强制类、可选类)

Trajectory

TrajectoryTrack历史的记录。 它将轨道完成的所有步骤的一些信息存储为G4TrajectoryPoint类的对象。
由于内存消耗的角度来看,建议不要存储Trajectory中产生的次级粒子的轨迹。
用户可以从G4VTrajectoryG4VTrajectoryPoint基类创建自己的轨迹类,以存储对模拟有用的任何其他信息。

Geant4运行的基本流程

Geant4学习——入门(基本概念、Geant4工具包的结构、强制类、可选类)

如何开始Geant4

初始化

  1. 定义物质和几何体结构
  2. 定义粒子、物理过程以及加载需要的反应截面表
    Geant4学习——入门(基本概念、Geant4工具包的结构、强制类、可选类)

运行

  1. 导入几何体结构
    Geant4学习——入门(基本概念、Geant4工具包的结构、强制类、可选类)

  2. 循环Event
    – 若多于一个run,则配置不同几何体
    Geant4学习——入门(基本概念、Geant4工具包的结构、强制类、可选类)

用户需要定义的类

  • 初始化类
    – 在初始化中调用
    G4VUserDetectorConstruction
    G4VUserPhysicsList
  • 行为类
    – 在Event循环中调用的类
    G4VUserPrimaryGeneratorAction
    G4UserRunAction
    G4UserEventAction
    G4UserStackingAction
    G4UserTrackingAction
    G4UserSteppingAction

几个简单的输入输出流(G4cout,G4cerr,G4endl)

G4coutG4cerrG4endlG4ios.hh中定义,这些对象封装了机器/操作系统/编译器依赖。就像普通的std :: coutstd :: cerrstd :: endl一样使用它们。一些GUI使用这些ostream对象来保留自己的缓冲日志文件。不推荐使用std :: cin。 某些GUI无法正确处理std :: cin,使用用户定义的UI命令获取输入。

强制用户定义类

设置环境变量

这些操作在安装Geant4时理应设置好!

[ming@localhost geant4make]$ $G4SYSTEM
bash: Linux-g++: command not found...

[ming@localhost Desktop]$ cd $G4INSTALL
[ming@localhost geant4make]$ pwd
/usr/local/share/Geant4-10.7.1/geant4make

[ming@localhost geant4make]$ cd $G4WORKDIR
bash: cd: /home/ming/geant4_workdir: No such file or directory

[ming@localhost geant4make]$ cd $CLHEP_BASE_DIR 
[ming@localhost local]$ pwd
/usr/local

[ming@localhost ~]$ cd $G4LEVELGAMMADATA
[ming@localhost PhotonEvaporation5.7]$ pwd
/usr/local/share/Geant4-10.7.1/data/PhotonEvaporation5.7

还有一些其他变量,例如GUIVISROOT等!

主程序

Geant4不提供main(),需要用户自己编写。
主程序中,必须包含以下几个部分:

  • G4RunManager运行管理类,在程序的开头,一般创建一个单线程的运行管理类对象或者多线程运行管理类;
  • 将强制类设置到设置到运行管理对象中:
    – G4VUserDetectorConstruction
    – G4VUserPhysicsList
    – G4VUserPrimaryGeneratorAction
    用户可以定义VisManagerUI session以及其他行为类放到主程序中。

可视化

在主程序中,根据计算机环境,构造Geant4提供的G4UIsession具体类,并调用其sessionStart()方法来进行可视化,Geant4提供以下几种可视化的方式:

  • G4UIterminal——C-shell字符终端
  • G4GAG——基于Tcl / Tk或Java PVM的GUI
  • G4Wo——Opacs
  • G4UIBatch——宏文件的批处理文件(常用)

根据您的计算机环境从G4VVisManager派生用户自己的具体类。Geant4提供图形驱动程序的接口:

  • DAWN
  • WIRED
  • RayTracer
  • OPACS
  • OpenGL
  • OpenInventor
  • VRML

定义Detector

G4VUserDetectorConstruction抽象基类派生用户自己的具体类。
用户要在虚函数Construct()中定义以下内容:

  • 构建所有几何体需要的材料
  • 构建所有detector几何体体积
  • 构建探测器灵敏区

可以选择定义探测器元素的可视化属性。

选择物理过程

Geant4没有任何默认的粒子或过程,即使对于粒子传输,也必须明确定义它。
G4VUserPhysicsList抽象基类派生用户自己的具体类:

  • 定义所有必要的粒子
  • 定义所有必要的过程并将其分配给适当的粒子
  • 定义截止范围

Geant4提供了许多实用程序类/函数。

产生初级粒子

G4VUserPrimaryGeneratorAction抽象基类派生用户的具体类,将G4Event对象传递给一个或多个主要生成器具体类对象,这些对象生成主要顶点和主要粒子,Geant4提供了三个粒子生成器:

  • G4ParticleGun
  • G4HEPEvtInterface
    – 通过ascii文件连接到/hepevt/common
  • HepMC的接口。

用户可选类

必须在用户的main()中构造所有用户行为类,这些类的方法在Beam On期间被调用,并且必须将其设置为RunManager

G4UserRunAction

  • BeginOfRunAction(const G4Run*)
    – 定义直方图
  • EndOfRunAction(const G4Run*)
    – 收集直方图

G4UserEventAction

  • BeginOfEventAction(const G4Event*)
    Event选择
    – 定义直方图
  • EndOfEventAction(const G4Event*)
    – 分析Event

G4UserStackingAction

  • PrepareNewEvent()
  • ClassifyNewTrack(const G4Track*)
  • NewStage()

G4UserTrackingAction

  • PreUserTrackingAction(const G4Track*)
    – 确定轨迹是否存储
    – 创建用户定义的轨迹
  • PostUserTrackingAction(const G4Track*)

G4UserSteppingAction

  • UserSteppingAction(const G4Step*)
    – kill/暂停/推迟Track
    – 绘制步骤(对于不由轨迹存储的轨迹)

参考资料:
GettingStarted
B1

上一篇:技巧 | 程序员必备Linux常用命令大集合


下一篇:fatal: refusing to merge unrelated histories