geant4 常用代码

1 获取特特定能量范围的特定粒子

E:\examples_understanding\geant4-v11.0.0_note\examples\extended\runAndEvent\RE02

    //-- Particle with kinetic energy filter.
    G4SDParticleWithEnergyFilter* pkinEFilter =
    new G4SDParticleWithEnergyFilter(fltName="gammaE filter",kmin,kmax);
    pkinEFilter->add("gamma");  // Accept only gamma.
    pkinEFilter->show();        // Show accepting condition to stdout.

2 获取初级粒子或者次级粒子,判断粒子是否还存活

E:\examples_understanding\geant4-v11.0.0_note\examples\extended\runAndEvent\RE05

  // check if it is alive
  if(theTrack->GetTrackStatus()!=fAlive) { return; }

  // check if it is primary
  if(theTrack->GetParentID()!=0) { return; }

3 正确理解step

step是在不同物体之间共同计算的,并不是一个volume里面step从0开始算
在这里插入图片描述
在这里插入图片描述

4 使用histo存储数据,检测step和event里面是有值的,但是最后的histo是空的

可能不是程序问题,把之前的root文件删掉,如果删不掉,就在runAction里面重命名,然后再运行一下,看还是不是空的,我也是很无语,调试一晚上,是因为第一个空的root一直没有被覆盖,。。。

5 Track ID的理解

http://littlepascal.lofter.com/post/322764_cc8c595
是每个粒子独一无二的编号

在 G4 中,发射一个(或一系列)粒子到所有次级粒子死亡的过程成为一次 Event。

而每次发射的初始粒子则有粒子发射器进行控制。

而在每一个 event 过程中,粒子与材料反应后会可能生成多个次级粒子,每个粒子都会有一条径迹,称之
为 track

而每一个粒子(初始的或次级的)的径迹又是由很多步组成的,称之为 step

关于 track 和 step 的理解请参阅下图
在这里插入图片描述
在这里插入图片描述

6 查看当前linux系统里面有多少CPU

# 总核数 = 物理CPU个数 X 每颗物理CPU的核数 
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq

# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l
# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l 
# 注意,此处查看的线程数是总得线程数,可以理解为逻辑cpu的数量
grep 'processor' /proc/cpuinfo | sort -u | wc -l 

7 多次run beamOn问题总结

测试的时候,发现,如果连续重复 run beamOn,彼此之间是有一定的差异的,在可接受的波动内,但是如果一次只跑一个run beamOn,这样重复跑出来的结果是完全一模一样,最后发现问题是没有在example.cc文件里面指定随机种子,指定的方式为:

    //下面的加在main()函数中
    CLHEP::HepRandom::setTheEngine(new CLHEP::RanecuEngine());//选择随机数引擎RanecuEngine,默认为HepJamesRandom
    //将系统时间设置为随机数种子
    G4long seed = time(NULL);
    CLHEP::HepRandom::setTheSeed(seed);

8 最新的geant4调用多线程的方法

下面一句话就可以

auto *runManager  = G4RunManagerFactor:CreateRunManager();

9 案例快速查找

在这里插入图片描述

10 判断粒子在不在voulum里面

测试过程发现使用GetPostStepPoint获取volunme名称的时候,下面代码段统计不到信息

    // record primary
    if (step->GetPostStepPoint()->GetProcessDefinedStep()->GetProcessName() == "DetectorArray" &&
        step->GetTrack()->GetParentID() == 0 &&
        step->GetTrack()->GetParticleDefinition()->GetParticleName() == "gamma")
    {
        step->GetTrack()->SetTrackStatus(fStopAndKill);
        CountArray[2] = CountArray[2] + 1;
    }

将上述代码段修改为GetPreStepPoint控制就有统计信息

    if (step->GetPreStepPoint()->GetTouchable()->GetVolume()->GetName() == "DetectorArray" &&
        step->GetTrack()->GetTrackID() == 1 &&
        step->GetTrack()->GetParticleDefinition()->GetParticleName() == "gamma")
    {
        CountArray[2] = CountArray[2] + 1;
        step->GetTrack()->SetTrackStatus(fStopAndKill);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值