Найти ядро, участвующее в процессе nCapture в Geant4 - PullRequest
1 голос
/ 05 июня 2011

Я пытаюсь определить целевое ядро ​​в (n, гамма) реакции в Geant4. Я не смог извлечь эту информацию. Единственное место, где я нашел его для хранения, - это G4IsoParticleChange, который создается G4HadronicProcess, если включен подсчет изотопов.

К сожалению, эта информация теряется (тоже не очень хорошо, но стиль утечки памяти) при каждом запуске процесса. Я не могу найти пользователя, который запрашивает эту информацию между созданиями частиц. Насколько я могу судить, G4UserStackingAction недостаточно, потому что все вторичные частицы создаются для шага перед их укладкой (* хотя написание этого последнего предложения дало мне представление).

Может ли кто-нибудь помочь мне определить ядро, которое захватывает нейтрон в (n, гамма) реакции? Есть ли более простой способ получить эту информацию?

Спасибо

P.S. Поскольку нейтрон может быть поглощен только один раз за шаг, будет ли безопасно просто подождать, пока вторичные элементы не будут собраны, чтобы получить информацию IsoParticleChange, или я рискую утечкой памяти?

Изменить, чтобы быть более понятным:

Я спрашиваю, знает ли кто-нибудь, как извлечь ядро, которое было целью в процессе nCapture в Geant4. Из источника ясно, что утечка памяти будет происходить всякий раз, когда вызывается G4HadronicProcess, если информация G4IsoParticleChange не извлекается. Похоже, что пользователь не поймал точку, подходящую для захвата, не пропуская некоторую информацию и не вызывая утечку памяти, и, тем не менее, можно включить это хранилище информации. Мне интересно, каков правильный способ получения этой информации или есть ли лучший способ получить информацию такого типа о целевом ядре.

Ранее я получал некоторую помощь по SO от людей, знакомых с Geant. Я не смог получить ответ от форума Slac Geant4, чтобы дать мне доступ к записи там. В любом случае, форум не кажется активным.

Спасибо

Последующий:

В случае, если кто-то наткнется на это, я получил ответ от одного из авторов класса G4HadronicProcess: «Эта часть реализации не поддерживалась в течение многих лет» и «Привлечь ядро ​​к взаимодействию очень трудно». если не невозможно без редактирования исходного кода. " Итак, я нахожусь в процессе настройки нового рабочего пространства Geant, где я могу это сделать. FYI.

Ответы [ 2 ]

1 голос
/ 21 сентября 2013

Я наконец нашел эффективное решение этой проблемы: я ищу ядро ​​во вторичном трековом векторе шага, заканчивающегося захватом нейтрона.Это ядро, которое захватило нейтрон и отскок которого отслеживается 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 ссылаются на мои собственные классы данных.

1 голос
/ 06 июня 2011

Ну, я не смотрел подробно, чтобы увидеть, действительно ли это соответствует вашим потребностям, но кажется, что многие проблемы, связанные с отслеживанием родителей и продуктов и тому подобное, могут быть решены аналогично описанному * в этом Совете с форума .

Aha! Совет по проверке вторичных может быть лучше, потому что он показывает, как выбрать конечное состояние родительской частицы и извлечь некоторую информацию из процесса, завершившего шаг.

Вы можете начать там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...