Skip to content

Commit e7255af

Browse files
authored
Merge pull request #223 from aglowacki/master
netcdf
2 parents f245c29 + 2ed5df3 commit e7255af

25 files changed

+411
-338
lines changed

src/core/process_whole.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ bool optimize_integrated_fit_params(data_struct::Analysis_Job<double> * analysis
6060
const data_struct::Params_Override<double>* const params_override,
6161
std::string save_filename,
6262
data_struct::Fit_Parameters<double>& out_fitp,
63+
ArrayTr<double>* custom_background,
6364
Callback_Func_Status_Def* status_callback)
6465
{
6566
fitting::models::Gaussian_Model<double> model;
@@ -96,7 +97,7 @@ bool optimize_integrated_fit_params(data_struct::Analysis_Job<double> * analysis
9697
model.set_fit_params_preset(analysis_job->optimize_fit_params_preset);
9798
}
9899
//Initialize the fit routine
99-
fit_routine->initialize(&model, &params_override->elements_to_fit, energy_range);
100+
fit_routine->initialize(&model, &params_override->elements_to_fit, energy_range, custom_background);
100101

101102
model.print_fit_params();
102103

@@ -382,7 +383,7 @@ void load_and_fit_quatification_datasets(data_struct::Analysis_Job<double>* anal
382383
//Update fit parameters by override values
383384
model.update_fit_params_values(&(override_params->fit_params));
384385
//Initialize the fit routine
385-
fit_routine->initialize(&model, &elements_to_fit, energy_range);
386+
fit_routine->initialize(&model, &elements_to_fit, energy_range, nullptr);
386387
//Fit the spectra
387388
fit_routine->fit_spectra(&model, &quantification_standard->integrated_spectra, &elements_to_fit, quantification_standard->element_counts[fit_itr.first]);
388389

@@ -712,7 +713,7 @@ bool find_and_optimize_roi(data_struct::Analysis_Job<double>& analysis_job,
712713

713714
data_struct::Fit_Parameters<double> out_fitp;
714715
std::string roi_name = roi_itr.first;
715-
if (false == optimize_integrated_fit_params(&analysis_job, int_spectra, detector_num, params_override, sfile_name + "_roi_" + roi_name + "_det_", out_fitp, status_callback))
716+
if (false == optimize_integrated_fit_params(&analysis_job, int_spectra, detector_num, params_override, sfile_name + "_roi_" + roi_name + "_det_", out_fitp, nullptr, status_callback))
716717
{
717718
logE << "Failed to optimize ROI "<< file_path<<" : "<< roi_name<<".\n";
718719
}
@@ -773,8 +774,7 @@ bool find_and_optimize_roi(data_struct::Analysis_Job<double>& analysis_job,
773774

774775
void optimize_single_roi(data_struct::Analysis_Job<double>& analysis_job,
775776
std::string roi_file_name,
776-
std::map<int, std::map<std::string,
777-
data_struct::Fit_Parameters<double>>> & out_roi_fit_params,
777+
std::map<int, std::map<std::string, data_struct::Fit_Parameters<double>>> & out_roi_fit_params,
778778
Callback_Func_Status_Def* status_callback)
779779
{
780780
//std::map<int, std::vector<std::pair<unsigned int, unsigned int>>> rois;

src/core/process_whole.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,13 @@ using namespace std::placeholders; //for _1, _2,
108108

109109
DLL_EXPORT bool perform_quantification(data_struct::Analysis_Job<double>* analysis_job, bool save_when_done);
110110

111-
DLL_EXPORT bool optimize_integrated_fit_params(data_struct::Analysis_Job<double>* analysis_job,
112-
std::string dataset_filename,
111+
DLL_EXPORT bool optimize_integrated_fit_params(data_struct::Analysis_Job<double> * analysis_job,
112+
const data_struct::Spectra<double>& int_spectra,
113113
size_t detector_num,
114-
data_struct::Params_Override<double>* params_override,
114+
const data_struct::Params_Override<double>* const params_override,
115+
std::string save_filename,
115116
data_struct::Fit_Parameters<double>& out_fitp,
117+
ArrayTr<double>* custom_background = nullptr,
116118
Callback_Func_Status_Def* status_callback = nullptr);
117119

118120
DLL_EXPORT void generate_optimal_params(data_struct::Analysis_Job<double>* analysis_job);
@@ -501,7 +503,10 @@ DLL_EXPORT void process_dataset_files(data_struct::Analysis_Job<T_real>* analysi
501503
continue;
502504
}
503505

504-
analysis_job->init_fit_routines(spectra_volume->samples_size(), true);
506+
ArrayTr<T_real>* custom_background = nullptr;
507+
// if analysis_job->use_roi_background .load ()
508+
509+
analysis_job->init_fit_routines(spectra_volume->samples_size(), custom_background, true);
505510
proc_spectra(spectra_volume, detector, &tp, !loaded_from_analyzed_hdf5, scan_type, status_callback);
506511
delete spectra_volume;
507512
}
@@ -580,7 +585,7 @@ DLL_EXPORT void process_dataset_files_quick_and_dirty(std::string dataset_file,
580585
}
581586
delete tmp_spectra_volume;
582587

583-
analysis_job->init_fit_routines(spectra_volume->samples_size(), true);
588+
analysis_job->init_fit_routines(spectra_volume->samples_size(), nullptr, true);
584589

585590
proc_spectra(spectra_volume, detector, &tp, !is_loaded_from_analyzed_h5, scan_type, status_callback);
586591
delete spectra_volume;

src/data_struct/analysis_job.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ Detector<T_real>* Analysis_Job<T_real>::get_detector(int detector_num)
131131
//-----------------------------------------------------------------------------
132132

133133
template<typename T_real>
134-
void Analysis_Job<T_real>::init_fit_routines(size_t spectra_samples, bool force)
134+
void Analysis_Job<T_real>::init_fit_routines(size_t spectra_samples, ArrayTr<T_real>* custom_background, bool force)
135135
{
136136
if(_first_init || force)// && _last_init_sample_size != spectra_samples)
137137
{
@@ -153,7 +153,7 @@ void Analysis_Job<T_real>::init_fit_routines(size_t spectra_samples, bool force
153153

154154
Fit_Element_Map_Dict<T_real>* elements_to_fit = &(detector->fit_params_override_dict.elements_to_fit);
155155
//Initialize model
156-
fit_routine->initialize(detector->model, elements_to_fit, energy_range);
156+
fit_routine->initialize(detector->model, elements_to_fit, energy_range, custom_background);
157157
}
158158
}
159159
}

src/data_struct/analysis_job.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class DLL_EXPORT Analysis_Job
8888

8989
fitting::optimizers::Optimizer<T_real>* optimizer(){return _optimizer;}
9090

91-
void init_fit_routines(size_t spectra_samples, bool force=false);
91+
void init_fit_routines(size_t spectra_samples, ArrayTr<T_real>* custom_background = nullptr, bool force=false);
9292

9393
std::string command_line;
9494

src/fitting/optimizers/nlopt_optimizer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ OPTIMIZER_OUTCOME NLOPT_Optimizer<T_real>::minimize(Fit_Parameters<T_real>*fit_p
316316
const Fit_Element_Map_Dict<T_real>* const elements_to_fit,
317317
const Base_Model<T_real>* const model,
318318
const Range energy_range,
319+
const ArrayTr<T_real> * const background,
319320
bool use_weights,
320321
Callback_Func_Status_Def* status_callback)
321322
{
@@ -332,7 +333,7 @@ OPTIMIZER_OUTCOME NLOPT_Optimizer<T_real>::minimize(Fit_Parameters<T_real>*fit_p
332333
return OPTIMIZER_OUTCOME::STOPPED;
333334
}
334335

335-
fill_user_data(ud, fit_params, spectra, elements_to_fit, model, energy_range, status_callback, _options.at(STR_OPT_MAXITER), use_weights);
336+
fill_user_data(ud, fit_params, spectra, elements_to_fit, model, energy_range, background, status_callback, _options.at(STR_OPT_MAXITER), use_weights);
336337

337338
nlopt::opt opt(_algo, fitp_arr.size());
338339
opt.set_lower_bounds(lb_arr);

src/fitting/optimizers/nlopt_optimizer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class DLL_EXPORT NLOPT_Optimizer: public Optimizer<T_real>
7474
const Fit_Element_Map_Dict<T_real>* const elements_to_fit,
7575
const Base_Model<T_real>* const model,
7676
const Range energy_range,
77+
const ArrayTr<T_real> * const background,
7778
bool use_weights,
7879
Callback_Func_Status_Def* status_callback = nullptr);
7980

src/fitting/optimizers/optimizer.h

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ void fill_user_data(User_Data<T_real> &ud,
165165
const Fit_Element_Map_Dict<T_real> * const elements_to_fit,
166166
const Base_Model<T_real>* const model,
167167
const Range energy_range,
168+
const ArrayTr<T_real> * const background,
168169
Callback_Func_Status_Def* status_callback,
169170
size_t total_itr,
170171
bool use_weights = true)
@@ -210,20 +211,28 @@ void fill_user_data(User_Data<T_real> &ud,
210211
ud.weights.fill(1.0);
211212
}
212213

213-
ArrayTr<T_real> background(spectra->size());
214-
background.setZero(spectra->size());
215-
if (fit_params->contains(STR_SNIP_WIDTH))
214+
ArrayTr<T_real> snip_bk(spectra->size());
215+
snip_bk.setZero(spectra->size());
216+
if(background == nullptr)
216217
{
217-
background = snip_background<T_real>(spectra,
218-
fit_params->value(STR_ENERGY_OFFSET),
219-
fit_params->value(STR_ENERGY_SLOPE),
220-
fit_params->value(STR_ENERGY_QUADRATIC),
221-
fit_params->value(STR_SNIP_WIDTH),
222-
energy_range.min,
223-
energy_range.max);
218+
if (fit_params->contains(STR_SNIP_WIDTH))
219+
{
220+
snip_bk = snip_background<T_real>(spectra,
221+
fit_params->value(STR_ENERGY_OFFSET),
222+
fit_params->value(STR_ENERGY_SLOPE),
223+
fit_params->value(STR_ENERGY_QUADRATIC),
224+
fit_params->value(STR_SNIP_WIDTH),
225+
energy_range.min,
226+
energy_range.max);
227+
}
228+
ud.spectra_background = snip_bk.segment(energy_range.min, energy_range.count());
229+
ud.spectra_background = ud.spectra_background.unaryExpr([](T_real v) { return std::isfinite(v) ? v : (T_real)0.0; });
224230
}
225-
ud.spectra_background = background.segment(energy_range.min, energy_range.count());
226-
ud.spectra_background = ud.spectra_background.unaryExpr([](T_real v) { return std::isfinite(v) ? v : (T_real)0.0; });
231+
else
232+
{
233+
ud.spectra_background = background->segment(energy_range.min, energy_range.count());
234+
}
235+
227236
ud.spectra_model.resize(energy_range.count());
228237
}
229238

@@ -320,6 +329,7 @@ class DLL_EXPORT Optimizer
320329
const Fit_Element_Map_Dict<T_real> * const elements_to_fit,
321330
const Base_Model<T_real>* const model,
322331
const Range energy_range,
332+
const ArrayTr<T_real> * const background,
323333
bool use_weights,
324334
Callback_Func_Status_Def* status_callback = nullptr) = 0;
325335

src/fitting/routines/base_fit_routine.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ class DLL_EXPORT Base_Fit_Routine
110110
*/
111111
virtual void initialize(models::Base_Model<T_real>* const model,
112112
const Fit_Element_Map_Dict<T_real> * const elements_to_fit,
113-
const struct Range energy_range) = 0;
113+
const struct Range energy_range,
114+
ArrayTr<T_real>* custom_background) = 0;
114115

115116

116117
protected:

src/fitting/routines/hybrid_param_nnls_fit_routine.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ OPTIMIZER_OUTCOME Hybrid_Param_NNLS_Fit_Routine<T_real>::fit_spectra_parameters(
187187
ret_val = this->_optimizer->minimize_func(model, &fit_params, spectra, this->_energy_range, &_background, gen_func, use_weights);
188188

189189
_model->update_fit_params_values(&fit_params);
190-
this->initialize(_model, elements_to_fit, this->_energy_range);
190+
this->initialize(_model, elements_to_fit, this->_energy_range, this->_custom_background);
191191
std::unordered_map<std::string, T_real> out_counts;
192192
this->fit_spectra(_model, spectra, elements_to_fit, out_counts);
193193

src/fitting/routines/matrix_optimized_fit_routine.cpp

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -258,11 +258,13 @@ std::unordered_map<std::string, Spectra<T_real>> Matrix_Optimized_Fit_Routine<T_
258258

259259
template<typename T_real>
260260
void Matrix_Optimized_Fit_Routine<T_real>::initialize(models::Base_Model<T_real>* const model,
261-
const Fit_Element_Map_Dict<T_real>* const elements_to_fit,
262-
const struct Range energy_range)
261+
const Fit_Element_Map_Dict<T_real>* const elements_to_fit,
262+
const struct Range energy_range,
263+
ArrayTr<T_real>* custom_background)
263264
{
264265

265266
this->_energy_range = energy_range;
267+
this->_custom_background = custom_background;
266268
_element_models.clear();
267269
//logI<<"-------- Generating element models ---------"<<"\n";
268270
_element_models = _generate_element_models(model, elements_to_fit, energy_range);
@@ -319,23 +321,29 @@ OPTIMIZER_OUTCOME Matrix_Optimized_Fit_Routine<T_real>:: fit_spectra(const model
319321

320322
ArrayTr<T_real> background;
321323

322-
323-
if(fit_params.contains(STR_SNIP_WIDTH))
324+
if(this->_custom_background == nullptr)
324325
{
325-
ArrayTr<T_real> bkg = snip_background<T_real>(spectra,
326-
fit_params.value(STR_ENERGY_OFFSET),
327-
fit_params.value(STR_ENERGY_SLOPE),
328-
fit_params.value(STR_ENERGY_QUADRATIC),
329-
fit_params.value(STR_SNIP_WIDTH),
330-
this->_energy_range.min,
331-
this->_energy_range.max);
332-
background = bkg.segment(this->_energy_range.min, this->_energy_range.count());
326+
if(fit_params.contains(STR_SNIP_WIDTH))
327+
{
328+
ArrayTr<T_real> bkg = snip_background<T_real>(spectra,
329+
fit_params.value(STR_ENERGY_OFFSET),
330+
fit_params.value(STR_ENERGY_SLOPE),
331+
fit_params.value(STR_ENERGY_QUADRATIC),
332+
fit_params.value(STR_SNIP_WIDTH),
333+
this->_energy_range.min,
334+
this->_energy_range.max);
335+
background = bkg.segment(this->_energy_range.min, this->_energy_range.count());
336+
}
337+
else
338+
{
339+
background.setZero(this->_energy_range.count());
340+
}
333341
}
334342
else
335343
{
336-
background.setZero(this->_energy_range.count());
344+
background = this->_custom_background->segment(this->_energy_range.min, this->_energy_range.count());
337345
}
338-
346+
339347
std::function<void(const models::Base_Model<T_real>* const model, const Fit_Parameters<T_real>* const, const Range* const, Spectra<T_real>*)> gen_func = std::bind(&Matrix_Optimized_Fit_Routine<T_real>::model_spectrum, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4);
340348

341349
//set num iter to 300;

0 commit comments

Comments
 (0)