1、Geant4 Users Guide- For Application Developers -1. 简介2. 运行 Geant4 一个简单的例子1. 如何编写 main() 函数2. 如何定义一个探测器的几何形状3. 如何指定探测器的材料4. 如何指定粒子5. 如何指定物理过程6. 如何产生一个初级事件7. 如何生成 (Make)一个可执行的程序8. 如何建立一个交互式的程序接口 (Session)9. 如何运行一个程序10. 如何可视化探测器和事件3. 工具包基本组成1. G4 的各个功能模块和它们的功能2. 全局类3. 单位系统4. Run5. 事件6. 事件发生器接口7. 事件偏倚技巧
2、4. 探测器定义和响应1. 几何2. 材料3. 电磁场4. Hits5. 数字化6. 对象的持续性5. 粒子跟踪和物理过程1. 粒子跟踪2. 物理过程3. 粒子4. 产物阈值与截断值5. 分区域截断Geant4 Users DocumentsVersion: Geant4 5.2 June 20036. 用户行为 (Actions)1. 必要的用户行为 (Actions)和初始化2. 可选的用户行为 (Actions)7. 应用程序的通讯和控制1. 内建命令2. 用户接口 -定义新的命令8. 可视化1. 可视化介绍2. 什么可以被可视化 ?3. 与可视化有关的属性4. 折线 ,标记和文字5.
3、生成一个可视化的可执行程序6. 可视化引擎7. 交互式可视化8. 非交互式可视化9. 内建可视化命令10. 其他9. 例子1. 入门例子2. 高级例子10. 附录1. Geant4 程序编译提示2. 数据分析接口3. CLHEP 基本类库4. C+ 标准模板库5. Makefiles 和 Geant4 环境变量6. 使用 MS Visual C+编译 Geant47. 开发和调试工具About the authors1. 简介1.1 本手册内容 The Users Guide for Application Developers是用户在学习和开发基于 Geant4 的探测器模拟程序时,应该阅读
4、的第一手册。手册主要讲述: 向初学者介绍面向对象的 Geant4 探测器模拟工具包,Geant4 Users GuideFor Application Developers 介绍了各种可用工具和他们的使用方法,并且 提供了一些对开发、运行模拟程序非常有用的信息手册只是对工具包的一个概述,而不是详尽的描述。除一些特殊的工具外,没有讨论相关的物理过程。 Geant4 中所涉及的相关物理过程在 Physics Reference Manual中有详细讨论。Geant4 类的功能和设计细节可以在 Users Guide for Toolkit Developers中找到,它的全 部代码清单在 Soft
5、ware Reference Manual中给出。Geant4 是一个用 C语言编写的、全新的探测器模拟工具包。读者需要有面向对象的 C语言的基本知识。不需要有早期用 FORTRAN 编写的 Geant 版本的知识。虽然 Geant4 是个相当复杂的软件系统,但对于开发探测器模拟程序来说,只需要了解相对很少的一部分。1.2 如何使用本手册第 2 章, ”运行 Geant4一个简单的 example”。 Geant4 非常简单的介绍。讲述了编写和运行一个简单的 Geant4 应用程序的方法。 Geant4 的新用户应该首先阅读这一章。强烈推荐在阅读本章的时候在你的计算机上安装并运行一个 Gean
6、t4 工具包。当我们在讨论 Geant4 提供的 example 时,我们可以运行这些例子,这将是非常有益的。在安装 Geant4 的时候,请查阅 Installation Guide for Setting up Geant4 in Your Computing Environment。第 3 章, “工具包基本组成 “ 讨论 Geant4 的基本问题,例如类属于哪个功能模块、和物理单位系统。然后讨论了 runs 和事件,他们都是一个模拟过程的基本组成单位。第 4 章, “探测器定义和响应 “ 描述了如何创建一个特定材料和形状的探测器,并且将这个探测器放置与电磁场中。同时,还描述了如何使探测
7、器对粒子敏感,如何保存相关的信息。第 5 章, “粒子跟踪和物理过程 “ 讨论了粒子如何在介质中输运。 Geant4 的粒子跟踪方法与物理过程一起由工具包提供。本章还讨论了粒子在 Geant4 中的定义和实现,最后列出了一个粒子属性清单。第 6 章, “用户行为 (Actions)“ 是 Geant4 提供的一些 hooks,通过这些 hooks,用户可以执行一些特殊的、定制的任务。第 7 章, “应用程序的通讯和控制 “ 概述了用户可用的、用于控制程序执行的命令。在第 2章以后,第 6、 7 两章对新用户来说是最重要的。第 8 章, “可视化 “ 探测器几何、粒子径迹和事件的显示。第 9 章
8、, “例子 “ 提供了一些入门和比较高级的模拟程序代码, 可以不作任何修改进行编译。这些例子非常适用与学习使用 Geant4 工具包,并可以基于这些例子,开发更加复杂的应用程序。About the authors2. 运行 Geant4 一个简单的例子1. 如何编写 main() 函数1. 一个 main() 函数的例子2. G4RunManager 类3. 用户初始化( Initialization)和行为( Action)类4. G4UImanager 类和发送 UI 用户接口命令5. G4cout 和 G4cerr2. 如何定义一个探测器的几何形状1. 基本概念2. 创建一个简单的几何体
9、3. 选择一个实体( Solid)4. 创建一个逻辑几何体5. 放置一个几何体6. 创建一个物理几何体7. 坐标系和旋转3. 如何指定探测器的材料1. 通常情况2. 定义一种简单材料3. 定义一种分子4. 通过质量百分数定义一种混合物5. 打印材料信息4. 如何指定粒子1. 粒子定义2. 截断范围5. 如何指定物理过程1. 物理过程2. 物理过程管理3. 指定物理过程6. 如何产生一个初级事件1. 产生初级事件2. G4VPrimaryGenerator 类7. 如何生成 (Make)一个可执行的程序1. 在一种 UNIX 环境下编译例子 1( ExampleN01)2. 在 Windows
10、环境下编译例子 1( ExampleN01)8. 如何建立一个交互式的程序接口 (Session)Geant4 Users DocumentsGeant4 Users GuideFor Application Developers1. 简介2. 可用的接口类简述3. 建立接口库4. 如何使用交互式接口9. 如何运行一个程序1. 简介2. Hard-coded 批处理模式3. 使用宏文件的批处理模式4. 命令行驱动的交互模式5. 通常情况10. 如何可视化探测器和事件1. 介绍2. 可视化引擎3. 如何将可视化引擎链接到一个可执行文件中4. 编写一个包含可视化的 main() 函数5. Scen
11、e, Scene Handler, 和 Viewer6. 可视化程序接口例子7. 常用的可视化命令8. 探测器几何体的树型结构可视化About the authors2.1 如何编写 main() 函数2.1.1 一个 main()函数的例子main()函数包含的内容将因特定的模拟应用不同而不同,因此必须由用户提供。 Geant4 工具包不提供 main() 函数,但提供了一个简单的例子指导用户编写自己的 main()函数。程序清单 2.1.1 是一个模拟程序所必须的 main() 函数的最简单例子。Geant4 Users GuideFor Application DevelopersGet
12、ting Started with Geant4#include “G4RunManager.hh“#include “G4UImanager.hh“#include “ExN01DetectorConstruction.hh“#include “ExN01PhysicsList.hh“main() 函数通过 Geant4 提供的两个类 G4RunManager 和 G4UImanager,和另外三个类,ExN01DetectorConstruction, ExN01PhysicsList 和 ExN01PrimaryGeneratorAction, 它们是从Geant4 提供的类派生的。下一
13、节将对这些类进行讨论。2.1.2 G4RunManager 类main() 函数必须做的第一件事是创建一个 G4RunManager 类的实例。 这是 Geant4 内核中唯一的一个运行管理类, 它必须在 main()函数中显式的创建。它控制程序的流程并在一个 run#include “ExN01PrimaryGeneratorAction.hh“int main()/ 构造缺省 run managerG4RunManager* runManager = new G4RunManager;/ 设置必须的初始化类runManager-SetUserInitialization(new ExN01
14、DetectorConstruction);runManager-SetUserInitialization(new ExN01PhysicsList);/ 设置必须的用户行为类runManager-SetUserAction(new ExN01PrimaryGeneratorAction);/ 初始化 G4 内核runManager-initialize();/ 获取指向 UI manager 的指针并设置 verbositiesG4UImanager* UI = G4UImanager:GetUIpointer();UI-ApplyCommand(“/run/verbose 1“);UI-
15、ApplyCommand(“/event/verbose 1“);UI-ApplyCommand(“/tracking/verbose 1“);/ 启动一个 runint numberOfEvent = 3;runManager-BeamOn(numberOfEvent);/ 任务结束delete runManager;return 0;代码清单 2.1.1中管理事件循环。当 G4RunManager 被创建时,其它的管理类同时被创建。它们在G4RunManager 被删除的时候自动删除。运行管理类同时管理初始化进程,包括在用户初始化类中的方法。我们必传递所有必须的消息给运行控制进程,以建立并
16、运行一个模拟过程,这些消息包括:1. 探测器将如何构建,2. 将被模拟的所有粒子和所有物理过程,3. 在一个事件中的初级粒子将如何产生和4. 其他模拟必须的消息。在这个例子中,这些代码是runManager-SetUserInitialization(new ExN01DetectorConstruction);runManager-SetUserInitialization(new ExN01PhysicsList);分别创建指定探测器几何和物理过程的对象,并传递这些指针给运行管理进程。ExN01DetectorConstruction 是一个用户初始化类的例子,它是从G4VUserDete
17、ctorConstruction 类派生的。这个类描述整个探测器的结构,包括: 探测器的几何形状, 在探测器中使用的材料, 探测器的敏感区域定义和 这些敏感区域的读出方式。同样 ExN01PhysicsList 是由 G4VUserPhysicsList 派生,要求用户定义 在模拟中将被使用的粒子, 这些粒子的截断范围和 所有将被模拟的物理过程。在 main() 函数中的下一个指令是runManager-SetUserAction(new ExN01PrimaryGeneratorAction);建立一个粒子发生器的实例并传递指向他的指针给运行管理进程。ExN01PrimaryGenerato
18、rAction 是一个用户行为 (action)类的例子,它从G4VUserPrimaryGeneratorAction 派生。在该类中,用户必须描述初级事件的初始状态。这个类有一个公有虚方法 generatePrimaries() ,它将在每个事件的开始时刻被调用。详细的描述请阅读 2.6 节 。注意, Geant4 不提供任何缺省行为用于产生一个初级事件。下一个指令是runManager-initialize();建立探测器结构,创建物理过程,计算截面并且建立 run。最后int numberOfEvent = 3;runManager-beamOn(numberOfEvent);运行管理
19、进程开始 3 个顺序执行的事件的第一个 run。 beamOn() 方法可以在 main()函数中被调用任意多次。一旦开始一次 run,探测器结构和物理过程都不可以更改。然而,如 3.4.4节 所述,它们可以在两次 run 之间进行更改。更多关于 G4RunManager 的信息可以在 3.4 节找到。如上所述,其它管理类在运行管理类创建的时候创建。其中一个是用户接口管理类,G4UImanager 。在 main() 函数中,必须获取指向用户接口管理进程的指针。G4UImanager* UI = G4UImanager:getUIpointer();在本例中, applyCommand()被调
20、用了 3 次,发命令给应用程序,让应用程序打印出 run、事件和粒子跟踪的信息。用户能够使用大量可用的用户接口命令对模拟过程进行控制。这些命令可以在 7.1 节 找到。2.1.3 用户初始化(Initialization)和行为(Action) 类必需的用户类有三个类必需由用户定义。两个是用户初始化类,另一个是用户行为 (action)类。它们必须由Geant4 提供的抽象基类 G4VUserDetectorConstruction, G4VuserPhysicsList andG4VuserPrimaryGeneratorAction 派生。 Geant4 不提供这些类的缺省方法。 G4Ru
21、nManager 在调用 initialize() 和 BeamOn()方法的时候,检查这些必须的类是否存在。就像在上节中提到的, G4VUserDetectorConstruction 要求用户定义探测器,G4VUserPhysicsList 要求用户定义物理过程。探测器定义将在 2.2 和 2.3 节讨论。物理定 义将在 2.4 和 2.5 节讨论。用户行为 (action)类 G4VuserPrimaryGeneratorAction 要求定义初级事件状态。初级事件产生将在 2.6 节 讨论。可选用户行为 (Action)类Geant4 提供了 5 个用户 hook 类: G4UserR
22、unAction G4UserEventAction G4UserStackingAction G4UserTrackingAction G4UserSteppingAction在这些类中,有几个虚方法允许用户在模拟程序的各个层次添加其它代码。有关用户初始化和行为 (action)类的详细讨论在 第 6 章 。2.1.4. G4UImanager 类和发送 UI 用户接口命令Geant4 提供了一大类叫 intercoms 的类。 G4UImanager 是这个大类(类属)中的管理类。你可以通过调用这些类对象的 set 方法来使用这些类的功能。在代码清单 2.1.1 中,各种 Geant4管理
23、类的初始化信息被设置。 intercoms 的机制和使用方法的详细描述,将在下一章进行讨论,并会列出可用的用户接口命令。用户接口命令的发送可以在整个应用程序中进行。#include “G4RunManager.hh“#include “G4UImanager.hh“#include “G4UIterminal.hh“#include “N02VisManager.hh“#include “N02DetectorConstruction.hh“#include “N02PhysicsList.hh“#include “N02PrimaryGeneratorAction.hh“#include “
24、N02RunAction.hh“#include “N02EventAction.hh“#include “N02SteppingAction.hh“#include “g4templates.hh“int main(int argc,char* argv)/ 构造缺省的 run managerG4RunManager * runManager = new G4RunManager;/ 设置必须的初始化类N02DetectorConstruction* detector = new N02DetectorConstruction;runManager-SetUserInitialization
25、(detector);runManager-SetUserInitialization(new N02PhysicsList);/ 可视化 managerG4VisManager* visManager = new N02VisManager;visManager-initialize();/ 设置用户行为类runManager-SetUserAction(new N02PrimaryGeneratorAction(detector);runManager-SetUserAction(new N02RunAction);runManager-SetUserAction(new N02Event
26、Action);runManager-SetUserAction(new N02SteppingAction);/ 获取指向 UI manager 的指针G4UImanager* UI = G4UImanager:GetUIpointer();2.1.5 G4cout 和 G4cerr虽然在上例中没有包含输出流,但通常它是需要的。 G4cout 和 G4cerr 是由 Geant4 定义的iostream 对象。 这些对象的使用, 除了输出流被 G4UImanager 处理外,其余是与普通的 cout和 cerr 完全相同的。因此,输出字符串可能显示在其它的窗口或者存到一个文件中。有关这些输出
27、流的处理在 7.2.4 节 中描述。用户应该使用这些对象来代替普通的 cout 和 cerr。About the authors2.2 如何定义一个探测器的几何形状if(argc=1)/ 定义交互式 (G)UI 终端G4UIsession * session = new G4UIterminal;UI-ApplyCommand(“/control/execute prerun.g4mac“);session-sessionStart();delete session;else/ 批处理模式G4String command = “/control/execute “;G4String fileN
28、ame = argv1;UI-ApplyCommand(command+fileName);/ 任务结束delete visManager;delete runManager;return 0;代码清单 2.1.2一个使用交互式终端和可视化的 main() 函数例子, 与代码清单 2.1.1 中不同的部分用蓝色显示Geant4 Users GuideFor Application DevelopersGetting Started with Geant42.2.1 基本概念在 Geant4 中,探测器几何体是由大量几何体组成的。其中,最大的的几何体叫世界 (World)。它包含其他所有的几何体
29、。其它的几何体,都被创建并放置在世界 (World)中。每个几何体都通过描述它的形状和物理特性来创建,然后放置到另一个几何体中。当一个几何体被放置到另一个中时,我们叫前者为子几何体,后者为母几何体。用相对于母体坐标系的坐标指定子体放置的位置。为了描述几何体的形状,我们使用实体的概念。一个实体是指一个有固定形状和尺寸的几何物体。一个边长 10cm 的立方体和一个半径 30cm、高 75cm 的圆柱体都是具体的实体。为了描述几何体的全部属性,我们使用逻辑几何体的概念。逻辑几何体包括实体的所有几何特性,和另外的物理特性:几何体的材料;是否包含探测器的敏感单元;磁场;等等。我们必须描述如何放置几何体。
30、为此,需要建立一个物理几何体,用于放置逻辑体的拷贝。2.2.2 创建一个简单的几何体创建一个几何体需要做什么? 创建一个实体 用这个实体,加上其他属性,创建一个逻辑体。2.2.3 选择一个实体(solid)为了创建一个简单的盒子,只需要定义它的名字和它各边的长度。可以在 Novice ExampleN01 中找到这样的例子。在探测器定义的代码 ExN01DetectorConstruction.cc 中,你可以找到如下定义盒子的代码:G4double expHall_x = 3.0*m;G4double expHall_y = 1.0*m;这段代码创建了一个叫 “expHall_box“的盒子
31、,这个盒子在沿 X 轴方向从 -3.0m 到 3m,沿 Y轴方向从 -1m 到 1m,沿 Z 轴方向从 -1m 到 1m。它还使用 G4Tubs 创建了一个圆柱体。这段代码创建了一个叫 “tracker_tube“的圆柱体,半径为 60cm,高为 50cm。2.2.4 创建一个逻辑几何体为了创建一个逻辑体,你必须首先创建实体和材料。所以,可以使用用上节已经建立的盒子,创建一个用氩气(参看有关材料的章节)填充的简单逻辑体:G4LogicalVolume* experimentalHall_log= new G4LogicalVolume(experimentalHall_box,Ar,“expH
32、all_log“);这个逻辑体叫 “expHall_log“。G4double expHall_z = 1.0*m;G4Box* experimentalHall_box= new G4Box(“expHall_box“,expHall_x,expHall_y,expHall_z);代码清单 2.2.1创建一个盒子G4double innerRadiusOfTheTube = 0.*cm;G4double outerRadiusOfTheTube = 60.*cm;G4double hightOfTheTube = 50.*cm;G4double startAngleOfTheTube = 0
33、.*deg;G4double spanningAngleOfTheTube = 360.*deg;G4Tubs* tracker_tube= new G4Tubs(“tracker_tube“,innerRadiusOfTheTube,outerRadiusOfTheTube,hightOfTheTube,startAngleOfTheTube,spanningAngleOfTheTube);代码清单 2.2.2创建一个圆柱体同样,我们也可以用圆柱体创建一个填充铝的逻辑体。G4LogicalVolume* tracker_log= new G4LogicalVolume(tracker_tub
34、e,Al,“tracker_log“);名为 “tracker_log“2.2.5 放置一个几何体如何放置一个几何体?如果已经创建了一个逻辑体,然后你可以决定将这个逻辑体放置到另一个已经存在的几何体中。然后决定将这个几何体的中心放置到另一个几何体的什么位置,并且如何旋转。一旦这些都确定了,那么就可以创建一个物理体了。物理体是一个已经放置的几何体实例,它包含几何体的所有属性。2.2.6 创建一个物理几何体通过逻辑体来创建一个物理体。一个物理体是一个已经放置了的逻辑体实例。这个实例必须被放置在另外一个逻辑母几何体之中。为了简化,下面的例子是不旋转的:以上将逻辑体 tracker_log 放置在母体
35、 experimentalHall_log的坐标原点,不旋转。生成的物理体叫 “tracker“,它的拷贝序号为 0。一个物理体必须放置在另一个母体之中的规则有一个例外。那就是世界 (World),它是被创建的最大的几何体,包含其他所有几何体。这个几何体很明显不可以被包含于其他任何几何体G4double trackerPos_x = -1.0*meter;G4double trackerPos_y = 0.0*meter;G4double trackerPos_z = 0.0*meter;G4VPhysicalVolume* tracker_phys= new G4PVPlacement(0,
36、 / 不旋转G4ThreeVector(trackerPos_x,trackerPos_y,trackerPos_z),/ 子体在母体中的坐标tracker_log, / 子逻辑体指针“tracker“, / 物理体名experimentalHall_log, / 母逻辑体指针false, / 无布尔操作0); / 物理体的拷贝序号代码清单 2.2.3一个简单物理体中。它必须使用空母体指针通过 G4PVPlacement 来创建,它同样必须是不旋转的,必须被放置于全局坐标原点。通常,最好选用一个简单的实体作为世界。在例 N01,我们使用 experimental hall:2.2.7 坐标系和
37、旋转在 Geant4 中,与一个已放置的物理体相关的旋转矩阵描述的是这个几何体的坐标系相对于母体坐标系的旋转变换。一个旋转矩阵的建立通常与 CLHELP 一样,通过实例化一个单位矩阵,然后对这个单位矩阵进行旋转变换。在例 N04 中有这样的示例。About the authors2.3 如何指定探测器的材料2.3.1 通常情况G4VPhysicalVolume* experimentalHall_phys= new G4PVPlacement(0, /不旋转G4ThreeVector(0.,0.,0.), /子体在母体中的坐标experimentalHall_log, /子逻辑体指针“expH
38、all“, /物理体名0, /母逻辑体指针false, /无布尔操作0); /物理体的拷贝序号代码清单 2.2.4例 N01 中的世界Geant4 Users GuideFor Application DevelopersGetting Started with Geant4在自然界,通常材料 (化合物,混合物 )是由元素组成的,元素又是由同位素组成的。因此,在 Geant4 中有三个主要的类,每一个类都有一个表作为一个静态数据成员,用于跟踪这些类各自的实例。G4Element 描述原子属性: 原子序数, 核子数 , 原子质量, 壳层能量, 和其他量,如原子截面,等等G4Material 描述
39、物质的宏观属性: 密度, 状态, 温度, 压强, 和其他宏观量,如辐射长度,平均自由程,单位长度能损,等等。G4Material 对工具包中的其它部分是可见的,用于粒子跟踪,几何体,和物理过程。它包含可能是其组成成分的元素和同位素的所有信息,同时,它隐藏这些实现细节。2.3.2 定义一种简单材料在下例中,通过指定材料名字,密度,摩尔质量和原子数创建了液 Ar。lAr 为指向该材料的指针,将用于指定一个给定逻辑体的材料:G4LogicalVolume* myLbox = new G4LogicalVolume(aBox,lAr,“Lbox“,0,0,0);2.3.3 定义一种分子G4double
40、 density = 1.390*g/cm3;G4double a = 39.95*g/mole;G4Material* lAr = new G4Material(name=“liquidArgon“, z=18., a, density);代码清单 2.3.1创建液 Ar在下例中,通过指定组成成分的分子中各种原子的数目,创建了水这种材料。2.3.4 通过质量百分数定义一种混合物下例中,通过指定各种成分的质量百分数,我们创建了空气这种混合物。2.3.5 打印材料信息a = 1.01*g/mole;G4Element* elH = new G4Element(name=“Hydrogen“,sy
41、mbol=“H“ , z= 1., a);a = 16.00*g/mole;G4Element* elO = new G4Element(name=“Oxygen“ ,symbol=“O“ , z= 8., a);density = 1.000*g/cm3;G4Material* H2O = new G4Material(name=“Water“,density,ncomponents=2);H2O-AddElement(elH, natoms=2);H2O-AddElement(elO, natoms=1);代码清单 2.3.2通过定义分子来创建水 .a = 14.01*g/mole;G4E
42、lement* elN = new G4Element(name=“Nitrogen“,symbol=“N“ , z= 7., a);a = 16.00*g/mole;G4Element* elO = new G4Element(name=“Oxygen“ ,symbol=“O“ , z= 8., a);density = 1.290*mg/cm3;G4Material* Air = new G4Material(name=“Air “,density,ncomponents=2);Air-AddElement(elN, fractionmass=70*perCent);Air-AddElem
43、ent(elO, fractionmass=30*perCent);代码清单 2.3.3通过定义组分的质量百分数创建空气G4cout GetProcessManager();/ Construct processes for gammaG4PhotoElectricEffect * thePhotoElectricEffect = new G4PhotoElectricEffect();G4ComptonScattering * theComptonScattering = new G4ComptonScattering();G4GammaConversion* theGammaConvers
44、ion = new G4GammaConversion();/ Register processes to gammas process managerpmanager-AddDiscreteProcess(thePhotoElectricEffect);pmanager-AddDiscreteProcess(theComptonScattering);pmanager-AddDiscreteProcess(theGammaConversion);代码清单 2.5.2给一个 gamma 注册物理过程Geant4 Users GuideFor Application DevelopersGett
45、ing Started with Geant4G4VPrimaryGenerator 类完成的,这将在下一小节中讨论。用户的G4VUserPrimaryGeneratorAction 构造类,只是描述了初级粒子的产生方式。#ifndef ExN01PrimaryGeneratorAction_h#define ExN01PrimaryGeneratorAction_h 1#include “G4VUserPrimaryGeneratorAction.hh“class G4ParticleGun;class G4Event;class ExN01PrimaryGeneratorAction :
46、public G4VUserPrimaryGeneratorActionpublic:ExN01PrimaryGeneratorAction();ExN01PrimaryGeneratorAction();public:void generatePrimaries(G4Event* anEvent);private:G4ParticleGun* particleGun;#endif#include “ExN01PrimaryGeneratorAction.hh“#include “G4Event.hh“#include “G4ParticleGun.hh“#include “G4ThreeVe
47、ctor.hh“#include “G4Geantino.hh“#include “globals.hh“ExN01PrimaryGeneratorAction:ExN01PrimaryGeneratorAction()G4int n_particle = 1;particleGun = new G4ParticleGun(n_particle);particleGun-SetParticleDefinition(G4Geantino:GeantinoDefinition();particleGun-SetParticleEnergy(1.0*GeV);particleGun-SetParti
48、clePosition(G4ThreeVector(-2.0*m,0.0*m,0.0*m);ExN01PrimaryGeneratorAction:ExN01PrimaryGeneratorAction()2.6.1.1粒子发生器的选择在用户的 G4VUserPrimaryGeneratorAction 类的构造函数中,用户应该初始化初级粒子发生器。如果必要的化,用户需要为这些粒子发生器设置一些初始值。在代码清单 2.6.1 中, G4ParticleGun 是用来作为实际的粒子发生器的。 G4ParticleGun 中的方法,将在下节中讨论。请注意,那些在用户的 G4VUserPrimary
49、GeneratorAction 构造函数中构造的初级粒子发生器的对象,必须在相应的析构函数中删除。2.6.1.2事件的产生G4VUserPrimaryGeneratorAction 类,有一个纯虚方法 generatePrimaries()。这个方法在每一个事件的开始被调用。在这个方法中,用户必须调用具体 G4VPrimaryGenerator 类的generatePrimaryVertex() 方法。delete particleGun;void ExN01PrimaryGeneratorAction:generatePrimaries(G4Event* anEvent)G4int i = anEvent-get_eventID() % 3;switch(i)case 0:particleGun-SetParticleMomentumDirection(G4ThreeVector(1.0,0.0,0.0);break;case 1:particleGun-SetParticleMomentumDirection(G4Thre