80 cout <<
"This optimizer is the standard MLEM (for Maximum Likelihood Expectation Maximization)." << endl;
81 cout <<
"It is numerically implemented in the multiplicative form (as opposed to the gradient form)." << endl;
82 cout <<
"It truncates negative data to 0 to satisfy the positivity constraint." << endl;
83 cout <<
"If subsets are used, it naturally becomes the OSEM optimizer." << endl;
84 cout <<
"With transmission data, the log-converted pre-corrected data are used as in J. Nuyts et al: \"Iterative reconstruction" << endl;
85 cout <<
"for helical CT: a simulation study\", Phys. Med. Biol., vol. 43, pp. 729-737, 1998." << endl;
86 cout <<
"The following options can be used (in this particular order when provided as a list):" << endl;
87 cout <<
" initial image value: to set the uniform voxel value for the initial image" << endl;
88 cout <<
" denominator threshold: to set the threshold of the data space denominator under which the ratio is set to 1" << endl;
89 cout <<
" minimum image update: to set the minimum of the image update factor under which it stays constant (0 or a negative value" << endl;
90 cout <<
" means no minimum thus allowing a 0 update)" << endl;
91 cout <<
" maximum image update: to set the maximum of the image update factor over which it stays constant (0 or a negative value means" << endl;
92 cout <<
" no maximum)" << endl;
102 string key_word =
"";
104 key_word =
"initial image value";
107 Cerr(
"***** iOptimizerMLEM::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
111 key_word =
"denominator threshold";
114 Cerr(
"***** iOptimizerMLEM::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
118 key_word =
"minimum image update";
121 Cerr(
"***** iOptimizerMLEM::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
125 key_word =
"maximum image update";
128 Cerr(
"***** iOptimizerMLEM::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
143 const int nb_options = 4;
144 FLTNB options[nb_options];
146 if (
ReadStringOption(a_optionsList, options, nb_options,
",",
"MLEM configuration"))
148 Cerr(
"***** iOptimizerMLEM::ReadOptionsList() -> Failed to correctly read the list of options !" << endl);
170 Cerr(
"***** iOptimizerMLEM->CheckSpecificParameters() -> Provided initial image value (" <<
m_initialValue <<
") must be strictly positive !" << endl);
176 Cerr(
"***** iOptimizerMLEM->CheckSpecificParameters() -> Provided data space denominator threshold (" <<
m_dataSpaceDenominatorThreshold <<
") must be strictly positive !" << endl);
188 Cerr(
"***** iOptimizerMLEM->CheckSpecificParameters() -> Cannot reconstruct list-mode transmission data !" << endl);
205 Cout(
"iOptimizerMLEM::InitializeSpecific() -> Use the MLEM optimizer" << endl);
211 else Cerr(
"!!!!! The minimum update value is not set, if using subsets, voxels could be trapped in 0 value causing some negative bias !" << endl);
225 FLTNB a_multiplicativeCorrections,
FLTNB a_additiveCorrections,
FLTNB a_blankValue,
240 FLTNB a_multiplicativeCorrections,
FLTNB a_additiveCorrections,
FLTNB a_blankValue,
247 if (a_data<0.) a_data = 0.;
250 else *ap_backwardValues = 1.;
256 a_data -= a_additiveCorrections;
257 a_forwardModel -= a_additiveCorrections;
261 if (a_data<1. || a_forwardModel<1. || a_data>a_blankValue || a_forwardModel>a_blankValue)
263 *ap_backwardValues = 1.;
267 a_data = log(a_blankValue/a_data);
268 a_forwardModel = log(a_blankValue/a_forwardModel);
271 else *ap_backwardValues = 1.;
283 FLTNB a_sensitivity,
FLTNB* ap_correctionValues,
284 INTNB a_voxel,
int a_tbf,
int a_rbf,
int a_cbf )
287 FLTNB image_update_factor = *ap_correctionValues / a_sensitivity;
293 *ap_newImageValue = a_currentImageValue * image_update_factor;
FLTNB m_dataSpaceDenominatorThreshold
int ImageSpaceSpecificOperations(FLTNB a_currentImageValue, FLTNB *ap_newImageValue, FLTNB a_sensitivity, FLTNB *ap_correctionValues, INTNB a_voxel, int a_tbf=-1, int a_rbf=-1, int a_cbf=-1)
This function perform the image update step specific to the optimizer.
bool m_listmodeCompatibility
int ReadOptionsList(const string &a_optionsList)
A function used to read options from a list of options.
int DataSpaceSpecificOperations(FLTNB a_data, FLTNB a_forwardModel, FLTNB *ap_backwardValues, FLTNB a_multiplicativeCorrections, FLTNB a_additiveCorrections, FLTNB a_blankValue, FLTNB a_quantificationFactor, oProjectionLine *ap_Line)
This function performs the data space operations specific to the optimizer (computes the values to be...
int CheckSpecificParameters()
A private function used to check the parameters settings specific to the child optimizer.
int InitializeSpecific()
This function is used to initialize specific stuff to the child optimizer.
bool m_emissionCompatibility
int ReadDataASCIIFile(const string &a_file, const string &a_keyword, T *ap_return, int a_nbElts, bool a_mandatoryFlag)
Look for "a_nbElts" elts in the "a_file" file matching the "a_keyword" string passed as parameter a...
bool m_histogramCompatibility
iOptimizerMLEM()
The constructor of iOptimizerMLEM.
#define KEYWORD_MANDATORY
Declaration of class iOptimizerMLEM.
#define SPEC_TRANSMISSION
FLTNB m_maximumImageUpdateFactor
bool m_transmissionCompatibility
This class is designed to generically described any iterative optimizer.
This class is designed to manage and store system matrix elements associated to a vEvent...
~iOptimizerMLEM()
The destructor of iOptimizerMLEM.
int ReadConfigurationFile(const string &a_configurationFile)
A function used to read options from a configuration file.
FLTNB m_minimumImageUpdateFactor
Declaration of class sOutputManager.
int SensitivitySpecificOperations(FLTNB a_data, FLTNB a_forwardModel, FLTNB *ap_weight, FLTNB a_multiplicativeCorrections, FLTNB a_additiveCorrections, FLTNB a_blankValue, FLTNB a_quantificationFactor, oProjectionLine *ap_Line)
This function compute the weight associated to the provided event (for sensitivity computation) ...
void ShowHelpSpecific()
A function used to show help about the child optimizer.
int ReadStringOption(const string &a_input, T *ap_return, int a_nbElts, const string &sep, const string &a_option)
Parse the 'a_input' string corresponding to the 'a_option' into 'a_nbElts' elements, using the 'sep' separator. The results are returned in the templated 'ap_return' dynamic templated array. Call "ConvertFromString()" to perform the correct conversion depending on the type of the data to convert.