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);
}