【问题标题】:Find nucleus involved in nCapture process in Geant4在 Geant4 中查找参与 nCapture 过程的核
【发布时间】:2011-09-08 19:35:21
【问题描述】:

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

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

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

谢谢

附:由于一个中子只能在一个步骤内被吸收一次,等到二级粒子堆叠起来获取 IsoParticleChange 信息是否安全,或者我是否有内存泄漏的风险?

编辑得更清楚:

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

我之前从熟悉 Geant 的人那里得到了一些关于 SO 的帮助。我无法从 Slac Geant4 论坛获得回复,让我可以在那里发帖。反正论坛好像不是很活跃。

谢谢

跟进:

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

【问题讨论】:

  • 我对你在问什么感到有点困惑。您是在问如何找到内存泄漏?或者您是在问如何使用特定的库 Geant4?
  • 我正在寻求有关 Geant4 的具体帮助。 Geant4 是 CERN 开发的高能物理软件。
  • 我想你对online documentationsoftware reference manual特别熟悉吧?我发现根植于类文档是解决此类问题的一种缓慢且有时令人沮丧但可靠的技术。
  • 还有"Slack Geant4 forum"你是说"SLAC Geant4 forum"吗?在任何情况下,您都可以考虑在the forum maintained by the Geant developers 上提问(似乎托管在 SLAC,所以我们可能在谈论同一件事)。
  • 是的,我的意思是 SLAC,我认为这是同一个论坛。我对文档很熟悉,但如果你经常使用 geant,你可能会注意到它有些欠缺!根植于源代码确实是获取有关类在 geant 中如何工作的任何真实信息的唯一方法。

标签: c++ physics montecarlo


【解决方案1】:

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

【讨论】:

  • 是的,我最终做了同样的事情并检查了次级粒子的原子核。已经大约两年了,但感谢您发布解决方案!我将不得不回顾一下我的代码,但我认为有一些细节可以减少查找核所需的检查次数。我会将您的答案标记为正确。
【解决方案2】:

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

啊哈! The tip on examining secondaries 可能会更好,因为它展示了如何在父粒子的结束状态上进行选择,并从结束该步骤的过程中提取一些信息。

你可以从那里开始。

【讨论】:

  • 好吧,问题是每次调用该进程以避免内存泄漏后,我需要调用 G4Hadronic::GetIsotopeProductionInfo() 会出现(我可能是错的)。一个进程可以在一个步骤中多次调用吗?
  • @user:我对 geant 的内部结构并不那么,但我怀疑这样做会搞砸事情,所以在工作代码中似乎不太可能。
  • 我的意思是,如果说,在一个步骤中生成了 2 个辅助节点,这可能会发生,该过程可能会被调用两次,你不觉得吗?我也真的不知道。
  • @user:呃……我不知道。好问题。
  • 根据此链接中的信息,似乎每个进程每个步骤的每种“DoIt”类型仅调用一次。当调用包含辅助节点列表的“DoIt”方法时,进程会返回 G4ParticleChange。因此,多个辅助节点可以来自一次“DoIt”的调用。 google.com/…
猜你喜欢
  • 1970-01-01
  • 2017-12-12
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 2013-12-20
相关资源
最近更新 更多