Counts mismatch in FLUKA and geant4

Please fill out the following information to help in answering your question, and also see tips for posting code snippets. If you don’t provide this information it will take more time to help with your problem!

Geant4 Version: 11.2.2
Operating System: Ubuntu 24.04.4 LTS
Compiler/Version: GCC 13.3.0
CMake Version: 3.28.3

For Cs137 radioactive simulation I am using FLUKA and GEANT4. In G4 I am using G4Livermore physics model and sensitive detectors for scoring. In FLUKA I am using DETECT card to get the energy counts. I am wonderd at the same number of primaries GEANT4 has less counts stored in detector than fluka. Could anyone help me with that?

Thanks


@jrellin could you please help me with that?

Without added context, it is not clear where the problem would be coming from. At first glance, the G4Livermore physics model will not be enough if you are actually using the decay of Cs137 since that physics model does not have decay and radioactive decay physics. I would recommend using the physics list of rdecay01 and rdecay02 as a start.

Or if you want to make it easier you could just make the particle source a point source of 662 keV and bypass the decay process to start with.

Thank you @jrellin for your response. I have attached the PhysicsList for your reference.

#include “physics.hh”

#include “G4SystemOfUnits.hh”
#include “G4UnitsTable.hh”

// EM Physics options
#include “G4EmStandardPhysics.hh”
#include “G4EmStandardPhysics_option4.hh”
#include “G4EmLivermorePhysics.hh”
#include “G4EmPenelopePhysics.hh”

// Decay
#include “G4DecayPhysics.hh”
#include “G4RadioactiveDecayPhysics.hh”
#include “G4NuclideTable.hh”
#include “G4EmExtraPhysics.hh”
#include “G4EmParameters.hh”

#include “G4VPhysicsConstructor.hh”
#include “G4ios.hh”
#include “G4HadronicParameters.hh”

//…oooOO0OOooo…oooOO0OOooo…oooOO0OOooo…

MyPhysicsList::MyPhysicsList()
{
SetVerboseLevel(1);
G4HadronicParameters::Instance()->SetTimeThresholdForRadioactiveDecay(1.0e+60 * CLHEP::year);

// =========================
// Default Livermore physics
// =========================
fEmName = "livermore";

fEmPhysicsList = new G4EmLivermorePhysics();

G4NuclideTable::GetInstance()->SetThresholdOfHalfLife(0.1*picosecond);
G4NuclideTable::GetInstance()->SetLevelTolerance(1.0*eV);

// =========================
// Decay physics
// =========================
fDecayPhysicsList = new G4DecayPhysics();

// Register physics
RegisterPhysics(fEmPhysicsList);


RegisterPhysics(fDecayPhysicsList);
RegisterPhysics(new G4RadioactiveDecayPhysics());

}

//…oooOO0OOooo…oooOO0OOooo…oooOO0OOooo…

MyPhysicsList::~MyPhysicsList()
{
}

//…oooOO0OOooo…oooOO0OOooo…oooOO0OOooo…

void MyPhysicsList::AddPhysicsList(const G4String& name)
{
if (name == fEmName) return;

if (name == "emstandard") {

    fEmName = name;
    delete fEmPhysicsList;
    fEmPhysicsList = new G4EmStandardPhysics();

} else if (name == "emstandard_opt4") {

    fEmName = name;
    delete fEmPhysicsList;
    fEmPhysicsList = new G4EmStandardPhysics_option4();

} else if (name == "livermore") {

    fEmName = name;
    delete fEmPhysicsList;
    fEmPhysicsList = new G4EmLivermorePhysics();

} else if (name == "penelope") {

    fEmName = name;
    delete fEmPhysicsList;
    fEmPhysicsList = new G4EmPenelopePhysics();

} else {

    G4cout << "MyPhysicsList::AddPhysicsList: <" << name 
            << "> is not defined" << G4endl;
    return;
}

// Replace the physics in Geant4 kernel
ReplacePhysics(fEmPhysicsList);

G4cout << "### EM Physics List changed to: " << name << G4endl;

}

//…oooOO0OOooo…oooOO0OOooo…oooOO0OOooo…

void MyPhysicsList::SetCuts()
{
// Default cut value
SetCutValue(0.01mm, “gamma”);
SetCutValue(0.01
mm, “e-”);
SetCutValue(0.01*mm, “e+”);

// Apply cuts
G4VUserPhysicsList::SetCuts();

if (verboseLevel > 0) {
    G4cout << "### Production cuts set to 0.01 mm" << G4endl;
}

}

//…oooOO0OOooo…oooOO0OOooo…oooOO0OOooo…

Can you be more specific about what is not matching? Counts is non-specific. Energy spectra would be helpful.

One thing to do is to enable EM options if you want the gamma emission from Ba137 since I believe that the defaults for Pixe, Auger, and Fluo are False by default.

G4EmParameters* params = G4EmParameters::Instance();
params->SetFluo(true);
params->SetAuger(true);
params->SetPixe(true);

But without further context, unclear what the issue is.

Thank you for your response. The problem is not with energy spectra. The spectra is as expected. There is also 32 keV X-ray peak from Ba-137 emission. However, I have taken 1e7 primaries both in GEANT4 and FLUKA. But for the same number of primaries, there are around 10000 counts in GEANT4 photopeak and 100000 counts in FLUKA spectrum photopeak. I am unable to understand why this mismatch is happening?

Hi @RohitNathawat

an order of magnitude difference is definitely not related to the details of physics. Looks more something related to the geometry (distances, etc.). Are you sure that the two setups (dimensions, distances, materials) in Geant4 and in FLUKA are really mirroring up?

Ciao,

Luciano

Hi @lpandola

Yes, I have used the same geometry, materials and distance in both simulations for mirroring up.

Cheers,

Rohit

Without the geant and fluka files, there is not much we can do to help here. Do you have images of both geometries as rendered in those codes?

I would suggest debugging your simulations, if they are truly identical, by defining a beam of 662 keV gamma rays fired straight at your detector in both simulations. And then compare the number of “counts” and energy spectra there. That will at least isolate (most) physics issues from geometry issues.

Dear @jrellin I have attached the geometry from both the simulation code. The detector is 2" x 2" NaI(Tl) detector and placed 15 cm away from the source. Number of primaries in both simulations are 15723000. You can see the spectrum difference in the both simulations. It is raw spectrum without gaussian energy broadening. If I also do gaussian broadening the counts become more less in geant4. Please let me know if you need other files also.