常用函数:
initialize()
建立探测器结构,创建物理过程,计算截面并且建立 run。
ApplyCommand()
发命令给应用程序让其打印信息,例如打印运行 run 、事件 event 和粒子跟踪 tracking 的信息。
BeamOn()
启动事件的一个 run。
G4cout()
由 Geant4 定义的 iostream 对象,被 G4UImanager 处理,输出需要的信息。G4cerr()由 Geant4 定义的 iostream 对象 , 被 G4UImanager 处理,输出错误信息。
一、通过 Geant4 的简单例子入门
1 搭建 main() 函数框架
G4中 main() 函数必须自己构造,以下为一个最简单的例子,之后可根据具体情况开发。
#include "G4RunManager.hh"
#include "G4UImanager.hh"
#include "ExN01DetectorConstruction.hh"
#include "ExN01PhysicsList.hh"
#include "ExN01PrimaryGeneratorAction.hh"
int main()
{
// 构造缺省 run manager
G4RunManager* runManager = new G4RunManager;
// 设置必须的初始化类
runManager->SetUserInitialization(new ExN01DetectorConstruction);
runManager->SetUserInitialization(new ExN01PhysicsList);
// 设置必须的用户行为类
runManager->SetUserAction(new ExN01PrimaryGeneratorAction);
// 初始化 G4 内核
runManager->initialize();
// 获取指向 UI manager 的指针并设置 verbosities
G4UImanager* UI = G4UImanager::GetUIpointer();
UI->ApplyCommand("/run/verbose 1");
UI->ApplyCommand("/event/verbose 1");
UI->ApplyCommand("/tracking/verbose 1");
// 开始运行三个按顺序处理的事件,启动一个 run
int numberOfEvent = 3;
runManager->BeamOn(numberOfEvent);
// 任务结束
delete runManager;
return 0;
}
运行管理类:
G4RunManager 类是 G4 内核中唯一的一个运行管理类。
需要传递所有必须的信息给运行控制进程 G4RunManager,包括:探测器将如何构建、被模拟的所有粒子和所有物理过程、在一个事件中的初级粒子将如何产生和其他模拟必须的信息。
其它管理类在运行管理类创建的时候创建。其中一个是用户接口管理类 G4UImanager,在main() 函数中,必须获取指向用户接口管理进程的指针。
用户行为类:
#include "G4RunManager.hh"
#include "G4UImanager.hh"
#include "G4UIterminal.hh"
#include "N02VisManager.hh"
#include "N02DetectorConstruction.hh"
#include "N02PhysicsList.hh"
#include "N02PrimaryGeneratorAction.hh"
#include "N02RunAction.hh"
#include "N02EventAction.hh"
#include "N02SteppingAction.hh"
#include "g4templates.hh"
int main(int argc,char** argv)
{
// 构造缺省的 run manager
G4RunManager * runManager = new G4RunManager;
// 设置必须的初始化类
N02DetectorConstruction* detector = new N02DetectorConstruction;
runManager->SetUserInitialization(detector);
runManager->SetUserInitialization(new N02PhysicsList);
// 可视化 manager
G4VisManager* visManager = new N02VisManager;
visManager->initialize();
// 设置用户行为类
runManager->SetUserAction(new N02PrimaryGeneratorAction(detector));
runManager->SetUserAction(new N02RunAction);
runManager->SetUserAction(new N02EventAction);
runManager->SetUserAction(new N02SteppingAction);
// 获取指向 UI manager 的指针
G4UImanager* UI = G4UImanager::GetUIpointer();
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 fileName = argv[1];
UI->ApplyCommand(command+fileName);
}
// 任务结束
delete visManager;
delete runManager;
return 0;
}
intercoms类:
2 创建探测器
在G4中最大的的几何体叫世界(World),其它的几何体,都被创建并放置在世界(World)中。每个几何体都通过描述它的形状(由实体定义,如尺寸、形状)和物理特性(由逻辑几何体定义,如材料、磁场、是否包含探测器的敏感单元)来创建,然后放置到另一个几何体中。当一个几何体被放置到另一个中时,我们叫前者为子几何体,后者为母几何体,并用相对于母体坐标系的坐标指定子体放置的位置。
2.1 探测器的形状
想构建一个探测器,首先要创建一个实体。
G4double expHall_x = 3.0*m;
G4double expHall_y = 1.0*m;
G4double expHall_z = 1.0*m;
G4Box* experimentalHall_box = new G4Box("expHall_box",expHall_x,expHall_y,expHall_z);
G4double innerRadiusOfTheTube = 0.*cm;
G4double outerRadiusOfTheTube = 60.*cm;
G4double hightOfTheTube = 50.*cm;
G4double startAngleOfTheTube = 0.*deg;
G4double spanningAngleOfTheTube = 360.*deg;
G4Tubs* tracker_tube = new G4Tubs("tracker_tube",innerRadiusOfTheTube,outerRadiusOfTheTube,hightOfTheTube,startAngleOfTheTube,spanningAngleOfTheTube);
这段代码分别创建了一个名为 expHall_box 的盒子,大小为沿 X 轴方向从-3m 到 3m,沿 Y 轴方向从-1m 到 1m,沿 Z 轴方向从-1m 到 1m;和一个名为 tracker_tube 的圆柱体,半径为 60cm,高为 50cm。
2.2 探测器的材料
创建好实体后,通过定义实体的物理特性,便可以得到逻辑几何体。
首先定义几何体的材料,这里我们可以利用刚刚创建好的实体。
G4LogicalVolume* experimentalHall_log
= new G4LogicalVolume(experimentalHall_box,Ar,"expHall_log");
G4LogicalVolume* tracker_log
= new G4LogicalVolume(tracker_tube,Al,"tracker_log");
这段代码用氩气填充了盒子 expHall_box,生成逻辑体 expHall_log;用铝填充了圆柱体 tracker_tube,生成逻辑体 tracker_log。
实际上G4中材料的定义是非常精细的,为此设置了几个专门的类,每一个类都有一个表作为一个静态数据成员,用于跟踪这些类各自的实例。
G4double density = 1.390*g/cm3;
G4double a = 39.95*g/mole;
G4Material* lAr = new G4Material(name="liquidArgon", z=18., a, density);
G4LogicalVolume* experimentalHall_log
= new G4LogicalVolume(experimentalHall_box,lAr,"expHall_log");
a = 1.01*g/mole;
G4Element* elH = new G4Element(name="Hydrogen",symbol="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);
此外还可以通过指定各种成分的质量百分数,创建像空气这样的混合物。
a = 14.01*g/mole;
G4Element* 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->AddElement(elO, fractionmass=30*perCent);
最后我们可以通过打印来查看已经创建的材料信息。
G4cout << H2O; \\ 打印水的材料信息
G4cout << *(G4Material::GetMaterialTable()); \\ 打印已创建的材料列表
2.3 探测器的位置
G4VPhysicalVolume* experimentalHall_phys
= new G4PVPlacement(0, //不旋转
G4ThreeVector(0.,0.,0.), //子体在母体中的坐标
experimentalHall_log, //子逻辑体指针
"expHall", //物理体名
0, //母逻辑体指针
false, //无布尔操作
0); //物理体的拷贝序号
G4double trackerPos_x = -1.0*meter;
G4double trackerPos_y = 0.0*meter;
G4double trackerPos_z = 0.0*meter;
G4VPhysicalVolume* tracker_phys
= new G4PVPlacement(0, // 不旋转
G4ThreeVector(trackerPos_x,trackerPos_y,trackerPos_z), // 子体在母体中的坐标
tracker_log, // 子逻辑体指针
"tracker", // 物理体名
experimentalHall_log, // 母逻辑体指针
false, // 无布尔操作
0); // 物理体的拷贝序号
3 创建粒子
Geant4 为用户提供了各种类型的粒子,每个粒子都由各自的类来描述,这些类都是由 G4ParticleDefinition 派生的。这些粒子主要分为 6 类:轻子,介子,重子,玻色子,短寿命粒子,离子。每一类粒子都被定义在 geant4/source/particles 的子目录中,分别有一个相应的库。