diff --git a/GUI/Model/Job/FitSuiteItem.cpp b/GUI/Model/Job/FitSuiteItem.cpp index 2c52cea0aa81743859275c7d9d1545e427554e82..f1df138e0ff43174167ab6a1700e1d0cf1bb0d53 100644 --- a/GUI/Model/Job/FitSuiteItem.cpp +++ b/GUI/Model/Job/FitSuiteItem.cpp @@ -23,20 +23,30 @@ namespace { namespace Tag { +const QString UpdateInterval("UpdateInterval"); +const QString IterationsCount("IterationsCount"); +const QString Chi2("Chi2"); + +const QString MinimizerContainer("MinimizerContainer"); const QString FitParameterContainer("FitParameterContainer"); } // namespace Tag +namespace Attrib { + +const QString value("value"); + +} // namespace Attrib + } // namespace FitSuiteItem::FitSuiteItem() : SessionItem(M_TYPE) + , m_updateInterval(10) + , m_iterCount(0) + , m_chi2(0.0) { - addProperty(P_UPDATE_INTERVAL, int(10)); - addProperty(P_ITERATION_COUNT, int(0)); - addProperty(P_CHI2, double(0.0)); - - registerTag(T_MINIMIZER, 1, 1, {MinimizerContainerItem::M_TYPE}); + setObjectName("FitSuite"); } FitParameterContainerItem* FitSuiteItem::createFitParametersContainer() @@ -56,52 +66,75 @@ FitParameterContainerItem* FitSuiteItem::fitParameterContainerItem() MinimizerContainerItem* FitSuiteItem::createMinimizerContainer() { - if (getItem(T_MINIMIZER)) + if (m_minimizerContainer) throw Error("FitSuiteItem::createMinimizerContainer() -> Error. Attempt to create " "a second MinimizerContainer."); - return model()->insertItem<MinimizerContainerItem>(this, -1, T_MINIMIZER); + m_minimizerContainer = std::make_unique<MinimizerContainerItem>(); + return m_minimizerContainer.get(); } MinimizerContainerItem* FitSuiteItem::minimizerContainerItem() { - return item<MinimizerContainerItem>(T_MINIMIZER); + return m_minimizerContainer.get(); } int FitSuiteItem::updateInterval() const { - return getItemValue(P_UPDATE_INTERVAL).toInt(); + return m_updateInterval; } -void FitSuiteItem::setUpdateInterval(const int interval) +void FitSuiteItem::setUpdateInterval(int interval) { - setItemValue(P_UPDATE_INTERVAL, interval); + m_updateInterval = interval; emit updateIntervalChanged(interval); } int FitSuiteItem::iterationCount() const { - return getItemValue(P_ITERATION_COUNT).toInt(); + return m_iterCount; } -void FitSuiteItem::setIterationCount(const int count) +void FitSuiteItem::setIterationCount(int count) { - setItemValue(P_ITERATION_COUNT, count); + m_iterCount = count; emit iterationCountChanged(count); } double FitSuiteItem::chi2() const { - return getItemValue(P_CHI2).toDouble(); + return m_chi2; } void FitSuiteItem::setChi2(const double chi2) { - setItemValue(P_CHI2, chi2); + m_chi2 = chi2; } void FitSuiteItem::writeNonSessionItems(QXmlStreamWriter* writer) const { + // update interval + writer->writeStartElement(Tag::UpdateInterval); + GUI::Session::XML::writeAttribute(writer, Attrib::value, m_updateInterval); + writer->writeEndElement(); + + // iterations count + writer->writeStartElement(Tag::IterationsCount); + GUI::Session::XML::writeAttribute(writer, Attrib::value, m_iterCount); + writer->writeEndElement(); + + // chi2 + writer->writeStartElement(Tag::Chi2); + GUI::Session::XML::writeAttribute(writer, Attrib::value, m_chi2); + writer->writeEndElement(); + + // minimizer container + if (m_minimizerContainer) { + writer->writeStartElement(Tag::MinimizerContainer); + m_minimizerContainer->writeTo(writer); + writer->writeEndElement(); + } + // fit parameter container if (m_fitContainer) { writer->writeStartElement(Tag::FitParameterContainer); @@ -114,12 +147,34 @@ void FitSuiteItem::readNonSessionItems(QXmlStreamReader* reader) { while (reader->readNextStartElement()) { - // fit parameter container - if (reader->name() == Tag::FitParameterContainer) { - if (!m_fitContainer) - createFitParametersContainer(); - m_fitContainer->readFrom(reader); - GUI::Session::XML::gotoEndElementOfTag(reader, Tag::FitParameterContainer); + // update interval + if (reader->name() == Tag::UpdateInterval) { + GUI::Session::XML::readAttribute(reader, Attrib::value, &m_updateInterval); + GUI::Session::XML::gotoEndElementOfTag(reader, Tag::UpdateInterval); + + // iterations count + } else if (reader->name() == Tag::IterationsCount) { + GUI::Session::XML::readAttribute(reader, Attrib::value, &m_iterCount); + GUI::Session::XML::gotoEndElementOfTag(reader, Tag::IterationsCount); + + // chi2 + } else if (reader->name() == Tag::Chi2) { + GUI::Session::XML::readAttribute(reader, Attrib::value, &m_chi2); + GUI::Session::XML::gotoEndElementOfTag(reader, Tag::Chi2); + + // minimizer container + } else if (reader->name() == Tag::MinimizerContainer) { + if (!m_minimizerContainer) + createMinimizerContainer(); + m_minimizerContainer->readFrom(reader); + GUI::Session::XML::gotoEndElementOfTag(reader, Tag::MinimizerContainer); + + // fit parameter container + } else if (reader->name() == Tag::FitParameterContainer) { + if (!m_fitContainer) + createFitParametersContainer(); + m_fitContainer->readFrom(reader); + GUI::Session::XML::gotoEndElementOfTag(reader, Tag::FitParameterContainer); } else { reader->skipCurrentElement(); diff --git a/GUI/Model/Job/FitSuiteItem.h b/GUI/Model/Job/FitSuiteItem.h index c91e85d2154b4083a21ec6b1c4afaf8bd025f398..a0be3e4e3d67d1165874f706d90625aa2844f854 100644 --- a/GUI/Model/Job/FitSuiteItem.h +++ b/GUI/Model/Job/FitSuiteItem.h @@ -23,12 +23,6 @@ class MinimizerContainerItem; class BA_CORE_API_ FitSuiteItem : public QObject, public SessionItem { Q_OBJECT -private: - static constexpr auto P_UPDATE_INTERVAL{"Update interval"}; - static constexpr auto P_ITERATION_COUNT{"Number of iterations"}; - static constexpr auto P_CHI2{"Chi2"}; - static constexpr auto T_MINIMIZER{"Minimizer settings"}; - public: static constexpr auto M_TYPE{"FitSuite"}; @@ -57,6 +51,10 @@ signals: void updateIntervalChanged(int interval); private: + int m_updateInterval; + int m_iterCount; + double m_chi2; + std::unique_ptr<MinimizerContainerItem> m_minimizerContainer; std::unique_ptr<FitParameterContainerItem> m_fitContainer; }; diff --git a/GUI/Model/Job/JobItem.cpp b/GUI/Model/Job/JobItem.cpp index 0b9d5f280e596771a6888cb140dd15c5695ad697..31e4365aa5d906946cd3dd6cff83dac0e381dcdb 100644 --- a/GUI/Model/Job/JobItem.cpp +++ b/GUI/Model/Job/JobItem.cpp @@ -12,7 +12,6 @@ // // ************************************************************************************************ -#include "GUI/Model/Job/JobItem.h" #include "Base/Util/Assert.h" #include "Device/Detector/SimulationAreaIterator.h" #include "GUI/Model/CatDevice/InstrumentItemCatalog.h" @@ -25,6 +24,8 @@ #include "GUI/Model/Device/InstrumentItems.h" #include "GUI/Model/Job/FitParameterContainerItem.h" #include "GUI/Model/Job/FitSuiteItem.h" +#include "GUI/Model/Job/JobItem.h" +#include "GUI/Model/Job/MinimizerItem.h" #include "GUI/Model/Job/ParameterTreeItems.h" #include "GUI/Model/Model/SessionXML.h" // writeItemAndChildItems #include "GUI/Model/Sample/ItemWithMaterial.h" diff --git a/Tests/Unit/GUI/TestFitParameterModel.cpp b/Tests/Unit/GUI/TestFitParameterModel.cpp index dd7e07e25dfe93e55804c27026d043e64e57d435..bdeec6dc656d9e7ec3aedf88349a4fa83085d7ce 100644 --- a/Tests/Unit/GUI/TestFitParameterModel.cpp +++ b/Tests/Unit/GUI/TestFitParameterModel.cpp @@ -2,6 +2,7 @@ #include "GUI/Model/Job/FitParameterItem.h" #include "GUI/Model/Job/FitParameterLinkItem.h" #include "GUI/Model/Job/FitSuiteItem.h" +#include "GUI/Model/Job/MinimizerItem.h" #include "GUI/Model/Model/FitParameterModel.h" #include "GUI/Model/Model/JobModel.h" #include "Tests/GTestWrapper/google_test.h"