geant4获取一个次级光子从产生到消失的全部过程中每一步的能量变化,用代码演示一下
时间: 2024-02-12 12:05:17 浏览: 96
下面是一个简单的 Geant4 示例代码,用于获取次级光子从产生到消失的全部过程中每一步的能量变化信息:
```c++
#include "G4RunManager.hh"
#include "G4UImanager.hh"
#include "G4VisExecutive.hh"
#include "G4UIExecutive.hh"
#include "MyDetectorConstruction.hh"
#include "MyPrimaryGeneratorAction.hh"
#include "MyRunAction.hh"
#include "MyEventAction.hh"
#include "MySteppingAction.hh"
int main(int argc, char** argv) {
// 创建 Geant4 的 RunManager 对象
G4RunManager* runManager = new G4RunManager;
// 设置用户自定义的 Detector Construction
runManager->SetUserInitialization(new MyDetectorConstruction);
// 设置用户自定义的 Primary Generator Action
runManager->SetUserAction(new MyPrimaryGeneratorAction);
// 设置用户自定义的 Run Action
runManager->SetUserAction(new MyRunAction);
// 设置用户自定义的 Event Action
runManager->SetUserAction(new MyEventAction);
// 设置用户自定义的 Stepping Action
runManager->SetUserAction(new MySteppingAction);
// 初始化运行
runManager->Initialize();
// 创建 UI 管理器
G4UImanager* uiManager = G4UImanager::GetUIpointer();
// 启动可视化
G4VisManager* visManager = new G4VisExecutive;
visManager->Initialize();
// 如果有命令行参数,则使用命令行模式,否则使用交互式模式
if (argc != 1) {
G4String command = "/control/execute ";
G4String fileName = argv[1];
uiManager->ApplyCommand(command + fileName);
} else {
G4UIExecutive* ui = new G4UIExecutive(argc, argv);
uiManager->ApplyCommand("/control/execute init_vis.mac");
ui->SessionStart();
delete ui;
}
// 结束运行
delete visManager;
delete runManager;
return 0;
}
```
上面的代码中,我们创建了一个名为 `MySteppingAction` 的用户自定义 Stepping Action 类,用于获取次级光子的能量变化信息。下面是 `MySteppingAction` 的代码:
```c++
#include "MySteppingAction.hh"
#include "G4Step.hh"
#include "G4Track.hh"
#include "G4ThreeVector.hh"
#include "G4SystemOfUnits.hh"
void MySteppingAction::UserSteppingAction(const G4Step* step) {
// 获取当前 Step 中的 Track
G4Track* track = step->GetTrack();
// 判断当前 Track 是否是光子
if (track->GetDefinition()->GetParticleName() == "gamma") {
// 获取当前 Step 中的能量变化
G4double energy = step->GetDeltaEnergy();
// 如果当前光子产生了次级光子,则获取次级光子的信息
G4TrackVector* secondary = step->GetSecondary();
if (secondary->size() > 0) {
for (G4int i = 0; i < secondary->size(); i++) {
G4Track* secTrack = (*secondary)[i];
G4String secName = secTrack->GetDefinition()->GetParticleName();
G4double secEnergy = secTrack->GetKineticEnergy();
G4double secTime = secTrack->GetGlobalTime();
// 输出次级光子的信息
G4cout << "Secondary particle: " << secName
<< " Energy: " << secEnergy/MeV << " MeV"
<< " Time: " << secTime/ns << " ns" << G4endl;
}
}
// 输出当前光子在当前 Step 中的能量变化信息
G4cout << "Gamma energy: " << energy/keV << " keV" << G4endl;
}
}
```
在 `MySteppingAction` 中,我们通过判断当前 Track 是否是光子来获取次级光子的能量变化信息。如果当前光子产生了次级光子,则遍历次级光子的数组,获取次级光子的能量和时间信息,并将其输出到控制台。如果当前光子没有产生次级光子,则只输出当前光子在当前 Step 中的能量变化信息。
阅读全文