Published May 27, 2026 | Version rel_6.4.0
Software Open

STIR Software for Tomographic Image Reconstruction

  • 1. Imperial College London (UK)
  • 2. University College London
  • 3. University College London and Prescient Imaging
  • 4. National Physics Laboratory (UK)
  • 5. Positrigo
  • 6. Hammersmith Imanet Ltd
  • 7. University of Leeds (UK)
  • 8. ETH Zuerich
  • 9. Dalhousie University (Canada)
  • 10. University of Milano-Bicocca (Italy)
  • 11. Commonwealth Scientific and Industrial Research Organisation, and University of Queensland
  • 12. Brunel University (UK)
  • 13. University of Barcelona (Spain)
  • 14. UK Research & Innovation
  • 15. University College London (UK)
  • 16. King's College London
  • 17. Rijksuniversiteit Groningen (Netherlands)
  • 18. University College London, National Physics Laboratory (UK)
  • 19. Katholieke Universiteit Leuven (Belgium)
  • 20. Hospedale San Raffaele Milano (Italy)
  • 21. University of Copenhagen, Rigshospitalet, Denmark

Description

Summary of changes in STIR release 6.4

Overall summary

This version is 100% backwards compatible with STIR 6.3.

This is a release with an important TOF bug fix, considerable improvements in the Python interface, support for libparallelproj 2, speed-up in CUDA code and normalisation code, and example/documentation improvements (including an example script to process Siemens Quadra data). Of course, there is also the usual code-cleanup and some improvements to the documentation.

Main code contributions were by Kris Thielemans (UCL), Zekai Li (UMCG), Denis Prokopenko (KCL), Nicole Jurjew (UCL), Markus Jehl (Positrigo). Thanks also to Christian Hinge (U Copenhagen) for testing Quadra reconstructions. Overall overview and release management was by Kris Thielemans (UCL).

Patch release info

Summary for end users (also to be read by developers)

Bug fixes

  • An important bug fix for the "ray tracing matrix" (or actually any "matrix") projector for TOF PET. Previously, oblique segments had problems, see # 1537.
    # 1675. Extra tests were introduced in # 1674.
  • ArcCorrection should now work correctly for TOF data (although we don't use it).
    PR #1712.
  • Fixed a small memory leak in scatter estimation caused by multiple calls to ProjDataInfo::clone() combined with dynamic_cast. The object is now cloned once and ownership is transferred safely after type checking.
    PR #1673
  • Vision 600 and Quadra default Scanner definitions now have a view-offset such that STIR reconstructed images match e7tools output.
    PR #1675.

New functionality

General

  • The STIR wrapper to Parallelproj now has restrict_to_cylindrical_FOV variable/keyword (defaulting to true), identical to what is used in the ray-tracing matrix.
    PR #1261.

Python

  • The Python interface has been improved, especially related to "downcasting" of return values of most hierarchies, including ProjDataInfo, images, ExamData, priors/penalties, objective functions.
    PR #1712.

  • STIR is now installed as a Python module, but this should be backwards compatible (aside from the renames of some examples). The stirextra module is now a submodule, so use stir.extra instead (although the former will work, but with a warning). Some of the more useful examples, including Vision_files_preprocess.py, are now installed as part of the module, to make them easy to call. You can now for instance do

    python -m stir.projdata_visualisation -h

    and in Python

    import stir
    from stir.projdata_visualisation import launch_GUI
    launch_GUI('proj_data_filename')

    See PR #1713 for more details.

  • Example script Quadra_files_preprocess.py to convert e7tools output for the Siemens Biograph Quadra to STIR compatible files (based on Vision_files_preprocess.py).
    PR #1675.

  • Extra arguments to Vision_files_preprocess.py
    PR #1682.

  • Extra Python example coordinates_vs_bins.py.
    PR #1712.

  • Extra Python example in NeuroLF_reconstruction_example/ showing complete reconstruction chain for NeuroLF data, and some interactive plots using matplotlib.widgets.
    PR #1711.

Utilities

  • Add --disable-geometric-model option to find_ML_normfactors3D.

Changed functionality

  • When using a (ray tracing) matrix as projector, previously the matrix stored elements for the whole LOR, while many elements would be zero. We now only store the non-zero ones, resulting in a speed-up for the Siemens Vision Quadra of about a factor 1.7. Memory usage is also reduced.
    # 1674.
  • OpenMP parallelisation was added to the function to create a 2d histogram of hits per crystal from a proj data object, make_fan_sum_data.
    PR #1667.
  • Several optimisations were contributed as part of the SyneRBI AI-RBI hackathon:
    • Compatibility with libparallelproj 2.0 and usage of CUDA managed pointers via CuVec for internal variables in our parallelproj interface and CudaGibbsPenalty. This results in a ~20% speed-up, but also code simplification.
      PR #1689.
    • Extra constructors for array, image and projdata classes that allow std::move for input arrays.
      PR #1693 and PR #1694.

Changes to documentation

  • more info on the coordinate conventions in the STIR-developers-overview.
  • Brief section on Python in the STIR-UsersGuide.

Build system

  • Several libraries were merged into one library (called stir_buildblock, but this might change in the future). This avoids circular dependencies between libraries, and should therefore avoid linking problems in external projects. It could also make it possible to enable shared libraries (not recommended yet).
    This change should be transparent to the developer of external projects, as long as the ${STIR_LIBRARIES} CMake variable is used, as previously already recommended (see the STIR-UsersGuide). However, developers that extend STIR via the STIR_LOCAL mechanism might have to change their STIR library dependencies (see the PR for details).
    PR #1658
  • Use the CMake HDF5::HDF5 target to specify dependencies on, as opposed to HDF5_CXX_LIBRARIES etc. This should be more future proof and avoids problems with the STIR conda-forge build. (This can be switched of with the CMake option USE_HDF5_TARGET=OFF.)
    PR #1665
  • For builds with CERN ROOT, the minimum C++ standard is now automatically set to the one used to build ROOT. Starting from ROOT v6.32, the CMake variable ROOT_CXX_STANDARD specifies the C++ standard used to build ROOT, so STIR now uses this as (minimum) C++ version. (From ROOT 6.34, CMake will automatically ensure that ROOT dependencies (such as STIR) use the same C++ standard).
    Note that for ROOT versions below v6.32, the C++ standard is not exposed. In this case, STIR's FindROOT.cmake sets ROOT_CXX_STANDARD = 17, matching pre-built releases and conda packages. For custom builds of ROOT below v6.32 that use a more recent C++ standard, the STIR user must specify the appropriate C++ standard manually during configuration by specifying CMAKE_CXX_STANDARD.
    PR #1700

Known problems

See our issue tracker.

What is new for developers (aside from what should be obvious from the above):

New functionality

  • Added a Python script to convert e7tools generated Siemens Biograph Vision 600 sinograms to STIR compatible format. PR #1675

Changed functionality

  • Simplified the ProjDataInfoGenericNoArcCorr class hierarchy by merging `ProjDataInfoGeneric into it and deriving it from ProjDataInfoCylindricalNoArcCorr. See Issue #1307 for rationale.
    WARNING: this change might have unexpected consequences for developers: when checking for the type of ProjDataInfo with dynamic_cast with a sequence of if statements (or equivalent), make sure you test for ProjDataInfoGeneric before testing for ProjDataInfoCylindricalNoArcCorr.(or even ProjDataInfoCylindrical). It is therefore strongly recommended to test via
    proj_data.get_proj_data_info_sptr()->get_scanner_ptr()->get_scanner_geometry() == "Cylindrical")
    etc
    PR #1696
  • ProjDataInfo::clone() now uses covariant return types, avoiding need for explicit downcasting. Also added the DataWithProjDataInfo class, reducing duplicate C++ code.
    PR #1712.

New Deprecations and renames

  • ProjDataInfoGeneric is now identical to ProjDataInfoGenericNoArcCorr.
  • ProjDataInfoBlocksOnCylindricalNoArcCorr will be removed in v7.0 as it is almost identical to ProjDataInfoGenericNoArcCorr.

Code improvements

  • Minor fix to replace a deprecated std::sprintf() with std::snprintf(), see #1586.
    PR #1697
  • Minor fix to replace a deprecated std::istrstream() with std::istringstream(), see #1637.
    PR #1698
  • Fix to adjust buffer size in `manip_projdata.cxx` to account for appended extensions for file names.
    PR #1699

Test changes

All new features and most code changes were accompanied by new tests.

List of pull requests

  • [CMake] merge circular-dependent libraries by @KrisThielemans in https://github.com/UCL/STIR/pull/1658
  • [CMake] Use hdf target as opposed to HDF5_CXX_LIBRARIES by @KrisThielemans in https://github.com/UCL/STIR/pull/1665
  • [CMake] depend on both HDF5::HDF5 and hdf5::hdf5_cpp by @KrisThielemans in https://github.com/UCL/STIR/pull/1668
  • more info() statements when running parallelproj by @KrisThielemans in https://github.com/UCL/STIR/pull/1670
  • TOF bin fix for RayTracingMatrix by @z-k-li in https://github.com/UCL/STIR/pull/1645
  • Added Siemens Quadra scanner in the scanner.cxx and .h by @z-k-li in https://github.com/UCL/STIR/pull/1628
  • Prompt histogram calculation by @markus-jehl in https://github.com/UCL/STIR/pull/1667
  • examples/python/Quadra_files_preprocess.py by @z-k-li in https://github.com/UCL/STIR/pull/1675
  • add Python example running LBFGSB-PC by @KrisThielemans in https://github.com/UCL/STIR/pull/1663
  • TOF improvements by @KrisThielemans in https://github.com/UCL/STIR/pull/1674
  • Fix memory leak from repeated ProjDataInfo::clone() calls by @NikEfth in https://github.com/UCL/STIR/pull/1673
  • Vision script bugfix: rotational shift between STIR and Siemens recons by @NicoleJurjew in https://github.com/UCL/STIR/pull/1682
  • Update Quadra_files_preprocess.py by @ChristianHinge in https://github.com/UCL/STIR/pull/1681
  • Make VoxelsOnCartesianGrid::construct_from_projdata_info return a contiguous array by @Dimitra-Kyriakopoulou in https://github.com/UCL/STIR/pull/1690
  • Hackathon project08: Preserve moved array storage in VoxelsOnCartesianGrid for CUDA-managed images by @Dimitra-Kyriakopoulou in https://github.com/UCL/STIR/pull/1693
  • Quadra script bugfix: rotational shift between STIR and Siemens recons by @z-k-li in https://github.com/UCL/STIR/pull/1688
  • Hackathon Project 8: Add CUDA-managed projection container support (continuation of the image stage) by @Dimitra-Kyriakopoulou in https://github.com/UCL/STIR/pull/1694
  • Upgrade to parallelproj 2.0 and use cuvec by @KrisThielemans in https://github.com/UCL/STIR/pull/1689
  • CuVec: check size by @casperdcl in https://github.com/UCL/STIR/pull/1695
  • Fix sprintf deprecation warnings by @denproc in https://github.com/UCL/STIR/pull/1697
  • Replace deprecated istrstream with istringstream by @denproc in https://github.com/UCL/STIR/pull/1698
  • Fix buffer size issue by @denproc in https://github.com/UCL/STIR/pull/1699
  • Define minimum C++ version using ROOT_CXX_STANDARD by @denproc in https://github.com/UCL/STIR/pull/1700
  • Merge release 6.3.1 by @KrisThielemans in https://github.com/UCL/STIR/pull/1703
  • add set_up in Scanner::ask_parameters() by @KrisThielemans in https://github.com/UCL/STIR/pull/1705
  • disable call to check_consistency() in constructor by @KrisThielemans in https://github.com/UCL/STIR/pull/1708
  • simplify ProjDataInfoGeneric hierarchy by @KrisThielemans in https://github.com/UCL/STIR/pull/1696
  • allow using full FOV for Parallelproj projector by @KrisThielemans in https://github.com/UCL/STIR/pull/1261
  • Fixes making the Python interface better (and some code reduction) by @KrisThielemans in https://github.com/UCL/STIR/pull/1712
  • Add --disable-geometric-model option to find_ML_normfactors3D [ci skip] by @KrisThielemans in https://github.com/UCL/STIR/pull/1714
  • Prepare for 6.4.0 by @KrisThielemans in https://github.com/UCL/STIR/pull/1715
  • Doxygen fixes by @KrisThielemans in https://github.com/UCL/STIR/pull/1716
  • Install stir as python module and install some examples by @KrisThielemans in https://github.com/UCL/STIR/pull/1713
  • use DataWithProjDataInfo for ListModeData by @KrisThielemans in https://github.com/UCL/STIR/pull/1717
  • Prep2 v6.4.0 by @KrisThielemans in https://github.com/UCL/STIR/pull/1718
  • Example python reconstruction of Hoffman data. by @markus-jehl in https://github.com/UCL/STIR/pull/1711
  • updated VERSION.txt etc for release of version 6.4.0 by @KrisThielemans in https://github.com/UCL/STIR/pull/1719

Full Changelog: https://github.com/UCL/STIR/compare/rel_6.3.1...rel_6.4.0

Notes

If you use this software, please cite it using the metadata from this file.

Files

UCL/STIR-rel_6.4.0.zip

Files (32.7 MB)

Name Size Download all
md5:db4f793e84113cadacdbd15d9fa6c193
32.7 MB Preview Download

Additional details

Related works

Is supplement to
Software: https://github.com/UCL/STIR/tree/rel_6.4.0 (URL)

Software