33.6. CT Projection Data
Table of Contents
Transmission measurements
In a CT simulation you are interested in how many photons pass through the object and reach each detector element for every projection angle. These are the transmission measurements. In GATE this information comes from actors or digitizers attached to the CT detector array.
In a very simple idealized CT detector, each pixel behaves like a photon counter. For every projection angle, GATE transports photons from the X ray source through the geometry and records what is detected in each pixel. The two main quantities you can extract are the number of detected photons in each pixel and the total detected energy in each pixel. For transmission CT, photon counts are usually closer to the physical model of exponential attenuation, while energy can be used in energy integrating detector models.
The simulated measurement for one projection angle can be viewed as a 1D array along the detector, where each entry contains the signal of one detector pixel. In GATE, you might obtain this per event and then sum over events for a given angle, or directly accumulate into a 2D image with one axis for the detector index and one axis for the projection number.
Transmission is often interpreted through the exponential attenuation law. If $I_0$ is the initial intensity and $I$ is the transmitted intensity for one ray, the relationship is
$$
I = I_0 \, e^{-\int \mu(x) \, \mathrm{d}x},
$$
where $\mu(x)$ is the linear attenuation coefficient along the path. In a CT simulation you do not usually compute the integral analytically. Instead, the Monte Carlo simulates photon interactions and absorption, and your detector signal approximates $I$. By comparing $I$ to a reference signal without the object, you obtain line integrals of attenuation.
It is common to work with logarithmic measurements, since the reconstruction algorithms expect line integrals rather than raw intensities. For each detector bin and angle you compute
$$
p = -\ln\left(\frac{I}{I_0}\right).
$$
The quantity $p$ approximates the path integral of $\mu$ along that ray. In practice, $I$ is the number of counts recorded with the object in place, and $I_0$ is the number of counts for an air scan, where only air is present between source and detector. When you post process GATE output to create CT projections, you often perform this logarithmic transformation as a separate analysis step using Python or ROOT.
In a polychromatic CT beam, different photon energies have different attenuation coefficients and the simple monoenergetic exponential law is only an approximation. GATE can simulate the full energy spectrum and the energy dependence of $\mu$. Your transmission measurements will then include beam hardening effects. Even in this case, you still typically compute logarithmic projections from the detected signal, but you should remember that the relation to a single $\mu$ value is more complex. This complexity is handled primarily in the reconstruction and correction algorithms, not in the transmission measurement itself.
To build clean transmission measurements from GATE, it is important to organize your simulation so that each projection angle corresponds to a known subset of events. You can, for example, loop over projection angles in Python, update the source and detector positions, run a fixed number of events for that angle, and save a separate detector output file or image for each projection. Later, you stack these 1D detector profiles into a 2D array indexed by angle and detector bin. This 2D array is the basis for CT sinograms.
Sinograms
A sinogram is the standard way to organize CT projection data. For a 2D slice, each ray is described by two parameters: the projection angle $\theta$ and the distance $s$ from the rotation center to the ray. In a detector based CT geometry, $s$ is related to the detector pixel index and the geometry of the scanner, and $\theta$ is the current rotation angle of the source and detector.
To construct a sinogram from GATE data, you first collect one 1D transmission profile for each projection angle as described above. You then form a 2D matrix $P(\theta_i, s_j)$, where $i$ indexes the projection angle and $j$ indexes the detector pixel. Each element contains a value that represents the line integral along that ray, usually the logarithmic quantity $p$ computed from the measured transmission. Arranged in this way, the data forms a characteristic pattern in the angle distance plane. For a simple point attenuator, the trace in the sinogram looks like a sinusoidal curve, which gives the name sinogram.
Formally, in a continuous setting the sinogram represents the Radon transform of the attenuation distribution $\mu(x, y)$:
$$
p(\theta, s) = \int_{-\infty}^{\infty} \mu\bigl(x(s,t), y(s,t)\bigr) \, \mathrm{d}t,
$$
where the coordinates on the ray are
$$
\begin{aligned}
x(s,t) &= s \cos\theta - t \sin\theta, \\
y(s,t) &= s \sin\theta + t \cos\theta.
\end{aligned}
$$
In Monte Carlo CT simulation you approximate $p(\theta, s)$ numerically from your transmitted intensities, rather than performing this integral directly.
In practice, to generate a sinogram from simulated data, you repeat a sequence of steps for each projection angle. You set the scanner to angle $\theta_i$, run enough events to reach the desired statistical precision, read or accumulate the detector response into an array indexed by detector bin, possibly convert the signal to line integrals by applying the logarithm and correcting for gain or exposure time, and store the resulting 1D profile as row $i$ in a 2D matrix. After looping over all planned projection angles, this matrix is your sinogram.
Once you have a sinogram from GATE, you can feed it into a CT reconstruction algorithm such as filtered backprojection or iterative reconstruction. At this stage, the details of the physics simulation are encapsulated in the sinogram values. The reconstruction code, which is separate from GATE, assumes only that each element of the sinogram approximates the integral of attenuation along a straight line. For learning purposes, you can start with a simple phantom, like a uniform water cylinder, simulate projections at a moderate number of angles, build a sinogram in Python or ROOT, and then try basic reconstruction methods to see how well the reconstructed image matches the known phantom.
An important point in CT simulation is that noise in the sinogram is directly related to the number of photons simulated. If you run very few events per angle, your transmission counts will fluctuate strongly and the sinogram will look noisy, which leads to noisy reconstructed images. If you increase the number of events, the sinogram becomes smoother and artifacts decrease. In this way, sinograms provide a clear visual link between Monte Carlo statistics in the simulation and the quality of the final CT image.
Finally, sinograms are also a convenient diagnostic tool for checking whether your simulated CT geometry behaves as expected. Simple shapes have characteristic sinogram patterns. For example, a uniform cylinder produces constant values across angles and certain detector indices, while localized high density inserts generate distinct sinusoidal tracks. By examining simulated sinograms, you can detect errors such as incorrect rotation, misaligned detector positions, or wrong attenuation in materials, before investing time in full reconstruction and analysis.
A CT sinogram is a 2D array $P(\theta_i, s_j)$ where each element is typically the logarithm of the ratio of transmitted to incident intensity,
$$
p(\theta_i, s_j) = -\ln\left(\frac{I(\theta_i, s_j)}{I_0(s_j)}\right),
$$
and approximates the line integral of attenuation along the corresponding ray.
Views: 12
KAHIBARO