BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
GUIFitObserver.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Views/FitWidgets/GUIFitObserver.cpp
6 //! @brief Implements class GUIFitObserver
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
19 
21  : QObject(parent), m_block_update_plots(false), m_update_interval(1)
22 {
23 }
24 
26 
28 {
29  if (!is_suitable_iteration(subject))
30  return;
31 
32  std::unique_lock<std::mutex> lock(m_update_plot_mutex);
34  return; // plotting still works, will skip iteration
35 
37  m_on_finish_notifier.wait(lock, [this]() { return m_block_update_plots; });
38 
39  FitProgressInfo info;
40  info.m_chi2 = subject->iterationInfo().chi2();
41  info.m_iteration_count = static_cast<int>(subject->iterationInfo().iterationCount());
42  info.m_values = subject->iterationInfo().parameters().values();
43 
44  if (subject->isCompleted())
45  info.m_log_info = subject->minimizerResult().toString();
46 
47  auto data = subject->dataPair().simulationResult().data();
48  info.m_sim_values = data->getRawDataVector();
49 
50  m_iteration_info = info;
51  emit updateReady();
52 }
53 
54 //! Returns true if data could be plotted, when there are resources for it.
55 
57 {
58  if (fitSuite->isInterrupted())
59  return false;
60 
61  int n_iter = static_cast<int>(fitSuite->iterationInfo().iterationCount());
62  return fitSuite->isFirstIteration() || n_iter % m_update_interval == 0
63  || fitSuite->isCompleted();
64 }
65 
66 //! Returns true if given iteration should be obligary plotted.
67 
69 {
70  return fitSuite->isCompleted();
71 }
72 
74 {
75  m_update_interval = val;
76 }
77 
78 //! Informs observer that FitSuiteWidget has finished plotting and is ready for next plot
79 
81 {
82  std::unique_lock<std::mutex> lock(m_update_plot_mutex);
83  m_block_update_plots = false;
84  lock.unlock();
85  m_on_finish_notifier.notify_one();
86 }
87 
89 {
90  std::unique_lock<std::mutex> lock(m_update_plot_mutex);
91  m_block_update_plots = true;
92  return m_iteration_info;
93 }
Defines class FitObjective.
Implements class GUIFitObserver.
Defines class GUIHelpers functions.
Declares namespace MinimizerUtils.
Holds vector of SimDataPairs (experimental data and simulation results) for use in fitting.
Definition: FitObjective.h:33
bool isFirstIteration() const
IterationInfo iterationInfo() const
mumufit::MinimizerResult minimizerResult() const
bool isInterrupted() const
const SimDataPair & dataPair(size_t i_item=0) const
Returns a reference to i-th SimDataPair.
bool isCompleted() const
The FitProgressInfo class contains all essential information about fit progress.
std::string m_log_info
std::vector< double > m_values
std::vector< double > m_sim_values
std::condition_variable m_on_finish_notifier
void setInterval(int val)
void finishedPlotting()
Informs observer that FitSuiteWidget has finished plotting and is ready for next plot.
bool is_suitable_iteration(const FitObjective *fitSuite) const
Returns true if data could be plotted, when there are resources for it.
bool is_obligatory_iteration(const FitObjective *fitSuite) const
Returns true if given iteration should be obligary plotted.
void updateReady()
FitProgressInfo m_iteration_info
FitProgressInfo progressInfo()
GUIFitObserver(QObject *parent=nullptr)
bool m_block_update_plots
void update(const FitObjective *subject)
std::mutex m_update_plot_mutex
unsigned iterationCount() const
Returns current number of minimizer iterations.
mumufit::Parameters parameters() const
double chi2() const
SimulationResult simulationResult() const
Returns the result of last computed simulation.
Definition: SimDataPair.cpp:96
std::unique_ptr< OutputData< double > > data(Axes::Units units=Axes::Units::DEFAULT) const
std::string toString() const
Returns multi-line string representing minimization results.
std::vector< double > values() const
Definition: Parameters.cpp:56