From 1b70f1475ef41dfaa91b4fc75c70a6a3186c022f Mon Sep 17 00:00:00 2001
From: Anton Piccardo-Selg <anton.piccardo-selg@tessella.com>
Date: Mon, 12 Oct 2015 13:46:00 +0100
Subject: [PATCH] Refs #13872 Add frame name to builder

---
 .../MDGeometry/MDHistoDimension.h             |  1 +
 .../MDGeometry/MDHistoDimensionBuilder.h      |  3 ++
 .../MDGeometry/MDHistoDimensionBuilder.cpp    | 21 +++++++++--
 .../test/MDHistoDimensionBuilderTest.h        | 36 ++++++++++++++++++-
 .../Geometry/test/MDHistoDimensionTest.h      | 22 ++++++------
 5 files changed, 70 insertions(+), 13 deletions(-)

diff --git a/Framework/Geometry/inc/MantidGeometry/MDGeometry/MDHistoDimension.h b/Framework/Geometry/inc/MantidGeometry/MDGeometry/MDHistoDimension.h
index b1f79d2c1cb..6e719ea6833 100644
--- a/Framework/Geometry/inc/MantidGeometry/MDGeometry/MDHistoDimension.h
+++ b/Framework/Geometry/inc/MantidGeometry/MDGeometry/MDHistoDimension.h
@@ -23,6 +23,7 @@ namespace Geometry {
  */
 class MANTID_GEOMETRY_DLL MDHistoDimension : public IMDDimension {
 public:
+
   /** Constructor for simple MDHistoDimension
   * @param name :: full name of the axis
   * @param ID :: identifier string
diff --git a/Framework/Geometry/inc/MantidGeometry/MDGeometry/MDHistoDimensionBuilder.h b/Framework/Geometry/inc/MantidGeometry/MDGeometry/MDHistoDimensionBuilder.h
index 26ffcbab3bf..cc7e302beae 100644
--- a/Framework/Geometry/inc/MantidGeometry/MDGeometry/MDHistoDimensionBuilder.h
+++ b/Framework/Geometry/inc/MantidGeometry/MDGeometry/MDHistoDimensionBuilder.h
@@ -28,6 +28,7 @@ public:
   void setMin(double min);
   void setMax(double max);
   void setNumBins(size_t nbins);
+  void setFrameName(std::string frameName);
 
   size_t getNumBins() const { return m_nbins; }
   MDHistoDimension *createRaw();
@@ -52,6 +53,8 @@ private:
   bool m_minSet;
   /// Flag indicating that max has been set.
   bool m_maxSet;
+  /// Frame name
+  std::string m_frameName;
 };
 
 /// Handy typedef for collection of builders.
diff --git a/Framework/Geometry/src/MDGeometry/MDHistoDimensionBuilder.cpp b/Framework/Geometry/src/MDGeometry/MDHistoDimensionBuilder.cpp
index ff3e0a28571..57d5fe5db8f 100644
--- a/Framework/Geometry/src/MDGeometry/MDHistoDimensionBuilder.cpp
+++ b/Framework/Geometry/src/MDGeometry/MDHistoDimensionBuilder.cpp
@@ -1,6 +1,7 @@
 #include "MantidGeometry/MDGeometry/MDHistoDimensionBuilder.h"
 #include "MantidKernel/Strings.h"
 #include "MantidKernel/UnitLabelTypes.h"
+#include "MantidGeometry/MDGeometry/MDFrameFactory.h"
 
 namespace Mantid {
 namespace Geometry {
@@ -8,7 +9,7 @@ namespace Geometry {
 /// Constructor
 MDHistoDimensionBuilder::MDHistoDimensionBuilder()
     : m_units(Kernel::Units::Symbol::EmptyLabel), m_min(0), m_max(0),
-      m_nbins(0), m_minSet(false), m_maxSet(false) {}
+      m_nbins(0), m_minSet(false), m_maxSet(false), m_frameName("") {}
 
 /// Destructor
 MDHistoDimensionBuilder::~MDHistoDimensionBuilder() {}
@@ -38,6 +39,7 @@ operator=(const MDHistoDimensionBuilder &other) {
     m_nbins = other.m_nbins;
     m_maxSet = other.m_maxSet;
     m_minSet = other.m_minSet;
+    m_frameName = other.m_frameName;
   }
   return *this;
 }
@@ -89,6 +91,14 @@ Setter for the dimension nbins
 */
 void MDHistoDimensionBuilder::setNumBins(size_t nbins) { m_nbins = nbins; }
 
+/**
+ * Setter for the frame name
+ * @param frameName: the frame name
+ */
+void MDHistoDimensionBuilder::setFrameName(std::string frameName) {
+  m_frameName = frameName;
+}
+
 /*
 Creational method
 @return fully constructed MDHistoDimension instance.
@@ -122,7 +132,14 @@ MDHistoDimension *MDHistoDimensionBuilder::createRaw() {
     throw std::invalid_argument(
         "Cannot create MDHistogramDimension without setting a n bins.");
   }
-  return new MDHistoDimension(m_name, m_id, m_units, coord_t(m_min),
+
+  // Select a Mantid Frame. Use FrameName if available else just use name.
+  auto frameFactory = Mantid::Geometry::makeMDFrameFactoryChain();
+  std::string frameNameForFactory = m_frameName.empty() ? m_name : m_frameName;
+  Mantid::Geometry::MDFrameArgument frameArgument(frameNameForFactory, m_units);
+  auto frame = frameFactory->create(frameArgument);
+
+  return new MDHistoDimension(m_name, m_id, *frame, coord_t(m_min),
                               coord_t(m_max), m_nbins);
 }
 
diff --git a/Framework/Geometry/test/MDHistoDimensionBuilderTest.h b/Framework/Geometry/test/MDHistoDimensionBuilderTest.h
index 77fe43e78a5..e627b4e7523 100644
--- a/Framework/Geometry/test/MDHistoDimensionBuilderTest.h
+++ b/Framework/Geometry/test/MDHistoDimensionBuilderTest.h
@@ -3,6 +3,8 @@
 
 #include <cxxtest/TestSuite.h>
 #include "MantidGeometry/MDGeometry/MDHistoDimensionBuilder.h"
+#include "MantidGeometry/MDGeometry/QLab.h"
+#include "MantidGeometry/MDGeometry/QSample.h"
 
 using Mantid::Geometry::MDHistoDimension;
 using Mantid::Geometry::MDHistoDimensionBuilder;
@@ -18,15 +20,20 @@ public:
     builder.setMin(0);
     builder.setMax(2);
     builder.setNumBins(1);
+    builder.setFrameName("QLab");
 
     MDHistoDimension *product = builder.createRaw();
 
     TS_ASSERT_EQUALS("testDimName", product->getName());
     TS_ASSERT_EQUALS("testDimId", product->getDimensionId());
-    TS_ASSERT_EQUALS("A^-1", product->getUnits().ascii());
+    Mantid::Kernel::InverseAngstromsUnit expectedUnit;
+    TS_ASSERT_EQUALS(expectedUnit.getUnitLabel(), product->getUnits().ascii());
     TS_ASSERT_EQUALS(0, product->getMinimum());
     TS_ASSERT_EQUALS(2, product->getMaximum());
     TS_ASSERT_EQUALS(1, product->getNBins());
+    TSM_ASSERT_THROWS_NOTHING(
+        "Should have selected QLab as the frame",
+        dynamic_cast<const Mantid::Geometry::QLab &>(product->getMDFrame()));
     delete product;
   }
 
@@ -38,6 +45,30 @@ public:
     builder.setMin(0);
     builder.setMax(2);
     builder.setNumBins(1);
+    builder.setFrameName("QSample");
+
+    IMDDimension_sptr product;
+    TS_ASSERT_THROWS_NOTHING(product = builder.create());
+    TS_ASSERT_EQUALS("testDimName", product->getName());
+    TS_ASSERT_EQUALS("testDimId", product->getDimensionId());
+    Mantid::Kernel::InverseAngstromsUnit expectedUnit;
+    TS_ASSERT_EQUALS(expectedUnit.getUnitLabel(), product->getUnits().ascii());
+    TS_ASSERT_EQUALS(0, product->getMinimum());
+    TS_ASSERT_EQUALS(2, product->getMaximum());
+    TS_ASSERT_EQUALS(1, product->getNBins());
+    TSM_ASSERT_THROWS_NOTHING(
+        "Should have selected QSample as the frame",
+        dynamic_cast<const Mantid::Geometry::QSample &>(product->getMDFrame()));
+  }
+
+  void testConstruct_without_frame_name() {
+    MDHistoDimensionBuilder builder;
+    builder.setName("testDimName");
+    builder.setId("testDimId");
+    builder.setUnits("A^-1");
+    builder.setMin(0);
+    builder.setMax(2);
+    builder.setNumBins(1);
 
     IMDDimension_sptr product;
     TS_ASSERT_THROWS_NOTHING(product = builder.create());
@@ -47,6 +78,9 @@ public:
     TS_ASSERT_EQUALS(0, product->getMinimum());
     TS_ASSERT_EQUALS(2, product->getMaximum());
     TS_ASSERT_EQUALS(1, product->getNBins());
+    TSM_ASSERT_THROWS_NOTHING(
+        "Should have selected GeneralFrame as the frame",
+        dynamic_cast<const Mantid::Geometry::GeneralFrame &>(product->getMDFrame()));
   }
 
   void testCopy() {
diff --git a/Framework/Geometry/test/MDHistoDimensionTest.h b/Framework/Geometry/test/MDHistoDimensionTest.h
index 63474366e71..65329f94d1f 100644
--- a/Framework/Geometry/test/MDHistoDimensionTest.h
+++ b/Framework/Geometry/test/MDHistoDimensionTest.h
@@ -18,13 +18,15 @@ public:
   void test_constructor_throws() {
     coord_t min = 10;
     coord_t max = 1; // min > max !
+    Mantid::Geometry::GeneralFrame frame("My General Frame", "Furlongs");
     TSM_ASSERT_THROWS("Should throw if min > max!",
-                      MDHistoDimension("name", "id", "Furlongs", min, max, 15),
+                      MDHistoDimension("name", "id", frame, min, max, 15),
                       std::invalid_argument);
   }
 
   void test_constructor() {
-    MDHistoDimension d("name", "id", "Furlongs", -10, 20.0, 15);
+    Mantid::Geometry::GeneralFrame frame("My General Frame", "Furlongs");
+    MDHistoDimension d("name", "id", frame, -10, 20.0, 15);
     TS_ASSERT_EQUALS(d.getName(), "name");
     TS_ASSERT_EQUALS(d.getDimensionId(), "id");
     TS_ASSERT_EQUALS(d.getUnits(), "Furlongs");
@@ -37,14 +39,14 @@ public:
   void test_toXMLStringIntegrated() {
     std::string expectedXML =
         std::string("<Dimension ID=\"id\">") + "<Name>name</Name>" +
-        "<Units>Furlongs</Units>" + "<Frame>Unknown frame</Frame>" +
+        "<Units>Furlongs</Units>" + "<Frame>My General Frame</Frame>" +
         "<UpperBounds>20.0000</UpperBounds>" +
         "<LowerBounds>-10.0000</LowerBounds>" +
         "<NumberOfBins>1</NumberOfBins>" + "<Integrated>" +
         "<UpperLimit>20.0000</UpperLimit>" +
         "<LowerLimit>-10.0000</LowerLimit>" + "</Integrated>" + "</Dimension>";
-
-    MDHistoDimension dimension("name", "id", "Furlongs", -10, 20.0, 1);
+    Mantid::Geometry::GeneralFrame frame("Furlongs", "Furlongs");
+    MDHistoDimension dimension("name", "id", frame, -10, 20.0, 1);
     std::string actualXML = dimension.toXMLString();
     TS_ASSERT_EQUALS(expectedXML, actualXML);
   }
@@ -52,20 +54,20 @@ public:
   void test_toXMLStringNotIntegrated() {
     std::string expectedXML =
         std::string("<Dimension ID=\"id\">") + "<Name>name</Name>" +
-        "<Units>Furlongs</Units>" + "<Frame>Unknown frame</Frame>" +
+        "<Units>Furlongs</Units>" + "<Frame>My General Frame</Frame>" +
         "<UpperBounds>20.0000</UpperBounds>" +
         "<LowerBounds>-10.0000</LowerBounds>" +
         "<NumberOfBins>15</NumberOfBins>" + "</Dimension>";
-
-    MDHistoDimension dimension("name", "id", "Furlongs", -10, 20.0, 15);
+    Mantid::Geometry::GeneralFrame frame("My General Frame", "Furlongs");
+    MDHistoDimension dimension("name", "id", frame, -10, 20.0, 15);
     std::string actualXML = dimension.toXMLString();
     TS_ASSERT_EQUALS(expectedXML, actualXML);
   }
 
   void test_getMDUnits_gives_label_unit() {
-
     Kernel::UnitLabel unitLabel("Meters");
-    MDHistoDimension dimension("Distance", "Dist", unitLabel, 0, 10, 1);
+     Mantid::Geometry::GeneralFrame frame("Length", unitLabel);
+    MDHistoDimension dimension("Distance", "Dist", frame, 0, 10, 1);
     const Mantid::Kernel::MDUnit &unit = dimension.getMDUnits();
     TS_ASSERT_EQUALS(unit.getUnitLabel(), unitLabel);
     TS_ASSERT(dynamic_cast<const Mantid::Kernel::LabelUnit *>(&unit));
-- 
GitLab