From b10f05513ad6117f2633c05d11228966362d4812 Mon Sep 17 00:00:00 2001 From: Gennady Pospelov <g.pospelov@fz-juelich.de> Date: Fri, 17 Jun 2016 13:57:18 +0200 Subject: [PATCH] Signal/slot renaming between FitSuiteWidget and GUIFitObserver to better describe what is flying around. --- .../Views/FitWidgets/FitActivityPanel.cpp | 4 +- .../Views/FitWidgets/FitProgressInfo.cpp | 24 +++++++++++ .../Views/FitWidgets/FitProgressInfo.h | 41 +++++++++++++++++++ .../Views/FitWidgets/FitSuiteWidget.cpp | 30 ++++++++++---- GUI/coregui/Views/FitWidgets/FitSuiteWidget.h | 7 ++-- .../Views/FitWidgets/GUIFitObserver.cpp | 30 ++++++++------ GUI/coregui/Views/FitWidgets/GUIFitObserver.h | 21 ++++------ .../Views/FitWidgets/RunFitControlWidget.cpp | 4 +- .../Views/FitWidgets/RunFitControlWidget.h | 4 +- GUI/coregui/utils/GUIHelpers.cpp | 7 ++++ GUI/coregui/utils/GUIHelpers.h | 1 + 11 files changed, 130 insertions(+), 43 deletions(-) create mode 100644 GUI/coregui/Views/FitWidgets/FitProgressInfo.cpp create mode 100644 GUI/coregui/Views/FitWidgets/FitProgressInfo.h diff --git a/GUI/coregui/Views/FitWidgets/FitActivityPanel.cpp b/GUI/coregui/Views/FitWidgets/FitActivityPanel.cpp index bace44d2372..17b69f52cbf 100644 --- a/GUI/coregui/Views/FitWidgets/FitActivityPanel.cpp +++ b/GUI/coregui/Views/FitWidgets/FitActivityPanel.cpp @@ -43,8 +43,8 @@ FitActivityPanel::FitActivityPanel(JobModel *jobModel, QWidget *parent) setLayout(mainLayout); - connect(m_controlWidget, SIGNAL(startFitting()), this, SLOT(onStartFittingRequest())); - connect(m_controlWidget, SIGNAL(stopFitting()), this, SLOT(onStopFittingRequest())); + connect(m_controlWidget, SIGNAL(startFittingPushed()), this, SLOT(onStartFittingRequest())); + connect(m_controlWidget, SIGNAL(stopFittingPushed()), this, SLOT(onStopFittingRequest())); m_stackedWidget->setModel(jobModel); } diff --git a/GUI/coregui/Views/FitWidgets/FitProgressInfo.cpp b/GUI/coregui/Views/FitWidgets/FitProgressInfo.cpp new file mode 100644 index 00000000000..469929e6be1 --- /dev/null +++ b/GUI/coregui/Views/FitWidgets/FitProgressInfo.cpp @@ -0,0 +1,24 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file GUI/coregui/Views/FitWidgets/FitProgressInfo.cpp +//! @brief Implements class FitProgressInfo +//! +//! @homepage http://www.bornagainproject.org +//! @license GNU General Public License v3 or higher (see COPYING) +//! @copyright Forschungszentrum Jülich GmbH 2016 +//! @authors Scientific Computing Group at MLZ Garching +//! @authors Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov +//! @authors Walter Van Herck, Joachim Wuttke +// +// ************************************************************************** // + +#include "FitProgressInfo.h" + +FitProgressInfo::FitProgressInfo() + : m_chi2(0.0) + , m_iteration_count(0) +{ + +} diff --git a/GUI/coregui/Views/FitWidgets/FitProgressInfo.h b/GUI/coregui/Views/FitWidgets/FitProgressInfo.h new file mode 100644 index 00000000000..e45697ad281 --- /dev/null +++ b/GUI/coregui/Views/FitWidgets/FitProgressInfo.h @@ -0,0 +1,41 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file GUI/coregui/Views/FitWidgets/FitProgressInfo.h +//! @brief Declares class FitProgressInfo +//! +//! @homepage http://www.bornagainproject.org +//! @license GNU General Public License v3 or higher (see COPYING) +//! @copyright Forschungszentrum Jülich GmbH 2016 +//! @authors Scientific Computing Group at MLZ Garching +//! @authors Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov +//! @authors Walter Van Herck, Joachim Wuttke +// +// ************************************************************************** // + +#ifndef FITPROGRESSINFO_H +#define FITPROGRESSINFO_H + +#include "WinDllMacros.h" +#include <QVector> + +//! The FitProgressInfo class contains all essential information about fit progress. +//! It is send from GUIFitObserver to FitSuiteWidget on every nth iteration. + +class BA_CORE_API_ FitProgressInfo { +public: + FitProgressInfo(); + + double chi2() const { return m_chi2; } + int iterationCount() const { return m_iteration_count; } + QVector<double> parValues() const { return m_values; } + + friend class GUIFitObserver; +private: + double m_chi2; + int m_iteration_count; + QVector<double> m_values; +}; + +#endif diff --git a/GUI/coregui/Views/FitWidgets/FitSuiteWidget.cpp b/GUI/coregui/Views/FitWidgets/FitSuiteWidget.cpp index e4c45c0e960..f8ced507ba1 100644 --- a/GUI/coregui/Views/FitWidgets/FitSuiteWidget.cpp +++ b/GUI/coregui/Views/FitWidgets/FitSuiteWidget.cpp @@ -30,6 +30,7 @@ #include "MinimizerSettingsWidget.h" #include "FitResultsWidget.h" #include "mainwindow_constants.h" +#include "FitProgressInfo.h" #include "GUIHelpers.h" #include <QVBoxLayout> #include <QTabWidget> @@ -98,10 +99,10 @@ void FitSuiteWidget::onError(const QString &text) qDebug() << "FitSuiteWidget::onError" << text; } -void FitSuiteWidget::onUpdatePlots() +void FitSuiteWidget::onPlotsUpdate() { qDebug() << "FitSuiteWidget::onUpdatePlots"; - m_currentItem->getIntensityDataItem()->setRawDataVector(m_observer->getSimulationData()); + m_currentItem->getIntensityDataItem()->setRawDataVector(m_observer->simulationData()); m_observer->finishedPlotting(); } @@ -133,7 +134,7 @@ void FitSuiteWidget::onUpdateParameters(const QStringList ¶meters, QVector<d } } -void FitSuiteWidget::onUpdateStatus(const QString &text) +void FitSuiteWidget::onStatusUpdate(const QString &text) { Q_ASSERT(m_currentItem); qDebug() << "FitSuiteWidget::onUpdateStatus(const QString &text)" << text; @@ -144,6 +145,11 @@ void FitSuiteWidget::onUpdateStatus(const QString &text) fitSuiteItem->setItemValue(FitSuiteItem::P_ITERATION_COUNT, niter); } +void FitSuiteWidget::onProgressInfoUpdate(const FitProgressInfo &info) +{ + +} + void FitSuiteWidget::startFitting() { if(!m_currentItem) @@ -222,13 +228,19 @@ void FitSuiteWidget::connectSignals() connect(m_runFitManager, SIGNAL(finishedFitting()), this, SLOT(onFittingFinished())); connect(m_runFitManager, SIGNAL(fittingError(QString)), this, SIGNAL(fittingError(QString))); - connect(m_observer.get(), SIGNAL(updatePlots()), - this, SLOT(onUpdatePlots())); - connect(m_observer.get(), SIGNAL(updateParameters(QStringList,QVector<double>)), + connect(m_observer.get(), SIGNAL(plotsUpdate()), this, SLOT(onPlotsUpdate())); + + connect(m_observer.get(), SIGNAL(parameterUpdate(QStringList,QVector<double>)), this, SLOT(onUpdateParameters(QStringList,QVector<double>))); - connect(m_observer.get(), SIGNAL(updateStatus(QString)), - this, SLOT(onUpdateStatus(QString))); - connect(m_observer.get(), SIGNAL(updateLog(QString)), + + connect(m_observer.get(), SIGNAL(statusUpdate(QString)), this, SLOT(onStatusUpdate(QString))); + + connect(m_observer.get(), SIGNAL(logInfoUpdate(QString)), this, SIGNAL(fittingLog(QString))); + + + connect(m_observer.get(), SIGNAL(progressInfoUpdate(FitProgressInfo)), + this, SLOT(onProgressInfoUpdate(QString))); + } diff --git a/GUI/coregui/Views/FitWidgets/FitSuiteWidget.h b/GUI/coregui/Views/FitWidgets/FitSuiteWidget.h index ca1ecae6d3d..46571354f61 100644 --- a/GUI/coregui/Views/FitWidgets/FitSuiteWidget.h +++ b/GUI/coregui/Views/FitWidgets/FitSuiteWidget.h @@ -32,6 +32,7 @@ class ParameterTuningWidget; class RunFitManager; class GUIFitObserver; template <class T> class OutputData; +class FitProgressInfo; //! The FitSuiteWidget contains all fit settings for given JobItem (fit parameters, @@ -60,9 +61,10 @@ signals: public slots: void onError(const QString &text); - void onUpdatePlots(); + void onPlotsUpdate(); void onUpdateParameters(const QStringList ¶meters, QVector<double> values); - void onUpdateStatus(const QString &text); + void onStatusUpdate(const QString &text); + void onProgressInfoUpdate(const FitProgressInfo &info); void startFitting(); void stopFitting(); @@ -70,7 +72,6 @@ public slots: private slots: void onFittingStarted(); void onFittingFinished(); - void onFitSuitePropertyChange(const QString &name); private: diff --git a/GUI/coregui/Views/FitWidgets/GUIFitObserver.cpp b/GUI/coregui/Views/FitWidgets/GUIFitObserver.cpp index 19389c8102d..607d0a00823 100644 --- a/GUI/coregui/Views/FitWidgets/GUIFitObserver.cpp +++ b/GUI/coregui/Views/FitWidgets/GUIFitObserver.cpp @@ -19,6 +19,9 @@ #include "IntensityDataItem.h" #include "FitParameter.h" #include "FitSuiteParameters.h" +#include "FitProgressInfo.h" +#include "GUIHelpers.h" +#include <QVector> #include <QDebug> @@ -54,9 +57,9 @@ void GUIFitObserver::update(FitSuite *subject) qDebug() << (*it)->getValue(); } } - emit updateParameters(parameters, values); + emit parameterUpdate(parameters, values); - emit updateLog(QString("NCalls: %1 Chi: %2\n%3"). + emit logInfoUpdate(QString("NCalls: %1 Chi: %2\n%3"). arg(QString::number(subject->getNumberOfIterations()), QString::number(subject->getChi2()), QString::fromStdString(text))); @@ -66,28 +69,31 @@ void GUIFitObserver::update(FitSuite *subject) std::streambuf *old = std::cout.rdbuf(buffer.rdbuf()); subject->printResults(); std::string text = buffer.str(); - emit updateLog(QString::fromStdString(text)); + emit logInfoUpdate(QString::fromStdString(text)); std::cout.rdbuf(old); } - int curIteration = subject->getNumberOfIterations(); - if (curIteration == 0) { - emit startFitting(subject->getRealOutputData()->clone()); - } + if(canUpdateStatus(subject)) { + emit statusUpdate(QString::number(subject->getNumberOfIterations())); + FitProgressInfo info; + info.m_chi2 = subject->getChi2(); + info.m_iteration_count = subject->getNumberOfIterations(); + info.m_values = GUIHelpers::fromStdVector(subject->getFitParameters()->getValues()); + emit progressInfoUpdate(info); - if(canUpdateStatus(subject)) { - emit updateStatus(QString::number(subject->getNumberOfIterations())); } if(canUpdatePlots(subject)) { m_block_update_plots = true; m_simData.reset(subject->getSimulationOutputData()->clone()); m_chiData.reset(subject->getChiSquaredOutputData()->clone()); - emit updatePlots(); + emit plotsUpdate(); } + + } void GUIFitObserver::setInterval(int val) @@ -120,12 +126,12 @@ void GUIFitObserver::finishedPlotting() m_block_update_plots = false; } -const OutputData<double> *GUIFitObserver::getSimulationData() const +const OutputData<double> *GUIFitObserver::simulationData() const { return m_simData.get(); } -const OutputData<double> *GUIFitObserver::getChiSquaredData() const +const OutputData<double> *GUIFitObserver::chiSquaredData() const { return m_chiData.get(); } diff --git a/GUI/coregui/Views/FitWidgets/GUIFitObserver.h b/GUI/coregui/Views/FitWidgets/GUIFitObserver.h index 58b76b69656..a18e461e0bf 100644 --- a/GUI/coregui/Views/FitWidgets/GUIFitObserver.h +++ b/GUI/coregui/Views/FitWidgets/GUIFitObserver.h @@ -24,6 +24,7 @@ template <class T> class OutputData; class FitSuite; class IntensityDataItem; +class FitProgressInfo; //! The GUIFitObserver class is a intermediate between FitSuite and the GUI. //! It is called at the end of each iterations and sends (messages, data) to the rest of the GUI. @@ -40,24 +41,18 @@ public: void finishedPlotting(); - const OutputData<double> *getSimulationData() const; - const OutputData<double> *getChiSquaredData() const; + const OutputData<double> *simulationData() const; + const OutputData<double> *chiSquaredData() const; public slots: - void setInterval(int val); signals: - - void updateStatus(const QString &); - - void updatePlots(); - - void updateLog(const QString &); - - void startFitting(OutputData<double>*); - - void updateParameters(const QStringList &, QVector<double>); + void statusUpdate(const QString &); + void plotsUpdate(); + void logInfoUpdate(const QString &); + void parameterUpdate(const QStringList &, QVector<double>); + void progressInfoUpdate(const FitProgressInfo &info); private: bool canUpdatePlots(FitSuite *fitSuite); diff --git a/GUI/coregui/Views/FitWidgets/RunFitControlWidget.cpp b/GUI/coregui/Views/FitWidgets/RunFitControlWidget.cpp index cd7d19eb70c..8894ceab392 100644 --- a/GUI/coregui/Views/FitWidgets/RunFitControlWidget.cpp +++ b/GUI/coregui/Views/FitWidgets/RunFitControlWidget.cpp @@ -89,8 +89,8 @@ RunFitControlWidget::RunFitControlWidget(QWidget *parent) layout->addWidget(m_iterationsCountLabel); setLayout(layout); - connect(m_startButton, SIGNAL(clicked(bool)), this, SIGNAL(startFitting())); - connect(m_stopButton, SIGNAL(clicked(bool)), this, SIGNAL(stopFitting())); + connect(m_startButton, SIGNAL(clicked(bool)), this, SIGNAL(startFittingPushed())); + connect(m_stopButton, SIGNAL(clicked(bool)), this, SIGNAL(stopFittingPushed())); connect(m_intervalSlider, SIGNAL(valueChanged(int)), this, SLOT(onSliderValueChanged(int))); setEnabled(false); diff --git a/GUI/coregui/Views/FitWidgets/RunFitControlWidget.h b/GUI/coregui/Views/FitWidgets/RunFitControlWidget.h index 360911496f0..a1464fa6e2b 100644 --- a/GUI/coregui/Views/FitWidgets/RunFitControlWidget.h +++ b/GUI/coregui/Views/FitWidgets/RunFitControlWidget.h @@ -40,8 +40,8 @@ public: void setJobMessagePanel(JobMessagePanel *jobMessagePanel); signals: - void startFitting(); - void stopFitting(); + void startFittingPushed(); + void stopFittingPushed(); public slots: void onFittingStarted(JobItem *jobItem); diff --git a/GUI/coregui/utils/GUIHelpers.cpp b/GUI/coregui/utils/GUIHelpers.cpp index 984ab77bbe5..446810e22ef 100644 --- a/GUI/coregui/utils/GUIHelpers.cpp +++ b/GUI/coregui/utils/GUIHelpers.cpp @@ -228,5 +228,12 @@ QStringList fromStdList(const std::list<std::string> &string_list) return result; } +QVector<double> fromStdVector(const std::vector<double> &data) +{ + QVector<double> result; + result.reserve(int(data.size())); std::copy(data.begin(), data.end(), std::back_inserter(result)); + return result; +} + } // namespace GUIHelpers diff --git a/GUI/coregui/utils/GUIHelpers.h b/GUI/coregui/utils/GUIHelpers.h index 7611e3b9586..c2d4ee795b4 100644 --- a/GUI/coregui/utils/GUIHelpers.h +++ b/GUI/coregui/utils/GUIHelpers.h @@ -71,6 +71,7 @@ BA_CORE_API_ bool isVersionMatchMinimal(const QString &version, const QString &m BA_CORE_API_ QString currentDateTime(); BA_CORE_API_ QStringList fromStdList(const std::list<std::string> &string_list); +BA_CORE_API_ QVector<double> fromStdVector(const std::vector<double> &data); template<class T, class... Ts> std::unique_ptr<T> make_unique(Ts&&... params) { -- GitLab