Proposal for multiSiddon position/orientation for detector with non-zero axial component

Greetings,

Disclaimer: To the best of my knowledge, the following only affect scanner with detector’ orientation that have a non-zero Z component and if the multiSiddon projector is used.

In that specific cases, I believe that the multiSiddon projector currently has a bug, as shown in [1]. However, it is already indirectly hinted in CASToR documentation that a scanner axial axis are assumed to be the z-axis (and also stated in [2]). Also, most scanner are a discretization of a cylinder which make that restriction almost trivial to deal with (helmet-type PET scanner would be an exception).

Thus, I have two suggestions:

  1. Explicitly mention in the CASToR documentation that scanner axial axis are assumed to be in the z-axis.
    • This just to warn user that some functionality might break if this is not respected. While the code might be general enough that it is not really the case, the documentation hints as such and it simplify a couple of things if we can make that assumption.
  2. For the multiSiddon projector, I would propose that either…
    a) Explicitly mention in the CASToR documentation that non-null z component for detector’ orientation is currently not supported for the multiSiddon projector and simplify the multiSiddon code by removing the uZ.
    - While it is not supported, the computation using uZ is a waste.
    b) Change the creation of the detector’ axes such that they are orthonormal.
    - I have a proposition that I can commit for review, if desired.

While not supporting uZ =/= 0.0 would remove some computations, it seems nice to be able to be a little more general. However, I do not know if it is currently worth it.

Bests,
Maxime Toussaint

[1] In CASToR v3.1.1, the detector axise are defined as:
depth = [uX sqrt(1 - uZ^2), uY sqrt(1 - uZ^2), uZ]
trans = [uY, -uX, 0.0]
axial = [uX uZ, uY uZ, sqrt(1 - uZ^2)]
with dettectorOrientation = [uX, uY, uZ]
From there, we can show that ||depth|| = (…) = uX^2 + uY^2 + uZ^2 - uX^2 uZ^2 - uY^2 uZ^2 = 1.0 - uX^2 uZ^2 - uY^2 uZ^2. Thus, ||depth|| =/= 1 if uZ =/= 0.
We can also show that depth and axial are not orthogonal if uZ =/= 0.0.

[2] Possible problem with multiSiddon projector random sampling

Hi Maxime,
First thank to bring (again :slight_smile: ) this issue to our attention.
For 1.: indeed we should make it clearer that the z-axis is assumed to be the scanner axial axis.
For 2: the plan is to provide the possibility to use multi-siddon - or any projector based on computation of a position in the detector volume - available for scanner systems with non-zero Z orientation.

Actually this is also a topic of discussions for other features we plan to integrate into CASToR, and we still are in the process of implementing a generic multi-line approach in the code (i.e separating the multi-line feature of the projector algorithm itself, so that we can use multi-line siddon, joseph, etc… without creating redundant classes). There is a WiP branch about it in the Gitlab that you may have spotted already.

And yes, we will be interested to talk about your 2b! I’ll send you a separate email about it.

Best,
Thibaut