.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_examples/00_basic_projection.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_examples_00_basic_projection.py: Non-TOF Joseph Forward and Back Projection ========================================== This minimal example demonstrates how to call python API for the non-TOF Joseph forward and back projection functions, which are implemented in :func:`parallelproj_core.joseph3d_fwd` and :func:`parallelproj_core.joseph3d_back`. .. GENERATED FROM PYTHON SOURCE LINES 9-15 .. code-block:: Python import importlib import parallelproj_core import matplotlib.pyplot as plt from utils import show_voxel_cube, show_lors .. GENERATED FROM PYTHON SOURCE LINES 16-17 import array API compatible library (CuPy if CUDA is available, otherwise NumPy). .. GENERATED FROM PYTHON SOURCE LINES 17-27 .. code-block:: Python if parallelproj_core.cuda_enabled == 1 and importlib.util.find_spec("cupy") is not None: import array_api_compat.cupy as xp dev = xp.cuda.Device(0) else: import array_api_compat.numpy as xp dev = "cpu" .. GENERATED FROM PYTHON SOURCE LINES 28-29 Print backend and device info. .. GENERATED FROM PYTHON SOURCE LINES 29-33 .. code-block:: Python print(f"parallelproj_core version: {parallelproj_core.__version__}") print(f"parallelproj_core cuda enabled: {parallelproj_core.cuda_enabled}") print(f"using array API compatible library: {xp.__name__} on device {dev}") .. rst-class:: sphx-glr-script-out .. code-block:: none parallelproj_core version: v2.0.3 parallelproj_core cuda enabled: 0 using array API compatible library: array_api_compat.numpy on device cpu .. GENERATED FROM PYTHON SOURCE LINES 34-35 Define a mini sparse demo image. .. GENERATED FROM PYTHON SOURCE LINES 35-44 .. code-block:: Python image = xp.zeros((5, 5, 5), dtype=xp.float32, device=dev) image[0, 2, 4] = 0.25 image[4, 2, 4] = 0.25 image[0, 0, 0] = 0.5 image[4, 4, 4] = 0.5 voxel_size = xp.asarray([2.0, 2.0, 2.0], device=dev, dtype=xp.float32) img_origin = xp.asarray([-1.0, -1.0, -1.0], device=dev, dtype=xp.float32) .. GENERATED FROM PYTHON SOURCE LINES 45-46 Define LOR start and end points. .. GENERATED FROM PYTHON SOURCE LINES 46-56 .. code-block:: Python lor_start = xp.asarray( [[14.0, 3.5, 7.0], [-1, -1, -8], [7, -6, -6]], device=dev, dtype=xp.float32, ) lor_end = xp.asarray( [[-8.0, 3.5, 7.0], [-1, -1, 14], [7, 12, 12]], device=dev, dtype=xp.float32, ) .. GENERATED FROM PYTHON SOURCE LINES 57-58 Forward projection of the demo image. .. GENERATED FROM PYTHON SOURCE LINES 58-64 .. code-block:: Python img_fwd = xp.zeros(lor_start.shape[0], dtype=xp.float32, device=dev) parallelproj_core.joseph3d_fwd( lor_start, lor_end, image, img_origin, voxel_size, img_fwd ) print(img_fwd) .. rst-class:: sphx-glr-script-out .. code-block:: none [0.75 1. 1.4142135] .. GENERATED FROM PYTHON SOURCE LINES 65-87 .. code-block:: Python fig = plt.figure(figsize=(6, 6), layout="constrained") ax = fig.add_subplot(111, projection="3d") show_voxel_cube(ax, image, voxel_size, img_origin) show_lors( ax, lor_start, lor_end, labels=[f"LOR-{i}: {float(x):.2f}" for i, x in enumerate(img_fwd)], ) ax.set_xlim(-10, 15) ax.set_ylim(-10, 15) ax.set_zlim(-10, 15) ax.set_xlabel("x [mm]") ax.set_ylabel("y [mm]") ax.set_zlabel("z [mm]") ax.set_box_aspect([1, 1, 1]) ax.set_title( "Forward projection of a 3D image using Joseph's method", fontsize="medium" ) fig.show() .. image-sg:: /auto_examples/images/sphx_glr_00_basic_projection_001.png :alt: Forward projection of a 3D image using Joseph's method :srcset: /auto_examples/images/sphx_glr_00_basic_projection_001.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 88-89 back projection of ones along the same LORs. .. GENERATED FROM PYTHON SOURCE LINES 89-99 .. code-block:: Python back_ones = xp.zeros(image.shape, dtype=xp.float32, device=dev) parallelproj_core.joseph3d_back( lor_start, lor_end, back_ones, img_origin, voxel_size, xp.ones(img_fwd.shape, dtype=xp.float32, device=dev), ) .. GENERATED FROM PYTHON SOURCE LINES 100-120 .. code-block:: Python fig2 = plt.figure(figsize=(6, 6), layout="constrained") ax2 = fig2.add_subplot(111, projection="3d") show_voxel_cube(ax2, back_ones, voxel_size, img_origin) show_lors( ax2, lor_start, lor_end, labels=[f"LOR-{i}" for i in range(lor_start.shape[0])] ) ax2.set_xlim(-10, 15) ax2.set_ylim(-10, 15) ax2.set_zlim(-10, 15) ax2.set_xlabel("x [mm]") ax2.set_ylabel("y [mm]") ax2.set_zlabel("z [mm]") ax2.set_box_aspect([1, 1, 1]) ax2.set_title( "Back projection of a sinogram full of ones using Joseph's method", fontsize="medium", ) fig2.show() .. image-sg:: /auto_examples/images/sphx_glr_00_basic_projection_002.png :alt: Back projection of a sinogram full of ones using Joseph's method :srcset: /auto_examples/images/sphx_glr_00_basic_projection_002.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 0.505 seconds) .. _sphx_glr_download_auto_examples_00_basic_projection.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: 00_basic_projection.ipynb <00_basic_projection.ipynb>` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: 00_basic_projection.py <00_basic_projection.py>` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: 00_basic_projection.zip <00_basic_projection.zip>` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_