Day 09(下)exampleB2a.cc+ActionInitialization+PrimaryGeneratorAction
一、exampleB2a.cc
拿到实例怎么样运行(没有类似于cline的软件):首先打开程序所在的文件夹,新建文件夹,进入新文件夹,在终端打开,再cmake
c++
// 打开所在文件夹,进入终端
// 创建新文件夹"b2a",名字任意
mkdir b2a
// 进入文件夹
cd b2a/
// 准备编译
cmake ..
// 编译,正常最好不要出现warning
make
// 打开并可视化生成的范例文件exampleB2a
./exampleB2a // 此时参数个数为1
./exampleB2a test.mac // 此时参数大于1,运行自写的mac文件test
c++
// 定义了step max,并且使用了G4写好的physicslist,若不使用,就自写step max
physicsList->RegisterPhysics(new G4StepLimiterPhysics());
// 给可视化界面+一个菜单gui.mac
if (ui->IsGUI()) {
UImanager->ApplyCommand("/control/execute gui.mac");
}
二、ActionInitialization
该程序中的所有Action类需要在此中进行初始化
c++
// 初始化
void ActionInitialization::BuildForMaster() const
{
SetUserAction(new RunAction);//针对于多线程的设置
}
void ActionInitialization::Build() const
{
SetUserAction(new PrimaryGeneratorAction);
SetUserAction(new RunAction);
SetUserAction(new EventAction);
}
三、PrimaryGeneratorAction
G4单位定义上是一个数值,所以设置时的单位都是带上的用*连接,其中
Mev<<Gev<<mm<<cm<<G4endl
c++
// 设置相关数值
G4ParticleDefinition* particleDefinition =
G4ParticleTable::GetParticleTable()->FindParticle("proton");//"proton"发射的为质子
fParticleGun->SetParticleDefinition(particleDefinition);//发射的是一个质子
fParticleGun->SetParticleMomentumDirection(G4ThreeVector(0., 0., 1.));//发射方向001
fParticleGun->SetParticleEnergy(3.0 * GeV);//发射能量3Gev
void PrimaryGeneratorAction::GeneratePrimaries(G4Event* event)
{
G4double worldZHalfLength = 0;
//设置粒子枪大小时,根据世界大小进行设置,该方法获得设置的世界的logicalvolume
G4LogicalVolume* worldLV = G4LogicalVolumeStore::GetInstance()->GetVolume("World");
G4Box* worldBox = nullptr;
//根据logicalvolume获取solidvolume,也就是worldBox
if (worldLV) worldBox = dynamic_cast<G4Box*>(worldLV->GetSolid());
//然后根据solidvolume获取一半的长度,然后就可以设置粒子枪的位置,一半初始在边界的位置
if (worldBox)
worldZHalfLength = worldBox->GetZHalfLength();
else {
G4cerr << "World volume of box not found." << G4endl;
G4cerr << "Perhaps you have changed geometry." << G4endl;
G4cerr << "The gun will be place in the center." << G4endl;
}
//粒子枪的位置
fParticleGun->SetParticlePosition(G4ThreeVector(0., 0., -worldZHalfLength + 1 * um));
//发射event
fParticleGun->GeneratePrimaryVertex(event);
}