STIR  6.2.0
Todo List
Module A collection of error functions.
replace with boost::erf
Module A collection of error functions.
replace with boost::erf
Module A collection of error functions.
replace with boost::erf
File abs_image.cxx
Potentially, in the future it should be included in stir_math as an option.
File apply_normfactors.cxx
should be replaced by using stir::BinNormalisationFromML2D
File apply_patlak_to_images.cxx

Reimplement the method for image-based input function.

Add to the Doxygen documentation a reference to their paper and how exactly this utility works.

File attenuation_coefficients_to_projections.cxx
get threshold from command line
File BackProjectorByBinNiftyPET.h

NiftyPET limitations - currently limited to the Siemens mMR scanner and requires to CUDA.

STIR wrapper limitations - currently only projects all of the data (no subsets). NiftyPET currently supports spans 0, 1 and 11, but the STIR wrapper has only been tested for span-11.

File BasicCoordinate.h
The arithmetic operations might at some point be moved to a derived class stir::CartesianCoordinate.
File BinNormalisationFromECAT8.cxx
merge ECAT7 and 8 code
File BinNormalisationFromGEHDF5.cxx
remove duplication
File Bland_Altman_plot.cxx
Add to the Doxygen documentation a reference to their paper and how exactly this utility works.
Module caching-related methods
It should be possible to read only part of the cache in memory.
File convecat6_if.cxx
This could easily be used to convert to other file formats. For images, this simply involves changing the OutputFileFormat. For projection data, we would have to extend OutputFileFormat to handle projection data.
Module copy_fill

current mechanism requires overloading for specific classes. This could be resolved using SFINAE.

Module data_buildblock
move projection data etc in here
File distributableMPICacheEnabled.cxx
merge with distributable.cxx
File distributed_test_functions.h
Currently no independent test functions are implemented. The tests are used by embedding them into the reconstruction functions and calling them once.
File ForwardProjectorByBinNiftyPET.h

NiftyPET limitations - currently limited to the Siemens mMR scanner and requires to CUDA.

STIR wrapper limitations - currently only projects all of the data (no subsets). NiftyPET currently supports spans 0, 1 and 11, but the STIR wrapper has only been tested for span-11.

File GenerateImage.h
Code duplicates things from stir::InterfileHeader. This is bad as it might miss new features being added there.
File index_at_maximum.h
move implementations to .cxx
File line_distances.h
move implementations to .cxx
File line_profiles_through_projdata.cxx
put the output profile name as a first argument after the command, to follow STIR conventions.
File list_TAC_ROI_values.cxx

Add the –V option to include the volume information for the sample region.

Merge it with the list_ROI_values.cxx utility.

File LmToProjDataNiftyPET.h

NiftyPET limitations - currently limited to the Siemens mMR scanner and requires to CUDA.

STIR wrapper limitations - currently only projects all of the data (no subsets). NiftyPET currently supports spans 0, 1 and 11, but the STIR wrapper has only been tested for span-11.

File mult_image_parameters.cxx

Make a generic utility which will multiply all the parameters together and store them in a multiple image file.

It might be possible to integrate it into the stir_math.cxx, in the future.

File mult_model_with_dyn_images.cxx
Add to the Doxygen documentation how exactly this utility works.
File NiftyPETHelper.h

NiftyPET limitations - currently limited to the Siemens mMR scanner and requires to CUDA.

STIR wrapper limitations - currently only projects all of the data (no subsets). NiftyPET currently supports spans 0, 1 and 11, but the STIR wrapper has only been tested for span-11.

Class stir::AnalyticReconstruction
Currently the template argument uses DiscretisedDensity because of conversion problems with stir::shared_ptr. Maybe it will be possible to correct this once we use boost:shared_ptr.
Member stir::angle (const BasicCoordinate< num_dimensions, coordT > &p1, const BasicCoordinate< num_dimensions, coordT > &p2)
move to a new CartesianCoordinate class
Member stir::apply_array_functions_on_each_index (Array< num_dim, elemT > &out_array, const Array< num_dim, elemT > &in_array, FunctionObjectPtrIter start, FunctionObjectPtrIter stop)
Add a specialisation such that this function would handle iterators of function objects and (smart) pointers to function objects. At the moment, it's only the latter.
Member stir::apply_array_functions_on_each_index (Array< num_dim, elemT > &out_array, const Array< num_dim, elemT > &in_array, ActualFunctionObjectPtrIter start, ActualFunctionObjectPtrIter stop)
Modify such that this function would handle function objects and (smart) pointers to ArrayFunctionObject objects. At the moment, it's only the latter.
Member stir::ArcCorrection::get_arc_corrected_proj_data_info_sptr () const
return a shared_ptr<ProjDataInfoCylindricalArcCorr> after switching to boost::shared_ptr.
Member stir::ArcCorrection::get_not_arc_corrected_proj_data_info_sptr () const
return a shared_ptr<ProjDataInfoCylindricalNoArcCorr> after switching to boost::shared_ptr.
Class stir::ArrayFilter1DUsingConvolution< elemT >
implement other boundary conditions
Member stir::Bin::operator/= (const float dx)
It is zero division proof in a similar way to divide<,,>(), though I am not sure if it should be.
Class stir::BinNormalisationFromAttenuationImage
Add mechanism for caching the attenuation correction factors, such that they will be calculated only once. However, caching should by default be disabled, as most applications need them only once anyway.
Class stir::BinNormalisationPETFromComponents

This class should probably be derived from BinNormalisationWithCalibration.

The class currently does not handle "compressed" projection data (i.e. span etc).

Currently, set_up() creates a ProjDataInMemory object with the PET detection efficiencies. This uses a lot of memory unfortunately.

Class stir::BSpline::BSplines1DRegularGrid< out_elemT, in_elemT, constantsT >
remove overlap with the n-dimensional version BSplinesRegularGrid
Member stir::BSpline::BSplinesRegularGrid< num_dimensions, out_elemT, in_elemT, constantsT >::gradient (const BasicCoordinate< num_dimensions, pos_type > &relative_positions) const
should probably be templated in pos_type.
Member stir::BSpline::BSplinesRegularGrid< num_dimensions, out_elemT, in_elemT, constantsT >::operator() (const BasicCoordinate< num_dimensions, pos_type > &relative_positions) const
should probably be templated in pos_type.
Member stir::BSpline::BSplinesRegularGrid< num_dimensions, out_elemT, in_elemT, constantsT >::set_coef (const Array< num_dimensions, in_elemT > &input)
rename
Class stir::CListEvent
this is still under development. Things to add are for instance energy windows and time-of-flight info. Also, get_bin() would need time info or so for rotating scanners.
Class stir::CListEventPENN
Fix the rotation
Member stir::CListModeDataSAFIR< CListRecordT >::has_delayeds () const override
Implement this properly to check for delayed events in LM files.
Member stir::CListModeDataSAFIR< CListRecordT >::save_get_position () override
Maybe provide real implementation?
Class stir::CombinedShape3D< operation >

document more

Parsing cannot work yet because of template (can be solved by explicit instantiation)

Class stir::CorrectProjDataApplication
Preliminary class interface. At some point, this class should move to the library, instead of being in correct_projdata.cxx.
Member stir::cos_angle (const BasicCoordinate< num_dimensions, coordT > &p1, const BasicCoordinate< num_dimensions, coordT > &p2)
move to a new CartesianCoordinate class
Class stir::CudaRelativeDifferencePrior< elemT >
Limitation: currently only weights of size 3x3x3 are supported. Therefore, single slice images will lead to an error being thrown.
Class stir::DataSymmetriesForBins
I have used Bin here to have the 4 coordinates, but Bin has data as well which is not really necessary here.
Member stir::Densel
This might at some point evolve into a class, similar to Bin.
Class stir::DetectionPosition< coordT >
document directions
Member stir::determinant (const Array< 2, elemT > &m)
Only works for low dimensions for now.
Member stir::DiscretisedDensityOnCartesianGrid< num_dimensions, elemT >::actual_get_index_coordinates_for_relative_coordinates (const CartesianCoordinate3D< float > &coords) const override
cope with non-standard orientations
Member stir::DiscretisedDensityOnCartesianGrid< num_dimensions, elemT >::actual_get_relative_coordinates_for_indices (const BasicCoordinate< num_dimensions, float > &indices) const override
cope with non-standard orientations
Member stir::DiscretisedShape3D::operator== (const Shape3D &) const override
currently not implemented (will call error()
Member stir::DiscretisedShape3D::scale (const CartesianCoordinate3D< float > &scale3D) override
Not implemented (will call error())
Member stir::distributable_computation (const shared_ptr< ForwardProjectorByBin > &forward_projector_sptr, const shared_ptr< BackProjectorByBin > &back_projector_sptr, const shared_ptr< DataSymmetriesForViewSegmentNumbers > &symmetries_sptr, DiscretisedDensity< 3, float > *output_image_ptr, const DiscretisedDensity< 3, float > *input_image_ptr, const shared_ptr< ProjData > &proj_data_ptr, const bool read_from_proj_data, int subset_num, int num_subsets, int min_segment_num, int max_segment_num, bool zero_seg0_end_planes, double *double_out_ptr, const shared_ptr< ProjData > &additive_binwise_correction, const shared_ptr< BinNormalisation > normalise_sptr, const double start_time_of_frame, const double end_time_of_frame, RPC_process_related_viewgrams_type *RPC_process_related_viewgrams, DistributedCachingInformation *caching_info_ptr, int min_timing_pos_num, int max_timing_pos_num)
The subset-scheme should be moved somewhere else (a Subset class?).
Member stir::distributable_computation_cache_enabled (const shared_ptr< ForwardProjectorByBin > &forward_projector_ptr, const shared_ptr< BackProjectorByBin > &back_projector_ptr, const shared_ptr< DataSymmetriesForViewSegmentNumbers > &symmetries_ptr, DiscretisedDensity< 3, float > *output_image_ptr, const DiscretisedDensity< 3, float > *input_image_ptr, const shared_ptr< ProjData > &proj_data_sptr, const bool read_from_proj_data, int subset_num, int num_subsets, int min_segment_num, int max_segment_num, bool zero_seg0_end_planes, double *double_out_ptr, const shared_ptr< ProjData > &additive_binwise_correction, const shared_ptr< BinNormalisation > normalise_sptr, const double start_time_of_frame, const double end_time_of_frame, RPC_process_related_viewgrams_type *RPC_process_related_viewgrams, DistributedCachingInformation *caching_info_ptr, int min_timing_pos_num, int max_timing_pos_num)
Merge this functionality into distributable_computation()
Class stir::DistributedWorker< TargetT >

The log_likelihood_ptr argument to the RPC function is currently always NULL.

Currently the only computation that is supported corresponds to the gradient computation. It would be trivial to add others.

Class stir::DynamicDiscretisedDensity
template in elemT and numDimensions?
Class stir::DynamicProjData

Move read_from_file, write_to_ecat7 to usual registry methods

Interfile support currently doesn't set start_time_in_secs_since_1970

Class stir::ecat::BinNormalisationFromECAT8
dead-time is not yet implemented
Class stir::ecat::CListEventECAT8_32bit

This implementation only works if the list-mode data is stored without axial compression.

If the target sinogram has the same characteristics as the sinogram encoding used in the list file (via the offset), the code could be sped-up dramatically by using the information. At present, we go a huge round-about (offset->sinogram->detectors->sinogram->offset)

Member stir::ecat::CListModeDataECAT8_32bit::has_delayeds () const override
this might depend on the acquisition parameters
Class stir::ecat::ecat7::CListEventDataECAT962
use DetectionPosition etc.
Class stir::ecat::ecat7::CListModeDataECAT< CListRecordT >
This class currently relies in the fact that vector<>::size_type == SavedPosition
Member stir::ecat::ecat7::CListModeDataECAT< CListRecordT >::CListModeDataECAT (const std::string &listmode_filename_prefix)
Maybe allow for passing e.g. something_2.lm in case the first lm file is missing.
Member stir::ecat::ecat7::CListModeDataECAT< CListRecordT >::get_next_record (CListRecord &record) const
Currently switches over to the next .lm file whenever get_next_record() on the current file fails. This even happens when it failed not because of EOF, or if the listmode file is shorter than 2 GB.
Member stir::ecat::ecat7::CListModeDataECAT< CListRecordT >::has_delayeds () const
this might depend on the acquisition parameters
Member stir::error (const char *const s,...)
As opposed to using printf-style calling sequence, use a syntax like stir::info
Member stir::error (const STRING &string)
At a later stage, it will also write to a log-file.
Class stir::ExamInfo

this is very incomplete at the moment. Things like bed positions, gating, isotopes etc etc are all missing

This should be an abtract registered object, in order to serve as a complete base function for every input data type.

Member stir::extract_line (const Array< 3, elemT > &, const BasicCoordinate< 3, int > &index, const int dimension)
make n-dimensional version
Class stir::FactoryRegistry< Key, Factory, Compare >
Probably it would be better to store pointers to factories. However, in that case, the destructor of FactoryRegistry would have to deallocate these factory objects. This would mean that factories have to be allocated with new, and hence would prevent using simple function pointers.
Class stir::Filter1D< T >
apply() members can't be const as they call TimedObject::start_timers()
Member stir::find_centre_of_gravity (const Array< num_dimensions, T > &)
better error handling
Class stir::FrameSinglesRates
This class does not store rates, but totals! Naming is all wrong.
Class stir::FullArrayIterator< topleveliterT, restiterT, elemT, _Ref, _Ptr >
use std::enable_if and std::is_convertible as opposed to boost::enable_if_convertible
Class stir::GE::RDF_HDF5::BinNormalisationFromGEHDF5
dead-time is not yet implemented
Member stir::GE::RDF_HDF5::CListModeDataGEHDF5::has_delayeds () const override
this depends on the acquisition parameters
Class stir::GE::RDF_HDF5::InputStreamWithRecordsFromHDF5< RecordT >
Allow choosing between allocation with new or on the stack.
Class stir::GE::RDF_HDF5::SinglesRatesFromGEHDF5
expose GE::RDF_HDF5::GEHDF5Wrapper.get_exam_info_sptr()
Class stir::GeneralisedObjectiveFunction< TargetT >
Currently, there is subset code in both IterativeReconstruction and here. This is confusing and leads to repetition. It probably should all be moved here.
Member stir::GeneralisedObjectiveFunction< TargetT >::fill_nonidentifiable_target_parameters (TargetT &target, const float value) const
The type of the value should really be derived from e.g. TargetT::full_iterator.
Member stir::GeneralisedObjectiveFunction< TargetT >::get_prior_ptr () const
It would be nicer to not return a pointer.
Member stir::GeneralisedPriorTests::GeneralisedPriorTests (char const *density_filename=nullptr)
it would be better to parse an objective function. That would allow us to set all parameters from the command line.
Member stir::get_min_indices (const Array< num_dimensions, T > &a)
If the array
Member stir::HUToMuImageProcessor< TargetT >::virtual_set_up (const TargetT &image) override
could get manufacturer name, kVp from the image later on, when these become available
Member stir::in_place_apply_array_function_on_1st_index (Array< num_dim, elemT > &array, FunctionObjectPtr f)

Add a 1D specialisation as the current implementation would be really inefficient in this case.

Add a specialisation such that this function would handle function objects and (smart) pointers to function objects. At the moment, it's only the latter.

Member stir::in_place_apply_array_functions_on_each_index (Array< num_dim, elemT > &array, FunctionObjectPtrIter start, FunctionObjectPtrIter stop)
Add a specialisation such that this function would handle function objects and (smart) pointers to function objects. At the moment, it's only the latter.
Member stir::index_at_maximum (const VectorWithOffset< elemT > &v)
make iterator version, or something that works on std::vector
Member stir::indices_at_maximum (const Array< 3, elemT > &input_array)

generalise to arbitrary dimensions

implementation currently cycles through the data twice

Member stir::info (const STRING &string, const int verbosity_level=1)
At a later stage, it will also write to a log-file.
Member stir::inner_product (const BasicCoordinate< num_dimensions, coordT > &p1, const BasicCoordinate< num_dimensions, coordT > &p2)
move to a new CartesianCoordinate class
Class stir::InputFileFormat< DataT >

should be able to open for input-output maybe

there is overlap between function having filenames or istreams. This is a bit of a mess. Also, some file formats we might only have an API for using C-style FILE.

Class stir::InputStreamWithRecords< RecordT, OptionsT >
Allow choosing between allocation with new or on the stack.
Class stir::InputStreamWithRecordsFromUPENNtxt
write functions
Member stir::interpolate_projdata (ProjData &proj_data_out, const ProjData &proj_data_in, const BSpline::BSplineType spline_type, const bool remove_interleaving=false)
This currently only works for direct sinograms (i.e. segment 0).
Class stir::IOTests< A >
Delete STIRtmp.* files, but that's a bit difficult as we don't know which ones are written.
Class stir::IOTests_DiscretisedDensity
Delete STIRtmp.* files, but that's a bit difficult as we don't know which ones are written.
Class stir::IOTests_DynamicDiscretisedDensity
Delete STIRtmp.* files, but that's a bit difficult as we don't know which ones are written.
Class stir::IOTests_ParametricDiscretisedDensity
Delete STIRtmp.* files, but that's a bit difficult as we don't know which ones are written.
Class stir::IterativeReconstruction< TargetT >

move subset things somewhere else

all the compute functions should be const.

Member stir::IterativeReconstruction< TargetT >::get_initial_data_ptr () const

Dependency on explicit strings "1" or "0" in IterativeReconstruction::initial_data_filename is not nice.

should not return a 'bare' pointer.

Class stir::KeyArgument
Should be made a protected enum of KeyParser
Class stir::KeyParser

add checking functions in the map, as in

add facilities for checking (while parsing) if a keyword was present before the current one

Member stir::KeyParser::ask_parameters ()
any consistency checks are currently done by post_processing() at the end of the parsing. It should be possible to have checks after every question such that it can be repeated.
Member stir::KeyParser::post_processing ()

return Succeeded instead.

rename to post_parsing()

Class stir::ListEvent
this is still under development. Things to add are for instance energy windows and time-of-flight info. Also, get_bin() would need time info or so for rotating scanners.
Member stir::ListEvent::get_bin (Bin &bin, const ProjDataInfo &) const
get_bin() might need time info or so for rotating scanners.
Member stir::ListEvent::get_LOR () const =0
This function might need time info or so for rotating scanners.
Class stir::ListModeData_dummy

Currently, it can only be used in combination with SIRF.

A possibility is to complete this as a class for cache files.

Class stir::ListTime
this is still under development. Things to add are angles or so for rotating scanners. Also, some info on the maximum (and actual?) number of gates would be useful.
Class stir::LmToProjData

Currently, there is no support for gating or energy windows. This could in principle be added by a derived class, but it would be better to do it here.

Timing info or so for get_bin_from_event() for rotating scanners etc.

There is overlap between the normalisation and the current treatment of bin.get_bin_value(). This is really because we should be using something like a EventNormalisation class for pre-normalisation.

Member stir::LmToProjData::get_bin_from_event (Bin &bin, const ListEvent &) const
Would need timing info or so for e.g. time dependent normalisation or angle info for a rotating scanner.
Member stir::LmToProjData::get_compression_count (const Bin &bin) const
it is not compatiable with e.g. HiDAC doesn't belong here anyway (more ProjDataInfo?)
Member stir::LogcoshPrior< elemT >::weights
This member is mutable at present because some const functions initialise it. That initialisation should be moved to a new set_up() function.
Class stir::map_element
make private class in KeyParser
Member stir::max_eigenvector_using_power_method (elemT &max_eigenvalue, Array< 1, elemT > &max_eigenvector, const Array< 2, elemT > &m, const Array< 1, elemT > &start, const double tolerance=.03, const unsigned long max_num_iterations=10000UL)
the algorithm would work with hermitian matrices, but the code needs one small adjustment.
Class stir::MaximalArrayFilter3D< elemT >

Currently, the mask is determined in terms of the mask radius (in pixels), where size = 2*radius+1. This could easily be relaxed.

generalise to n-dimensions

Class stir::MedianArrayFilter3D< elemT >

Currently, the mask is determined in terms of the mask radius (in pixels), where size = 2*radius+1. This could easily be relaxed.

generalise to n-dimensions

Class stir::MinimalArrayFilter3D< elemT >

Currently, the mask is determined in terms of the mask radius (in pixels), where size = 2*radius+1. This could easily be relaxed.

generalise to n-dimensions

Member stir::ModelMatrix< num_param >::multiply_dynamic_image_with_model (ParametricVoxelsOnCartesianGrid &parametric_image, const DynamicDiscretisedDensity &dynamic_image) const
current implementation first fills first argument with 0 and then calls multiply_dynamic_image_with_model_and_add_to_input(). This is somewhat inefficient.
Member stir::ModelMatrix< num_param >::multiply_parametric_image_with_model (DynamicDiscretisedDensity &dynamic_image, const ParametricVoxelsOnCartesianGrid &parametric_image) const
current implementation first fills first argument with 0 and then calls multiply_dynamic_image_with_model_and_add_to_input(). This is somewhat inefficient.
Class stir::NestedIteratorTests
Code is ugly. Copy-paste with tiny modifications.
Member stir::norm (const BasicCoordinate< num_dimensions, coordT > &p1)
move to a new CartesianCoordinate class
Member stir::norm_squared (const BasicCoordinate< num_dimensions, coordT > &p1)
move to a new CartesianCoordinate class
Class stir::OSSPSReconstruction< TargetT >
split into a preconditioned subgradient descent class and something that computes the preconditioner.
Class stir::OutputFileFormat< DataT >

Support projection data

Provide functions that enable the user to inquire about capabilities. For instance, supports_multi_time_frames(), supports_different_xy_pixel_size() etc.

Class stir::OutputFileFormatTests
Delete STIRtmp.* files, but that's a bit difficult as we don't know which ones are written.
Member stir::ParametricQuadraticPrior< TargetT >::weights
This member is mutable at present because some const functions initialise it. That initialisation should be moved to a new set_up() function.
Class stir::ParseAndCreateFrom< DiscretisedDensity< 3, elemT >, ExamDataT >
Currently only supports VoxelsOnCartesianGrid parameters (we could introduce another keyword to differentiate between types).
Member stir::ParseAndCreateFrom< OutputT, InputT, ParserT >::create (const InputT &) const
Currently we're assuming this returns a bare pointer (to a new object). This is due to limitations in the reconstruction classes. It will need to change to a std::unique pointer.
Class stir::PatlakPlot
Should be derived from LinearModels, but when non-linear models will be introduced, as well.
Member stir::PatlakPlot::apply_linear_regression (ParametricVoxelsOnCartesianGrid &par_image, const DynamicDiscretisedDensity &dyn_image) const
There is currently no check if the time frame definitions from dyn_image are the same as the ones encoded in the model.
Member stir::PatlakPlot::get_dynamic_image_from_parametric_image (DynamicDiscretisedDensity &dyn_image, const ParametricVoxelsOnCartesianGrid &par_image) const
Should be a virtual function declared in the KineticModel class.
Member stir::PatlakPlot::multiply_dynamic_image_with_model_gradient (ParametricVoxelsOnCartesianGrid &parametric_image, const DynamicDiscretisedDensity &dyn_image) const
Should be a virtual function declared in the KineticModel class.
Member stir::PatlakPlot::multiply_dynamic_image_with_model_gradient_and_add_to_input (ParametricVoxelsOnCartesianGrid &parametric_image, const DynamicDiscretisedDensity &dyn_image) const
Should be a virtual function declared in the KineticModel class.
Member stir::PlasmaData::PlasmaData (const std::vector< PlasmaSample > &plasma_blood_plot)
Better to use iterators
Member stir::PlasmaData::read_plasma_data (const std::string input_string)
Implementation to set the input units.
Class stir::PlasmaSample
This currently assumes sampling, while in practice we often have data accumulated over time, but this can currently not be encoded.
Member stir::PLSPrior< elemT >::set_up (shared_ptr< const DiscretisedDensity< 3, elemT >> const &target_sptr) override
set the anatomical image to zero if not defined
Member stir::PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData< TargetT >::add_subset_sensitivity (TargetT &sensitivity, const int subset_num) const override
Current implementation does NOT add to the subset sensitivity, but overwrites
Member stir::PoissonLogLikelihoodWithLinearModelForMeanAndListModeData< TargetT >::cache_path
add the ability to set a filename.
Member stir::PoissonLogLikelihoodWithLinearModelForMeanAndListModeData< TargetT >::frame_defs
This is currently used to be able to compute the gradient for one time frame. However, it probably does not belong here. For instance when fitting kinetic model parameters from list mode data, time frames are in principle irrelevant. So, we will probably shift this to the derived class.
Member stir::PoissonLogLikelihoodWithLinearModelForMeanAndListModeData< TargetT >::recompute_cache
multiple cache files need to be supported!
Member stir::PoissonLogLikelihoodWithLinearModelForMeanAndListModeData< TargetT >::set_skip_lm_input_file (const bool arg)

replace with reading from a custom-listmode file (although this would have to support the additive term).

in the future the following statements should be removed.

in the future the following statements should be removed.

Class stir::PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin< TargetT >
implement a subset scheme based on events
Member stir::PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBinTests::PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBinTests (char const *const lm_data_filename, char const *const density_filename=0)
it would be better to parse an objective function. That would allow us to set all parameters from the command line.
Member stir::PoissonLogLikelihoodWithLinearModelForMeanAndProjData< TargetT >::actual_add_multiplication_with_approximate_sub_Hessian_without_penalty (TargetT &output, const TargetT &input, const int subset_num) const override
Two work-arounds for the noisy estimate of the Hessian are listed below, but they are currently not implemented.
Member stir::PoissonLogLikelihoodWithLinearModelForMeanAndProjDataTests::PoissonLogLikelihoodWithLinearModelForMeanAndProjDataTests (char const *const proj_data_filename=0, char const *const density_filename=0)
it would be better to parse an objective function. That would allow us to set all parameters from the command line.
Member stir::ProjDataInfo::set_tof_mash_factor (const int new_num)
N.E: This function is very ugly and unnessesary complicated. Could be much better.
Member stir::ProjDataInfoCylindrical::set_tof_mash_factor (const int new_num) override
N.E. Would be nice to have all the points of the scanner in cache.
Class stir::ProjDataInfoCylindricalNoArcCorr
The detector specific functions possibly do not belong in this class. One can easily imagine a case where the theta,phi,s,t coordinates are as described, but there is no real correspondence with detectors (for instance, a rotating system). Maybe they should be moved somewhere else?
Member stir::ProjDataInfoCylindricalNoArcCorr::get_all_det_pos_pairs_for_bin (std::vector< DetectionPositionPair<>> &, const Bin &, bool ignore_non_spatial_dimensions=true) const
It might be possible to return some weight factors in case there is no many-to-one correspondence between detection positions and bins (for instance for continuous detectors, or rotating scanners, or arc-corrected data).
Member stir::ProjDataInfoCylindricalNoArcCorr::get_bin_for_det_pos_pair (Bin &, const DetectionPositionPair<> &) const
use member template for the coordT type to support continuous detectors.
Member stir::ProjDataInfoCylindricalNoArcCorr::get_det_pos_pair_for_bin (DetectionPositionPair<> &, const Bin &) const
use member template for the coordT type to support continuous detectors.
Member stir::ProjDataInfoCylindricalNoArcCorr::ProjDataInfoCylindricalNoArcCorr (const shared_ptr< Scanner > scanner_ptr, const VectorWithOffset< int > &num_axial_pos_per_segment, const VectorWithOffset< int > &min_ring_diff_v, const VectorWithOffset< int > &max_ring_diff_v, const int num_views, const int num_tangential_poss, const int tof_mash_factor=0)
only suitable for full-ring PET scanners
Class stir::ProjDataInfoGeneric
change hierarchy order, i.e. derive from ProjDataInfoCylindrical from ProjDataInfoGeneric.
Member stir::ProjDataInfoGenericNoArcCorr::get_all_det_pos_pairs_for_bin (std::vector< DetectionPositionPair<>> &, const Bin &) const
It might be possible to return some weight factors in case there is no many-to-one correspondence between detection positions and bins (for instance for continuous detectors, or rotating scanners, or arc-corrected data).
Member stir::ProjDataInfoGenericNoArcCorr::get_bin_for_det_pos_pair (Bin &, const DetectionPositionPair<> &) const
use member template for the coordT type to support continuous detectors.
Member stir::ProjDataInfoGenericNoArcCorr::get_det_pos_pair_for_bin (DetectionPositionPair<> &, const Bin &) const
use member template for the coordT type to support continuous detectors.
Class stir::ProjDataRebinning
there should be a method to rebin the data without writing the result to disk
Member stir::ProjectorByBinPair::get_symmetries_used () const
determine set of minimal symmetries
Class stir::ProjMatrixByBinFromFile
this class currently only works with VoxelsOnCartesianGrid. To fix this, we would need a DiscretisedDensityInfo class, and be able to have constructed the appropriate symmetries object by parsing the .par file
Class stir::ProjMatrixByBinSinglePhoton
This is a horrible work-around for the fact that STIR currently insists on working on a density.
Class stir::ProjMatrixElemsForOneBin

Most of the members of this class would work just as well for a (not yet existing) class ProjMatrixElemsForOneDensel. This means that we should derived both from a common base class, templated in the type of element.

It might be useful to template this class in terms of the element-type as well. That way, we could have 'compact' elements, efficient elements, etc. However, doing this will probably only be useful if all ProjMatrixByBin classes are then templated as well, which would be a pain.

Class stir::ProjMatrixElemsForOneDenselValue
Simply derived from Bin for now.
Class stir::PullLinearInterpolator< elemT >
preliminary. We might want to derive this from a class or so.
Class stir::PullNearestNeighbourInterpolator< elemT >
preliminary. We might want to derive this from a class or so.
Class stir::PushNearestNeighbourInterpolator< elemT >
preliminary. We might want to derive this from a class or so.
Class stir::PushTransposeLinearInterpolator< elemT >
preliminary. We might want to derive this from a class or so.
Member stir::QuadraticPrior< elemT >::weights
This member is mutable at present because some const functions initialise it. That initialisation should be moved to a new set_up() function.
Member stir::randoms_from_singles (ProjData &proj_data, const SinglesRates &singles, float coincidence_time_window=-1.F, float radionuclide_halflife=-1.F)
Dead-time is currently completely ignored.
Member stir::Reconstruction< TargetT >::initialise (const std::string &parameter_filename)
It currently calls error() when something goes wrong. It should return Succeeded (or throw an exception).
Member stir::Reconstruction< TargetT >::set_up (shared_ptr< TargetT > const &target_data_sptr)
Currently, set_up() is called by reconstruct(). This is in contrast with some other class hierarchies in STIR where set_up() has to be called before any actual processing. Maybe this should be made consistent.
Class stir::RegisteredObject< Root >
Currently there is a hard-wired value of "None" for the default key (with a 0 factory). This is inappropriate in some cases.
Member stir::RegisteredParsingObject< Derived, Base, Parent >::read_from_stream (std::istream *)
Currently, the return value is a Base*. Preferably, it should be a Derived*, but it seems the registration machinery would need extra (unsafe) reinterpret_casts to get that to work. (TODO find a remedy).
Member stir::RegisteredParsingObject< Derived, Base, Parent >::RegisterIt::~RegisterIt ()
At present, the object remain in the registry, as there is a potential conflict in the order of destruction of the registry and the RegisterIt objects. This can be solved with shared_ptr s.
Member stir::RelatedViewgrams< elemT >::RelatedViewgrams (const std::vector< Viewgram< elemT >> &viewgrams, const shared_ptr< DataSymmetriesForViewSegmentNumbers > &symmetries_used)
Currently public for the STIR_MPI version
Member stir::RelativeDifferencePrior< elemT >::weights
This member is mutable at present because some const functions initialise it. That initialisation should be moved to a new set_up() function.
Member stir::RigidObject3DMotion::get_rel_time_of_samples (const double start_time, const double end_time) const =0
Really only makes sense for motion tracking that happens via sampling. One could imagine having simulated motion, and then this function wouldn't make a lot of sense. So, it probably should be moved to a derived class SampledRigidObject3DMotion or so.
Class stir::RigidObject3DMotionFromPolaris
move synchronisation out of this class
Class stir::RigidObject3DTransformation

Document sign choice for rotation.

define Euler angles (the code is derived from the Polaris manual)

Class stir::RigidObject3DTransformationTests
tests on inverse of transform_bin fail with some rotations (too large difference in round-trip).
Class stir::ROITests
Tests are currently somewhat simplistic
Member stir::round_to (integerT &result, const float x)
add code to check that integerT is really an integer type at compilation time
Member stir::sample_function_on_regular_grid (Array< 3, elemT > &out, FunctionType func, const BasicCoordinate< 3, positionT > &offset, const BasicCoordinate< 3, positionT > &step)
At the moment, only the 3D version is implemented, but this could be templated.
Member stir::sample_function_using_index_converter (Array< 3, elemT > &out, FunctionType func, Lambda &&index_converter)
At the moment, only the 3D version is implemented, but this could be templated.
Class stir::Scanner

Some scanners do not have all info filled in at present. Values are then set to 0.

derive from ParsingObject

a hierarchy distinguishing between different types of scanners

Member stir::Scanner::get_axial_length () const
Need to update this function when enabling different spacing between blocks and buckets etc.
Member stir::Scanner::get_default_num_arccorrected_bins () const
change name, mabe refering to the fan of detectors in coincidence or so
Member stir::Scanner::get_max_num_non_arccorrected_bins () const
change name
Member stir::Scanner::get_num_virtual_axial_crystals_per_block () const
The current list is bound to be incomplete. would be better to stick it in set_params().
Member stir::Scanner::get_num_virtual_transaxial_crystals_per_block () const
The current list is bound to be incomplete. would be better to stick it in set_params().
Member stir::Scanner::get_size_of_timing_pos () const
change name to get_size_of_timing_pos_in_ps
Member stir::Scanner::get_timing_resolution () const
change name to get_size_of_timing_pos_in_ps
Member stir::Scanner::set_num_virtual_axial_crystals_per_block (int)
Can currently only set to hard-wired values. Otherwise calls error()
Member stir::Scanner::set_num_virtual_transaxial_crystals_per_block (int)
Can currently only set to hard-wired values. Otherwise calls error()
Class stir::ScatterEstimation

The code should throw an error if 2D input data are loaded. It should just deactivate the final upsampling.

Currently FBP reconstruction is not working and just throws an error.

This code needs far more documentation.

Class stir::ScatterSimulation

detector coordinates are derived from ProjDataInfo, but areas and orientations are determined by using a cylindrical scanner.

variables/function named density really should use attenuation. This is currently only done for a few variables, but parsing keywords are correct.

Member stir::setup_distributable_computation (const shared_ptr< ProjectorByBinPair > &proj_pair_sptr, const shared_ptr< const ExamInfo > &exam_info_sptr, const shared_ptr< const ProjDataInfo > proj_data_info_sptr, const shared_ptr< const DiscretisedDensity< 3, float >> &target_sptr, const bool zero_seg0_end_planes, const bool distributed_cache_enabled)
currently uses some global variables for configuration in the distributed namespace. This needs to be converted to a class, e.g. DistributedMaster
Class stir::Shape3D

This could/should be generalised to allow general fuzzy shapes. Probably the only thing to change is to let is_inside_shape() return a float (between 0 and 1). This would solve some issues with DiscretisedDhape3D.

The restriction to the 3D case for this base class largely comes from the construct_volume() member (and the origin parsing members)

This base class really should have no origin member. For example, DiscretisedShape3D now has effectively two. Instead, we should have an additional class Shape3DWithOrigin. Easy to do.

Member stir::Shape3D::construct_volume (VoxelsOnCartesianGrid< float > &image, const CartesianCoordinate3D< int > &num_samples) const

Get rid of restriction to allow only VoxelsOnCartesianGrid<float> (but that's rather hard)

Potentially this should fill a DiscretisedShape3D.

Member stir::Shape3D::is_inside_shape (const CartesianCoordinate3D< float > &coord) const =0
replace by floating point return value?
Class stir::Shape3DWithOrientation
A previous release had Euler angle code. However, it is currently disabled as there were bugs in it.
Class stir::SingleScatterSimulation
The class is specific to PET so should be renamed accordingly.
Class stir::SPECTListEvent
this is still under development. Things to add are for instance energy windows and time-of-flight info. Also, get_bin() would need time info or so for rotating scanners.
Member stir::SSRB (const ProjDataInfo &in_proj_data_info, const int num_segments_to_combine, const int num_views_to_combine=1, const int num_tangential_poss_to_trim=0, const int max_in_segment_num_to_process=-1, const int num_tof_bins_to_combine=1)

get rid of both restrictions flagged as warnings in the documentation for this function.

rename to something much more general than SSRB

Class stir::SumOfGeneralisedObjectiveFunctions< ObjFuncT, TargetT, ParentT >

document why use of ParentT template

doc subsets

Member stir::SumOfGeneralisedObjectiveFunctions< ObjFuncT, TargetT, ParentT >::actual_subsets_are_approximately_balanced (std::string &warning_message) const
doc subset
Member stir::transform_3d_object (DiscretisedDensity< 3, float > &out_density, const DiscretisedDensity< 3, float > &in_density, const RigidObject3DTransformation &transformation_in_to_out)
cannot use ObjectTransformation yet as it needs the inverse transformation
Member stir::transpose_of_transform_3d_object (DiscretisedDensity< 3, float > &out_density, const DiscretisedDensity< 3, float > &in_density, const RigidObject3DTransformation &transformation_in_to_out)
cannot use ObjectTransformation yet as it needs the inverse transformation
Class stir::TrivialBinNormalisation
Make sure that the keyword value None corresponds to this class.
Class stir::Utah_phantom
dims here are wrong A: cylinder, 20cm diam, 10cm height B: cylinder, 18cm diam, 15cm height C: outer annulus, 20cm extern.diam, 2cm thick, 15cm height D: cylinder in B, 4.5cm diam, 18cm??? height E: shorter cylinder in B, 4.5cm diam, 5.5cm height
Class stir::VectorWithOffset< T >
add allocator template as in std::vector. This is non-trivial as we would have to use uninitialized_copy etc. in some places.
Member stir::VectorWithOffset< T >::resize (const int min_index, const int max_index)
in principle reallocation could be avoided when the new range would fit in the old one by shifting.
Member stir::warning (const STRING &string, const int verbosity_level=1)
At a later stage, it will also write to a log-file.
File test_IO.h
The current implementation requires that the output file format as also readable by stir::read_from_file. At least we should provide a run-time switch to not run that part of the tests.
File test_IO_DiscretisedDensity.cxx
The current implementation requires that the output file format as also readable by stir::read_from_file. At least we should provide a run-time switch to not run that part of the tests.
File test_IO_DynamicDiscretisedDensity.cxx
The current implementation requires that the output file format as also readable by stir::read_from_file. At least we should provide a run-time switch to not run that part of the tests.
File test_IO_ParametricDiscretisedDensity.cxx
The current implementation requires that the output file format as also readable by stir::read_from_file. At least we should provide a run-time switch to not run that part of the tests.
File test_OutputFileFormat.cxx
The current implementation requires that the output file format as also readable by stir::read_from_file. At least we should provide a run-time switch to not run that part of the tests.
File test_proj_data_info_LOR.cxx

test stir::ProjDataInfo::get_LOR and stir::ProjDataInfo::get_bin

use stir::RunTests

File TimeGateDefinitions.h
This files needs proper test
Module Variables for STIR_MPI
move to protected area