Day 06 动作类的初始化类------以B1为例
Day 06 动作类的初始化类------以B1为例
一、B1ActionInitialization继承G4VUserActionInitialization类
这个G4VUserActionInitialization类中有两个虚函数:Build()与BuildForMaster()。该类是一个抽象类,用来实例化所有的动作类的。
在顺序执行下,Build()会被G4RunManager调用;多线程模式下,Build()会被G4WorkerRunManager调用,BuildForMaster()会被G4MTRunManager调用。
若继承G4VUserActionInitialization类,就要重写这两个虚函数。Build()多线程和顺序模式都会被调用来初始化动作类,BuildForMaster()只会在多线程被调用取初始化动作类。
二、在BuildForMaster()中唯一需要去初始化的只有runAction动作类,其他动作类在Build()内即可,runAction动作类也需要在Build()中进行初始化
# BuildForMaster();自己写程序时,这里多半不需要动
void B1ActionInitialization::BuildForMaster() const
{# 范式(标准模式,配套使用)B1RunAction* runAction = new B1RunAction; # 创建指针SetUserAction(runAction); # 用SetUserAction方法进行调用,通过runManager的方法进行调用
}# Build(),若想要跟踪时,可以在这里添加trackingAction
void B1ActionInitialization::Build() const
{# 该指针在这个方法中后面没有被需要(调用)所以可以直接newSetUserAction(new B1PrimaryGeneratorAction); # runAction指针在eventAction初始化中被调用这个参数,这个参数需要被传于,所以需要setB1RunAction* runAction = new B1RunAction;SetUserAction(runAction);B1EventAction* eventAction = new B1EventAction(runAction);SetUserAction(eventAction);SetUserAction(new B1SteppingAction(eventAction));
}
对于程序而言必须要有DetectorConstruction.cc类、PrimaryGeneratorAction.cc类。其余依情况添加。若让程序支持多线程,则B1ActionInitialization类也是必须存在的。
三、exampleB1.cc主程序文件:
前面build()里面包含primaryGeneratorAction、B1RunAction、B1EventAction、B1SteppingAction等,唯独没有
B1DetectorConstruction,这个动作类在主程序文件中被初始化:
G4RunManager* runManager = new G4RunManager;
# 告诉runManager我们的detector是什么样的
runManager->SetUserInitialization(new B1DetectorConstruction());# 例子:用户自己写的physics list
G4VModularPhysicsList* physicsList = new QBBC;
physicsList->SetVerboseLevel(1);
runManager->SetUserInitialization(physicsList);#告诉runmanager初始化是什么样子的
runManager->SetUserInitialization(new B1ActionInitialization());
G4RunManager是用来管理一个run的,是一个管理类的方法,在主函数(程序)中进行创建实现,唯一一个需要被手动创造的管理类。当被创建时,其他的管理类会被自动创造,若被释放时,其他管理类被自动释放。
对于顺序模式下:必须提供G4VUserPrimaryGeneratorAction(粒子源)、G4VUserDetectorConstruction(模型)、G4VUserPhysicsList(告诉它PhysicsList是什么样的);为实现项目,还可以提供5个动作类:G4VUserRunAction、G4VUserEventAction、G4VUserStackingAction、G4VUserTrackingAction、G4VUserSteppingAction。
可以使用G4VUserActionInitialization初始化6个动作类。
对于多线程模式下:必须提供G4VUserDetectorConstruction(模型)、G4VUserPhysicsList,且必须使用G4VUserActionInitialization初始化动作类。
G4WorkerRunManager
G4MTRunManager(多线程下的)管理各个进程的WorkerManRunager