From a88e424a644b8b447e6b666467c06c11c9318f26 Mon Sep 17 00:00:00 2001
From: Anton Piccardo-Selg <anton.piccardo-selg@tessella.com>
Date: Mon, 12 Oct 2015 12:09:14 +0100
Subject: [PATCH] Refs #13872 Removal of string-based constructor for
 MDHistoDim

---
 .../ReflectometryTransform.h                  |  3 +-
 .../src/ReflectometryTransform.cpp            |  6 +-
 .../DataObjects/test/MDEventWorkspaceTest.h   | 10 ++-
 .../DataObjects/test/MDHistoWorkspaceTest.h   | 82 +++++++++++--------
 .../src/ConvertToReflectometryQ.cpp           | 18 +++-
 .../test/ConvertToReflectometryQTest.h        | 27 ++++++
 6 files changed, 98 insertions(+), 48 deletions(-)

diff --git a/Framework/DataObjects/inc/MantidDataObjects/ReflectometryTransform.h b/Framework/DataObjects/inc/MantidDataObjects/ReflectometryTransform.h
index df759cbde18..c05985fe62b 100644
--- a/Framework/DataObjects/inc/MantidDataObjects/ReflectometryTransform.h
+++ b/Framework/DataObjects/inc/MantidDataObjects/ReflectometryTransform.h
@@ -75,7 +75,8 @@ public:
   // Execute the strategy to produce a transformed, output MDWorkspace
   Mantid::API::IMDEventWorkspace_sptr
   executeMD(Mantid::API::MatrixWorkspace_const_sptr inputWs,
-            Mantid::API::BoxController_sptr boxController) const;
+            Mantid::API::BoxController_sptr boxController,
+            Mantid::Geometry::MDFrame_uptr frame) const;
 
   // Execute the strategy to produce a transformed, output group of Matrix (2D)
   // Workspaces
diff --git a/Framework/DataObjects/src/ReflectometryTransform.cpp b/Framework/DataObjects/src/ReflectometryTransform.cpp
index c07b6481867..67e826a32c6 100644
--- a/Framework/DataObjects/src/ReflectometryTransform.cpp
+++ b/Framework/DataObjects/src/ReflectometryTransform.cpp
@@ -208,12 +208,12 @@ void createVerticalAxis(MatrixWorkspace *const ws, const MantidVec &xAxisVec,
  */
 Mantid::API::IMDEventWorkspace_sptr ReflectometryTransform::executeMD(
     Mantid::API::MatrixWorkspace_const_sptr inputWs,
-    BoxController_sptr boxController) const {
+    BoxController_sptr boxController, Mantid::Geometry::MDFrame_uptr frame) const {
   MDHistoDimension_sptr dim0 = MDHistoDimension_sptr(new MDHistoDimension(
-      m_d0Label, m_d0ID, "(Ang^-1)", static_cast<Mantid::coord_t>(m_d0Min),
+      m_d0Label, m_d0ID, *frame, static_cast<Mantid::coord_t>(m_d0Min),
       static_cast<Mantid::coord_t>(m_d0Max), m_d0NumBins));
   MDHistoDimension_sptr dim1 = MDHistoDimension_sptr(new MDHistoDimension(
-      m_d1Label, m_d1ID, "(Ang^-1)", static_cast<Mantid::coord_t>(m_d1Min),
+      m_d1Label, m_d1ID, *frame, static_cast<Mantid::coord_t>(m_d1Min),
       static_cast<Mantid::coord_t>(m_d1Max), m_d1NumBins));
 
   auto ws = createMDWorkspace(dim0, dim1, boxController);
diff --git a/Framework/DataObjects/test/MDEventWorkspaceTest.h b/Framework/DataObjects/test/MDEventWorkspaceTest.h
index 16ccafffd9b..314e810a591 100644
--- a/Framework/DataObjects/test/MDEventWorkspaceTest.h
+++ b/Framework/DataObjects/test/MDEventWorkspaceTest.h
@@ -92,10 +92,10 @@ public:
 
   void test_copy_constructor() {
     MDEventWorkspace<MDLeanEvent<3>, 3> ew3;
-
+    Mantid::Geometry::GeneralFrame frame("m", "m");
     for (size_t i = 0; i < 3; i++) {
       ew3.addDimension(
-          MDHistoDimension_sptr(new MDHistoDimension("x", "x", "m", -1, 1, 0)));
+          MDHistoDimension_sptr(new MDHistoDimension("x", "x", frame, -1, 1, 0)));
     }
     ew3.initialize();
     ew3.getBoxController()->setSplitThreshold(1);
@@ -154,20 +154,22 @@ public:
 
   void test_initialize_throws() {
     IMDEventWorkspace *ew = new MDEventWorkspace<MDLeanEvent<3>, 3>();
+    Mantid::Geometry::GeneralFrame frame("m", "m");
     TS_ASSERT_THROWS(ew->initialize(), std::runtime_error);
     for (size_t i = 0; i < 5; i++)
       ew->addDimension(
-          MDHistoDimension_sptr(new MDHistoDimension("x", "x", "m", -1, 1, 0)));
+          MDHistoDimension_sptr(new MDHistoDimension("x", "x", frame, -1, 1, 0)));
     TS_ASSERT_THROWS(ew->initialize(), std::runtime_error);
     delete ew;
   }
 
   void test_initialize() {
     IMDEventWorkspace *ew = new MDEventWorkspace<MDLeanEvent<3>, 3>();
+    Mantid::Geometry::GeneralFrame frame("m", "m");
     TS_ASSERT_THROWS(ew->initialize(), std::runtime_error);
     for (size_t i = 0; i < 3; i++)
       ew->addDimension(
-          MDHistoDimension_sptr(new MDHistoDimension("x", "x", "m", -1, 1, 0)));
+          MDHistoDimension_sptr(new MDHistoDimension("x", "x", frame, -1, 1, 0)));
     TS_ASSERT_THROWS_NOTHING(ew->initialize());
     delete ew;
   }
diff --git a/Framework/DataObjects/test/MDHistoWorkspaceTest.h b/Framework/DataObjects/test/MDHistoWorkspaceTest.h
index e978ead39a4..cd95eb6326c 100644
--- a/Framework/DataObjects/test/MDHistoWorkspaceTest.h
+++ b/Framework/DataObjects/test/MDHistoWorkspaceTest.h
@@ -79,10 +79,11 @@ public:
 
   //--------------------------------------------------------------------------------------
   void test_constructor() {
-    MDHistoDimension_sptr dimX(new MDHistoDimension("X", "x", "m", -10, 10, 5));
-    MDHistoDimension_sptr dimY(new MDHistoDimension("Y", "y", "m", -10, 10, 5));
-    MDHistoDimension_sptr dimZ(new MDHistoDimension("Z", "z", "m", -10, 10, 5));
-    MDHistoDimension_sptr dimT(new MDHistoDimension("T", "t", "m", -10, 10, 5));
+    Mantid::Geometry::GeneralFrame frame("m", "m");
+    MDHistoDimension_sptr dimX(new MDHistoDimension("X", "x", frame, -10, 10, 5));
+    MDHistoDimension_sptr dimY(new MDHistoDimension("Y", "y", frame, -10, 10, 5));
+    MDHistoDimension_sptr dimZ(new MDHistoDimension("Z", "z", frame, -10, 10, 5));
+    MDHistoDimension_sptr dimT(new MDHistoDimension("T", "t", frame, -10, 10, 5));
 
     MDHistoWorkspace ws(dimX, dimY, dimZ, dimT);
 
@@ -155,8 +156,9 @@ public:
   //---------------------------------------------------------------------------------------------------
   /** Create a dense histogram with only 2 dimensions */
   void test_constructor_fewerDimensions() {
-    MDHistoDimension_sptr dimX(new MDHistoDimension("X", "x", "m", -10, 10, 5));
-    MDHistoDimension_sptr dimY(new MDHistoDimension("Y", "y", "m", -10, 10, 5));
+    Mantid::Geometry::GeneralFrame frame("m", "m");
+    MDHistoDimension_sptr dimX(new MDHistoDimension("X", "x", frame, -10, 10, 5));
+    MDHistoDimension_sptr dimY(new MDHistoDimension("Y", "y", frame, -10, 10, 5));
 
     MDHistoWorkspace ws(dimX, dimY);
 
@@ -184,9 +186,10 @@ public:
   /** Create a dense histogram with 7 dimensions */
   void test_constructor_MoreThanFourDimensions() {
     std::vector<MDHistoDimension_sptr> dimensions;
+    Mantid::Geometry::GeneralFrame frame("m", "m");
     for (size_t i = 0; i < 7; i++) {
       dimensions.push_back(MDHistoDimension_sptr(
-          new MDHistoDimension("Dim", "Dim", "m", -10, 10, 3)));
+          new MDHistoDimension("Dim", "Dim", frame, -10, 10, 3)));
     }
 
     MDHistoWorkspace ws(dimensions);
@@ -239,7 +242,8 @@ public:
 
   //---------------------------------------------------------------------------------------------------
   void test_getVertexesArray_1D() {
-    MDHistoDimension_sptr dimX(new MDHistoDimension("X", "x", "m", -10, 10, 5));
+    Mantid::Geometry::GeneralFrame frame("m", "m");
+    MDHistoDimension_sptr dimX(new MDHistoDimension("X", "x", frame, -10, 10, 5));
     MDHistoWorkspace ws(dimX);
     size_t numVertices;
     coord_t *v1 = ws.getVertexesArray(0, numVertices);
@@ -256,8 +260,9 @@ public:
 
   //---------------------------------------------------------------------------------------------------
   void test_getVertexesArray_2D() {
-    MDHistoDimension_sptr dimX(new MDHistoDimension("X", "x", "m", -10, 10, 5));
-    MDHistoDimension_sptr dimY(new MDHistoDimension("Y", "y", "m", -10, 10, 5));
+    Mantid::Geometry::GeneralFrame frame("m", "m");
+    MDHistoDimension_sptr dimX(new MDHistoDimension("X", "x", frame, -10, 10, 5));
+    MDHistoDimension_sptr dimY(new MDHistoDimension("Y", "y", frame, -10, 10, 5));
     MDHistoWorkspace ws(dimX, dimY);
     size_t numVertices, i;
 
@@ -281,9 +286,10 @@ public:
 
   //---------------------------------------------------------------------------------------------------
   void test_getVertexesArray_3D() {
-    MDHistoDimension_sptr dimX(new MDHistoDimension("X", "x", "m", -10, 10, 5));
-    MDHistoDimension_sptr dimY(new MDHistoDimension("Y", "y", "m", -9, 10, 5));
-    MDHistoDimension_sptr dimZ(new MDHistoDimension("Z", "z", "m", -8, 10, 5));
+    Mantid::Geometry::GeneralFrame frame("m", "m");
+    MDHistoDimension_sptr dimX(new MDHistoDimension("X", "x", frame, -10, 10, 5));
+    MDHistoDimension_sptr dimY(new MDHistoDimension("Y", "y", frame, -9, 10, 5));
+    MDHistoDimension_sptr dimZ(new MDHistoDimension("Z", "z", frame, -8, 10, 5));
     MDHistoWorkspace ws(dimX, dimY, dimZ);
     size_t numVertices, i;
 
@@ -297,10 +303,11 @@ public:
 
   //---------------------------------------------------------------------------------------------------
   void test_getCenter_3D() {
+    Mantid::Geometry::GeneralFrame frame("m", "m");
     MDHistoDimension_sptr dimX(
-        new MDHistoDimension("X", "x", "m", -10, 10, 20));
-    MDHistoDimension_sptr dimY(new MDHistoDimension("Y", "y", "m", -9, 10, 19));
-    MDHistoDimension_sptr dimZ(new MDHistoDimension("Z", "z", "m", -8, 10, 18));
+        new MDHistoDimension("X", "x", frame, -10, 10, 20));
+    MDHistoDimension_sptr dimY(new MDHistoDimension("Y", "y", frame, -9, 10, 19));
+    MDHistoDimension_sptr dimZ(new MDHistoDimension("Z", "z", frame, -8, 10, 18));
     MDHistoWorkspace ws(dimX, dimY, dimZ);
     VMD v = ws.getCenter(0);
     TS_ASSERT_DELTA(v[0], -9.5, 1e-5);
@@ -311,13 +318,14 @@ public:
   //---------------------------------------------------------------------------------------------------
   /** Test for a possible seg-fault if nx != ny etc. */
   void test_uneven_numbers_of_bins() {
-    MDHistoDimension_sptr dimX(new MDHistoDimension("X", "x", "m", -10, 10, 5));
+    Mantid::Geometry::GeneralFrame frame("m", "m");
+    MDHistoDimension_sptr dimX(new MDHistoDimension("X", "x", frame, -10, 10, 5));
     MDHistoDimension_sptr dimY(
-        new MDHistoDimension("Y", "y", "m", -10, 10, 10));
+        new MDHistoDimension("Y", "y", frame, -10, 10, 10));
     MDHistoDimension_sptr dimZ(
-        new MDHistoDimension("Z", "z", "m", -10, 10, 20));
+        new MDHistoDimension("Z", "z", frame, -10, 10, 20));
     MDHistoDimension_sptr dimT(
-        new MDHistoDimension("T", "t", "m", -10, 10, 10));
+        new MDHistoDimension("T", "t", frame, -10, 10, 10));
 
     MDHistoWorkspace ws(dimX, dimY, dimZ, dimT);
 
@@ -348,10 +356,11 @@ public:
 
   //---------------------------------------------------------------------------------------------------
   void test_createIterator() {
+    Mantid::Geometry::GeneralFrame frame("m", "m");
     MDHistoDimension_sptr dimX(
-        new MDHistoDimension("X", "x", "m", -10, 10, 10));
-    MDHistoDimension_sptr dimY(new MDHistoDimension("Y", "y", "m", -9, 10, 10));
-    MDHistoDimension_sptr dimZ(new MDHistoDimension("Z", "z", "m", -8, 10, 10));
+        new MDHistoDimension("X", "x", frame, -10, 10, 10));
+    MDHistoDimension_sptr dimY(new MDHistoDimension("Y", "y", frame, -9, 10, 10));
+    MDHistoDimension_sptr dimZ(new MDHistoDimension("Z", "z", frame, -8, 10, 10));
     MDHistoWorkspace ws(dimX, dimY, dimZ);
     IMDIterator *it = ws.createIterator();
     TS_ASSERT(it);
@@ -369,14 +378,15 @@ public:
   //---------------------------------------------------------------------------------------------------
   // Test for the IMDWorkspace aspects of MDWorkspace.
   void testGetNonIntegratedDimensions() {
+    Mantid::Geometry::GeneralFrame frame("m", "m");
     MDHistoDimension_sptr dimX(
-        new MDHistoDimension("X", "x", "m", -10, 10, 1)); // Integrated.
+        new MDHistoDimension("X", "x", frame, -10, 10, 1)); // Integrated.
     MDHistoDimension_sptr dimY(
-        new MDHistoDimension("Y", "y", "m", -10, 10, 10));
+        new MDHistoDimension("Y", "y", frame, -10, 10, 10));
     MDHistoDimension_sptr dimZ(
-        new MDHistoDimension("Z", "z", "m", -10, 10, 20));
+        new MDHistoDimension("Z", "z", frame, -10, 10, 20));
     MDHistoDimension_sptr dimT(
-        new MDHistoDimension("T", "t", "m", -10, 10, 10));
+        new MDHistoDimension("T", "t", frame, -10, 10, 10));
 
     MDHistoWorkspace ws(dimX, dimY, dimZ, dimT);
     Mantid::Geometry::VecIMDDimension_const_sptr vecNonIntegratedDims =
@@ -419,11 +429,11 @@ public:
         "<RefDimensionId>z</RefDimensionId>" + "</ZDimension>" +
         "<TDimension>" + "<RefDimensionId>t</RefDimensionId>" +
         "</TDimension>" + "</DimensionSet>";
-
-    MDHistoDimension_sptr dimX(new MDHistoDimension("X", "x", "m", -10, 10, 5));
-    MDHistoDimension_sptr dimY(new MDHistoDimension("Y", "y", "m", -10, 10, 5));
-    MDHistoDimension_sptr dimZ(new MDHistoDimension("Z", "z", "m", -10, 10, 5));
-    MDHistoDimension_sptr dimT(new MDHistoDimension("T", "t", "m", -10, 10, 5));
+    Mantid::Geometry::GeneralFrame frame("m", "m");
+    MDHistoDimension_sptr dimX(new MDHistoDimension("X", "x", frame, -10, 10, 5));
+    MDHistoDimension_sptr dimY(new MDHistoDimension("Y", "y", frame, -10, 10, 5));
+    MDHistoDimension_sptr dimZ(new MDHistoDimension("Z", "z", frame, -10, 10, 5));
+    MDHistoDimension_sptr dimT(new MDHistoDimension("T", "t", frame, -10, 10, 5));
 
     MDHistoWorkspace ws(dimX, dimY, dimZ, dimT);
 
@@ -1001,7 +1011,8 @@ public:
   }
 
   void test_displayNormalizationDefault() {
-    MDHistoDimension_sptr dimX(new MDHistoDimension("X", "x", "m", -10, 10, 5));
+    Mantid::Geometry::GeneralFrame frame("m", "m");
+    MDHistoDimension_sptr dimX(new MDHistoDimension("X", "x", frame, -10, 10, 5));
     // Constructor variant 1.
     MDHistoWorkspace ws1(dimX);
     TS_ASSERT_EQUALS(Mantid::API::NoNormalization, ws1.displayNormalization());
@@ -1018,10 +1029,9 @@ public:
   }
 
   void test_setDisplayNormalization() {
-
     auto targetDisplayNormalization = Mantid::API::VolumeNormalization;
-
-    MDHistoDimension_sptr dimX(new MDHistoDimension("X", "x", "m", -10, 10, 5));
+    Mantid::Geometry::GeneralFrame frame("m", "m");
+    MDHistoDimension_sptr dimX(new MDHistoDimension("X", "x", frame, -10, 10, 5));
     // Constructor variant 1.
     MDHistoWorkspace ws1(dimX, dimX, dimX, dimX, targetDisplayNormalization);
     TS_ASSERT_EQUALS(targetDisplayNormalization, ws1.displayNormalization());
diff --git a/Framework/MDAlgorithms/src/ConvertToReflectometryQ.cpp b/Framework/MDAlgorithms/src/ConvertToReflectometryQ.cpp
index 43447b0003f..8ca7d86719f 100644
--- a/Framework/MDAlgorithms/src/ConvertToReflectometryQ.cpp
+++ b/Framework/MDAlgorithms/src/ConvertToReflectometryQ.cpp
@@ -20,6 +20,9 @@
 #include "MantidMDAlgorithms/ReflectometryTransformQxQz.h"
 #include "MantidMDAlgorithms/ReflectometryTransformP.h"
 
+#include "MantidGeometry/MDGeometry/QLab.h"
+#include "MantidGeometry/MDGeometry/GeneralFrame.h"
+
 #include <boost/optional.hpp>
 #include <boost/shared_ptr.hpp>
 #include <boost/make_shared.hpp>
@@ -330,31 +333,38 @@ void ConvertToReflectometryQ::exec() {
   BoxController_sptr bc = boost::make_shared<BoxController>(2);
   this->setBoxController(bc);
 
-  // Select the transform strategy.
+  // Select the transform strategy and an appropriate MDFrame
   ReflectometryTransform_sptr transform;
-
+  Mantid::Geometry::MDFrame_uptr frame;
   if (outputDimensions == qSpaceTransform()) {
     transform = boost::make_shared<ReflectometryTransformQxQz>(
         dim0min, dim0max, dim1min, dim1max, incidentTheta, numberOfBinsQx,
         numberOfBinsQz);
+    frame.reset(new Mantid::Geometry::QLab);
   } else if (outputDimensions == pSpaceTransform()) {
     transform = boost::make_shared<ReflectometryTransformP>(
         dim0min, dim0max, dim1min, dim1max, incidentTheta, numberOfBinsQx,
         numberOfBinsQz);
+    frame.reset(new Mantid::Geometry::GeneralFrame(
+        "P",
+        Mantid::Kernel::InverseAngstromsUnit().getUnitLabel()));
   } else {
     transform = boost::make_shared<ReflectometryTransformKiKf>(
         dim0min, dim0max, dim1min, dim1max, incidentTheta, numberOfBinsQx,
         numberOfBinsQz);
+    frame.reset(new Mantid::Geometry::GeneralFrame(
+        "KiKf",
+        Mantid::Kernel::InverseAngstromsUnit().getUnitLabel()));
   }
 
   IMDWorkspace_sptr outputWS;
 
   TableWorkspace_sptr vertexes =
       boost::make_shared<Mantid::DataObjects::TableWorkspace>();
-
+  
   if (outputAsMDWorkspace) {
     if (transMethod == centerTransform()) {
-      auto outputMDWS = transform->executeMD(inputWs, bc);
+      auto outputMDWS = transform->executeMD(inputWs, bc, std::move(frame));
       // Copy ExperimentInfo (instrument, run, sample) to the output WS
       ExperimentInfo_sptr ei(inputWs->cloneExperimentInfo());
       outputMDWS->addExperimentInfo(ei);
diff --git a/Framework/MDAlgorithms/test/ConvertToReflectometryQTest.h b/Framework/MDAlgorithms/test/ConvertToReflectometryQTest.h
index fe9704e809e..c2ae270aed5 100644
--- a/Framework/MDAlgorithms/test/ConvertToReflectometryQTest.h
+++ b/Framework/MDAlgorithms/test/ConvertToReflectometryQTest.h
@@ -12,6 +12,9 @@
 #include "MantidTestHelpers/WorkspaceCreationHelper.h"
 #include "MantidDataObjects/Workspace2D.h"
 
+#include "MantidGeometry/MDGeometry/GeneralFrame.h"
+#include "MantidGeometry/MDGeometry/QLab.h"
+
 #include <boost/assign.hpp>
 
 #include <cxxtest/TestSuite.h>
@@ -152,6 +155,14 @@ public:
             "OutputTransformedWorkspace"));
     TS_ASSERT(ws != NULL);
     TS_ASSERT_EQUALS(2, ws->getExperimentInfo(0)->run().getLogData().size());
+   // Assert that dimensions should be a general frame
+    const auto &frame0 = ws->getDimension(0)->getMDFrame();
+    TSM_ASSERT_THROWS_NOTHING(
+        "Should be a QLab frame",
+        dynamic_cast<const Mantid::Geometry::QLab &>(frame0));
+    TSM_ASSERT_EQUALS(
+        "Should have a special coordinate system selection of QLab",
+        ws->getSpecialCoordinateSystem(), Mantid::Kernel::QLab);
   }
 
   void test_execute_kikf_md() {
@@ -161,6 +172,14 @@ public:
         Mantid::API::AnalysisDataService::Instance().retrieve(
             "OutputTransformedWorkspace"));
     TS_ASSERT(ws != NULL);
+    // Assert that dimensions should be a general frame
+    const auto &frame0 = ws->getDimension(0)->getMDFrame();
+    TSM_ASSERT_THROWS_NOTHING(
+        "Should be a general frame",
+        dynamic_cast<const Mantid::Geometry::GeneralFrame &>(frame0));
+    TSM_ASSERT_EQUALS(
+        "Should have a special coordinate system selection of None",
+        ws->getSpecialCoordinateSystem(), Mantid::Kernel::None);
   }
 
   void test_execute_pipf_md() {
@@ -170,6 +189,14 @@ public:
         Mantid::API::AnalysisDataService::Instance().retrieve(
             "OutputTransformedWorkspace"));
     TS_ASSERT(ws != NULL);
+    // Assert that dimensions should be a general frame
+    const auto &frame0 = ws->getDimension(0)->getMDFrame();
+    TSM_ASSERT_THROWS_NOTHING(
+        "Should be a general frame",
+        dynamic_cast<const Mantid::Geometry::GeneralFrame &>(frame0));
+    TSM_ASSERT_EQUALS(
+        "Should have a special coordinate system selection of None",
+        ws->getSpecialCoordinateSystem(), Mantid::Kernel::None);
   }
 
   void test_execute_qxqz_2D() {
-- 
GitLab