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).
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).
CMAKE_INSTALL_PREFIX
, where V.v indicates the major.minor version number, e.g. 6.0:
STIR_DIR
documented below.
ProjDataInfo::ask_parameters()
and therefore create_projdata_template
has changed:
false
.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.
FloatLOR
to LOR
, and same for derived classes.
The TOF addition 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:
See also the (enormous) PR #304.
Limitations
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.
number of radionuclides := 1 radionuclide name[1] := ... radionuclide halflife (sec)[1] := ... radionuclide branching factor[1] := ...Previous versions of STIR used isotope name. This is still recognised if radionuclide name[1] is not present. Note that neither versions are confirming to the (very old) Interfile 4.0 proposal.
ProjMatrixByBinPinholeSPECTUB
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.
LORAs2Points
,LORInCylinderCoordinates
,
LORInAxialAndSinogramCoordinates
and PointOnCylinder
.
FloatLOR
to LOR
, and same for
derived classes.
DetectionPositionPair.__repr__
for printing and
change order of text in DetectionPosition.__repr__
to
fit with constructor to avoid confusion.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.
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.
See our issue tracker.
STIR_USE_BOOST_SHARED_PTR
will be removed. It probably no longer
works anyway. Therefore stir::shared_ptr
will always be std::shared_ptr
.
ListModeData
now has a shared_ptr<const ProjDataInfo> proj_data_info_sptr
protected
member, and the scanner_sptr
member has been removed.proj_data_info_sptr
, it should be removed.
virtual ListModeData::get_scanner_ptr()
is replaced by ListModeData::get_scanner()
.
ProjDataInfo*NoArcCorr::get_bin_for_det_pair
is now private.
Use get_bin_for_det_pos_pair
instead.
GeneralisedObjectiveFunction
hierarchy now has a already_set_up
member variable that needs to be set to false
by set_*
functions and checked by callers.
BinNormalisation::undo
and apply
members that
take explicit time arguments
extend_sinogram_in_views
, extend_segment_in_views
and interpolate_axial_position
find_package(STIR)
.find_package
finds STIR as it follows conventions better.
For instance, STIR can now by found by find_package
when setting CMAKE_PREFIX_PATH
to what was used for CMAKE_INSTALL_PREFIX
when
installing STIR (indicated as STIR_CMAKE_INSTALL_PREFIX above). Moreover, if you use the same
CMAKE_INSTALL_PREFIX
for your project as for STIR, you shouldn't need to set STIR_DIR
nor CMAKE_PREFIX_PATH
.
Scanner
now allows storing TOF information. This is currently not yet done for all
TOF-capable scanners though. Contributions welcome!
auto sino = proj_data.get_sinogram(ax_pos_num, segment_num, false, timing_pos_num);These are deprecated since version 5.2 and should be replaced by
const SinogramIndices sinogram_idxs{ax_pos_num, segment_num, timing_pos_num}; auto sino = proj_data.get_sinogram(sinogram_idxs);
clone()
member, currently returning a bare pointer (like other STIR classes).
Bin
can now be output to stream as text.
RunTests::check_if_equal
for Bin
.
KeyParser
has a new facility to add an alias to a keyword. This can be used to rename a keyword
for instance while remaining backwards compatible. By default, a warning will be written, but this can be disabled.
ProjDataInfoCylindricalNoArcCorr::get_all_det_pos_pairs_for_bin
is in most places intended to return
the physical locations. However, a `DetectionPositionPair` also contains (unmashed) TOF bin information.
This will be further complicated once energy windows are supported. The
method therefore has an extra boolean argument ignore_non_spatial_dimensions
, which defaults to
true
.
multiply_crystal_factors
is essentially a non-TOF calculation. When given TOF projection data,
it will "spread" the non-TOF result equally over all TOF bins. This is also appropriate for
randoms_from_singles
.
STIR_NO_NAMESPACES
, STIR_NO_MUTABLE
, BOOST_NO_TEMPLATE_SPECIALIZATION
,
BOOST_NO_STRINGSTREAM
and various items specifically for VC 6.0.
override
in derived classes, via clang-tidy --modernize-use-override.