我正在尝试确定 Geant4 中 (n,gamma) react 中的目标核。我一直无法提取此信息。我发现它唯一存储的地方是 G4IsoParticleChange,如果启用同位素计数,它由 G4HadronicProcess 创建。
不幸的是,每次调用进程时,这些信息都会丢失(也不是以一种很好的方式,而是以内存泄漏的方式)。我找不到在粒子创建之间询问此信息的用户 Hook 。据我所知,G4UserStackingAction 是不够的,因为次级粒子都是在堆叠之前为一个步骤创建的(* 尽管写最后一句话给了我一个想法)。
谁能帮我确定在 (n,gamma) react 中捕获中子的原子核?有没有更简单的方法来获取这些信息?
谢谢
附言由于一个中子在一个步骤中只能被吸收一次,所以等到中子堆叠起来获取 IsoParticleChange 信息是否安全,或者我是否有内存泄漏的风险?
编辑得更清楚:
我想问是否有人知道如何检索作为 Geant4 中 nCapture 进程目标的核。从源代码中可以清楚地看出,如果未检索到 G4IsoParticleChange 信息,则每当调用 G4HadronicProcess 时都会发生内存泄漏。似乎没有用户 Hook 点适合在不丢失某些信息并导致所述内存泄漏的情况下获取此信息,但可以打开此信息存储。我想知道获取这些信息的正确方法是什么,或者是否有更好的方法来获取有关目标核的此类信息。
我之前从熟悉 Geant 的人那里得到了一些关于 SO 的帮助。我无法从 Slac Geant4 论坛得到回复,无法让我访问那里发帖。无论如何,该论坛似乎并不十分活跃。
谢谢
跟进:
万一有人偶然发现这个问题,我从 G4HadronicProcess 类的一位作者那里得到的答案是“这部分实现已经很多年没有维护了”和“让核心参与交互非常困难如果不编辑源代码也不是不可能。”所以我正在建立一个新的 Geant 工作区,我可以在那里做。仅供引用。
最佳答案
我终于找到了解决该问题的有效方法:我在以中子俘获结束的步骤的次级轨道 vector 中搜索原子核。这个原子核是捕获中子的原子核,Geant4 跟踪其反冲。不要忘记从该原子核中减去 1 个中子以获得您想要的结果(对于氢的捕获,您将使用此方法获得氘)。
所以在我的 SteppingAction 中,我添加:
// neutron capture
if ( aStep->GetPostStepPoint()->GetProcessDefinedStep()
&& aStep->GetPostStepPoint()->GetProcessDefinedStep()->GetProcessType() == fHadronic // see G4ProcessType.hh
&& aStep->GetPostStepPoint()->GetProcessDefinedStep()->GetProcessSubType() == fCapture // see G4HadronicProcessType.hh
) {
if ( aStep->GetSecondary() != 0
&& aStep->GetSecondary()->size() != 0
) {
std::vector<G4Track*>::const_iterator it;
for (it=aStep->GetSecondary()->begin(); it!=aStep->GetSecondary()->end(); it++) {
if ( !(*it)->GetCreatorProcess()
|| (*it)->GetCreatorProcess()->GetProcessSubType() != fCapture // see G4HadronicProcessType.hh
|| (*it)->GetCreatorProcess()->GetProcessType() != fHadronic // see G4ProcessType.hh
|| !(*it)->GetDynamicParticle()
|| (*it)->GetDynamicParticle()->GetParticleDefinition()->GetAtomicNumber() == 0 // keep only nucleus
|| (*it)->GetDynamicParticle()->GetParticleDefinition() == G4Neutron::NeutronDefinition() // but not the neutron (perhaps antiparticles could also be checked)
) { continue; }
myEventAction->TreatNeutronCapture(*it);
break;
}
if (it == aStep->GetSecondary()->end()) {
G4cerr << "\n#### END OF SECONDARY VECTOR REACHED AFTER NEUTRON CAPTURE ! ###\n";
myEventAction->TreatNeutronCapture(0);
}
} else { myEventAction->TreatNeutronCapture(0); }
}
如您所见,我将实际的步进处理推迟到 EventAction 的方法。这是我的 TreatNeutronCapture 方法:
void MyExperimentEventAction::TreatNeutronCapture(const G4Track* track)
{
myParticle = myMC->GetParticle(ParticleMap[track->GetParentID()]);
if (track == 0) { myParticle->SetFinalProcess(-1); } // if no nucleus is found in secondaries
else { myParticle->SetFinalProcess(track->GetDynamicParticle()->GetPDGcode()); }
}
myParticle 和 myMC 引用我自己的数据类。
关于c++ - 在Geant4中找到参与nCapture过程的核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6244336/