From b4d41a4f0ec0d548de7d13d7ec19793154af7cef Mon Sep 17 00:00:00 2001 From: Arthur Glowacki Date: Thu, 15 Aug 2024 17:23:53 -0500 Subject: [PATCH] Set compton_f_step from limit_lo to limit_lo_hi. Added check fit param min and max values are not the same --- src/fitting/models/gaussian_model.cpp | 8 +++--- src/fitting/optimizers/mpfit_optimizer.cpp | 30 ++++++++++++++-------- src/fitting/optimizers/mpfit_optimizer.h | 4 +-- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/fitting/models/gaussian_model.cpp b/src/fitting/models/gaussian_model.cpp index 9cb5f582..d2a48d05 100644 --- a/src/fitting/models/gaussian_model.cpp +++ b/src/fitting/models/gaussian_model.cpp @@ -109,7 +109,7 @@ Fit_Parameters Gaussian_Model::_generate_default_fit_parameters( fit_params.add_parameter(Fit_Param(STR_COMPTON_FWHM_CORR, (T_real)1.0, (T_real)4.0, (T_real)1.0, (T_real)0.1, E_Bound_Type::LIMITED_LO_HI)); fit_params.add_parameter(Fit_Param(STR_COMPTON_AMPLITUDE, MIN_COUNTS_LIMIT_LOG, MAX_COUNTS_LIMIT_LOG, (T_real)5.0, STEP_COUNTS_LIMIT_LOG, E_Bound_Type::LIMITED_LO_HI)); fit_params.add_parameter(Fit_Param(STR_COMPTON_F_STEP, (T_real)0.0, (T_real)1.0, (T_real)0.0, (T_real)0.1, E_Bound_Type::FIXED)); - fit_params.add_parameter(Fit_Param(STR_COMPTON_F_TAIL, (T_real)0.0, (T_real)1.0, (T_real)0.1, (T_real)0.1, E_Bound_Type::LIMITED_LO)); + fit_params.add_parameter(Fit_Param(STR_COMPTON_F_TAIL, (T_real)0.0, (T_real)1.0, (T_real)0.1, (T_real)0.1, E_Bound_Type::LIMITED_LO_HI)); fit_params.add_parameter(Fit_Param(STR_COMPTON_GAMMA, (T_real)0.1, (T_real)10., (T_real)1.0, (T_real)0.1, E_Bound_Type::FIXED)); fit_params.add_parameter(Fit_Param(STR_COMPTON_HI_F_TAIL, (T_real)0.0, (T_real)1.0, (T_real)0.013, (T_real)0.0000001, E_Bound_Type::LIMITED_LO_HI)); fit_params.add_parameter(Fit_Param(STR_COMPTON_HI_GAMMA, (T_real)0.1, (T_real)3., (T_real)1.0, (T_real)0.01, E_Bound_Type::FIXED)); @@ -199,7 +199,7 @@ void Gaussian_Model::set_fit_params_preset(Fit_Params_Preset preset) _fit_parameters[STR_COMPTON_FWHM_CORR].bound_type = E_Bound_Type::LIMITED_LO_HI; _fit_parameters[STR_COMPTON_AMPLITUDE].bound_type = E_Bound_Type::LIMITED_LO_HI; _fit_parameters[STR_COMPTON_F_STEP].bound_type = E_Bound_Type::FIXED; - _fit_parameters[STR_COMPTON_F_TAIL].bound_type = E_Bound_Type::LIMITED_LO; + _fit_parameters[STR_COMPTON_F_TAIL].bound_type = E_Bound_Type::LIMITED_LO_HI; _fit_parameters[STR_COMPTON_GAMMA].bound_type = E_Bound_Type::FIXED; _fit_parameters[STR_COMPTON_HI_F_TAIL].bound_type = E_Bound_Type::LIMITED_LO_HI; _fit_parameters[STR_COMPTON_HI_GAMMA].bound_type = E_Bound_Type::FIXED; @@ -237,7 +237,7 @@ void Gaussian_Model::set_fit_params_preset(Fit_Params_Preset preset) _fit_parameters[STR_COMPTON_FWHM_CORR].bound_type = E_Bound_Type::LIMITED_LO_HI; _fit_parameters[STR_COMPTON_AMPLITUDE].bound_type = E_Bound_Type::LIMITED_LO_HI; _fit_parameters[STR_COMPTON_F_STEP].bound_type = E_Bound_Type::FIXED; - _fit_parameters[STR_COMPTON_F_TAIL].bound_type = E_Bound_Type::LIMITED_LO; + _fit_parameters[STR_COMPTON_F_TAIL].bound_type = E_Bound_Type::LIMITED_LO_HI; _fit_parameters[STR_COMPTON_GAMMA].bound_type = E_Bound_Type::LIMITED_LO_HI; _fit_parameters[STR_COMPTON_HI_F_TAIL].bound_type = E_Bound_Type::LIMITED_LO_HI; _fit_parameters[STR_COMPTON_HI_GAMMA].bound_type = E_Bound_Type::LIMITED_LO_HI; @@ -313,7 +313,7 @@ void Gaussian_Model::set_fit_params_preset(Fit_Params_Preset preset) _fit_parameters[STR_COMPTON_FWHM_CORR].bound_type = E_Bound_Type::LIMITED_LO_HI; _fit_parameters[STR_COMPTON_AMPLITUDE].bound_type = E_Bound_Type::LIMITED_LO_HI; _fit_parameters[STR_COMPTON_F_STEP].bound_type = E_Bound_Type::FIXED; - _fit_parameters[STR_COMPTON_F_TAIL].bound_type = E_Bound_Type::LIMITED_LO; + _fit_parameters[STR_COMPTON_F_TAIL].bound_type = E_Bound_Type::LIMITED_LO_HI; _fit_parameters[STR_COMPTON_GAMMA].bound_type = E_Bound_Type::FIXED; _fit_parameters[STR_COMPTON_HI_F_TAIL].bound_type = E_Bound_Type::LIMITED_LO_HI; _fit_parameters[STR_COMPTON_HI_GAMMA].bound_type = E_Bound_Type::FIXED; diff --git a/src/fitting/optimizers/mpfit_optimizer.cpp b/src/fitting/optimizers/mpfit_optimizer.cpp index d829335f..3542996c 100644 --- a/src/fitting/optimizers/mpfit_optimizer.cpp +++ b/src/fitting/optimizers/mpfit_optimizer.cpp @@ -321,7 +321,7 @@ void MPFit_Optimizer::set_options(std::unordered_map -void MPFit_Optimizer::_fill_limits(Fit_Parameters *fit_params , std::vector > &par) +bool MPFit_Optimizer::_fill_limits(Fit_Parameters *fit_params , std::vector > &par) { for (auto itr = fit_params->begin(); itr != fit_params->end(); itr++) { @@ -346,13 +346,11 @@ void MPFit_Optimizer::_fill_limits(Fit_Parameters *fit_params , || fit.bound_type == E_Bound_Type::LIMITED_LO || fit.bound_type == E_Bound_Type::LIMITED_LO_HI) { - if (fit.max_val == fit.min_val) - { - fit.max_val += (T_real)1.0; - fit.min_val -= (T_real)1.0; - (*fit_params)[itr->first].max_val += (T_real)1.0; - (*fit_params)[itr->first].min_val -= (T_real)1.0; - } + if(fit.min_val == fit.max_val) + { + logE<<"Fit parameter "<::_fill_limits(Fit_Parameters *fit_params , par[fit.opt_array_index].deriv_abstol = (T_real)0.00001; // Absolute tolerance for derivative debug printout } } + return true; } //----------------------------------------------------------------------------- @@ -521,7 +520,10 @@ OPTIMIZER_OUTCOME MPFit_Optimizer::minimize(Fit_Parameters*fit_p _options.maxfev = _options.maxiter * ((int)fitp_arr.size() + 1); - _fill_limits(fit_params, par); + if(false == _fill_limits(fit_params, par)) + { + return OPTIMIZER_OUTCOME::FAILED; + } mp_result result; result.xerror = &perror[0]; @@ -669,7 +671,10 @@ OPTIMIZER_OUTCOME MPFit_Optimizer::minimize_func(Fit_Parameters std::vector > par; par.resize(fitp_arr.size()); - _fill_limits(fit_params, par); + if(false == _fill_limits(fit_params, par)) + { + return OPTIMIZER_OUTCOME::FAILED; + } mp_result result; result.xerror = &perror[0]; @@ -821,7 +826,10 @@ OPTIMIZER_OUTCOME MPFit_Optimizer::minimize_quantification(Fit_Parameter std::vector > par; par.resize(fitp_arr.size()); - _fill_limits(fit_params, par); + if(false == _fill_limits(fit_params, par)) + { + return OPTIMIZER_OUTCOME::FAILED; + } this->_last_outcome = mpfit(quantification_residuals_mpfit, (int)ud.quant_map.size(), (int)fitp_arr.size(), &fitp_arr[0], &par[0], &_options, (void *) &ud, &result); logI << "\nOutcome: " << optimizer_outcome_to_str(this->_outcome_map[this->_last_outcome]) << "\nNum iter: " << result.niter << "\n Norm of the residue vector: " << *result.resid << "\n"; diff --git a/src/fitting/optimizers/mpfit_optimizer.h b/src/fitting/optimizers/mpfit_optimizer.h index a3fb3859..034a2f2c 100644 --- a/src/fitting/optimizers/mpfit_optimizer.h +++ b/src/fitting/optimizers/mpfit_optimizer.h @@ -95,9 +95,9 @@ class DLL_EXPORT MPFit_Optimizer: public Optimizer private: - void _fill_limits(Fit_Parameters *fit_params, std::vector > &par); + bool _fill_limits(Fit_Parameters *fit_params, std::vector > &par); - struct mp_config _options; + struct mp_config _options; };