Scintillation Yield

I simulated EJ200 and Ej204 PS in geant4 Then I enumerated the optical photons that were produced in each event. I saw that the number of optical photons generated for 1 MeV electron is one order of magnitude less than scintillation yield.
To be sure, I simulated a big plastic scintillator and put an electron with 1 MeV energy in the center of geometry so that particles can not escape from geometry and then count the number of optical photons per event.
Average of optical photons for 1 MeV electron is 800 photons while scintillation yield is 10000.
Why are these not equal? Do I have to increase the “SCINTILLATIONYIELD” to reach from 800 to 10000?

Scnt_MPT->AddConstProperty(“SCINTILLATIONYIELD”, 10400. / MeV);//for EJ204 equal to 800 !?
Scnt_MPT->AddConstProperty(“RESOLUTIONSCALE”, 1.0);
Scnt_MPT->AddConstProperty(“FASTTIMECONSTANT”, 0.7*ns);
Scnt_MPT->AddConstProperty(“YIELDRATIO”, 1.0);


how do you count/log the optical photons that are emitted in the scintillator? To make sure, do you have the scintillation process enabled?

Thank you,
I useed this method for counting optical photon:
void SteppingAction::UserSteppingAction(const G4Step* aStep)
const G4String currentPhysicalName
= aStep->GetPreStepPoint()->GetPhysicalVolume()->GetName();

const G4String particleName
= aStep->GetTrack()->GetDefinition()->GetParticleName();

if (currentPhysicalName == "Crystal"){
	G4double EdepStep = aStep->GetTotalEnergyDeposit();
	if (EdepStep > 0.) eventAction->EdepInCrystal = eventAction->EdepInCrystal + EdepStep;

	//count scintillating photons and kill the photons after the first step
	 if (particleName == "opticalphoton"){
		eventAction->absTime = aStep -> GetPreStepPoint() -> GetGlobalTime();


void B4aEventAction::EndOfEventAction(const G4Event* evt)

// Accumulate statistics

  // get analysis manager
  G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();

 // fill ntuple
  analysisManager->FillNtupleDColumn(0, EdepInCrystal);
  **analysisManager->FillNtupleDColumn(1, nAbsPhotons);**
  analysisManager->FillNtupleDColumn(2, absTime);
  analysisManager->FillNtupleDColumn(3, Eid);

I would actually use a StackingAction to perform the counting. My suspect here is that there is something weird with the counting procedure…

Of course I can count with other method for example command scoring and get population. I will do it.
Does the average number of photons that you count match the scintillation yield?

Does the average number of photons that you count match the scintillation yield?

Well, I don’t know, but my suspect that the problem is coming from the scoring of the photons, rather than from the scintillation production… Or, at least, this is the first thing that I would double-check.

1 Like

First of all, thank you for your response
In my work I need to evaluate energy deposit proportional to emitted Opticalphoton. for this reason number of emitted photons have a basic role in my work.
In my simulation scintillation has been occurred. Optical photons have been generated.
I simulated scintillation process step by step with this tutorial and checked it with other works that people report in GitHub.
I don’t know what other parameter can affect the number of photons produced except SCINTILLATIONYIELD.
hitherto I scored number of photon with two methods (Stepping Action & Mesh Scoring-population). The results are the same.
Anyway, I will count the photons in another way(StackingAction) and report the results.
Thank you very much dear Luciano.

In addition to Luciano’s comments, I would suggest playing around with the extended example OpNovice2 and the macro below. There are several things that might be going on, on the production side.

  1. The SCINTILLATIONYIELD sets the mean number of opticalphotons produced in a step. If the mean number for a given step is <= 10, the actual number is calculated from a Poisson distribution. If the mean number is > 10, the actual number is calculated from a Gaussian distribution with a sigma given by RESOLUTIONSCALE * sqrt(mean number). Set RESOLUTIONSCALE to 0 to remove the fluctuations. You should see output like the below. With the macro, we expect one optical photon per eV of energy loss. Here, dE is 67 eV, and 64 photons are produced.

  2. The difference (67 vs 64) is due to Birks’ saturation. This can be important for large energy losses. Edit the code ( to set Birks’ coefficient to 0, and for each step you should see the expected number of optical photons.

  3. But for the entire track, the number of opticalphotons is less than expected. This is because energy is carried away by e.g. gamma leaving the volume.

Step#    X(mm)    Y(mm)    Z(mm) KinE(MeV)  dE(MeV) StepLeng TrackLeng  NextVolume ProcName
    1   -1e+03        0        0         1        0        0  0.000176        Tank initStep
    2   -1e+03 -1.16e-06 -7.11e-07         1 6.71e-05  0.00019  0.000366        Tank msc
    :----- List of 2ndaries - #SpawnInStep= 64(Rest= 0,Along= 0,Post=64), #SpawnTotal= 64 ---------------
    :    -1e+03 -9.95e-07 -6.11e-07  6.51e-06      opticalphoton
/control/verbose 2
/tracking/verbose 2
/run/verbose 1
/process/optical/verbose 1
/control/cout/ignoreThreadsExcept 0

/opnovice2/boxMaterial G4_BGO
/opnovice2/worldMaterial G4_AIR

/opnovice2/boxProperty ABSLENGTH 0.000002 1   0.000005 2   0.000008 3
/opnovice2/boxProperty RAYLEIGH 0.000002 1   0.000008 1
/opnovice2/boxProperty RINDEX   0.000002 1.3 0.000008 1.4
/opnovice2/boxProperty SCINTILLATIONCOMPONENT1 0.000002 1.0 0.000005 1.1 0.000008 1.3

/opnovice2/boxConstProperty SCINTILLATIONTIMECONSTANT1 20   ## ns
/opnovice2/boxConstProperty SCINTILLATIONYIELD 1000000
/opnovice2/boxConstProperty SCINTILLATIONYIELD1 1.0
/opnovice2/boxConstProperty RESOLUTIONSCALE 0

/opnovice2/worldProperty RINDEX    0.000002 1.01 0.000008 1.01
/opnovice2/worldProperty ABSLENGTH 0.000002 100  0.000005 100   0.000008 100

/process/optical/processActivation Cerenkov false

/process/optical/scintillation/setByParticleType false
/process/optical/scintillation/setTrackInfo      false
/process/optical/scintillation/setStackPhotons true
/process/optical/scintillation/setEnhancedTimeConstants true


/gun/particle e-
/gun/energy 1 MeV
/gun/position -1 0 0 m
/gun/direction 1 0 0
/run/beamOn 1
1 Like

Thank you. It’s very good comment.
I will check and present the result.

Hello again.
I checked my code and count Optical photon with three way(number of particle, number of creator process and population in volume). Your guidance was very useful. I found that in my physics class I had a Set method that reduce number of scintillation yield and I forgot that.
This was a big mistake and I took your time, but it made me master the subject more.
Now I have another question:
We know that Birks constant can be different for type of particle. Depending on the energy loss, it can be different, and I checked this with two different particles in the code(electron and proton). The effect of Birks is much greater when particle is a proton.
My question is that:
What particle should the number set in this part belong to?
Scintillator_material->GetIonisation()->SetBirksConstant(0.155*mm / MeV);
Thank you.


good that you understood the issue :wink:

The Birks factor goes as a multiplier for the dE/dx, which is naturally different for protons and electrons of the same energy. So, the Birks constant should not be attached to each particle individually, in my understanding.


1 Like

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.