geant4入门讲解篇-2
文| 梁佐佐
让我们继续以B1例子为主,讲解Geant4的模拟流程。如下图所示,Run是由多个Event组成的,PrimaryGenerator每执行一次,就会产生一个独立的Event,每个Event又是由多个Step组成的。Step是物理过程反应的最小模拟单元,从长度上可以小到nm甚至fm,可以通过蒙卡抽样得到当前传输粒子发生某种物理过程的信息,比如是否发生了光电效应,如果是,则会产生次级粒子即有动能的自由电子,然后继续模拟抽样该电子的物理过程,比如发生电离,沉积了多少能量等。
Geant4关键函数之间的流程关系B1的物理过程列表用的是集成好的QBBC,包含了标准电磁相互作用过程和强子物理过程,只需要在主函数exampleB1.cc中声明调用即可。在定义好几何体之后,当又辐射粒子穿过几何体时,Geant4会根据辐射粒子的特性和几何体材料的特性进行物理过程的蒙卡抽样,通过Step给出所可能发生的物理过程。
Geant4最需要注意的地方在于根据用户的需求获得想要的信息,B1是想获得入射N个粒子后,Shape2获得多少剂量。获取信息,离不开SteppingAction.cc,step即G4Step,会给出几乎所有真实实验中可以给出的信息。
计算剂量,我们需要知道:
a. 每个粒子即Event会沉积多少能量,然后把所有粒子/Event的沉积能量相加,所有的沉积能量/Shape2质量=剂量;
b. 每个粒子与几何体相互作用时,Shape2中的每个Step沉积多少能量,然后把这些Step沉积能量相加给当前的Event。
在Geant4模拟中,我们通常是从小到大来获取统计这些能量信息:
a. 询问当前Step所处的位置是否属于Shape2几何体内,如果是,沉积能量edep相加给当前Event中的一个中间变量fEdep(在每个Event开始时,该变量fEdep初始化为0,用来统计当前Event下所有Step的沉积能量和)。
if (!fScoringVolume) {
const B1DetectorConstruction* detectorConstruction= static_cast<const B1DetectorConstruction*>(G4RunManager::GetRunManager()->GetUserDetectorConstruction());
fScoringVolume = detectorConstruction->GetScoringVolume();
// fScoringVolume=Shape2
}
// get volume of the current step
G4LogicalVolume*volume= step->GetPreStepPoint()->GetTouchableHandle()->GetVolume()->GetLogicalVolume();
// check if we are in scoring volume
if (volume != fScoringVolume) return;
// collect energy deposited in this step
G4double edepStep = step->GetTotalEnergyDeposit();
fEventAction->AddEdep(edepStep);
b. 在每个Event开始时,变量fEdep初始化为0,在结束时,将fEdep相加给Run中的变量“fEdep”,在Run结束时,当前所有入射粒子总的沉积能量也就得出来了。
void B1EventAction::BeginOfEventAction(const G4Event*)
{
fEdep = 0.;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void B1EventAction::EndOfEventAction(const G4Event*)
{
// accumulate statistics in run action
fRunAction->AddEdep(fEdep);
}
在接下来的教程系列中,我们将分别探究B1DetectorConstruction.cc、B1PrimaryGeneratorAction.cc、B1SteppingAction.cc 的实战应用。