STIR Software for Tomographic Image Reconstruction
Authors/Creators
-
Efthimiou, Nikos
- Mustafovic, Sanida1
-
Brown, Richard2
- Twyman Skelly, Robert3
-
Deidda, Daniel4
- Tsoumpas, Charalampos
- Jehl, Markus5
- Kyriakopoulou, Dimitra2
- Falcon, Carles
- Borgeaud, Tim6
- Wadhwa, Palak7
- Beisel, Tobias
- Khateri, Parisa8
- Strugari, Matthew9
- Colombo, Matteo Neel10
- Emond, Elise2
-
Gillman, Ashley11
- Jacobson, Matthew
- Zverovich, Alexey12
- Fuster Marti, Berta13
- Labbe, Claire
- Jurjew, Nicole2
-
Biguri, Ander2
-
Fischer, Jannis
- Bertolli, Ottavia2
- Brusaferri, Ludovica2
-
Thomas, Benjamin2
-
Pasca, Edoardo14
- Roethlisberger, Michael8
- Aguiar, Pablo
- Niknejad, Tahereh
- Sadki, Mustapha12
-
Singh, Imraj15
- Kerrouche, Nacer6
- Dikaios, Nikos
-
Ovtchinnikov, Evgueni
-
Fardell, Gemma14
- Prokopenko, Dennis16
- Schmidtlein, C Ross14
- Valente, Patrick12
- Li, Zekai17
- Porter, Sam David18
-
Ehrhardt, Matthias J.
- Schramm, Georg19
- Völgyes, David
- Dinelle, Katie
- Belluzzo, Damiano20
- Ching, Daniel
- Hague, Darren12
- Tunnicliffe, Harry7
- Dao, Viet Anh7
-
da Costa-Luis, Casper O.
- Chen, Gefei
- Mikhaylova, Ekaterina5
- Reeves, Antonia2
- Wynne, Benjamin
- Rashidnasab, Alaleh2
- Whitehead, Alexander C.2
- Hinge, Christian21
- Tsai, Yu-jung2
- Gillen, Rebecca2
- Vavrek, Jayson
- Kohr, Holger
- tokkot
- El Katib, Mahmoud
-
Thielemans, Kris2
- 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
- 6.4.0 released 27 May 2026
GitHub Milestone 6.4
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. ArcCorrectionshould 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 withdynamic_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_FOVvariable/keyword (defaulting totrue), 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
stirextramodule is now a submodule, so usestir.extrainstead (although the former will work, but with a warning). Some of the more useful examples, includingVision_files_preprocess.py, are now installed as part of the module, to make them easy to call. You can now for instance dopython -m stir.projdata_visualisation -hand 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.pyto convert e7tools output for the Siemens Biograph Quadra to STIR compatible files (based onVision_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 usingmatplotlib.widgets.
PR #1711.
Utilities
- Add
--disable-geometric-modeloption tofind_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::movefor input arrays.
PR #1693 and PR #1694.
- Compatibility with libparallelproj 2.0 and usage of CUDA managed pointers via CuVec for internal variables in our parallelproj interface and
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 theSTIR_LOCALmechanism might have to change their STIR library dependencies (see the PR for details).
PR #1658 - Use the CMake
HDF5::HDF5target to specify dependencies on, as opposed toHDF5_CXX_LIBRARIESetc. This should be more future proof and avoids problems with the STIR conda-forge build. (This can be switched of with the CMake optionUSE_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_STANDARDspecifies 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'sFindROOT.cmakesetsROOT_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 specifyingCMAKE_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
ProjDataInfoGenericNoArcCorrclass hierarchy by merging `ProjDataInfoGenericinto it and deriving it fromProjDataInfoCylindricalNoArcCorr. See Issue #1307 for rationale.
WARNING: this change might have unexpected consequences for developers: when checking for the type ofProjDataInfowithdynamic_castwith a sequence ofifstatements (or equivalent), make sure you test forProjDataInfoGenericbefore testing forProjDataInfoCylindricalNoArcCorr.(or evenProjDataInfoCylindrical). 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 theDataWithProjDataInfoclass, reducing duplicate C++ code.
PR #1712.
New Deprecations and renames
ProjDataInfoGenericis now identical toProjDataInfoGenericNoArcCorr.ProjDataInfoBlocksOnCylindricalNoArcCorrwill be removed in v7.0 as it is almost identical toProjDataInfoGenericNoArcCorr.
Code improvements
- Minor fix to replace a deprecated
std::sprintf()withstd::snprintf(), see #1586.
PR #1697 - Minor fix to replace a deprecated
std::istrstream()withstd::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
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
- Repository URL
- https://github.com/UCL/STIR