Geant4 不完全学习指南7 (关于探测器Hit等的定义及类的分析)

关于探测器的定义,指南5,指南6都是从几何和材料方面来讲的,这次结合xeampleB2a例子,简单讨论分析一下关于灵敏探测器设置的相关的类。

writte by jack in hubei 15:40

           Hits

一 hit

hit 是在用户探测器的灵敏区域内,粒子发生物理相互作用的快照。用户可以储存与G4Step对象相关的各种信息。这些信息可以是:

(1)每一步位置和时间 (2)粒子的动量和能量 (3)每一步的能量沉积 (4)几何信息 或者上述信息的组合

现在简单分析一下探测器定义时的各种类

1 G4VHit (G4VHit.hh)

G4VHit 是一个表示Hit的抽象类。用户必须继承这个基类,派生出自己的hit类。用户类的成员数据由用户自己选择。

G4VHit有两个虚方法,Draw() 和 Print(),用来显示和打印用户的 hits,这些方法应由用户实现。

G4VHit 是一个抽像类,用户必须从它派生出自己的类。另外一方面,hits 应和 G4Event 对像一起存储,这个对像表示当前事件。

2 G4VHitsCollection(G4VHitsCollection.hh)

这是收集hits的一个基类, 建议用户使用G4THitsCollection模板类,以防他或她的收集hits过程是短暂的。 而如果收集是使用ODBMS持久化的,则具体收集类可以直接从此类派生。G4VHitsCollection 是一个抽像类,表示一个向量集合,这个集合的元素是一种用户定义的 hits。因此,用户必须为每个 G4VHit 的具体类定义一个G4VHitsCollection 的具体类。

3 G4THitsCollection(G4THitsCollection.hh)

G4THitsCollection 是一个从 G4VHitsCollection 派生的模板类 ,可以将这个模板类进行实例化,来为特定的 G4VHit 类定义 hits collection(G4VHitsCollection)的具体类。用于每个事件的每个 hits 对像,必须有一个唯一的名字

G4Event 有一个 G4HCofThisEvent 类(G4 Hits collection of this event)的对像,它是一个 hits collection 的容器类。Hits collection 是通过它们的指针存储的,这些指针的类型是它们基类的类型。

通过前面(123)的分析,可以知道,hit 是目标粒子与探测器相互作用的快照,这个快照与粒子的没一个step相联系。hits 应和 G4Event 对像一起存储,这个对像表示当前事件。每一个hit对象,都是有G4VHitsCollection基类派生出的类来收集,可以由G4THitsCollection (从 G4VHitsCollection 派生的模板类)来收集hits。对于每一个event的hit collection,其地址都储存在G4Event 的一个 G4HCofThisEvent 类中,该类是一个G4THitsCollection具体类的一个容器。

4 G4Allocator(G4Allocator.hh)

G4Allocator 是一个用于从堆为对像中快速分配内存的类,它使用了页机制,虽然不是一定要使用这个类,但我们推荐使用它,尤其是那些对 C++内存分配机制不熟悉的用户,和那些不熟悉其它内存分配工具的用户。

             灵敏探测器

1  G4VSensitiveDetector( G4VSensitiveDetector.hh)

   G4VSensitiveDetector 是一个描述探测器的抽象基类,用户定义产生hit的灵敏探测器必须从这个基类派生。在派生类的构造函数中,由灵敏探测器定义的收集hits 的hit collection 必须用set方法传入"collectionName"字符串数组。

  一个灵敏探测器原则上要求建立一些hit 对象,这些对象使用的信息来自于一个粒子径迹上的steps。G4VSensitiveDetector 的ProcessHits() 方法使用 G4Step 对像作为输入执行这个任务。

  G4VSensitiveDetector 有三个主要的虚拟方法:

(1)  virtual G4bool ProcessHits(G4Step*aStep,G4TouchableHistory*ROhist) = 0;

当一个step是在一个拥有指向灵敏探测器指针的G4LogicalVolume内部时,G4SteppingManager 将调用这个方法。这个方法的第一个参数是当前step的一个G4step对象。第二个参数是一个用于“读出几何”的G4TouchableHistory 对像。只有当读出几何被定义在这个灵敏探测器时才会产生ROhist 这个指针。 G4TouchableHistory对象相关的几何信息储存在G4Step 的 PreStepPoint 中。在ProcessHits()这个方法中,如果当前 step 对用户探测器是非常有意义的,那么,将构造一个甚至多个 G4VHit 对像。

(2)   virtual void Initialize(G4HCofThisEvent*);

这个方法在每个事件开始时调用。它的参数是一个G4HCofThisEvent对象,在这个方法中,Hits collections 与 G4HCofThisEvent 对像相关,在这个事件内产生的hit被储存,在这个方法中,hits collections 和 G4HCofThisEvent 对像一起,可以用于``在事件处理期间''数字化。

(3) virtual void EndOfEvent(G4HCofThisEvent*);

    这个方法在每个事件结束是调用。它的参数跟前一个方法一样。在用户灵敏探测器中偶尔建立的 hits collections 可以与 G4HCofThisEvent 对像关联。

(4) G4CollectionNameVector collectionName;

   This protected name vector must be filled at the constructor of the user's concrete class for registering the name(s) of hits collection(s) being created by this particular sensitive detector.

用户的具体探测器类应使用一个唯一的名字进行实例化。这个名字和其它的全局名字一起,
用"/"分隔,来区分用户不同的探测器。例如

myEMcal = new MyEMcal("/myDet/myCal/myEMcal");

这里的 myEMcal 是用户探测器名。指向用户灵敏探测器的指针,必须传递给一个或多个G4LogicalVolume 对像,以设置这些逻辑体的灵敏特性。这个指针同时也应该向 G4SDManager 注册。

 

              读出几何

读出几何是一个虚拟共生的几何体,它用来获取通道号。通常,用户必须先将一个灵敏探测器与一个粒子跟踪几何中的volume关联。然后,用户将G4VReadoutGeometry 对像与灵敏探测器关联。如下图所示:

粒子模拟的径迹将在“实际的”几何体中被跟踪,灵敏探测器拥有自己的读出几何,G4 将检査当前 hit 属于那个``读出''单元。

进行粒子跟踪的时候,在step开始的位置(G4Step中PreStepPoint 位置),基类G4VReadoutGeometry将在读出几何中向用户灵敏探测器提供G4TouchableHistory 。G4TouchableHistory 是通过 G4VSensitiveDetector 的虚方法:

   G4bool processHits(G4Step* aStep, G4TouchableHistory* ROhist);

将参数ROhist传递给用户灵敏探测器的。用户将可以使用来自读出几何的 G4Step 和 G4TouchableHistory 的有关信息。注意关联是通过一个灵敏探测器对像完成的,完全有可能同时存在多个读出几何。

(2) 一个读出几何的设置

由于目前还没有涉及到相关编程的实例,先直接从手册中截图放在这里,保证内容的完整性,以后碰到实例在具体分析

                                          G4SDManager

G4SDManager 是一个 singleton 管理类,用于管理灵敏探测器。

(1) 灵敏探测器的激活/关闭

用户接口命令 activate 和 inactivate 可以用来控制用户灵敏探测器。

/hits/activate detector_name
/hits/inactivate detector_name

这里的 detector_name 是探测器名或者类名。例如,如果你的电磁量热计名叫/myDet/myCal/myEMcal ,

/hits/inactivate myCal 这个命令将关闭所有属于 myCal 类的所有探测器。

(2) 存取 hits collections

有几种存取 hits collections 的情况。
数字化
G4VUserStackingAction 中的事件过虑
``事件结尾''的简单分析
显示/打印 hits

下面是如何存取一个 hits collection 的例子:
G4SDManager* fSDM = G4SDManager::GetSDMpointer();
G4RunManager* fRM = G4RunManager::GetRunManager();
G4int collectionID = fSDM->GetCollectionID("collection_name");
const G4Event* currentEvent = fRM->GetCurrentEvent();
G4HCofThisEvent* HCofEvent = currentEvent->GetHCofThisEvent();
MyHitsCollection* myCollection = (MyHitsCollection*)(HC0fEvent-
>GetHC(collectionID));

 

后面涉及到数字化和可持续性的问题,需要用到不同的类库,在这里就先不加以学习,等到进阶的时候在进一步深入学习。

 

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
定义 LaBr3 探测器的物理过程,需要使用 Geant4 中的物理过程类。以下是一个示例代码,演示如何定义 LaBr3 探测器的物理过程: ```c++ // 定义 LaBr3 探测器材料 G4Material* lBr3 = ...; // 定义 LaBr3 闪烁体和光电倍增管的物理过程 G4ProcessManager* lBr3_PM = lBr3->GetProcessManager(); G4Scintillation* lBr3_Scintillation = new G4Scintillation(); G4OpAbsorption* lBr3_Absorption = new G4OpAbsorption(); G4OpBoundaryProcess* lBr3_Boundary = new G4OpBoundaryProcess(); G4OpMieHG* lBr3_Mie = new G4OpMieHG(); G4OpRayleigh* lBr3_Rayleigh = new G4OpRayleigh(); G4OpWLS* lBr3_WLS = new G4OpWLS(); lBr3_PM->AddProcess(lBr3_Scintillation); lBr3_PM->AddProcess(lBr3_Absorption); lBr3_PM->AddProcess(lBr3_Boundary); lBr3_PM->AddProcess(lBr3_Mie); lBr3_PM->AddProcess(lBr3_Rayleigh); lBr3_PM->AddProcess(lBr3_WLS); lBr3_PM->SetProcessOrdering(lBr3_Scintillation,idxPostStep); lBr3_PM->SetProcessOrdering(lBr3_Absorption,idxPostStep); lBr3_PM->SetProcessOrdering(lBr3_Boundary,idxPostStep); lBr3_PM->SetProcessOrdering(lBr3_Mie,idxPostStep); lBr3_PM->SetProcessOrdering(lBr3_Rayleigh,idxPostStep); lBr3_PM->SetProcessOrdering(lBr3_WLS,idxPostStep); // 设置 LaBr3 闪烁体和光电倍增管的材料属性 G4MaterialPropertiesTable* lBr3_MPT = new G4MaterialPropertiesTable(); G4MaterialPropertiesTable* PMT_MPT = new G4MaterialPropertiesTable(); lBr3->SetMaterialPropertiesTable(lBr3_MPT); PMT->SetMaterialPropertiesTable(PMT_MPT); // 定义 LaBr3 闪烁体和光电倍增管的光学特性 G4double lBr3_Energy[2] = {2.0*eV, 3.5*eV}; G4double lBr3_RIndex[2] = {1.82, 1.82}; G4double lBr3_AbsLength[2] = {5.0*cm, 5.0*cm}; lBr3_MPT->AddProperty("RINDEX",lBr3_Energy,lBr3_RIndex,2); lBr3_MPT->AddProperty("ABSLENGTH",lBr3_Energy,lBr3_AbsLength,2); G4double PMT_Energy[2] = {2.0*eV, 3.5*eV}; G4double PMT_RIndex[2] = {1.50, 1.50}; G4double PMT_AbsLength[2] = {4.0*cm, 4.0*cm}; PMT_MPT->AddProperty("RINDEX",PMT_Energy,PMT_RIndex,2); PMT_MPT->AddProperty("ABSLENGTH",PMT_Energy,PMT_AbsLength,2); ``` 在上述代码中,首先定义了 LaBr3 探测器的材料,并使用物理过程类定义了 LaBr3 闪烁体和光电倍增管的物理过程。这些过程包括闪烁过程、吸收过程、边界过程、Mie 散射过程、Rayleigh 散射过程和波长移位过程。接着,定义了 LaBr3 闪烁体和光电倍增管的材料属性,并将它们分配给相应的材料。需要注意的是,材料的折射率和吸收长度需要根据实际情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值