Geant4 是一个针对物理问题封装好的C++工具包,一个C++类的集合。我们在使用的过程中主要是对于工具包中的接口类进行重载和实现。
使用Geant4工具包的主要步骤:
1. 继承关键接口类,重载其中所有的关键函数。 cnscott的博客
这些个类和函数是运行Geant4程序所必需的,必需被继承和重载并在main()函数中调用。具体的类和函数如下:
G4VUserDetectorConstructionl类
· Construct() //建立整个空间结构和材料,注册探测器(Sensitive Detector)
G4VUserPhysicsList类
· ConstructParticle() //注册输运过程要考虑的粒子
· ConstructProcess() //注册不同粒子对应的物理过程
· SetCuts() //设置不同粒子的截断值
G4UserPrimaryGeneratorAction类
· GeneratePrimaries() //产生粒子
2. 编写自己的mian()函数,添加核心代码 cnscott的博客
//运行管理器
G4RunManager*runManager = new G4RunManager;
//探测器
G4VUserDetectorConstruction*detector = new MyDetectorConstruction;
runManager->SetUserInitialization(detector);
//物理过程
G4VUserPhysicsList*physics = new MyPhysicsList;
runManager->SetUserInitialization(physics);
//粒子产生
G4VUserPrimaryGeneratorAction*gen_action = new MyPrimaryGeneratorAction;
runManager->SetUserAction(gen_action);
//初始化Gent4内核
runManager->Initialize();
//进行输运计算
G4intnumberOfEvent=1000000;
runManager->BeamOn(numberOfEvent); //一个程序中可以有多个BeamOn
3. 获得计算结果 cnscott的博客
首先要明确Run、Event和Step所代表的不同概念。Run是指程序的一个运行周期,比如BeamOn 函数从开始执行到执行结束就是一个Run。Event 是一个事件,比如一个源粒子的整个输运过程。而Step是指粒子两个碰撞点之间这一部分。因此,他们之间的关系为Run>Event>Step。也就是说,一个Run包含多个Event,一个Event包含多个Step。在输运过程中,一个Event的所有Step都完成之后才会开始下一个Event,一个Run的所有Event都完成后才会开始下一个Run(如果存在的话)。
重载相关类和函数来获取关心的物理信息。这些类和函数并不是必需的,可以根据需要来重载相应的类和函数。几个常用的类和函数如下:
G4UserRunAction类
· BeginOfRunAction() //每个Run开始时被调用
· EndOfRunAction() //每个Run结束时被调用
G4UserEventAction类
· BeginOfEventAction() //每个Event开始时被调用
· EndOfEventAction() //每个Event结束时被调用
G4UserSteppingAction类
· UserSteppingAction() //每个Step完成时被调用
举个一个简单的例子,如果我们想要得到能谱数据,可以在G4UserRunAction类中设置一个用于存储能谱数据的成员变量数组,在BeginOfEventAction()函数中对沉积能量清零,在UserSteppingAction()函数中对每一步的沉积能量进行累加,在EndOfEventAction()中根据沉积能量对数组进行寻址加1操作,最后在EndOfRunAction()中将该数组的值保存到文件中或进行其他处理。不同类之间的数据传递可以使用指针、专用类或者全局变量来实现。当然上述过程并不是得到能谱数据的唯一途径,使用Geant4内置的MultiFunctionalDetector 和PrimitiveScorer或者编写自己的Sensitive Detector子类同样可以实现。 cns