Question: Understanding scatter correction in CASToR — why are pre- and post-scatter-correction images nearly identical?

Hi everyone,

I am trying to better understand how scatter correction is implemented in CASToR, particularly how the estimated scatter contribution is incorporated into the PET reconstruction.

In our reconstruction workflow, we have generated images before and after scatter correction, but the resulting images appear to be nearly identical. This made us question whether we are correctly applying/understanding the scatter-correction procedure in CASToR.

Could someone clarify the following?

  1. How does CASToR perform scatter correction? Is the scatter estimated in projection/sinogram space and then incorporated into the system model or the Poisson likelihood during reconstruction?
  2. At what stage is the scatter estimate applied? For example, is the estimated scatter added to the forward projection as an additive background term, subtracted from the measured data before reconstruction, or handled in another way?
  3. When using CASToR’s scatter-related options, what exactly changes between a reconstruction with scatter correction enabled and one without it?
  4. If the pre- and post-scatter-correction images are almost identical, what would be the main things to check?Could this indicate that the scatter estimate is very small, that the correction is not actually being applied, or that we are comparing outputs in a way that does not directly show the effect of scatter correction?
  5. Are there any recommended CASToR commands, output files, or intermediate projection data that we can inspect to verify that the scatter estimate is being generated and actually incorporated into the reconstruction?

For context, we are working with PET data and are particularly interested in understanding the correction at the reconstruction/projection level rather than simply comparing the final images.

Any explanation of the CASToR scatter-correction workflow, preferably from the level of the measured data → scatter estimation → reconstruction, would be very helpful.

Thank you!

Hi,

1.2.

Scatters (as well as randoms) are added as a background into the forward model.

Scatter estimations must be supplied as a rate = measured counts / seconds. This is because CASToR deals with dynamic histogrammed or listmode data using the same engine. When using listmode data, frame durations can thus be changed in the command line without having to change the datafile.

In the forward model, the image is projected using the system matrix that accounts for all effects (attenuation, efficiency/normalization, frame duration, quantification factor, decay effect, branching ratio). The resulting forward projection is thus an estimation of the true measured coincidences.

Scatter estimations must thus be supplied as measured counts. This means no corrections applied to scatters; they should be attenuated and not-normalized, etc. However, they must be noise-free as they represent the expectation of scatters being added to the forward model.

If a datafile contains scatter estimation, CASToR will consider it by default. If the “-ignore-corr scat” option is supplied, the correction will simply be ignored (the additive scatter background set to 0).

Honestly very hard to tell without knowing what kind of data you are dealing with and how confident you are with your scatter estimation method.

Try using the castor-datafileExplorer toolkit using options “-vb 3 -i -e” to print out the content of your events one by one. Look at the scatter estimation value and multiply it by the acquisition duration written in the header file. This will provide a first look at the scale of your scatter estimation, easily understandable if you are using histogrammed data.

CASToR is not intrinsically able to provide usual projection data that could be viewed as images because of the generic way geometry is defined. To do so, this would require a rebinning algorithm into a 3D projection space defined by the user. This feature is not yet implemented.

You can simply modify and expand the castor-datafileExplirer toolkit at the end of the program in the part for global exploration of the datafile. You can use the vEvent::GetAdditiveCorrections(int tofbin) function to cumulate the additive corrections and compute the total scatter estimates (multiplying it by the acquisition duration). This would at least provide an estimation of the global scatter counts and allow you to compute the scatter fraction.

Hope this helps.

Best
Simon

Thank you very much Simon. That was helpful.

Another question has to do with the use of attenuation factors:

I’m working with PET list-mode data in CASToR and I generated a sensitivity image using an attenuation map (i.e., I provided a μ-map with the -atn option during sensitivity computation so that attenuation is included in the sensitivity).

My question is about the consistent way to apply attenuation in the reconstruction step:

Do we need to also embed per-event attenuation correction factors (ACFs) into the list-mode datafile (CDF) after generating the sensitivity map, and set Attenuation correction flag: 1 in the CDH?

Or is it sufficient to simply provide the same μ-map again at reconstruction time (using -atn mumap.hdr), while keeping the list-mode file without per-event attenuation factors (CDH Attenuation correction flag: 0)?

In other words, when sensitivity is computed with -atn, what is the recommended/required matching reconstruction configuration:

  1. -atn at recon (μ-map driven attenuation), or
  2. per-event attenuation factors in the CDF (attenuation driven by the datafile), and no -atn at recon?

Any clarification on the intended workflow and how CASToR interprets the CDH attenuation flag for list-mode would be greatly appreciated.

Hi,

Attenuation correction factors must be also embedded within the listmode data file to be consistent. The projection of the mumap was not implemented within the iterative loop, only in the computation of the sensitivity.

The fact that you do not consider the attenuation would explain why the scatter correction seems to be highly underestimated. Including it in the data file should solve the problem.

Cheers
Simon

Someone replied to a topic you are Watching. bgyamfi1 September 10 Thank you very much Simon. That was helpful. Another question has to do with the use of attenuation factors: I’m working with PET list-mode data in CASToR and I generated a sensitivity

Someone replied to a topic you are Watching.

| bgyamfi1
September 10 |

  • | - |

Thank you very much Simon. That was helpful.

Another question has to do with the use of attenuation factors:

I’m working with PET list-mode data in CASToR and I generated a sensitivity image using an attenuation map (i.e., I provided a μ-map with the -atn option during sensitivity computation so that attenuation is included in the sensitivity).

My question is about the consistent way to apply attenuation in the reconstruction step:

Do we need to also embed per-event attenuation correction factors (ACFs) into the list-mode datafile (CDF) after generating the sensitivity map, and set Attenuation correction flag: 1 in the CDH?

Or is it sufficient to simply provide the same μ-map again at reconstruction time (using -atn mumap.hdr), while keeping the list-mode file without per-event attenuation factors (CDH Attenuation correction flag: 0)?

In other words, when sensitivity is computed with -atn, what is the recommended/required matching reconstruction configuration:

  1. -atn at recon (μ-map driven attenuation), or
  2. per-event attenuation factors in the CDF (attenuation driven by the datafile), and no -atn at recon?

Any clarification on the intended workflow and how CASToR interprets the CDH attenuation flag for list-mode would be greatly appreciated.