Skip to content

Commit

Permalink
Set compton_f_step from limit_lo to limit_lo_hi. Added check fit para…
Browse files Browse the repository at this point in the history
…m min and max values are not the same
  • Loading branch information
Arthur Glowacki committed Aug 15, 2024
1 parent c61799a commit b4d41a4
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 17 deletions.
8 changes: 4 additions & 4 deletions src/fitting/models/gaussian_model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ Fit_Parameters<T_real> Gaussian_Model<T_real>::_generate_default_fit_parameters(
fit_params.add_parameter(Fit_Param<T_real>(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<T_real>(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<T_real>(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<T_real>(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<T_real>(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<T_real>(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<T_real>(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<T_real>(STR_COMPTON_HI_GAMMA, (T_real)0.1, (T_real)3., (T_real)1.0, (T_real)0.01, E_Bound_Type::FIXED));
Expand Down Expand Up @@ -199,7 +199,7 @@ void Gaussian_Model<T_real>::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;
Expand Down Expand Up @@ -237,7 +237,7 @@ void Gaussian_Model<T_real>::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;
Expand Down Expand Up @@ -313,7 +313,7 @@ void Gaussian_Model<T_real>::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;
Expand Down
30 changes: 19 additions & 11 deletions src/fitting/optimizers/mpfit_optimizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ void MPFit_Optimizer<T_real>::set_options(std::unordered_map<std::string, T_real


template<typename T_real>
void MPFit_Optimizer<T_real>::_fill_limits(Fit_Parameters<T_real> *fit_params , std::vector<struct mp_par<T_real> > &par)
bool MPFit_Optimizer<T_real>::_fill_limits(Fit_Parameters<T_real> *fit_params , std::vector<struct mp_par<T_real> > &par)
{
for (auto itr = fit_params->begin(); itr != fit_params->end(); itr++)
{
Expand All @@ -346,13 +346,11 @@ void MPFit_Optimizer<T_real>::_fill_limits(Fit_Parameters<T_real> *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 "<<fit.name<<" is limited and has min: "<<fit.min_val<<" == to max: "<<fit.max_val<<"\n";
return false;
}
}


Expand Down Expand Up @@ -410,6 +408,7 @@ void MPFit_Optimizer<T_real>::_fill_limits(Fit_Parameters<T_real> *fit_params ,
par[fit.opt_array_index].deriv_abstol = (T_real)0.00001; // Absolute tolerance for derivative debug printout
}
}
return true;
}

//-----------------------------------------------------------------------------
Expand Down Expand Up @@ -521,7 +520,10 @@ OPTIMIZER_OUTCOME MPFit_Optimizer<T_real>::minimize(Fit_Parameters<T_real>*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<T_real> result;
result.xerror = &perror[0];
Expand Down Expand Up @@ -669,7 +671,10 @@ OPTIMIZER_OUTCOME MPFit_Optimizer<T_real>::minimize_func(Fit_Parameters<T_real>

std::vector<struct mp_par<T_real> > par;
par.resize(fitp_arr.size());
_fill_limits(fit_params, par);
if(false == _fill_limits(fit_params, par))
{
return OPTIMIZER_OUTCOME::FAILED;
}

mp_result<T_real> result;
result.xerror = &perror[0];
Expand Down Expand Up @@ -821,7 +826,10 @@ OPTIMIZER_OUTCOME MPFit_Optimizer<T_real>::minimize_quantification(Fit_Parameter

std::vector<struct mp_par<T_real> > 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<T_real>, (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";
Expand Down
4 changes: 2 additions & 2 deletions src/fitting/optimizers/mpfit_optimizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,9 @@ class DLL_EXPORT MPFit_Optimizer: public Optimizer<T_real>

private:

void _fill_limits(Fit_Parameters<T_real> *fit_params, std::vector<struct mp_par<T_real> > &par);
bool _fill_limits(Fit_Parameters<T_real> *fit_params, std::vector<struct mp_par<T_real> > &par);

struct mp_config<T_real> _options;
struct mp_config<T_real> _options;

};

Expand Down

0 comments on commit b4d41a4

Please sign in to comment.