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