Geant4认识1

来源:互联网 发布:阿里云主机绑定域名 编辑:程序博客网 时间:2024/06/05 08:57

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