24.7. Calculating Transmission
Table of Contents
Concept of Transmission in Radiation Shielding
In a radiation shielding simulation you are usually interested in how many particles pass through the shield compared to how many were sent toward it. This is expressed by the transmission, which is a dimensionless number between 0 and 1. A value close to 1 means that the shield hardly attenuates the beam, and a value close to 0 means that very few particles get through.
In Geant4 you do not measure transmission directly. Instead, you simulate many primary particles, you count how many of them (or how much of their intensity) reach a detector placed behind the shield, and then you compute the transmission from these counts.
Key definition
If $N_\text{inc}$ is the number of incident primary particles and $N_\text{tr}$ is the number of transmitted particles detected behind the shield, then the transmission $T$ is
$$
T = \frac{N_\text{tr}}{N_\text{inc}}.
$$
This simple definition is the basis for everything else in this chapter. All calculations, units, and uncertainties for transmission will start from it.
Counting Incident and Transmitted Particles
To calculate $T$ you need two consistent quantities from the same set of events: the total number of incident primaries and the number of primaries that successfully pass the shield.
In a typical Geant4 shielding setup, the incident number is simply the number of primaries you simulate with /run/beamOn. For example, if you call /run/beamOn 100000, then $N_\text{inc} = 100000$, provided that each event contains exactly one primary particle. If you use more complex primary generators that emit multiple primaries per event, you should keep a separate counter for the number of primary particles, not just the number of events.
Transmitted particles are those that reach a region placed behind the shield, usually modeled as a thin detector volume. The shield is placed between the source and this detector. You can decide what counts as transmitted, for example any primary that reaches the detector, or any particle (primary or secondary) that crosses into the detector. For basic attenuation studies you usually focus on primaries, particularly gamma rays.
A common and practical definition is:
A primary gamma is counted as transmitted if it deposits any energy in the detector volume behind the shield.
To implement this, you can use a sensitive detector class attached to the post-shield detector volume, and in its ProcessHits() method, check the particle type and energy deposition. Alternatively, you can use an event or stepping action to check when a track first enters the detector volume and increment a transmitted counter once per primary.
Implementing Transmission Calculation in Geant4
For a simple shielding study, it is convenient to manage transmission in your EventAction and RunAction classes, or via the Geant4 analysis system. The idea is always the same: count how many incident primaries you simulated, count how many of them passed through, and compute the ratio at the end of the run.
A minimal approach is to maintain two run-level counters:
- A counter for the number of primary particles fired.
- A counter for the number of transmitted particles detected.
The primary count can be incremented once per event in BeginOfEventAction, assuming one primary per event. The transmitted count can be updated based on information that your sensitive detector or stepping logic passes to the event or run actions. For example, you can have an event-level flag that is set to true if the primary deposits energy in the detector volume behind the shield. At the end of the event, if this flag is true, you increment the run-level transmitted counter.
Once the run completes, you have the two integers you need, and you can compute the transmission and print it or store it in an output file.
Transmission in a simulation run
Given a simulation run with $N_\text{inc}$ incident primaries and $N_\text{tr}$ transmitted primaries detected behind the shield, the run-averaged transmission is
$$
T_\text{run} = \frac{N_\text{tr}}{N_\text{inc}}.
$$
To obtain meaningful results, always use the same definition of “transmitted” every time you compare different shields or different thicknesses.
Geant4 does not enforce any particular definition for “incident” or “transmitted.” You must ensure consistency in your own code and macros.
Transmission as a Function of Thickness
In the broader shielding example you will often run the simulation multiple times with different shield thicknesses. For each thickness $x$ you calculate a transmission $T(x)$ and then compare the values or plot $T$ against $x$.
You can think of your simulation as generating data points $\{x_i, T_i\}$, where $x_i$ is the thickness of the shield in run $i$, and $T_i$ is the measured transmission for that run. If the material and beam energy are fixed, these points should follow an approximate exponential attenuation law.
For narrow, monoenergetic photon beams the theoretical transmission through a uniform absorber of thickness $x$ is often written as
$$
T(x) = \frac{I(x)}{I_0} = e^{-\mu x},
$$
where $I_0$ is the incident intensity, $I(x)$ is the intensity after the shield, and $\mu$ is the linear attenuation coefficient of the material. In your Geant4 study you are effectively measuring $I_0$ and $I(x)$ in a Monte Carlo way, through particle counting.
Although you are not required to enforce this analytical form in your beginner simulation, you can use it later when you compare simulation results with analytical calculations or reference data.
Statistical Uncertainty in Transmission
Transmission comes from counting statistics, so it is subject to statistical fluctuations. If you simulate a finite number of primaries, repeated runs with the same settings will yield slightly different values of $T$. It is important to estimate the uncertainty in $T$ so that you can judge whether differences between shielding configurations are statistically significant.
If you treat each primary as a Bernoulli trial that either transmits (success) or does not transmit (failure), then the number of transmitted primaries $N_\text{tr}$ follows a binomial distribution with parameters $N_\text{inc}$ and $T$. For large $N_\text{inc}$ and not too small $T$, the standard deviation of $T$ can be approximated as
$$
\sigma_T \approx \sqrt{\frac{T (1 - T)}{N_\text{inc}}}.
$$
In terms of the measured counts, you can replace $T$ with $N_\text{tr} / N_\text{inc}$, which gives
$$
\sigma_T \approx \sqrt{\frac{N_\text{tr} (N_\text{inc} - N_\text{tr})}{N_\text{inc}^3}}.
$$
Uncertainty of transmission
Given measured incident and transmitted counts, $N_\text{inc}$ and $N_\text{tr}$, you can estimate the statistical uncertainty of the transmission $T = N_\text{tr} / N_\text{inc}$ as
$$
\sigma_T \approx \sqrt{\frac{T (1 - T)}{N_\text{inc}}}
= \sqrt{\frac{N_\text{tr} (N_\text{inc} - N_\text{tr})}{N_\text{inc}^3}}.
$$
This uncertainty decreases as $1 / \sqrt{N_\text{inc}}$, so you can reduce it by simulating more primary particles.
When $N_\text{tr}$ is very small, for example in very thick shields, the binomial approximation can break down, and a Poisson treatment of $N_\text{tr}$ as a small count may be more appropriate. In that regime, you may approximate $\sigma_{N_\text{tr}} \approx \sqrt{N_\text{tr}}$ and propagate this to $T$ as
$$
\sigma_T \approx \frac{\sqrt{N_\text{tr}}}{N_\text{inc}}.
$$
In both cases, the essential idea is the same. More primary particles give smaller relative uncertainty in the measured transmission.
Using Geant4 Analysis for Transmission
You can use the Geant4 analysis system to record and manage transmission data efficiently. At minimum, you might want to create a simple ntuple where each row corresponds to a run configuration, with columns for the shield material, thickness, $N_\text{inc}$, $N_\text{tr}$, and $T$.
A typical workflow for each run is:
- Define or set the current shield material and thickness (for example via macro commands that adjust the geometry).
- Reset or initialize counters for $N_\text{inc}$ and $N_\text{tr}$.
- Simulate a chosen number of primaries.
- At the end of the run, compute $T$ and its estimated uncertainty.
- Fill one row in an ntuple or write the values to an output file.
Later, you can analyze the resulting data with external tools such as ROOT. For instance, you might plot $T$ versus thickness in ROOT and compare the curve with the expected analytical attenuation curve for each material.
Using explicit output for $N_\text{inc}$ and $N_\text{tr}$ also makes it easy to check for inconsistent behavior in your simulation. If $N_\text{inc}$ does not match the number of primaries you expected, or if $N_\text{tr}$ behaves strangely when you change the shield, you can review your detector definitions or sensitive detector logic.
Relating Transmission to Attenuation
In the overall shielding example, transmission is closely related to attenuation. When you know $T$ as a function of thickness $x$, you can extract attenuation coefficients or half value layers in a straightforward way.
If the transmission follows an exponential law, you can write
$$
T(x) = e^{-\mu x}.
$$
Taking the natural logarithm of both sides gives
$$
\ln T(x) = - \mu x.
$$
If you compute $T$ for several thicknesses $x_i$, you can plot $\ln T$ versus $x$ and fit a straight line. The slope of that line is $- \mu$. The half value layer, the thickness $x_{1/2}$ that reduces the transmission to $T = 0.5$, is then
$$
x_{1/2} = \frac{\ln 2}{\mu}.
$$
In practice, your Geant4 simulation will provide noisy estimates of $T$ with statistical uncertainties. By fitting the log-transmission values, and accounting for the uncertainties, you can characterize the shielding power of each material you test.
Although the extraction of attenuation coefficients itself is treated in the following chapter of the shielding example, the foundation of that procedure is the accurate and consistent calculation of transmission across different shield configurations as described here.
Views: 7
KAHIBARO