No fission fragment found through ParentID

I want to get fission fragment through ParentID, the codes are:

G4int trackID_induced_fission;

const G4StepPoint* endPoint = step->GetPostStepPoint();
G4VProcess* process   = 
                   const_cast<G4VProcess*>(endPoint->GetProcessDefinedStep());
if(process->GetProcessName()=="biasWrapper(nFission)")
{
    trackID_induced_fission=step->GetTrack()->GetTrackID();
}
if(step->GetTrack()->GetParentID()==trackID_induced_fission)
{
    cout<<step->GetTrack()->GetDefinition()->GetParticleName()<<endl;
}

the result indicates only neutron and gamma are produced in fission, why?

and how to access the fission fragment?

Geant4 Version:11.2.0
Operating System:Ubuntu 20.04
Compiler/Version:9.4.0
CMake Version:3.16.3


Hi @siyuan1979

Thank you for your question. Could you please try using one of the default physics lists that includes fission? For example, FTFP_BERT_HP should include this process[1]

Best,
Alvaro

[1] geant4/source/physics_lists/constructors/hadron_inelastic/src/G4HadronPhysicsFTFP_BERT_HP.cc at b4a16de652ec244f7a0ecc0a5cacfee21930bf75 · Geant4/geant4 · GitHub

In your main :

G4ParticleHPManager::GetInstance() → SetProduceFissionFragments(true);

or, alternatively :

/process/had/particle_hp/produce_fission_fragment true

@atolosad, @maire1 ,

I know how to produce the fission fragment in main function long time ago, like this:

G4ParticleHPManager::GetInstance()->SetProduceFissionFragments( true );
or
G4ParticleHPManager::GetInstance()->SetUseWendtFissionModel(true);

and when using the codes:

if(volume_pre==fPostVolume)
{
    fEventAction->AddEnergy(step->GetTotalEnergyDeposit());
}

i can obtain the pulse amplitude spectrum:

but now, i want the spectrum only by fission fragment, as the codes top,

the fission reactions take place, but only neutron and gamma are produced in the fission reactions.

this is wired, why?

Do you explicitly set the production cuts in your job, or are you relying on the Geant4 defaults (usually ~1 mm). The fission fragments are low enough energy that unless you’re doing fission in vacuum (G4_Galactic), they’ll be suppressed by the production cut. To see them, you will probably need to set the “proton” (all hadrons) production cut to zero.

@mkelsey , yes, the cuts were set, and the codes are:

void fpPhysicsList::SetCuts()
{
  SetCutValue(0*mm, "proton");
  SetCutValue(0*mm, "e-");
  SetCutValue(0*mm, "e+");
  SetCutValue(0*mm, "gamma");      
} 

when no condition of fission, the pulse amplitude spectrum include fission fragment was obtained, that was showed on the figure up.

Mmmm, okay. Then there’s something else going on. If you’re seeing the fragments only in step->GetTotalEnergyDeposit(), that means the fragments themselves (as tracks) were not created (because the tracks were suppressed, and their kinetic energy was assigned to the parent step).

Here a macro for example Hadr03, which shows that the fission fragments are explicitly generated.

What is different in your application ?

siyuan.mac.txt (666 Bytes)

siyuan.out.txt (4.4 KB)

@maire1 , fission fragments are always explicitly generated in my application, here is another pulse amplitude spectrum include fission fragments calculated by Geant4:

@mkelsey, the two peaks in the figure separately associate the lighter fission fragments and the heavier fission fragments,

the problem is the fission fragments can not be accessed through ParentID? and the codes are:

G4int trackID_induced_fission;

const G4StepPoint* endPoint = step->GetPostStepPoint();
G4VProcess* process   = 
                   const_cast<G4VProcess*>(endPoint->GetProcessDefinedStep());
if(process->GetProcessName()=="biasWrapper(nFission)")
{
    trackID_induced_fission=step->GetTrack()->GetTrackID();
}
if(step->GetTrack()->GetParentID()==trackID_induced_fission)
{
    cout<<step->GetTrack()->GetDefinition()->GetParticleName()<<endl;
}

Are you trying to do both of those things to the same step? That definitely won’t work.

If you’re looking at the step where the fission happened (i.e., the test on GetProcessName()), then the secondaries from the fission have not yet been converted into tracks. You will find them if you loop over the secondaries of the step (step->GetSecondaryInCurrentStep()).

Alternatively, if you modify your code, and look for track->GetCreatorProcess()->GetName() matching fission (make sure the process pointer isn’t null!), then you should see the fragments.

@mkelsey, yes you are right, through “step->GetTrack()->GetCreatorProcess()->GetProcessName()“, the fission fragments can be accessed,

thank you!