Geant4 不完全学习指南9(粒子跟踪和物理过程)

 学习总结8简单的学习了物理列表的使用情况,9则是学习其中的一些细节。在实际的模拟过程中,物理过程的选择

和粒子的跟踪有着十分重要的作用,模拟所得到的数据,大多和粒子的跟踪有关。通过前面的学习,我们大概知道了G4的

一个逻辑,可以简单的描述为Run---Event---Track---Step。

  当运行一个G4程序时,也就是开始了一次实验的取数,称为一个Run。Run这个名字取自于高能物理实验的一个俗语,

在高能物理试验中,每次设备的开机,采集一批数据叫做一个Run,两个Run 之间也许会做一些关机维护一类的操作,每个Run

的数据都会有一个Run number 来标记。

  在一个模拟中(即run中),一般模拟不只一个粒子,譬如模拟1000次质子-质子对撞,这每一次模拟称为一个event。对于每一个event,我们需要设定初始粒子(primary particle)的能量和位置等信息。

  每一个粒子走过的路径被称之为一条径迹(Track),G4会追踪每个Track 的信息,包括位置,能量,时间。每一个Track 又被分为一个个的步长(step)每个step交接处的顶点(Vertex)会发生物理过程(process),还有可能产生一个或多个次级粒子

 

                                              Run

  在G4中,Run是一个最大的模拟单位,一个run 由一系列事件组成,它是G4Run 的一个对象,由G4RunManager的方法 beamOn()启动。在一个run 中,探测器的几何,灵敏探测器的设置和模拟中所使用的物理过程都保持不变。

  G4Run代表一个run,他有一个run的事件标识数和在这个run中所要模拟的事件数,这个标识数可以由用户自己任意设置在G4内核中并未用到这个标识数。G4Run有两个指向G4VHitsCollection 和 G4VDigiCollection 表的指针。这两个表,分别与
sensitive detectors 和 digitizer modules 模拟相关。

 1 G4Run源码查看分析

2 管理run 进程

  在前面提到过,在main()函数中,必须实例化G4RunManager,G4RunManager 管理一个 run 的相关进程。在 G4RunManager 的构造函数中,除一些静态管理类外,其余所有的管理类都被构造,这些类将被 G4RunManager 的析构函数删除。G4RunManager 必须是一个 singleton 对象,用户可以通过静态方法 getRunManager() 获取指向这个 singleton 对象的指针。

G4RunManager由几个公用方法:

initialize()

  G4内核必须的所有初始化都是由这个方法触发的,这些初始化如下:

    (1)探测器几何,灵敏探测器或数字化模块设置的构成

    (2)粒子和物理过程的构成

    (3)反应截面表的计算

     这个方法必须在第一个run 之前调用。对于第二个和以后的run,如果某些初级初始化参数需要改变,它将自动被调用

beamOn(G4int numberOfEvent)

    这个方法触发一个实际的模拟过程,即一个事件循环。他有一个整型参数,表示被模拟的事件数。

getRunManager()

     这个静态方法返回指向 G4RunManager singleton 对象的指针。

getCurrentEvent()

   这个方法返回指向当前模拟的G4Event对象的指针,它只有在事件模拟过程中是可用的,在这个时候,G4应用程序的状态是

 “EventProc"。如果G4状态不是”EventProc",这个方法将返回一个空指针。注意返回值类型是 const  G4Event *。因此用户不能

 更改对象的内容。

setNumberOfEventsToBeStored(G4int nPrevious)

对于模拟多个事件“堆积”的情况,实际就是在同一时刻同时存取多个事件。通过调用这个方法, G4RunManager 将保存 nPrevious 个 G4Event 对象。这个方法必须在beamOn() 执行之前调用。

abortRun()

这个方法可以在需要中止一个 run 模拟过程的时候调用,它将安全的中止模拟过程,即使是在一个事件模拟的中间过程。但是,用户需要注意,这个被中止的最后一个事件模拟是不完全的,不可以用来做更多的分析。这个方法在 GeomClosed 和 EventProc这两个状态下是可用的。

3 G4UserRunAction

G4UserRunAction 是一个用户行为类,从它可以派生用户自己的类。这个基类,有两个虚拟方法:

beginOfRunAction()

这个方法在 beamOn() 方法开始的时候被调用。可假定的使用情况如下:

  • 设置一个 run 标识数,
  • 登记一个统计图,
  • 设置灵敏探测器或数字化模块(e.g., dead channel)的指定运行条件。

endOfRunAction()

这个方法在beamOn()结束时候调用,典型的使用如下:

  • 储存、输出 统计图
  • 操作run的摘要

G4UserRunAction源码分析

4 G4状态机

Geant4 被设计为一个状态机,某些方法仅在某个状态是可用的。 G4RunManager 控制 Geant4应用程序的状态改变,Geant4 的状态是用枚举量 G4ApplicationState 表示的。在一个 Geant4应用程序的整个生命周期中,一个有 6 个状态。G4StateManager 属于 intercoms 类。

G4State_PreInit state

这是一个 Geant4 应用程序的开始状态。当应用程序在这种状态是,表明它需要初始
化。应用程序在一个 run 之后,改变几何,物理过程,或者截断,也会使程序返回这
个状态。

G4State_Init state

在 G4RunManager 的方法 initialize() 被调用的时候,应用程序进入这个状态。在
这个状态下,在用户初始化类中定义的方法被调用。

G4State_Idle state

这个状态表明应用程序准备开始模拟。

G4State_GeomClosed state

当 beamOn() 被调用之后,应用程序进入到这个状态开始模拟。在这个状态下,用户
不可以更改几何,物理过程,截断设置。

G4State_EventProc state

当应用程序处理一个事件的时候,进入这个状态。G4RunManager 的
getCurrentEvent() 和 getPreviousEvent() 方法只有在这个状态下可用。

G4State_Quit state

当 G4RunManager 的析构函数被调用的时候,应用程序进入到这个“终结”状态。
Geant4 内核的 run Manager 正被删除,应用程序将不能回到任何其他状态。

G4State_Abort state

当 G4Exception 发生的时候,应用程序进入到这个“终结”状态并引起一个内核丢弃。
用户可以通过实现具体的 G4VStateDependent 类,仍然可以利用一个 hook 进行一些“安
全”的操作,例如,存储统计图。用户也可以通过交互式命令/control/suppressAbortion
选择限制 G4Exception 的发生。当例外被限制的时候,用户仍会受到 G4Exception 发
出的错误信息,并且不保证在接到这些 G4Exception 错误信息之后的结果是正确的。

如果用户希望在 Geant4 状态改变时执行一些期望的指令,可以创建一个由G4VStateDependent 派生的类。例如,用户可以在 G4Exception 发生的时候,或者在 Geant4进入 Abort 状态的时候,在内核数据丢弃之前保存用户需要的统计数据。

5 改变探测器几何

探测器几何定义在用户的 G4VUserDetectorConstruction 类中,它可以在两个 run 之间进行更改。有两种不同的情况。
第一中情况是,用户希望删除整个旧的几何结构并建立一个全新的结构。在这种情况下,用户需要向 RunManager 传递新的 world 几何体指针。因此,用户应该按如下的方法进行。
G4RunManager* runManager = G4RunManager::GetRunManager();
runManager->defineWorldVolume( newWorldPhys );

这种情况是相当少的,对于用户来说,

第二种情况更常见。第二种情况是这样的。假定用户需要移动、旋转探测器中的一个部分,这种情况常发生在束流测试试验中。很明显,用户不需要改变 world 几何体,更切确的说,用户的 world 几何体对于束流试验中是试验大厅)足够大,可以在里面移动、旋转用户的探测器。对于这种情况,用户可以继续使用所有的探测器几何设置,只需要用相应物理体的 Set 方法更新一下相应的变换向量就可以了。不必重新向 RunManager 传递新的 world 几何体指针。如果用户需要为每一个 run 改变几何设置,可以在 G4UserRunAction 类的方法beginOfRunAction() 中实现,它将在每次 run 开始前被调用;也可以派生
runInitialization() 方法
。请注意,上述的两种情况,用户需要让 RunManager 知道"thegeometry needs to be closed again"。因此,在下一次 run 以前,用户需要调用
runManager->geometryHasBeenModified();

 

                                             事件Event

     G4Event 代表一个事件,它是一个包含所有被模拟事件的输入输出信息的类的实例这个对象在 G4RunManager 中被创建并传递给 G4EventManager。可以通过 G4RunManager 的方法getCurrentEvent() 获取当前正在处理的事件(指针)。

1 事件的结构

一个 G4Event 对象有四类主要的信息。在 G4Event 中提供了这些信息的相应 Get 方法

(1)初级事件顶点和初级粒子

  在通过方法 processOneEvent() 将 G4Event 对象发送给 G4EventManager 的时候,必须保证这个 G4Event 对象已拥有一些初级粒子,这些初级粒子是由用户的G4VUserPrimaryGeneratorAction 类发送给 G4Event 对象的。

  G4PrimaryParticle 类代表 Geant4 开始模拟一个事件的初级粒子。这个类的实例拥有有关粒子类型及它的动量等信息,相关的位置与时间信息被保存在 G4PrimaryVertex 对象中,这样做的好处是,一个或多个 G4PrimaryParticle 对象可以共享同一个顶点。初级粒子顶点与初级粒子通过一个链表与 G4Event 对象相关联。

  G4PrimaryParticle 是 G4VPrimaryGenerator 类的一个具体类,需要通过指向G4ParticleDefinition 的一个指针,或者一个表示 P.D.G. 粒子代码的整数,来创建它的实例。对于某些假粒子的情况,如:geantino ,光学光子(optical photon)等,或者一些在 P.D.G. 粒
子代码中不存在的奇异的核碎片,G4PrimaryParticle 对象应该通过 G4ParticleDefinition 指针来构造。另外,那些短寿命的基本粒子,如,弱玻色子,或者夸克/胶子,可以使用 P.D.G.粒子代码将这些粒子作为 G4PrimaryParticle 对象实例化。需要注意的是,Geant4 只模拟那
些作为 G4ParticleDefinition 对象定义的粒子,其余的初级粒子将会被 G4EventManager 忽略。但是,如果要记录初级事件的起始点,定义一些中间(“intermediate”)粒子是非常有用的

(2)径迹(Track)

粒子的径迹被保存在 G4TrajectoryContainer 类的实例中,指向该对象的指针被保存在G4Event 中。径迹中所包含的信息在后面进行分析。

(3)Hits collections

 由探测器(sensitive detectors)所产生的 hits 被保存在 G4HCofThisEvent 类的实例中,指向它的指针同样被存储在 G4Event 中

(4)Digits collections

由 digitizer modules 产生的 digits 信息被保存在 G4DCofThisEvent 类的实例中,指向该对象的指针也存储在 G4Event 中。

5 G4EventManager的要求

G4EventManager 是管理事件对象的管理类,主要完成以下任务:

(1)将与当前 G4Event 事件对象有关的 G4PrimaryVertex 和 G4PrimaryParticle 对象转换
   为 G4Track 对象。所有代表初级粒子的 G4Track 对象被传递给 G4StackManager。

(2)G4StackManager 中弹出一个 G4Track 对象并传递给 G4TrackingManager如果径
   迹(track)在被 G4TrackingManager 模拟之后,被标记为“killed”,那么该 G4Track 对
   象将被 G4EventManager 删除。

(3)如果初级 track 被 G4TrackingManager "suspended" 或者 "postponed to next event",那
   么这个 track 将被重新压入 G4StackManager,由 G4TrackingManager 返回的次级
   G4Track 对象也被压入 G4StackManager。

(4)当 G4StackManager 对出栈请求的响应返回 NULL 的时候, G4EventManager 将中止
   当前的处理过程

(5)从 G4UserEventAction 类中调用用户自定义的方法 beginOfEventAction()
   endOfEventAction() 。

6 栈机制

G4StackManager 共有 3 个栈,分别是 urgent, waitingpostpone-to-next-event, 它们都是
G4TrackStack 类的实例。缺省情况下,所有的 G4Track 对象被保存在 urgent 栈中,以后进
先出的方式工作。在这种情况下,其余两个栈没有被使用。但是,通过用户自定义的
G4UserStackingAction 类,tracks 可能会被发送到其余两个栈中。
如果 G4UserStackingAction 的方法已经被用户重载,那么, postpone-to-next-event 栈和
waiting 栈中也可能又 tracks 存在。在一个事件开始的时刻,G4StackManager 将检查
postpone-to-next-event 栈,看是否有前一事件余留下来的 tracks。如果有的话,它会将这些
tracks 转移到 urgent 栈中。
当然,首先需要调用 G4UserStackingAction 的方法
PrepareNewEvent() ,然后,traks 将可能被用户重新分类并将它们压入 urgent 或者 waiting
栈,或者重新压入 postpone-to-next-event ,等待下一事件的处理。
在事件被处理的时候,
G4StackManager 从 urgent 栈中逐个弹出所有的 tracks。接着,G4UserStackingAction 中的
方法 NewStage() 将被调用。在这个方法中,在 waiting 栈中的 tracks 可能被发送到 urgent 栈,
也可能继续保留在 waiting 栈中,或者被压入到 postpone-to-next-event 栈中,延迟到下一个
事件。
有关 G4UserStackingAction 中的用户自定义方法的详情,以及它们如何影响 track 栈的管理,

下几次学习中将会再次介绍

7 G4UserEventAction 源码

8 G4UserStackingAction 源码

上面简单的学习了run,event 之间的一些关系以及运行中信息的处理问题,下面章节将继续分析讨论track和step

涉及到的一些知识点。

 

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值