2

我正在尝试确定 Geant4 中 (n,gamma) 反应中的目标核。我一直无法提取此信息。我发现它的唯一存储位置是 G4IsoParticleChange,如果启用了同位素计数,它由 G4HadronicProcess 创建。

不幸的是,每次调用该进程时,此信息都会丢失(也不是以一种好的方式,而是内存泄漏方式)。在粒子创建之间,我找不到用户挂钩来询问此信息。据我所知,G4UserStackingAction 是不够的,因为次级粒子都是在堆叠之前为一个步骤创建的(* 尽管写最后一句话给了我一个想法)。

谁能帮我确定在 (n,gamma) 反应中捕获中子的原子核?有没有更简单的方法来获取这些信息?

谢谢

PS 由于一个中子只能在一个步骤内被吸收一次,等到二级粒子被堆叠以获得 IsoParticleChange 信息是否安全,或者我是否冒着内存泄漏的风险?

编辑更清楚:

我在问是否有人知道如何在 Geant4 的 nCapture 过程中检索作为目标的核。从源头上可以清楚地看出,如果没有检索到 G4IsoParticleChange 信息,则只要调用 G4HadronicProcess 就会发生内存泄漏。似乎没有合适的用户钩子在不丢失某些信息并导致所述内存泄漏的情况下获取此信息,但可以打开此信息存储。我想知道获取此信息的正确方法是什么,或者是否有更好的方法来获取有关目标核的此类信息。

我以前从熟悉 Geant 的人那里得到了一些关于 SO 的帮助。我无法从 Slac Geant4 论坛获得回复,让我可以在那里发帖。无论如何,论坛似乎并不十分活跃。

谢谢

跟进:

万一有人偶然发现这一点,我从 G4HadronicProcess 类的一位作者那里得到的答案是“这部分实现已经很多年没有维护了”和“让核心参与交互是非常困难的,如果不是不可能的话无需编辑源代码。” 因此,我正在建立一个新的 Geant 工作区,我可以在其中执行此操作。供参考。

4

2 回答 2

2

我终于找到了解决这个问题的有效方法:我在以中子俘获结束的步骤的二级轨道矢量中搜索原子核。这个原子核是捕获中子的原子核,它的后坐力被 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 指的是我自己的数据类。

于 2013-09-21T15:53:36.190 回答
1

好吧,我没有详细查看它是否真的满足您的需求,但似乎许多与跟踪父母和产品等相关的问题可以通过类似于本提示中描述的方式来解决。论坛

啊哈!检查次级粒子的提示可能会更好,因为它显示了如何选择父粒子的结束状态并从结束该步骤的过程中提取一些信息。

你可以从那里开始。

于 2011-06-05T23:26:23.623 回答