From f7277e3b5667d95235c88c3c960d4f51aed1b0db Mon Sep 17 00:00:00 2001 From: Gennady Pospelov <g.pospelov@fz-juelich.de> Date: Fri, 10 Jun 2016 15:07:38 +0200 Subject: [PATCH] SimulationSetupAssistant now validates correspondance of realData and Instrument item during submit of fitting job. --- .../SimulationSetupAssistant.cpp | 69 +++++++++++++++++-- .../SimulationSetupAssistant.h | 4 +- 2 files changed, 68 insertions(+), 5 deletions(-) diff --git a/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.cpp b/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.cpp index b6152c479d0..e3e97c37a40 100644 --- a/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.cpp +++ b/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.cpp @@ -16,7 +16,15 @@ #include "SimulationSetupAssistant.h" #include "SampleValidator.h" +#include "RealDataItem.h" +#include "IntensityDataItem.h" +#include "InstrumentItem.h" +#include "DetectorItems.h" +#include "AxesItems.h" +#include "IDetector2D.h" +#include "IAxis.h" #include <QMessageBox> +#include <QDebug> //! Returns true if given setup is valid for submitting the job @@ -59,7 +67,6 @@ void SimulationSetupAssistant::checkMultiLayerItem(const MultiLayerItem *multiLa m_isValid = false; m_messages.append(sampleValidator.getValidationMessage()); } - } } @@ -71,11 +78,26 @@ void SimulationSetupAssistant::checkInstrumentItem(const InstrumentItem *instrum } } +//! Check if setup is suitable for fitting. In the case when there is a realData defined, +//! its axes will be compared with current detector item. + void SimulationSetupAssistant::checkFittingSetup(const InstrumentItem *instrumentItem, - const RealDataItem *realData) + const RealDataItem *realData) { - Q_UNUSED(instrumentItem); - Q_UNUSED(realData); + if(!realData) + return; + + int nxData(0), nyData(0), nxDetector(0), nyDetector(0); + realDataShape(realData, nxData, nyData); + detectorShape(instrumentItem, nxDetector, nyDetector); + + if(nxData != nxDetector || nyData != nyDetector) { + m_isValid = false; + m_messages.append("The realData doesn't match selected instrument."); + QString message = QString("Different shape of axes \n Detector [%1, %2], realData[%3, %4].") + .arg(nxDetector).arg(nyDetector).arg(nxData).arg(nyData); + m_messages.append(message); + } } //! Composes the error message for message box. @@ -89,3 +111,42 @@ QString SimulationSetupAssistant::composeMessage() } return result; } + +//! Returns shape of RealDataItem axes. + +void SimulationSetupAssistant::realDataShape(const RealDataItem *realData, int &nx, int &ny) +{ + nx = ny = 0; + if(const IntensityDataItem *intensityItem = realData->intensityDataItem()) { + SessionItem *xaxis = intensityItem->getItem(IntensityDataItem::P_XAXIS); + nx = xaxis->getItemValue(BasicAxisItem::P_NBINS).toInt(); + SessionItem *yaxis = intensityItem->getItem(IntensityDataItem::P_XAXIS); + ny = yaxis->getItemValue(BasicAxisItem::P_NBINS).toInt(); + } +} + +//! Returns shape of Instrument's detector axes. + +void SimulationSetupAssistant::detectorShape(const InstrumentItem *instrumentItem, int &nx, int &ny) +{ + nx = ny = 0; + DetectorItem *detectorItem = instrumentItem ->getDetectorItem(); + Q_ASSERT(detectorItem); + + auto subDetector = detectorItem->getGroupItem(DetectorItem::P_DETECTOR); + Q_ASSERT(subDetector); + + std::unique_ptr<IDetector2D> detector; + + if(auto sphericalDetector = dynamic_cast<SphericalDetectorItem *>(subDetector)) { + detector = sphericalDetector->createDetector(); + } + + else if(auto rectangularDetector = dynamic_cast<RectangularDetectorItem *>(subDetector)) { + detector = rectangularDetector->createDetector(); + } + + Q_ASSERT(detector.get()); + nx = detector->getAxis(0).getSize(); + ny = detector->getAxis(1).getSize(); +} diff --git a/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.h b/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.h index 34cb02600bf..f2995a7d55b 100644 --- a/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.h +++ b/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.h @@ -34,7 +34,6 @@ public: bool isValidSimulationSetup(const MultiLayerItem *multiLayerItem, const InstrumentItem *instrumentItem, const RealDataItem *realData = 0); - private: void clear(); void checkMultiLayerItem(const MultiLayerItem *multiLayerItem); @@ -42,6 +41,9 @@ private: void checkFittingSetup(const InstrumentItem *instrumentItem, const RealDataItem *realData); QString composeMessage(); + void realDataShape(const RealDataItem *realData, int &nx, int &ny); + void detectorShape(const InstrumentItem *instrumentItem, int &nx, int &ny); + bool m_isValid; QStringList m_messages; }; -- GitLab