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

时间:2011-06-05 16:48:23

标签: c++ physics montecarlo

我正在尝试确定Geant4中(n,γ)反应中的目标核。我无法提取此信息。我发现它存储的唯一地方是G4IsoParticleChange,它是由G4HadronicProcess创建的,如果启用了Isotope Counting。

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

有人能帮我确定在(n,γ)反应中捕获中子的原子核吗?是否有更简单的方法来获取此信息?

由于

P.S。由于中子只能在一个步骤内被吸收一次,所以只要等到第二个堆叠以获得IsoParticleChange信息或者我是否冒内存泄漏是否安全?

编辑更清晰:

我在问是否有人知道如何检索Geant4中nCapture过程中的目标细胞核。从源头可以清楚地看到,如果未检索到G4IsoParticleChange信息,则每当调用G4HadronicProcess时都会发生内存泄漏。似乎没有用户钩子适合于抓住它而不会丢失一些信息并导致所述内存泄漏,但是可以打开此信息存储。我想知道获取此信息的正确方法是什么,或者是否有更好的方法来获取有关目标核的此类信息。

我以前从熟悉Geant的人那里得到了一些帮助。我无法从Slac Geant4论坛得到回复,让我可以访问帖子。无论如何,论坛似乎并不活跃。

由于

随访:

如果有人偶然发现这个问题,我从G4HadronicProcess课程的一位作者那里得到的答案是“这部分实施工作多年来一直没有得到维护”和“让相关的核心参与进来非常困难”如果不是不可能没有编辑源代码。“所以我正在建立一个新的Geant工作区,我可以做到这一点。 FYI。

2 个答案:

答案 0 :(得分:1)

好吧,我没有仔细查看它是否真的满足了你的需求,但似乎与跟踪父母和产品等有关的许多问题都可以用类似于{{{ 3}}

啊哈! in this Tip from the forum可能更好,因为它显示了如何选择父粒子的结束状态,并从结束该步骤的过程中提取一些信息。

你可以从那里开始。

答案 1 :(得分: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引用我自己的数据类。