我试图在Geant4的(n,γ)反应中确定目标原子核。我一直无法提取这些信息。我发现它唯一要存储的地方是G4IsoParticleChange,它是由G4HadronicProcess在启用同位素计数的情况下创建的。
不幸的是,每次调用流程时,这些信息都会丢失(也不是以一种很好的方式,而是以内存泄漏的方式)。我找不到在粒子创建之间请求此信息的用户挂钩。据我所知,G4UserStackingAction是不够的,因为次级粒子都是在堆叠之前的一个步骤中创建的(*尽管写最后一句话给了我一个想法)。
谁能帮我确定在(n,γ)反应中捕获中子的原子核?有没有更简单的方法来获取这些信息?
谢谢
附注:由于一个中子在一个步骤中只能被吸收一次,那么等到次要元素堆叠起来获取IsoParticleChange信息是否安全,或者我是否有内存泄漏的风险?
编辑得更清楚:
我想问的是,是否有人知道如何检索Geant4中nCapture进程的目标核。从源代码可以清楚地看出,如果未检索到G4HadronicProcess信息,则无论何时调用G4IsoParticleChange,都会发生内存泄漏。在不丢失某些信息并导致内存泄漏的情况下,似乎没有合适的用户钩子点来获取此信息,但仍有可能打开此信息存储。我想知道获取这种信息的正确方法是什么,或者是否有更好的方法来获得关于目标核的这种信息。
我之前从熟悉Geant的人那里得到了一些帮助。我还没有从Slac Geant4论坛得到回复,让我可以访问那里的帖子。无论如何,这个论坛看起来并不是很活跃。
谢谢
后续行动:
如果有人偶然发现了这一点,我从G4HadronicProcess类的作者之一那里得到的答案是“这部分实现已经多年没有维护过了”,“如果不编辑源代码,让核心参与交互是非常困难的,如果不是不可能的话。”所以我正在建立一个新的Geant工作区,在那里我可以做到这一点。仅供参考。
发布于 2013-09-21 23:53:36
我终于找到了这个问题的有效解决方案:我在以中子俘获结束的一步的二级轨迹矢量中寻找原子核。这个原子核捕获了中子,它的反冲被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引用了我自己的数据类。
发布于 2011-06-06 07:26:24
好吧,我没有详细地看过它是否真的满足您的需求,但似乎许多与跟踪父母和产品等相关的问题都可以通过类似于所描述的in this Tip from the forum的方式来解决。
啊哈!The tip on examining secondaries可能更好,因为它展示了如何选择父粒子的结束状态,并从结束步骤的过程中提取一些信息。
你可以从这里开始。
https://stackoverflow.com/questions/6244336
复制相似问题