Day 09(下) B2a实例解说----exampleB2a.cc+ActionInitialization+PrimaryGeneratorAction

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

exampleB2a.cc

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);
}
相关推荐
Dream Algorithm1 小时前
价格在走盘整,但是头寸持仓量增加说明什么
笔记
Radan小哥2 小时前
Docker学习笔记—day007
笔记·学习·docker
Rsingstarzengjx2 小时前
PS 笔记1
笔记
㱘郳3 小时前
软考软件设计师笔记
笔记·软件工程
嵌入式学习者。3 小时前
Eplan自学笔记1
笔记
风123456789~4 小时前
【OceanBase专栏】OceanBase 外部表实验
数据库·笔记·oceanbase
贝塔实验室4 小时前
Altium Designer 6.0 初学教程-如何从原理图及PCB 中生成网表并且实现网表的加载
fpga开发·硬件架构·硬件工程·学习方法·射频工程·基带工程·pcb工艺
暮乘白帝过重山5 小时前
ArkTS 关键字速查笔记
笔记·arkts
Wild_Pointer.5 小时前
技术书籍精读笔记:全景目录
笔记
d111111111d5 小时前
W25Q60简介--SPI通信(笔记)
笔记·stm32·单片机·嵌入式硬件·学习