CERN / TIGRE

TIGRE: Tomographic Iterative GPU-based Reconstruction Toolbox
BSD 3-Clause "New" or "Revised" License
535 stars 180 forks source link

Hi, what is the different between voxel_backprojection.cu and voxel_backprojection2.cu ? #436

Closed leekunpeng closed 1 year ago

leekunpeng commented 1 year ago

Hello Dear Author, I am studying your source code and I am a little confused about the difference between voxle_backprojection.cu and voxle_backprojection2.cu. I did some tests and they both call voxle_backprojection.cu for backprojection in both circular FDK and helical FDK. Whereas in arbitrary trajectories, such as the example d18_ArbitraryAxisOfRotation.m, the SIRTs algorithm partially calls voxle_backprojection.cu and voxlebackprojection2.cu during the iteration, while the CGLS algorithm calls voxle backprojection2.cu. What is the difference between these two, please? Under what circumstances will they be called?

Specifications

AnderBiguri commented 1 year ago

Hi there! The trick is to check the Atb() code, or if you want more info, my PhD thesis. In essence, the back projector operator is not an exact adjoint of the projector operator, in order for it to be computationally efficient. The first, applies FDK weights to the back projector, and the second applies some weights that approximate the real adjoint. It's a Tony bit slower and still an approximation.

Some algorithms mathematically don't suffer too much from an unmatched backprojector, but some others do. SIRT and CGLS are examples of each.

If you are in doubt, use the second, the one that approximates the adjoint.

Ander

On Fri, 21 Apr 2023, 04:19 小李努力再努力, @.***> wrote:

Hello Dear Author, I am studying your source code and I am a little confused about the difference between voxle_backprojection.cu and voxle_backprojection2.cu. I did some tests and they both call voxle_backprojection.cu for backprojection in both circular FDK and helical FDK. Whereas in arbitrary trajectories, such as the example d18_ArbitraryAxisOfRotation.m, the SIRTs algorithm partially calls voxle_backprojection.cu and voxlebackprojection2.cu during the iteration, while the CGLS algorithm calls voxle backprojection2.cu. What is the difference between these two, please? Under what circumstances will they be called? Specifications

  • MATLAB version: MATLAB R2022a
  • OS:Windows 11
  • CUDA version: 11.6

— Reply to this email directly, view it on GitHub https://github.com/CERN/TIGRE/issues/436, or unsubscribe https://github.com/notifications/unsubscribe-auth/AC2OENHKU3TSFXZGYXX5WVLXCHVD7ANCNFSM6AAAAAAXGIONIA . You are receiving this because you are subscribed to this thread.Message ID: @.***>

leekunpeng commented 1 year ago

Hi,Ander.

Sorry to reply to you so late. I have read about the effect of matched and unmatched back-projector on iteration before. I will go back to your thesis to find more information. Thanks a lot.

Best. Lee

Hi there! The trick is to check the Atb() code, or if you want more info, my PhD thesis. In essence, the back projector operator is not an exact adjoint of the projector operator, in order for it to be computationally efficient. The first, applies FDK weights to the back projector, and the second applies some weights that approximate the real adjoint. It's a Tony bit slower and still an approximation. Some algorithms mathematically don't suffer too much from an unmatched backprojector, but some others do. SIRT and CGLS are examples of each. If you are in doubt, use the second, the one that approximates the adjoint. Ander On Fri, 21 Apr 2023, 04:19 小李努力再努力, @.> wrote: Hello Dear Author, I am studying your source code and I am a little confused about the difference between voxle_backprojection.cu and voxle_backprojection2.cu. I did some tests and they both call voxle_backprojection.cu for backprojection in both circular FDK and helical FDK. Whereas in arbitrary trajectories, such as the example d18_ArbitraryAxisOfRotation.m, the SIRTs algorithm partially calls voxle_backprojection.cu and voxlebackprojection2.cu during the iteration, while the CGLS algorithm calls voxle backprojection2.cu. What is the difference between these two, please? Under what circumstances will they be called? Specifications - MATLAB version: MATLAB R2022a - OS:Windows 11 - CUDA version: 11.6 — Reply to this email directly, view it on GitHub <#436>, or unsubscribe https://github.com/notifications/unsubscribe-auth/AC2OENHKU3TSFXZGYXX5WVLXCHVD7ANCNFSM6AAAAAAXGIONIA . You are receiving this because you are subscribed to this thread.Message ID: @.>