SyneRBI / SIRF-Exercises

SIRF Training and demonstration material
http://www.ccpsynerbi.ac.uk
Apache License 2.0
17 stars 21 forks source link

about the normalization of NEMA data #186

Closed mele-y closed 1 year ago

mele-y commented 1 year ago

Hello,I am trying to get the normalized sinogram as follows:

from sirf.STIR import *
import matplotlib.pyplot as plt
acq_data = AcquisitionData('./sino_f1g1d0b0.hs')
asm_norm = AcquisitionSensitivityModel('./norm.n.hdr')
asm_norm.set_up(acq_data)
normalized_acq_data= asm_norm.invert(acq_data)

sino_f1g1d0b0.hs and norm.n.hdr come from NEMA IQ data,but I'm not sure whether normalized_acq_datais normalized sinogram or not because the reconstructed image look like this: output

KrisThielemans commented 1 year ago

@mele-y apologies, I hadn't seen this issue. As you've closed this, I guess you're happy by now.

In principle, your normalised_acq_data is indeed normalised, and therefore could be reconstructed well (i.e. without further normalisation). However, in practice this doesn't work for the mMR. The reason is that it uses "virtual crystals" to accomodate the gaps between blocks. They never get any counts, have detection-efficiency zero, and therefore cannot be normalised (0/0).

I guess you could do what you did and then construct an AcquisitionSensitivityModel that only has the zeroes in the gaps (and is 1 elsewhere), and use that for OSEM etc, but that seems a bit nonsensical. Better to directly use the asm_norm as part of the objective function.

An alternative is to use gap-filling (which seems to be done by Siemens), but we don't have that functionality in SIRF/STIR.

A final option would be to remove the virtual crystals, and have a projector that takes the geometry into account (available in STIR via BlocksOnCylindrical). However, as the block-size is quite small for the mMR, in effect that will be almost the same as the current way of doing things.

mele-y commented 1 year ago

Thanks for your reply,and I try the method your mentioned (construt and AcquisitionSensitivityModel),which is useful.