Skip to content

Releases: UCL/STIR

v6.3.0

01 Nov 08:00
7e10575

Choose a tag to compare

Summary of changes in STIR release 6.3

Overall summary

This version is 100% backwards compatible with STIR 6.2, aside from three important bug fixes, which will change results (see below).

This is a release with many new features, as listed below. Highlights are

  • the new Gibbs penalty hierarchy with CUDA and OpenMP support (and much easier addition of new potential functions) (Matteo Neel Colombo, Univ of Milano-Bicocca),
  • new 2D analytic reconstruction algorithms (including two that allow quantitative reconstruction of SPECT) (Dimitra Kyriakopoulou, UCL),
  • better Python support including algebraic operations and faster conversion to NumPy arrays (Kris Thielemans, UCL),
  • continuous memory storage for arrays (allowing zero-copy access to image/projection data in SIRF Python, but not yet in STIR Python)
    (Kris Thielemans, UCL),
  • faster scatter estimation for blocks on cylindrical scanners (Markus Jehl, Positrigo),
  • reduced memory usage for iterative reconstructions, avoiding hitting the current limitation of 2^31 elements in ProjDataInMemory (Kris Thielemans, UCL),
  • Python code for adapting e7tools output for Siemens Vision 600 to STIR (Nicole Jurjew, UCL)

But there are many other changes from other contibutors as well, see below. Of course, there is also the usual code-cleanup and some
improvements to the documentation. Overall overview and release management was by Kris Thielemans (UCL) with help from Daniel Deidda (NPL).

Patch release info

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

New functionality

General

  • Several 2D analytic reconstruction algorithms were added for PET (i.e. inverting the 2D Radon transform) and parallel beam SPECT (inverting the 2D attenuated Radon transform). The latter allow quantitatively correct analytic reconstruction of SPECT data (after scatter correction).

    • The Spline Reconstruction Technique (SRT) algorithm has been added in 2 different versions: SRT2D for PET and SRT2DSPECT for SPECT.
      The reference for the implemented algorithms is:
      Fokas, A. S., A. Iserles, and V. Marinakis. Reconstruction algorithm for single photon emission computed tomography and its numerical implementation. Journal of the Royal Society Interface 3.6 (2006): 45-54.
    • GRD2D for PET is a direct Fourier method using regridding with Kaiser-Bessel functions.
    • DDSR2D for parallel beam SPECT uses Hilbert transforms in projection space.

    The reference for the implementation of these algorithms is:
    Dimitra Kyriakopoulou, Analytical and Numerical Aspects of Tomography,
    PhD thesis, University College London (UCL), 2024,
    Available at:
    discovery.ucl.ac.uk/id/eprint/10202525/.
    PR #1420 and PR #1595.

  • Wiener and Gamma filters were added.
    PR #1420.

  • ScatterSimulation can now downsample the scanner transaxially (crystals per ring) for BlocksOnCylindrical, scanners, which speeds
    up ScatterEstimation considerably. By default, downsampling the detectors per reading is disabled for backwards compatibility.
    PR #1291

  • The priors code has been refactored to provide two common, parallelized base classes for CPU and GPU implementations
    (GibbsPenalty and CudaGibbsPenalty).
    On CPU, we introduce GibbsQuadraticPenalty and GibbsRelativeDifferencePenalty, which inherit from the parallelized
    GibbsPenalty base class (now parallelized using OpenMP).
    GPU implementations are also provided as CudaGibbsQuadraticPenalty and CudaGibbsRelativeDifferencePenalty.
    Currently, the new Gibbs penalties are still missing the paraboloidal surrogates related method implementations. They provide two new
    methods: compute_gradient_times_input and compute_Hessian_diagonal.
    PR #1629

  • Data from GE Discovery MI systems in RDF9 should now be readable. TOF information on these scanners has also been added. However, projection data is currently still always returned as non-TOF (but list-mode data is read as TOF).
    PR #1503

  • Added the ability to set a forward projector for mask projection in the ScatterEstimation class.
    PR #1530

  • Duration in sinogram interfile/exam_info obtained from LmToProjData/lm_to_projdata has the correct value if we unlist all
    the events. This is not true for ROOT files PR #1519

  • LmToProjData class/lm_to_projdata utility now no longer requires a template projection data. If none is specified, it will use the
    proj_data_info from the input list-mode.
    Warning for some scanners with TOF capabilities, this will result in very large projection data (possibly larger than the default from
    the vendor).
    PR #1315

  • Adapt the SPECTUB projector to handle data with only a subset of the views (constructed using ProjData::get_subsets(). This is useful for SIRF/CIL applications using stochastic optimisation.
    PR #1596

Python

  • "Container" classes such as FloatVoxelsOnCartesianGrid, ProjDataInMemory and array-classes now have numerical operations
    properly defined, for instance a = b + c and a -= 3. Note that a = 1 + b is not yet available.
    PR #1630
  • The above "container" classes now have an extra member `as_array()` which returns a numpy ndarray. This is equivalent to
    `stirextra.to_numpy()` which will become deprecated later. In addition, the fill() method now directly accepts an ndarray,
    avoiding the need to go via an iterator. These additions also make it easier to prt SIRF python code to STIR.
    PR #1632
  • Added a Python script to convert e7tools generated Siemens Biograph Vision 600 sinograms to STIR compatible format.
    PR #1593

Utilities

  • stir_timings has now an extra option to parse a par-file for a projector-pair.

Changed functionality

  • In previous versions, when reading data/images where the radionuclide was not set, a default was used (F18 for PET, Tcm99 for SPECT). This led to surprising (and sometimes wrong) behaviour. The radionuclide is now kept as "unknown".
    PR #1574
  • Default ECAT scanner configurations updated to use a negative intrinsic tilt.
  • When computing the sensitivity images in PoissonLogLikelihoodWithLinearModelForMeanAndProjData, we now avoid creating an extra ProjDataInMemory in most cases (there are still some corner cases for TOF data when using non-TOF projector for the sensitivity, but then the memory overhead is small). This enables LAFOV PET reconstructions with the "ray tracing" matrix (we use less memory, and we avoid running into a current ProjDataInMemory
    limitation on the number of bins).
    PR #1716
  • Boost format was replaced by `std::format` for formatting strings. If C++20 or newer is not yet used, a work-around is in place by using the {fmt} library (included as as a git submodule). Import stir/format.h and then use the format() function to create strings containing various variables. If the format string is not known at compile time, use runtime_format() instead.
    Check the updated STIR-developers-overview.
    PR #1591 and PR
    #1605

Changes to examples

  • Python example plot_sinogram_profiles.py has been renamed to plot_projdata_profiles.py and generalised to work with TOF
    dimensions etc. A small pytest has been added as well.
    PR #1370
  • Python example ProjDataVisualisation.py now has a vmax slider.
    PR #1568

Bug fixes

  • Fixed a bug in the scatter estimation code (introduced in release 5.1.0) if input data is 3D and "cylindrical" (there was no bug for
    "blocksoncylindrical" data). The scatter estimation runs on data constructed via SSRB. However, the attenuation correction factors were
    incorrectly obtained with adding of oblique segments (as opposed to averaging). This resulted in intermediate images that had the wrong
    attenuation correction which were approximately num_segments times
    larger. This was compensated by the tail-fitting, but resulted in unexpected scale factors (scale factors were around 1/num_segments
    times what was expected). This means that if you used the "min/max scale factor" feature in the scatter estimate, you will have to adjust your threshold values. Expected scatter tail-fitting scale factors should now be restored to ~1-1.5 (depending on the amount of multiple and out-of-FOV scatter). See Issue #1532 for more detail.
    Fixed by using averaging functionality of SSRB instead of adding segments for attenuation correction factors.
    PR #1531
  • Fixed a bug in the distributed LM computation code (introduced in 6.1) that neglected to accumulate outputs when not built with OpenMP.
    See PR #1566.
  • Fixed bugs in accumulate_sub_Hessian_times_input and accumulate_sub_Hessian_times_input (and hence the non-subset ve...
Read more

v6.2.0

23 Jul 08:30
e50e6b1

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 nvcc 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

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

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

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

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

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

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

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

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.