84 cout <<
"This optimizer is the AML algorithm derived from the AB-EMML of C. Byrne, Inverse Problems, 1998, vol. 14, pp. 1455-67." << endl;
85 cout <<
"The bound B is taken to infinity, so only the bound A can be parameterized." << endl;
86 cout <<
"This bound must be quantitative (same unit as the reconstructed image)." << endl;
87 cout <<
"It is provided as a single value and thus assuming a uniform bound." << endl;
88 cout <<
"Subsets can be used." << endl;
89 cout <<
"With a negative or null bound, this algorithm implements equation 6 of A. Rahmim et al, Phys. Med. Biol., 2012, vol. 57, pp. 733-55." << endl;
90 cout <<
"If a positive bound is provided, then we suppose that the bound A is taken to minus infinity. In that case, this algorithm implements" << endl;
91 cout <<
"equation 22 of K. Van Slambrouck et al, IEEE TMI, Jan 2015, vol. 34, pp. 126-136." << endl;
92 cout <<
"The following options can be used (in this particular order when provided as a list):" << endl;
93 cout <<
" initial image value: to set the uniform voxel value for the initial image" << endl;
94 cout <<
" denominator threshold: to set the threshold of the data space denominator under which the ratio is set to 1" << endl;
95 cout <<
" bound: to set the bound parameter that shift the Poisson law (quantitative, negative or null for standard AML and positive for infinite AML)." << endl;
105 string key_word =
"";
107 key_word =
"initial image value";
110 Cerr(
"***** iOptimizerOriginalAML::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
114 key_word =
"denominator threshold";
117 Cerr(
"***** iOptimizerOriginalAML::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
124 Cerr(
"***** iOptimizerOriginalAML::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
139 const int nb_options = 3;
140 FLTNB options[nb_options];
142 if (
ReadStringOption(a_optionsList, options, nb_options,
",",
"AML configuration"))
144 Cerr(
"***** iOptimizerOriginalAML::ReadOptionsList() -> Failed to correctly read the list of options !" << endl);
165 Cerr(
"***** iOptimizerOriginalAML->CheckSpecificParameters() -> Provided data space denominator threshold (" <<
m_dataSpaceDenominatorThreshold <<
") must be strictly positive !" << endl);
171 Cerr(
"***** iOptimizerOriginalAML::CheckSpecificParameters() -> The initial image value (" <<
m_initialValue <<
") must be higher than or equal to the provided bound value ("
189 Cout(
"iOptimizerOriginalAML::InitializeSpecific() -> Use the AML optimizer" << endl);
195 else Cout(
" --> Bound value taken to minus infinity" << endl);
208 FLTNB a_multiplicativeCorrections,
FLTNB a_additiveCorrections,
FLTNB a_blankValue,
223 FLTNB a_multiplicativeCorrections,
FLTNB a_additiveCorrections,
FLTNB a_blankValue,
232 FLTNB denominator = a_forwardModel - shift;
239 FLTNB numerator = a_data - shift;
241 if (numerator<0.) *ap_backwardValues = 0.;
243 else *ap_backwardValues = numerator / denominator;
249 *ap_backwardValues = (a_data - a_forwardModel) /
ForwardProject(ap_Line);
264 FLTNB image_update_factor = *ap_correctionValues / a_sensitivity;
266 if (
m_bound<=0.) *ap_newImageValue =
m_bound + (a_currentImageValue -
m_bound) * image_update_factor;
268 else *ap_newImageValue = a_currentImageValue + image_update_factor;
bool m_listmodeCompatibility
iOptimizerOriginalAML()
The constructor of iOptimizerOriginalAML.
int ImageSpaceSpecificOperations(FLTNB a_currentImageValue, FLTNB *ap_newImageValue, FLTNB a_sensitivity, FLTNB *ap_correctionValues, INTNB a_voxel)
This function perform the image update step specific to the optimizer.
FLTNB ForwardProject(oProjectionLine *ap_Line, FLTNB *ap_image=NULL)
A function used to forward project the provided image (or 1 if NULL), based on the provided oProjecti...
Declaration of class iOptimizerOriginalAML.
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...
int ReadConfigurationFile(const string &a_configurationFile)
A function used to read options from a configuration file.
void ShowHelpSpecific()
A function used to show help about the child optimizer.
bool m_histogramCompatibility
#define KEYWORD_MANDATORY
int CheckSpecificParameters()
A private function used to check the parameters settings specific to the child optimizer.
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...
~iOptimizerOriginalAML()
The destructor of iOptimizerOriginalAML.
int InitializeSpecific()
This function is used to initialize specific stuff to the child optimizer.
Declaration of class sOutputManager.
int ReadOptionsList(const string &a_optionsList)
A function used to read options from a list of options.
FLTNB m_dataSpaceDenominatorThreshold
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.
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) ...
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...