文|?梁佐佐
讓我們繼續(xù)以B1例子為主,講解Geant4的模擬流程。如下圖所示,Run是由多個Event組成的,PrimaryGenerator每執(zhí)行一次,就會產(chǎn)生一個獨立的Event,每個Event又是由多個Step組成的。Step是物理過程反應的最小模擬單元,從長度上可以小到nm甚至fm,可以通過蒙卡抽樣得到當前傳輸粒子發(fā)生某種物理過程的信息,比如是否發(fā)生了光電效應,如果是,則會產(chǎn)生次級粒子即有動能的自由電子,然后繼續(xù)模擬抽樣該電子的物理過程,比如發(fā)生電離,沉積了多少能量等。

B1的物理過程列表用的是集成好的QBBC,包含了標準電磁相互作用過程和強子物理過程,只需要在主函數(shù)exampleB1.cc中聲明調(diào)用即可。在定義好幾何體之后,當又輻射粒子穿過幾何體時,Geant4會根據(jù)輻射粒子的特性和幾何體材料的特性進行物理過程的蒙卡抽樣,通過Step給出所可能發(fā)生的物理過程。
Geant4最需要注意的地方在于根據(jù)用戶的需求獲得想要的信息,B1是想獲得入射N個粒子后,Shape2獲得多少劑量。獲取信息,離不開SteppingAction.cc,step即G4Step,會給出幾乎所有真實實驗中可以給出的信息。
計算劑量,我們需要知道:
a.?每個粒子即Event會沉積多少能量,然后把所有粒子/Event的沉積能量相加,所有的沉積能量/Shape2質(zhì)量=劑量;
b.?每個粒子與幾何體相互作用時,Shape2中的每個Step沉積多少能量,然后把這些Step沉積能量相加給當前的Event。
在Geant4模擬中,我們通常是從小到大來獲取統(tǒng)計這些能量信息:
a.?詢問當前Step所處的位置是否屬于Shape2幾何體內(nèi),如果是,沉積能量edep相加給當前Event中的一個中間變量fEdep(在每個Event開始時,該變量fEdep初始化為0,用來統(tǒng)計當前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,在結(jié)束時,將fEdep相加給Run中的變量“fEdep”,在Run結(jié)束時,當前所有入射粒子總的沉積能量也就得出來了。
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?的實戰(zhàn)應用。