Geant4 粒子跟踪与信息提取不完全归纳 -11

      好久没有更新博客了,大半年的时间,摸索着边运行边看源代码,基本以及可以满足科研建模了,今天乘着建模过程中发现的一些问题,写一写归纳总结,希望和在摸索前进的各位一起进步。

 write by jcak in xiaogan 2020.2.16  -19:52.

话不多说,直接上干货。

        运行G4 的目的,就是想从模型中提取我们所需要的信息,当所有的框架都搭好后,信息的提取就是我们最关心的内容。G4中有几个关键的概念需要理解清楚;G4中通过粒子追踪(一般称之为Tracking)来获取信息,一般我们通过G4Step 或者G4Track中获取相关信息。

1 在前面提到过,G4中运行的大致框架是Run-Event-step 的框架 ,而step,track 的关系如下如所示

 

注意:在现在的版本中(我的是4.10.04),所示的信息有点区别,为了节省时间,我没有重新画图,从PPT中摘录

改正1:Stepnumber 是从1 开始的(即上图step0 应为step1 ,以此类推);

改正2:TrackID 也是从1开始的

提醒1:parentID 有为零一说,parentID==0 表明该粒子是初始粒子  >0 表明为次级粒子,小于0表明来自前个事件被推迟的粒子

提醒2:Track代表一个粒子,上图中TrackID就相当于是粒子的编号,不同的ID表示不同的粒子,不同于parentID

提醒3:TrackID为0 的粒子(再次提醒哈,在新版本中从1 开始)由6个step组成,每完成一个Step,粒子的信息就会发生改变。   如:飞行的时间,坐标,能量,动量等都会发生变化,所以每一个step G4Track(即对应的粒子)的信息就会发生改变。

提醒4:G4Step 和G4Track一样,是动态变化的,没经历一个Step ,G4Step 的信息也会发生变化。

 

2 G4Step 表示程序运行中的一个具体的Step,在前面也提到过,每一个Step 由前后两个点组成,分为PreStepPoint,PostStepPoint,如下图所示:

强烈提醒:当我们提取信息所在Volume信息时,用PreStepPoint->GetVolume() 来获得相应的信息,而其他的位置信息,一般都是PostStepPoint来获取。因为一旦发生边界穿越事件,如上图所示,前端点保留了粒子所在的volume信息,不理解也没关系,这是G4中默认的,待会给大家看运行的结果你们就明白了。

3 大家经常说,该怎样学会去提取信息了,给大家一个建议,直接从G4SteppingVerbose类中去看源码,里面几乎涉及到所有信息提取的源代码,直接搜索G4SteppingVerbose.hh 就可以看到相关的信息。下面我结合我建模的粒子,简单分析一下里面的源码。

 一个简单的头文件

源码1 

对应每一个event起始step0(表示该点是出射的点,再次强调stepNumber 是从1 开始的哦),out6中输出的结果是:

 

 

可以看到,里面的每一个"cf",都是我自己加上去的,所以对应的输出中就会有”cf“标志

 

上图表示非起点的信息表示,对应的,我把out6 中step1中的信息同样粘贴出来,注意到其变化。

 

可以看到 对应标题中没有"cf"标记。上面两个点是一个联系的step ,表示的是step1 的起点和终点,下面我将对应的Step 完成后,相应的G4Track信息粘贴过来,前面说过,每当一个step运行完成后,相应的G4Track信息就会更新,大家可以对比看看。

粒子出射点的坐标为(0,0,0),终点的坐标为(0.73,1.06,3.0)m ,World 的XYZ边界都是正负3m,所以粒子直接飞出了world。

 

从G4Track 的信息看出,相应点坐标,飞行的时间,动量方向,极化方向,粒子出射起点,都是用PostStepPoint 点对应的信息确定的,而上面的信息提取时利用命令:

   fTrack->GetVolume()->GetName(); 得到所在的Volume 是World 而不是 终点的out of world 。由此可见,

利用G4Track 提取Volume信息时,利用的是PreStepPoint ,而粒子其他的信息,则是利用PostStepPoint

 

下一节将会结合我这次建模的过程,记录分享一下每一个物理作用的作用过程,虽然我也没有搞得很明白,但大致的流程还是可以记录记录,后面如果弄清楚了在更改。

 

 

 

 

 

 

  • 13
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Geant4 中,可以通过实现 G4SteppingVerbose 类来获取二次粒子的信息。这个类是 Geant4 中用于输出每一步模拟信息的基类。你可以继承 G4SteppingVerbose 类并覆盖其成员函数,以输出你需要的信息。 以下是一个简单的例子,演示了如何获取二次粒子的信息: ```cpp #include "G4SteppingVerbose.hh" #include "G4Track.hh" class MySteppingVerbose: public G4SteppingVerbose { public: void TrackingStarted() override { G4SteppingVerbose::TrackingStarted(); G4Track* track = fpSteppingManager->GetTrack(); G4cout << "Primary particle: " << track->GetDefinition()->GetParticleName() << G4endl; } void StepInfo() override { G4SteppingVerbose::StepInfo(); const G4Step* step = fpSteppingManager->GetStep(); G4Track* track = fpSteppingManager->GetTrack(); if (track->GetCurrentStepNumber() == 1) { G4cout << "Secondary particle: " << step->GetSecondary()->at(0)->GetDefinition()->GetParticleName() << G4endl; } } }; int main() { // ... MySteppingVerbose* mySteppingVerbose = new MySteppingVerbose(); runManager->SetUserVerbose(mySteppingVerbose); // ... return 0; } ``` 在上面的例子中,我们继承了 G4SteppingVerbose 类,并覆盖了其中的 TrackingStarted() 和 StepInfo() 函数。TrackingStarted() 函数在开始跟踪一个粒子时调用,我们在这里输出了主粒子的信息。StepInfo() 函数在每一步结束后调用,我们在这里判断当前步骤是否为第一步,如果是,则输出第一个二次粒子的信息。 注意,为了使用自定义的 G4SteppingVerbose 类,我们需要在创建 G4RunManager 对象之后,调用 SetUserVerbose() 函数,将其设置为用户定义的详细模式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值