BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
FitSessionController.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/FitSessionController.cpp
6 //! @brief Implements class FitSessionController
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 
25 
26 namespace {
27 const bool use_fit_objective = true;
28 }
29 
31  : QObject(parent)
32  , m_jobItem(nullptr)
33  , m_runFitManager(new FitWorkerLauncher(this))
34  , m_observer(new GUIFitObserver)
35  , m_fitlog(new FitLog)
36  , m_block_progress_update(false)
37 {
38  connect(m_observer.get(), &GUIFitObserver::updateReady, this,
40 
47 }
48 
50 
52 {
53  if (m_jobItem && m_jobItem != item)
54  throw GUIHelpers::Error("FitSuiteManager::setItem() -> Item was already set.");
55 
56  m_jobItem = item;
58 
59  // no need to unsubscribe from jobItem on jobItem destroy. FitSessionManager deletes
60  // controller right after the jobItem.
61 
62  // Propagates update interval from FitSuiteItem to fit observer.
64  [this](const QString& name) {
66  m_observer->setInterval(m_jobItem->fitSuiteItem()
68  .toInt());
69  }
70  },
71  this);
72 }
73 
75 {
76  if (!m_jobItem)
77  return;
78 
79  try {
80  m_objectiveBuilder = std::make_unique<FitObjectiveBuilder>(m_jobItem);
81  m_observer->setInterval(
83  m_objectiveBuilder->attachObserver(m_observer);
84  m_observer->finishedPlotting();
86 
87  } catch (std::exception& e) {
88  m_jobItem->setStatus("Failed");
89  m_fitlog->append(e.what(), FitLogFlags::ERROR);
90  emit fittingError(QString::fromStdString(e.what()));
91  }
92 }
93 
95 {
96  return m_fitlog.get();
97 }
98 
100 {
102 }
103 
105 {
106  auto progressInfo = m_observer->progressInfo();
107  m_jobItem->dataItem()->setRawDataVector(progressInfo.simValues());
108 
109  updateIterationCount(progressInfo);
110 
111  if (!use_fit_objective)
112  updateFitParameterValues(progressInfo);
113 
114  updateLog(progressInfo);
115 
116  if (!progressInfo.logInfo().empty())
117  m_fitlog->append(progressInfo.logInfo(), FitLogFlags::DEFAULT);
118 
119  m_observer->finishedPlotting();
120 }
121 
123 {
124  m_fitlog->clearLog();
125 
126  m_jobItem->setStatus("Fitting");
129  m_jobItem->setEndTime(QString());
131 
132  emit fittingStarted();
133 }
134 
136 {
137  if (m_jobItem->getStatus() != "Failed")
138  m_jobItem->setStatus("Completed");
140  m_jobItem->setProgress(100);
142 
143  if (m_jobItem->isCompleted())
144  m_fitlog->append("Done", FitLogFlags::SUCCESS);
145 
146  emit fittingFinished();
147 }
148 
149 void FitSessionController::onFittingError(const QString& text)
150 {
151  QString message;
152  message.append("Current settings cause fitting failure.\n\n");
153  message.append(text);
154  m_fitlog->append(message.toStdString(), FitLogFlags::ERROR);
155 
156  emit fittingError(message);
157 }
158 
160 {
161  FitSuiteItem* fitSuiteItem = m_jobItem->fitSuiteItem();
162  // FIXME FitFlowWidget updates chi2 and n_iteration on P_ITERATION_COUNT change
163  // The order of two lines below is important
164  fitSuiteItem->setItemValue(FitSuiteItem::P_CHI2, info.chi2());
166 }
167 
169 {
170  QVector<double> values = GUIHelpers::fromStdVector(info.parValues());
173 }
174 
176 {
177  QString message = QString("NCalls:%1 chi2:%2 \n").arg(info.iterationCount()).arg(info.chi2());
179  int index(0);
180  QVector<double> values = GUIHelpers::fromStdVector(info.parValues());
181  for (auto item : fitParContainer->getItems(FitParameterContainerItem::T_FIT_PARAMETERS)) {
182  if (item->getItems(FitParameterItem::T_LINK).empty())
183  continue;
184  QString parinfo = QString(" %1 %2\n").arg(item->displayName()).arg(values[index++]);
185  message.append(parinfo);
186  }
187  m_fitlog->append(message.toStdString(), FitLogFlags::DEFAULT);
188 }
#define ASSERT(condition)
Definition: Assert.h:31
Defines class FitLog.
Defines class FitObjectiveBuilder.
Defines FitParameterItems family of classes.
Defines class FitSessionController.
Defines class FitSuiteItem.
Implements class FitWorkerLauncher.
Implements class GUIFitObserver.
Defines class GUIHelpers functions.
Defines class IntensityDataItem.
Defines class JobItem.
void setRawDataVector(std::vector< double > data)
Sets the raw data vector from external source Checks only the equality of data size,...
Definition: DataItem.cpp:30
Definition: FitLog.h:24
static const QString T_FIT_PARAMETERS
void setValuesInParameterContainer(const QVector< double > &values, class ParameterContainerItem *parameterContainer)
Propagate values to the corresponding parameter tree items of parameterContainer.
static const QString T_LINK
The FitProgressInfo class contains all essential information about fit progress.
std::vector< double > parValues() const
int iterationCount() const
double chi2() const
void onFittingError(const QString &text)
std::shared_ptr< GUIFitObserver > m_observer
std::unique_ptr< FitLog > m_fitlog
void fittingError(const QString &message)
void updateIterationCount(const FitProgressInfo &info)
FitWorkerLauncher * m_runFitManager
void updateFitParameterValues(const FitProgressInfo &info)
void updateLog(const FitProgressInfo &info)
FitSessionController(QObject *parent=nullptr)
std::shared_ptr< FitObjectiveBuilder > m_objectiveBuilder
void setItem(JobItem *item)
static const QString P_UPDATE_INTERVAL
Definition: FitSuiteItem.h:26
static const QString P_CHI2
Definition: FitSuiteItem.h:28
static const QString P_ITERATION_COUNT
Definition: FitSuiteItem.h:27
void runFitting(std::shared_ptr< FitObjectiveBuilder > suite)
void fittingError(const QString &message)
int getDuration()
Returns duration of fit in msec.
Serves as observer for FitObjective and saves fit iteration data for later display in GUI widgets.
void updateReady()
void setProgress(int progress)
Definition: JobItem.cpp:204
FitParameterContainerItem * fitParameterContainerItem()
Definition: JobItem.cpp:251
FitSuiteItem * fitSuiteItem()
Definition: JobItem.cpp:235
bool isCompleted() const
Definition: JobItem.cpp:150
void setBeginTime(const QString &begin_time)
Definition: JobItem.cpp:170
DataItem * dataItem()
Definition: JobItem.cpp:118
QString getStatus() const
Definition: JobItem.cpp:123
void setDuration(int duration)
Definition: JobItem.cpp:181
ParameterContainerItem * parameterContainerItem()
Definition: JobItem.cpp:240
void setStatus(const QString &status)
Definition: JobItem.cpp:128
void setEndTime(const QString &end_time)
Definition: JobItem.cpp:175
void setOnPropertyChange(std::function< void(QString)> f, const void *caller=0)
Definition: ModelMapper.cpp:35
QVector< SessionItem * > getItems(const QString &tag="") const
Returns vector of all items of given tag.
QVariant getItemValue(const QString &tag) const
Directly access value of item under given tag.
ModelMapper * mapper()
Returns the current model mapper of this item. Creates new one if necessary.
void setItemValue(const QString &tag, const QVariant &variant)
Directly set value of item under given tag.
QString currentDateTime()
Definition: GUIHelpers.cpp:210
QVector< double > fromStdVector(const std::vector< double > &data)
Definition: GUIHelpers.cpp:225
QString const & name(EShape k)
Definition: particles.cpp:21