Skip to content

Releases: UCL/STIR

v6.2.0

23 Jul 08:30
e50e6b1
Compare
Choose a tag to compare

Summary of changes in STIR release 6.2

Overall summary

This version is 100% backwards compatible with STIR 6.1, aside from a bug fix for the blocks-on-cylindrical set-up which caused the wrong geometry, and a changed default of the tail-fitting of the scatter estimator (see below). However, C++-17 is now required.

Main new features are the capability to mash TOF bins (via SSRB utility/code) and a CUDA version of the Relative Difference Prior. There are also some import bug fixes, as well as some speed-up (hopefully) in the use of arrays.

Of course, there is also the usual code-cleanup and improvements to the documentation.

This release contains mainly code written by @NicoleJurjew (UCL) (SSRB for TOF), @Imraj-Singh (UCL) (CUDA version of the Relative Difference Prior), @markus-jehl (Positrigo) (fixes for blocks on cylindrical) and @KrisThielemans (UCL).

Patch release info

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

New functionality

  • ProjData now has most of the methods for numerical operations as Array, i.e. +=,-=,*=,/=,find_max(),find_min(),sum().
    ProjDataInMemory adds =,-,*,/ (as well as overloads that are faster than the implementations in ProjData).
    PR #1439 and PR #1448
  • New prior CudaRelativeDifferencePrior (use Cuda Relative Difference Prior in .par files), only available if the CUDA toolkit is found during building. Results are identical to RelativeDifferencePrior up to numerical rounding issues. However, the code is currently limited to 3x3x3 weights.
    Added timings for the RDP (both non-CUDA and CUDA) to the stir_timings utility.
    PR #1408

Changed functionality

  • The default minimum scale factor for tail-fitting in the scatter estimation is now 0.05 (was 0.4). This (temporarily) resolves a
    problem that for the Siemens mMR, the default factor was too large (see issue #1280).
    **WARNING:**This potentially changes your scatter estimates. (You can check log files of the scatter estimation to see what the
    scaling factors are.) However, the Siemens mMR example files already lowered the default scale factor to .1, so if you use(d) those, you will get identical results.
  • Array::sum() (and hence images etc) now accumulates in a variable at higher precision to avoid loss of precision.
    PR #1439
  • PoissonLogLikelihoodWithLinearModelForMeanAndProjData now attempts to auto-detect if it should compute sensitivity using TOF back-projection or not. It does this by checking if its normalisation object can only handle TOF data or not. This should
    mean that the use time-of-flight sensitivities keyword should now rarely (if ever) be necessary.
    PR #1458
  • SSRB now allows to mash TOF bins.
    PR #1464
  • SPECT_dicom_to_interfile improvements:
    • remove requirement for the is_planar parameters. As STIR can only read SPECT sinograms, we now read/set all fields from a
      planar scan as well. There is therefore no need anymore for the boolean, and it is just ignored. Output of a conversion of
      planar data is now directly readable into STIR.
    • do checks if sequences are present to avoid seg-faults
      See PR #1473

Bug fixes

  • There was a bug in the computation of the detector coordinates for BlocksOnCylindrical scanners that caused the buckets to not be symmetric.
    PR #1462
  • BlocksOnCylindrical scanners were not axially symmetric due to a bug in how gaps were handled. Also, downsampling of
    BlocksOnCylindrical scanners in scatter simulation was inaccurate.
    PR #1466
  • The "Hessian times input" calculations of the Poisson log-likelihood for projection data were incorrect when the forward projection of the "input" contains negatives. We now detect this and throw an error if it occurs. A proper fix will have to be for later.
    See Issue #1461

Build system

  • C++-17 is now required.
  • Force C++ version according to CERN ROOT versions: ROOT 6.28.10 needs C++17 and 6.30.2 needs C++20. Also some fixes when relying on root-config.
  • Optionally enable CUDA as a CMake language (for the CUDA RDP). You should use CMake 3.23 or later if you use CUDA. If you have the CUDA Toolkit but an old version of CMake that you cannot update, you will have to set DISABLE_STIR_CUDA to ON.

Known problems

See our issue tracker.

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

Changed functionality

  • Array classes by default use contiguous memory allocation (as opposed to a sequence of 1D vectors). This could speed up memory
    allocation and destruction of arrays with a high number of underlying 1D vectors. It also allows reading/writing data in one call to the C++ library, as opposed to many small calls. Also added move constructors to the Array, VectorWithOffset classes.
    PR #1236 and PR #1438.

Bug fixes

  • PoissonLogLikelihoodWithLinearModelForMeanAndProjData had a (minor?) problem with TOF data that when computing the gradient, the normalisation object was not set-up with the TOF data, but non-TOF instead. This did not happen in our normal reconstruction code, and would have thrown an error if it occured.
    Fixed in PR #1427.

Other code changes

  • Fixed an incompatibility with C++20.
  • Enabled OpenMP for Array members find_max(), find_min(), sum(), sum_positive().
    PR #1449.
  • Changes to allow reading Siemens Biograph Vision data: iSSRB and SSRB are now included in the SWIG interface; minor changes to a
    shell script altering e7tools headers.

Test changes

C++ tests

  • Objective functions (both projection-data and list-mode) and priors now have a numerical test for accumulate_Hessian_times_input
    PR #1418

recon_test_pack

  • The output of simulate_PET_data_for_tests.sh can now be varied by setting environment variables, e.g. max_rd. (Do not forget to
    unset those variables afterwards!)
  • New test run_test_SSRB.sh

New Contributors

Full Changelog: rel_6.1.0...rel_6.2.0

v6.1.0

16 May 10:44
Compare
Choose a tag to compare

Summary of changes in STIR release 6.1

This version is 100% backwards compatible with STIR 6.0 for the user, except for the bug-fix in the RDP (see below).

Overall summary

This version adds capability of using Parallelproj (CPU and GPU versions) for TOF data. In addition, the list-mode objective function
has several improvements, including speed-up by using multi-threading if caching was not enabled.

Of course, there is also the usual code-cleanup and improvements to the documentation.

This release contains mainly code written by Nicole Jurjew (UCL) and Kris Thielemans (UCL).

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

New functionality

  • Add TOF capability of the parallelproj projector (see PR #1356)
  • It is now possible to read TOF bin order from the interfile header (see PR #1389)
  • PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin can now compute the value as well as
    accumulate_Hessian_times_input. PR #1418
  • GeneralisedObjectiveFunction has 2 new members to compute the full gradient (compute_gradient and compute_gradient_without_penalty). Previously, only subset gradients were available. PR #1418

Changed functionality

  • PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin now computes the gradient multi-threaded (if OpenMP is enabled), even if caching to file of the list-mode file is not enabled. PR #1418
  • Accumulation in computation of priors now uses doubles, which could result in slightly better precision. Part of PR #1410.

Bug fixes

  • The Relative Difference Prior gave incorrect results, probably since switching to C++-14 in version 6.0, although we are not sure.
    See PR #1410 and associated issue #1409.
  • Our checks for determining system byte-order were out-of-date and in particular did not work on MacOS 14 on ARM. We now use CMake's CMAKE_CXX_BYTE_ORDER (available since CMake 3.20). This could potentially affect reading of list-mode data (which would otherwise be garbled). Fixed in PR #1412.
  • The listmode objective function did not loop over TOF bins when computing the Hessian. This would give different results in OSSPS for
    computing the "denominator". Fixed in issue #1427.

Known problems

See our issue tracker.

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

Backward incompatibities

  • Additional checks on GeometryBlocksOnCylindrical scanner configuration, which may lead to an error being raised, while previously the code silently proceeded.

Bug fixes

  • PoissonLogLikelihoodWithLinearModelForMeanAndProjData had a (minor?) problem with TOF data that when computing the gradient, the normalisation object was not set-up with the TOF data, but non-TOF instead. This did not happen in our normal reconstruction code, and would have thrown an error if it occured. Fixed in issue #1427.

Other code changes

  • Fixes an incompatibility with C++20.

Build system

  • Force C++ version according to CERN ROOT versions: ROOT 6.28.10 needs C++17 and 6.30.2 needs C++20. Also some fixes when relying on root-config.

Test changes

C++ tests

  • Objective functions (both projection-data and list-mode) and priors now have a numerical test for accumulate_Hessian_times_input
    PR #1418

Full Changelog: rel_6.0.0...rel_6.1.0

v6.0.0

07 Feb 08:53
Compare
Choose a tag to compare

Summary of changes in STIR release 6.0

This version is 99% backwards compatible with STIR 5.x for the user (see below). Developers might need to make code changes as detailed below. Note though that the locations of installed files have changed. Developers of other software that uses STIR via CMake will therefore need to adapt (see below).

Overall summary

This release is a major upgrade adding Time of Flight (TOF) capabilities to STIR.

This version has a major code-cleanup related to removing old compiler work-arounds, consistent use of override and white-space enforcement.

Overall code management and assistance was Kris Thielemans (UCL and ASC). Other main contributors include: Nikos Efthimiou (UCL, University of Hull, UPenn, MGH) for the TOF framework and list-mode reconstruction, Elise Emond (UCL) for adapting TOF framework for projection-data, Palak Wadhwa (University of Leeds) for adaptations and testing on GE Signa PET/MR data, Robert Twyman for extending projector symmetries to TOF and formalising ROOT-based testing, Nicole Jurjew (UCL) for adaptations and testing on Siemens Vision 600 data. Non-TOF contributors include Daniel Deidda (NPL) and Markus Jehl (Positrigo).

Patch release info

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

Changes breaking backwards compatibility from a user-perspective

General

  • When parsing Interfile headers for projection data and the originating system is not recognised, the previous version of STIR tried to guess the scanner based on the number of views or rings. This was using very old scanners though, and could lead to confusion. These guesses have now been removed.
  • (deprecated) support for the GE VOLPET format (an old format used by the GE Advance and Discover LS sinograms when using "break-pointing") has been removed.
  • (deprecated) support for the AVW format via the (very old) AnalyzeAVW commercial library has been removed.
  • Most installed files are now in versioned directories. The following shows the new and old locations relative to CMAKE_INSTALL_PREFIX, where V.v indicates the major.minor version number, e.g. 6.0:
    • documentation (including examples as subfolder): share/doc/STIR-V.v (was share/doc/stir-V.v)

    • JSON files with radionuclide database: share/STIR-V.v/config (was share/stir/config)

      Developers also need to check the new location to use for STIR_DIR documented below.

  • ProjDataInfo::ask_parameters() and therefore create_projdata_template has changed:
    1. If the scanner definition in STIR has TOF capabilities, it will ask for the TOF mashing factor.
    2. The default for arc-correction has changed to N, i.e. false.
    3. Default value for span is now 11 for Siemens and 2 for GE scanners.
    4. The span=0 case (i.e. span-3 for segment 0, span=1 for oblique ones, erroneously by STIR used for the GE Advance) is no deprecated. GE uses span=2.
      (Reading a "span=0" case is still supported)
  • Projection-data related classes have accessors with an optional make_num_tangential_poss_odd argument (defaulting to false), which made the returned argument a different size. This has been deprecated since version 5.0. Setting this argument to true will now raise an error.

Python (and MATLAB)

  • renamed FloatLOR to LOR, and same for derived classes.

New functionality

TOF related

The new TOF support is mostly transparent, i.e. normally no changes are required to the reconstruction code etc. When using Interfile or ROOT files, certain new keywords are required, see examples/samples/PET_TOF_Interfile_header_Signa_PETMR.hs and examples/samples/root_header.hroot. See also the updated STIR_glossary.
Please cite the following papers:

  • Efthimiou, N., Emond, E., Wadhwa, P., Cawthorne, C., Tsoumpas, C., Thielemans, K., 2019. Implementation and validation of time-of-flight PET image reconstruction module for listmode and sinogram projection data in the STIR library. Phys Med Biol 64, 035004. DOI: 10.1088/1361-6560/aaf9b9.
  • Wadhwa, P., Thielemans, K., Efthimiou, N., Wangerin, K., Keat, N., Emond, E., Deller, T., Bertolli, O., Deidda, D., Delso, G., Tohme, M., Jansen, F., Gunn, R.N., Hallett, W., Tsoumpas, C., 2021. PET image reconstruction using physical and mathematical modelling for time of flight PET-MR scanners in the STIR library. Methods, Methods on simulation in biomedicine 185, 110–119. DOI: 10.1016/j.ymeth.2020.01.005

See also the (enormous) PR #304.

Limitations

  • Currently on the matrix based projectors support TOF. Note that the implementation is generic but slow: a non-TOF row is computed and then multiplied with the TOF kernel. This is somewhat alleviated by the use of caching. However, as not all symmetries are supported yet, caching of the projection matrix needs substantially more memory than in the non-TOF situation.
  • We do not have TOF scatter simulation/estimation yet.
Non-TOF updates
  • Radionuclide information is read from Interfile and GE HDF5 headers. If the radionuclide name is recognised to the STIR database, its values for half-life etc are used, as opposed to what was recorded in the file (if anything).
  • list_lm_events now has an additional option --event-bin which lists the bin assigned for the event (according to the "native" projection data, i.e. without any mashing).
    In addition, the --event-LOR option now also works for SPECT (it was disabled by accident).
  • stir_list_registries is a new utility that list possible values of various registries, which can be useful to know what to use in a .par file.
  • Radionuclide database now has a datasource entry with the radionuclide decay table (lnHB ). This makes it traceable to standardised measures of branching ratios, half lives etc. The change is backward compatible and old format is still supported. However we encourage to use the new one, see src/config/radionuclide_info.json.

Python (and MATLAB)

  • exposed ProjMatrixByBinPinholeSPECTUB
    PR #1366
  • PR #1288
    • exposed ListRecord etc, such that loops over list-mode data can now be performed in Python (although this will be somewhat slow). See examples/python/listmode_loop_demo.py.
    • added LORAs2Points,LORInCylinderCoordinates, LORInAxialAndSinogramCoordinates and PointOnCylinder.
      Warning: renamed FloatLOR to LOR, and same for derived classes.
  • add DetectionPositionPair.__repr__ for printing and change order of text in DetectionPosition.__repr__ to fit with constructor to avoid confusion.
    PR #1316

Changed functionality

  • We now always check (in ProjDataInfo*NoArcCorr) if number of tangential positions in the projection data exceeds the maximum number of non arc-corrected bins set for the scanner. If it is, an error is raised. You might therefore have to adapt your interfile header.
  • Interfile header changes:
    • Write STIR6.0 as Interfile key version to denote TOF changes. This is currently ignored for parsing though.
    • (PET) The effective central bin size (cm) keyword for projection data is now only used for arc-corrected data. It is no longer written to the header for non-arccorrected data.

Build system

  • CMake version 3.14 is now required.
  • C++-14 is now required.
    In fact, it is possible that C++-11 still works. If you really need it, you can try to modify the main CMakeLists.txt accordingly.
  • STIR_CONFIG_DIR is no longer a CMake cached variable, such that it automatically moves along with CMAKE_INSTALL_PREFIX. However, if you are upgrading an existing STIR build, you might have to delete the cached variable, or it will point to the old location.

Bug fixes

  • Interfile parsing no longer gets confused by the use of : in a keyword (e.g., used by Siemens for dates).
    PR #1267

Known problems

See our issue tracker.

Documentation changes

  • Added (some) documentation on TOF features
  • Added examples/C++/using_installed_STIR to illustrate how to use STIR as a "library".
  • Renamed examples/C++/src to examples/C++/using_STIR_LOCAL.

New deprecations for future versions

  • CMake option STIR_USE_BOOST_SHARED_PTR will be removed. It probably no longer works anyway. Therefore stir::shared_ptr will always be std::shared_ptr.
  • Direct X-windows display (corresponding to the CMake option `GRAPHICS=X`) will be removed. It is very outdated and sometimes doesn't work.
  • remaining files for ECAT6 support will be removed.

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

White-space and style enforcement

  • We now use clang-format to enforce C++-style, including white-space settings, l...
Read more

v5.2.0

30 Oct 06:40
Compare
Choose a tag to compare

Summary of changes in STIR release 5.2.0

This version is 100% backwards compatible with STIR 5.0 as far as usage goes. However, there are changes in the output of scatter estimation and ECAT8 normalisation, see below for more information.

Overall summary

Of course, there is also the usual code-cleanup and improvements to the documentation. See also the 5.2 milestone on GitHub.

Overall code management and assistance by Kris Thielemans (UCL and ASC). Other main contributors were Daniel Deidda (NPL) and Markus Jehl (Positrigo).

Patch release info

  • 5.2.0 released 30/10/2023

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

Bug fixes

  • Scatter estimation was setting initial activity image to 1 at set-up, effectively ignoring the initial image, aside from geometric info.
  • Setting SPECTUB resolution model with STIR python or SIRF divided slope by 10 in error. The problem did not occur when set using parameter file

Changed functionality

  • The ECAT8 normalisation (used for the Siemens mMR) code now takes the 4th component axial effects into account. These normalisation factors are therefore different (even up to ~10%). This gives improved axial uniformity in the images. The use of the axial effects can be switched off by adding setting use_axial_effects_factors:=0 to the parameter file (see an example in examples/Siemens-mMR/correct_projdata_no_axial_effects.par), or the class member of the same name.
    In addition, the Siemens normalisation header is now read (using a new class InterfileNormHeaderSiemens) such that hard-coded variables for the Siemens mMR have been removed. Further testing of this functionality is still required however.
    PR #1182.
  • Interfile header parsing now correctly identifies keywords that contain a colon by checking for :=.
  • The set_up() method of the ray-tracing projection matrix now skips further processing if it was already called with data of the same characteristics. This will means that any cached data will be re-used, potentially leading to a speed-up when re-using it from Python.
    PR #1281.

New functionality

  • The Discretised Shape3D shape/ROI has now an extra value label index. For ROIs, this allows using a single volume with multiple ROIs encoded as labels, such as output by ITKSnap and many others. When used as a shape in generate_image, it could be used to extract a single ROI from such a label image.
    PR #1196.

  • Global variables in SPECTUB have been substituted by class members, such that multiple SPECTUB projectors can be used.
    PR #1169.

  • Global variables in PinholeSPECTUB have been substituted by class members, such that multiple PinholeSPECTUB projectors can be used.
    PR #1212.

  • Scatter estimation is now smoothed in axial direction for BlocksOnCylindrical scanners.
    PR #1172.

  • InverseSSRB now works for BlocksOnCylindrical after a rewrite.
    PR #1172. /

  • Parallelised function set_fan_data_add_gaps_help across segments to reduce computation time.
    PR #1168.

  • New utility SPECT_dicom_to_interfile which reads a DICOM file with SPECT projection data and extracts the data and writes one or more Interfile 3.3 headers (still somewhat preliminary).
    PR #1182.

  • The new stir_timings utility is mostly useful for developers, but you could use it to optimise the number of OpenMP threads to use for your data.
    PR #1237.

  • New classes SegmentIndices, ViewgramIndices and SinogramIndices, used by ProjData related classes, as opposed to having to specify all the elements directly, e.g. in C++

          auto sinogram = proj_data.get_sinogram(sinogram_indices);
    

    This makes these functions more future proof, in particular for TOF. The older functions are now deprecated. Note that as Bin is now derived from ViewgramIndices, instantations of Bin can now be used to specify the indices as well in most places.
    There is still more work to do here, mostly related to the symmetries.
    PR #1273.

Python (and MATLAB)

  • Examples use stir.ProjData.read_from_file as opposed to stir.ProjData_read_from_file. The former is supported since SWIG 3.0, and the default from SWIG 4.1.
  • Addition of DetectionPosition and DetectionPositionPair.
  • bin.time_frame_num is now no longer a function in Python, but acts like a variable (as the other Bin members).
  • Addition of RadionuclideDB

New examples

  • examples/python/construct_projdata_demo.py illustrates constructing a ProjDataInMemory

Changed functionality

  • Scatter estimation was resetting the activity image to 1 before each iteration. This led to cases where the reconstructed image (and therefore the scatter estimation) did not converge, especially when using a small number of sub-iterations. Now, the reconstructed image is continuouslu updated between scatter iterations by default. This should also allow users to use less sub-iterations, therefore saving some time for the scatter estimation. The old behaviour can be re-enabled by setting restart_reconstruction_every_scatter_iteration to true either via a parameter file or via the set_restart_reconstruction_every_scatter_iteration() function.
    PR #1160.
  • energy resolution functions and keywords have now more documentation. Scanner::check_consistency also checks if the energy resolution is less than 20 (as it is FWHM/reference_energy).
    PR #1149.
  • Errors now throw std::runtime_error instead of std::string.
    PR #1131.
  • The parameter use_view_offset was removed from the interpolate_projdata functions. View-offset is now always taken into account.
    PR #1172.
  • The info, warning and error calls are thread safe now (which makes them slower), and the logging output in distributable.cxx was changed from verbosity 2 (which is the STIR default) to verbosity 3. This is to reduce the default output during iterative reconstructions.
    PR #1243.
  • The Succeeded class has a new method bool succeeded() enabling more concise code (avoiding the need for comparing with Succeeded::yes which is especially verbose in Python).
  • The example files for the Siemens mMR now use lower min/max thresholds for the (single) scatter scale. This gives better results, see Issue #1163.
    PR #1279.

Deprecated functionality and upcoming changes to required tool versions

  • The following functions (previously used for upsampling the scatter estimate) have been made obsolete or replaced, and will be removed in STIR version 6.0.0: interpolate_axial_position, extend_sinogram_in_views and extend_segment_in_views
  • Constructors/functions in ProjData related classes that explicitly use axial_pos_num, view_num etc in their arguments are now deprecated, and should be replaced by their respective versions that use SegmentIndices, ViewgramIndices or SinogramIndices. The former will not be compatible with TOF information that will be introduced in version 6.0.0.
  • Use of the AVW library to read Analyze files will be removed in 6.0, as this has not been checked in more than 15 years. Use ITK instead.
  • GE VOLPET and IE support will be removed in 6.0, as we have no files to test this, and it's obsolete anyway.
  • STIR version 6.0.0 will require C++ 14 (currently we require C++ 11, but already support C++ 20) and CMake 3.14.

Build system and dependencies

  • CMake 3.12 is now required on Windows.
  • We now use CMake's OBJECT library feature for the registries. This avoids re-compilation of the registries for every executable and therefore speeds-up building time. Use of STIR in an external project is not affected as long as the recommended practice was followed. This is now documented in the User's Guide.
    PR #1141.
  • The error and warning functions are now no longer included from common.h and need to be included manually when used (as was already the case for #include "stir/info.h").
    PR #1192.
  • add .h and .i as dependencies for SWIG generated wrappers to make sure they get rebuild. (Currently adding all .h files, which is too much, but CMake needs a fix before we can do this properly).
    PR #1218.

Changes for developers

  • moved all functionality in CListEventCylindricalScannerWithDiscreteDetectors to template class CListEventScannerWithDiscreteDetectors (templated in ProjDataInfoT). This enables re-use for generic/blocksoncylindrical scanners.
    PR #1222.
  • rewritten ProjDataInMemory to avoid streams, causing a speed-up of some operations, and removing a limit of total size of 2GB.
    [...
Read more

v5.1.2

11 Sep 06:39
Compare
Choose a tag to compare

Code is identical to 5.1.0 and 5.1.1, aside from handling the scatter test with a slightly larger threshold due to occasional failures (as it uses random placements). This change is a backport from STIR master.

v5.1.1

26 Aug 07:27
Compare
Choose a tag to compare

Code is identical to 5.1.0, aside from handling numerical precision in 2 tests, which otherwise can fail.

v5.1.0

14 Jan 22:21
Compare
Choose a tag to compare

Summary of changes in STIR release 5.1

This version is 100% backwards compatible with STIR 5.0.

Overall summary

  • This release includes the first open-source code available for reconstructing pinhole-SPECT datasets (see PR #1100). It contains code by Carlés Falcón (Neuroimaging Group, Barcelonaβeta Brain Research Center) to create the pinhole-SPECT system matrix. Integration into STIR was completed by Matthew Strugari (Dalhousie University) and Kris Thielemans (UCL). This work is reported in
    • Matthew Strugari, Carles Falcon, Kjell Erlandsson, Brian Hutton, G. Andrew Reid, Ian Pottie, Sultan Darvesh, Steven Beyea, Kimberly Brewer, Kris Thielemans,
      Integration of advanced 3D SPECT modelling for pinhole collimators into the open-source STIR framework,
      Proc. IEEE MIC 2022, Milan, Italy
  • Improvements to listmode reconstruction by Nikos Efthimiou, see PR #1030.
  • Support for PENNPET Explorer listmode data (if proprietary libraries are found) by Nikos Efthimiou, see PR #1028.
  • Scatter simulation, estimation and down/up-sampling, randoms handling and ML normalisation estimation adapted for scanner with Block geometry by Daniel Deidda (NPL) and Kris Thielemans (UCL).
  • Various small changes to add functionality to Python interface, mainly by Markus Jehl (Positrigo).
  • Python projection data visualiser (in examples/python) by Robert Twyman (UCL).

Of course, there is also the usual code-cleanup and improvements to the documentation. See also the 5.1 milestone on GitHub and the full release notes

Overall code management and assistance by Kris Thielemans (UCL and ASC).

v5.0.2

01 Jun 20:07
Compare
Choose a tag to compare

bug-fix release:

  • fix in exported STIRConfig.cmake for HDF5
  • fix Block/Generic get_phi() which could cause 180 degrees swaps

v5.0.1

01 Jun 20:05
Compare
Choose a tag to compare

bug-fix release

  • PR 1019: fixes for SWIG and hence Python interface.
  • PR #1012 and PR #1016: rotational changes to STIR's interface to ROOT files, breaking compatibility with 4.x (and 5.0.0 but this was broken). See below for more information.
  • PR #1026: various fixes to the radionuclide database code. WARNING: This PR changed the file format for radionuclide_info.json file to be more future proof.

v5.0.0

23 Mar 06:47
Compare
Choose a tag to compare

This version is 95% backwards compatible with STIR 4.0 for the user (see below). Developers might need to make code changes as detailed below.

Overall summary

  • At least C++-11 is now required. We are not aware of any problems with more recent versions of C++.
  • Initial support for PET scanners with block detectors or even generic location of detectors (less tested feature), taking into account appropriate geometry. This is currently kept independent of the cylindrical scanner modelling used normally, but this will be changed in a future version. See PR #577. This work is described in
    P. Khateri, J. Fischer, W. Lustermann, C. Tsoumpas, and G. Dissertori,
    Implementation of cylindrical PET scanners with block detector geometry in STIR,
    EJNMMI Physics, vol. 6, no. 1, p. 15, Jul. 2019, doi: 10.1186/s40658-019-0248-9.
    V. Dao, E. Mikhaylova, M. L. Ahnen, J. Fischer , K. Thielemans, C. Tsoumpas,
    Image Reconstruction for PET Scanners With Polygonal Prism Geometry Using STIR, proc. IEEE MIC 2021
    This code was initially developed by Parisa Khateri and Michael Roethlisberger (ETH), and further improved and tested by Viet Dao (Leeds), Daniel Deidda (NPL) and Kris Thielemans (UCL and ASC) with funding by the University of Leeds and Positrigo AG.
  • View Offset Support enabled for the PET scanners, contributed by Palak Wadhwa (Leeds Univ), allowing fixing rotation of reconstructed images, see PR 181.
  • Maximum Likelihood estimation of normalisation factors now includes estimation of geometric factors in 3D, see PR 619. This code was mostly contributed by Tahereh Niknejad (work completed at University of Lisbao, Portugal and PETsys Electronics, together with Kris Thielemans, UCL), as well as capabilities to work with virtual crystals, see PR 833 and PR 949. See the following proceedings for the initial work
    Tahereh Niknejad, Stefaan Tavernier, Joao Varela, and Kris Thielemans, Validation of 3D Model-Based Maximum-Likelihood Estimation of Normalisation Factors for Partial Ring Positron Emission Tomography In 2016 IEEE Nuclear Science Symposium, Medical Imaging Conference and Room-Temperature Semiconductor Detector Workshop (NSS/MIC/RTSD), 1–5. DOI: 10.1109/NSSMIC.2016.8069577.
  • A new ProjDataInfoSubsetByView class has been implemented which allows for subsets of projection data. Previously, subset projections could only be stored in fully sampled ProjData. This is still possible, the implementation is backward compatible, and subset reconstructions such as OSMAPSOL have not been changed. However, there is now an option to create subsets with ProjData::get_subset which only store a subset of views and so are more memory efficient when subsets might be handled separately. ProjDataInfoSubsetByView currently does not support file I/O.
  • ROOT files produced by GATE can now be interpreted using "virtual crystals", see PR #617.
  • A calibration factor can be applied in the normalisation with a new BinNormalisation derived class BinNormalisationWithCalibration; Interfile now reads/writes isotope name and calibration factor. See PR 672. This code was contributed by Daniel Deidda (NPL) and Kris Thielemans (UCL)
  • Radionuclide information is saved into a JSON configuration file for a number of popular radionuclide for PET and SPECT. This can make operations like decay correction easier and accurate. To be able to use the database we need to provide the isotope name used in the acquisition. For SPECT this is extracted from the Dicom header and saved in the interfile. For PET ways to read this information need to be implemented for each scanner/vendor. The new classes are new Radionuclide and RadionuclideDB; This code was contributed by Daniel Deidda (NPL) and Kris Thielemans (UCL)
  • KOSMAPOSL (HKEM) allows now to freeze the iterative part of the kernel at a specific subiteration. Code contributed by Daniel Deidda (NPL), Kris Thielemans (UCL) and Ashley Gillman (CSIRO)
  • It is now possibly to call the Georg's Schramm parallelproj projectors (using either OpenMP or CUDA), see PR 817, contributed by Kris Thielemans (UCL) with Georg Schramm (KUL).
  • OpenMP loop scheduling changed to use dynamic instead of runtime, resulting in faster performance.

Of course, there is also the usual code-cleanup and improvements to the documentation.

This release contains mainly code written by Kris Thielemans (UCL), Richard Brown (UCL), Parisa Khateri and Michael Roethlisberger (ETHZ), Robert Twyman (UCL), Daniel Deidda (NPL), Tahereh Nikjenad (PETsys), Palak Wadhwa (Univ of Leeds), Viet Ahn Dao (Univ of Leeds), Ashley Gillman (CSIRO), Georg Schramm (KUL), Markus Jehl (Positrigo), Gefei Chen (Univ of Macao)

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

Changes breaking backwards compatibility from a user-perspective

  • View Offset Support enabled for the PET scanners.

    • For the scanners that have non-zero intrinsic azimuthal tilt angle, reconstructed images will now get rotated.
    • If you use view mashing, in previous STIR versions images were rotated according to half the number of mashed views. This is now corrected.

    WARNING This means that reconstructed PET images will not be identical when either the scanner has non-zero view-offset, or view-mashing is on.
    To reflect this change, Scanner::get_default_intrinsic_tilt() has been renamed to get_intrinsic_azimuthal_tilt().
    Note: start angle was already supported for SPECT
    Backward compatibility for reconstructed images can be achieved by setting the STIR_LEGACY_IGNORE_VIEW_OFFSET CMake option to ON. (However, copied sinogram data will then always have the offset set to 0, in contrast to earlier versions of STIR).

  • PoissonLogLikelihood Hessian methods have been corrected to reflect the concavity of the function. Hessian vector products now return non-positive voxels, if the vector (input) is non-negative. STIR usages of these methods (OSSPS and SqrtHessianRowSum) have been updated to see no effective change in functionality. However, calling the Hessian vector product methods, via python etc., will result in a change in functionality as the sign of the output voxel values has changed.

  • Python/MATLAB wrappers no longer have ProjDataInfo::ProjDataInfoCTI, use ProjDataInfo::construct_proj_data_info instead. However, this now returns an object of the appropriate (derived) type as opposed to just ProjDataInfo. This should be transparent, except apparently for testing equality of objects.

Bug fixes

  • There was an inconsistency between log-likelihood function and its gradient when use_subset_sensitivities was false and num_subsets greater than 1. Fixing this isssue means that images reconstructed with OSSPS are different from previous versions of STIR when the above conditions are met. See Issue #873 and associated PR #893.
  • Parametric image reconstruction with POSMAPOSL could lead to zeroes being introduced gradually during reconstruction. See Issue #906 and associated PR #978.

New functionality

  • Capability to model block and generic PET detectors was added. This is currently limited to span=1, no view mashing and the ray-tracing matrix (single LOR). It is enabled by specifying appropriate keywords in the Interfile header of the projection data.

          Scanner parameters:=
          normal parameters...
          Scanner geometry (BlocksOnCylindrical/Cylindrical/Generic)  := BlocksOnCylindrical
          Distance between crystals in axial direction (cm)           := 0.22
          Distance between crystals in transaxial direction (cm)      := 0.22
          Distance between blocks in axial direction (cm)             := 0.22
          Distance between blocks in transaxial direction (cm)        := 3.3
          end scanner parameters:=
    

    Scatter and normalisation code are still pending changes.

  • Georg's Schramm parallelproj is an implementation of the Joseph algorithm for projection. If it has been installed in your system, and you tell CMake where to find it (`parallelproj_DIR=/wherever/lib/cmake`), the STIR user is now able to select an additional projector, called Parallelproj. This will use the CUDA version if available, otherwise will fall-back to the OpenMP version. Check the new sample files in examples/samples and the section in the User's Guide.

  • The (still preliminary) code for Maximum Likelihood estimation of normalisation factors now includes estimation of geometric factors in 3D as well

  • The (also preliminary) ProjDataInfoSubsetByView is backwards compatible and allows a new, memory efficient method for subset projections. Subset projections are created with with ProjData::get_subset, which is the only addition to the ProjData class (additions are mostly in the aforementioned new Info class). ProjDataInfoSubsetByView can be used to set up projectors, which will project only the subset. ProjDataInfoSubsetByView currently does not support file I/O. Therefore, the interface is not yet accessible through parameter files, only thro...

Read more