gpt4 book ai didi

c++ - 在Geant4中找到参与nCapture过程的核

转载 作者:行者123 更新时间:2023-11-30 04:34:03 25 4
gpt4 key购买 nike

我正在尝试确定 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com