G4OpWLS not emitting any particles

Hello there,

I am trying to collect optical photons in WLS and then detect them at the end of it. I adapted OpNovice to my needs, since I had everything pre-made there. I implemented WLS process in physics list and it seemed to work. Optical photons enter the WLS and eventually they undergo WLS process. But I cannot see any secondaries from this process so photons are absorbed but none are emitted. Why is it so?

Thank you, Matus

Hello Matus,

Have you implemented absorption and emission tables for WLS material in you geometry?

Best regards,


Hi Volodymyr,

yes, I have and absorption part seems to work, because results are changing as I change the absorption depth there, but no emission can be observed.



In my case I have implementation like this:

G4MaterialPropertiesTable *MatWLS = new G4MaterialPropertiesTable();

MatWLS->AddProperty(“WLSABSLENGTH”, AbsEnergy, AbsFiber, N_all);
// array of absorption thickness values for incoming and !! emitted photons; N_all=N_in+N_emit

MatWLS->AddProperty(“WLSCOMPONENT”, EmitEnergy, EmissionFiber, N_emit);
//emission intensity which depends on energy

Example in guide.


Thank you for your response Volodimir,

I have similar characterization of WLS, and it seems that process is working now. But when I track optical photons within the WLS, none of them provides information from GetCreatorProcess()->GetProcessName() that they have been created by emission from WLSprocess. Is it just my bad understanding that creator process of optical photon, which came from emission in WLS should be WLS process? I have not characterized surfaces of WLS, neither of scintillator so transmission of photons between two materials should be effected only by Rindex of two materials and reflexion of optical photons should be ideal.
Thanks for your response,

Hi Matus, if you add the code below to UserSteppingAction of the wls example, and run wls.in, you will see OpWLS process.

const std::vector<const G4Track*>* secondaries =

for (auto sec : *secondaries) {
  if (sec->GetDynamicParticle()->GetParticleDefinition() == G4OpticalPhoton::OpticalPhoton() ){
    G4String creator_process = sec->GetCreatorProcess()->GetProcessName();
    G4cout << "CP: " << creator_process << G4endl;

Many thanks for your responses,

I have got processes sorted out. In manual it is stated, that relative emission spectrum of the material as a function of the photon’s energy should be supplied in WLSCOMPONENT. Why are the values then exceeding 1 ? For instance, when characterizing scintillation spectrum with distribution spectrum, cumulative sum doesn’t exceed 1 and everything works as it should. Can you give me explanation, what numbers in WLSCOMPONENT mean? What rules should user follow when entering them?

Thank you,


As far as I understand it, ‘relative’ here means that the user does not have to normalize the emission spectrum. However, I would recommend plotting the emission spectrum and making sure you understand what is happening. Ideally this would be part of the examples.