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

标签 c++ physics montecarlo

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

相关文章:

c++ - SIGABRT on std::ifstream关闭

c++ - 为什么 C++ 允许从 int 隐式转换为 unsigned int?

c++ - 将文本文件中的整数插入整数数组

c++ - lambda如何捕获结构的成员

java - 精简计算器程序

二维弹性球碰撞物理

c++ - 如何在numpy c-api中共享随机数生成器?

c++ - 关于 C++ 上的随机数生成 dSFMT 性能

Matlab:假设一个 4x4 相关矩阵,如何生成一个 4x1 随机变量矩阵?

unity3d - 以统一的初始冲量在抛物线路径上移动二维物理体