Shielding, positron annihilation & default range cuts

_Geant4 Version:_10.7.4
_Operating System:_Ubuntu 22.04
_Compiler/Version:_gcc 11.4.0
_CMake Version:_3.22.1

This is not my specific project, rather an example I’m giving to make the point clear. In the Shielding physics package, there is a default range (production) cut of 0.7mm for electrons and positrons. In lead, this corresponds to an energy of 1MeV. Now imagine I am sending 3 MeV gamma-rays into a 5mm layer of lead shielding. Many of these will pair-produce in the shield. But most of the positrons will be below the range cut – and if the positron isn’t, the electron will be – in either case, ChatGPT tells me that the pair won’t be created, instead the total 3 MeV will be deposited in the lead at that point. No positron, no positron annihilation gammas – unless GEANT knows to make the 511 keV gammas, in this scenrio, bypassing the positron itself, but ChatGPT tells me no. So, in this default case for the shielding package – designed to model shielding – a major component of the radiation coming out of the other end of the shield, positron-annihilation photons at 511 keV, will not be produced. Am I right about this?

Whether or not that’s a sensible default behavior for a shielding package (if the AI is right that this is what happens!), I know that I can get around it by lowering the range cut to something much smaller than 0.7mm for both electrons and positrons. However, in my actual application, I really don’t want a low range cut for electrons, because that will make my simulation very slow. Is there any way I can get the positron, or just its annihilation gammas, without a very low range cut for electrons?

You can set different range cuts for different particles, this link shows how through UI commands at the end:

But you have to be careful when doing this, as you’re artificially biasing the simulation to preference some particles over others. For example if positrons have a much smaller range cut than electrons, positrons created near the end of your shielding material could escape while the electrons, by virtue of not actually being generated, cannot. Depending on the particle energy photons produced through bremsstrahlung might also be a concern.

To that end, consider that if you are simulating radiation shielding you might want those electrons to be simulated anyway in order to measure their contribution to the radiation field, and in that case having too high of a range cut for electrons is giving inaccurate results in more ways than one.

You can apply different range cuts to different regions, this might help speed up your simulation. If the shielding is thick enough to attenuate 511 keV photons at some locations you can set a higher cut there so that positrons are only generated in regions where their annihilation could conceivably contribute to the rest of the simulation.

Thanks very much, Christopher! If I can confirm one more thing… is it true that if the electron and positron cuts are different, the pair production mechanism will obey whichever cut is stricter and not create either particle? I.e. if the range cut is 0.1mm on positrons and 2mm on electrons, and both are to be created witha range of 0.5mm, neither will be created despite the short positron cut? ChatGPT told me this but obviously I would like to hear it from a real expert. Thanks!

No, I don’t think that’s true. I can actually have ChatGPT say the exact opposite. You shouldn’t rely too heavily on any LLM to explain the workings of Geant4 (or anything in my opinion) because they are trained on data that might be incomplete, out of date or just organized in a way that causes the LLM makes inaccurate inferences.

I’m fairly certain that Geant4 will apply the range cuts separately to the e- and the e+ from pair production, as it does for all secondaries, but you should test this yourself by using a Tracking Action and/or verbose output to see the effect of different range cuts.

Absolutely, I will go now and test. Thank you!

Extensive testing shows that range cuts don’t get applied to the secondaries of the pair production process, specifically, no matter what you do, at least in my setup, even with ApplyCuts set = 1, so positrons will always get created and annihilated. Thanks for your help!

Production threshold is applied only to processes which have potential divergent cross-section at energy null. Namely Ionization and Bremsstrahlung.

1 Like

Side question, Michel. I thought that production cuts applied through tracking (i.e., not within an EM process) applied universally. For example, if I set the proton cut to several mm, then neutron elastic scatters will end up with Edep applied to the neutron track, and no recoiling nucleus.

1 Like

you are right : “proton” cut works as you describe …
In my knowledge for elastic collisions only ( maybe, neutron scattering only ? )

1 Like

Thanks, Michel. Maybe the proton/hadron cut is special? You might be correct that it only works for elastic and quasi-elastic collisions, but I’m not 100% certain of that. My understanding is that the “tracking-based” production cuts (enabled when you call SetApplyCuts() in the physics list) are applied independently of processes (in TrackingManager or SteppingManager, I presume).

1 Like