From c9e59bdf1d530ab769b142efc4344a21d49f3bc7 Mon Sep 17 00:00:00 2001
From: Janik Zikovsky <zikovskyjl@ornl.gov>
Date: Thu, 2 Jun 2011 14:06:37 +0000
Subject: [PATCH] Fixes #3124: AddSampleLog extended to create other log types
 (numbers and number series)

---
 .../Framework/Algorithms/src/AddSampleLog.cpp | 43 ++++++++-
 .../Algorithms/test/AddSampleLogTest.h        | 88 ++++++++++++++++---
 2 files changed, 115 insertions(+), 16 deletions(-)

diff --git a/Code/Mantid/Framework/Algorithms/src/AddSampleLog.cpp b/Code/Mantid/Framework/Algorithms/src/AddSampleLog.cpp
index cb0c46f3d57..d3ae6983714 100644
--- a/Code/Mantid/Framework/Algorithms/src/AddSampleLog.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/AddSampleLog.cpp
@@ -3,6 +3,9 @@
 //----------------------------------------------------------------------
 #include "MantidAlgorithms/AddSampleLog.h"
 #include "MantidKernel/Exception.h"
+#include "MantidKernel/ListValidator.h"
+#include "MantidKernel/Strings.h"
+#include "MantidKernel/TimeSeriesProperty.h"
 #include <string>
 
 namespace Mantid
@@ -16,8 +19,8 @@ DECLARE_ALGORITHM(AddSampleLog)
 /// Sets documentation strings for this algorithm
 void AddSampleLog::initDocs()
 {
-  this->setWikiSummary("Used to insert a single string into the sample in a workspace ");
-  this->setOptionalMessage("Used to insert a single string into the sample in a workspace");
+  this->setWikiSummary("Used to insert a value into the sample logs in a workspace.");
+  this->setOptionalMessage("Used to insert a value into the sample logs in a workspace.");
 }
 
 using namespace Kernel;
@@ -29,6 +32,15 @@ void AddSampleLog::init()
     "Workspace to add the log entry to");
   declareProperty("LogName", "", new MandatoryValidator<std::string>,
     "The name that will identify the log entry");
+
+  std::vector<std::string> propOptions;
+  propOptions.push_back("String");
+  propOptions.push_back("Number");
+  propOptions.push_back("Number Series");
+  declareProperty("LogType", "String",new ListValidator(propOptions),
+    "The type that the log data will be."
+     );
+
   declareProperty("LogText", "",
     "The content of the log");
 }
@@ -43,8 +55,33 @@ void AddSampleLog::exec()
   // get the data that the user wants to add
   std::string propName = getProperty("LogName");
   std::string propValue = getProperty("LogText");
+  std::string propType = getPropertyValue("LogType");
+
+  // Remove any existing log
+  if (theRun.hasProperty(propName))
+    theRun.removeLogData(propName);
 
-  theRun.addLogData(new PropertyWithValue<std::string>(propName, propValue));
+  if (propType == "String")
+  {
+    theRun.addLogData(new PropertyWithValue<std::string>(propName, propValue));
+  }
+  else if (propType == "Number")
+  {
+    double val;
+    if (!Strings::convert(propValue, val))
+      throw std::invalid_argument("Error interpreting string '" + propValue + "' as a number.");
+    theRun.addLogData(new PropertyWithValue<double>(propName, val));
+  }
+  else if (propType == "Number Series")
+  {
+    double val;
+    if (!Strings::convert(propValue, val))
+      throw std::invalid_argument("Error interpreting string '" + propValue + "' as a number.");
+    Kernel::DateAndTime now = Kernel::DateAndTime::get_current_time();
+    TimeSeriesProperty<double> * tsp = new TimeSeriesProperty<double>(propName);
+    tsp->addValue(now, val);
+    theRun.addLogData(tsp);
+  }
 
   setProperty("Workspace", wSpace);
 }
diff --git a/Code/Mantid/Framework/Algorithms/test/AddSampleLogTest.h b/Code/Mantid/Framework/Algorithms/test/AddSampleLogTest.h
index 8a71e863e86..26b4bf74c0b 100644
--- a/Code/Mantid/Framework/Algorithms/test/AddSampleLogTest.h
+++ b/Code/Mantid/Framework/Algorithms/test/AddSampleLogTest.h
@@ -8,6 +8,7 @@
 #include "MantidTestHelpers/WorkspaceCreationHelper.h"
 #include "MantidAPI/MatrixWorkspace.h"
 #include "MantidAlgorithms/AddSampleLog.h"
+#include "MantidKernel/TimeSeriesProperty.h"
 
 using namespace Mantid::Kernel;
 using namespace Mantid::API;
@@ -17,20 +18,56 @@ class AddSampleLogTest : public CxxTest::TestSuite
 {
 public:
 
-  void testInsertion2D()
+  void test_Workspace2D()
   {
-    ExecuteAlgorithm(WorkspaceCreationHelper::Create2DWorkspace(10,10));
+    MatrixWorkspace_sptr ws = WorkspaceCreationHelper::Create2DWorkspace(10,10);
+    ExecuteAlgorithm(ws, "My Name", "String", "My Value", 0.0);
   }
 
-  void testInsertionEvent()
+  void test_EventWorkspace()
   {
-    ExecuteAlgorithm(WorkspaceCreationHelper::CreateEventWorkspace(10,10));
+    MatrixWorkspace_sptr ws = WorkspaceCreationHelper::CreateEventWorkspace(10,10);
+    ExecuteAlgorithm(ws, "My Name", "String", "My Value", 0.0);
   }
 
-  void ExecuteAlgorithm(MatrixWorkspace_sptr testWS)
+  void test_CanOverwrite()
+  {
+    MatrixWorkspace_sptr ws = WorkspaceCreationHelper::Create2DWorkspace(10,10);
+    ExecuteAlgorithm(ws, "My Name", "String", "My Value", 0.0);
+    ExecuteAlgorithm(ws, "My Name", "String", "My New Value", 0.0);
+  }
+
+  void test_Number()
+  {
+    MatrixWorkspace_sptr ws = WorkspaceCreationHelper::Create2DWorkspace(10,10);
+    ExecuteAlgorithm(ws, "My Name", "Number", "1.234", 1.234);
+    ExecuteAlgorithm(ws, "My Name", "Number", "2.456", 2.456);
+  }
+
+  void test_BadNumber()
+  {
+    MatrixWorkspace_sptr ws = WorkspaceCreationHelper::Create2DWorkspace(10,10);
+    ExecuteAlgorithm(ws, "My Name", "Number", "OneTwoThreeFour", 0.0, true);
+  }
+
+  void test_BadNumberSeries()
+  {
+    MatrixWorkspace_sptr ws = WorkspaceCreationHelper::Create2DWorkspace(10,10);
+    ExecuteAlgorithm(ws, "My Name", "Number Series", "FiveSixSeven", 0.0, true);
+  }
+
+  void test_NumberSeries()
+  {
+    MatrixWorkspace_sptr ws = WorkspaceCreationHelper::Create2DWorkspace(10,10);
+    ExecuteAlgorithm(ws, "My Name", "Number Series", "1.234", 1.234);
+    ExecuteAlgorithm(ws, "My Name", "Number Series", "2.456", 2.456);
+  }
+
+  void ExecuteAlgorithm(MatrixWorkspace_sptr testWS, std::string LogName, std::string LogType, std::string LogText,
+      double expectedValue, bool fails=false)
   {
     //add the workspace to the ADS
-    AnalysisDataService::Instance().add("AddSampleLogTest_Temporary", testWS);
+    AnalysisDataService::Instance().addOrReplace("AddSampleLogTest_Temporary", testWS);
 
     //execute algorithm
     AddSampleLog alg;
@@ -38,20 +75,45 @@ public:
     TS_ASSERT( alg.isInitialized() )
 
     alg.setPropertyValue("Workspace", "AddSampleLogTest_Temporary");
-    alg.setPropertyValue("LogName", "my name");
-    alg.setPropertyValue("LogText", "my data");
-
+    alg.setPropertyValue("LogName", LogName);
+    alg.setPropertyValue("LogText", LogText);
+    alg.setPropertyValue("LogType", LogType);
     TS_ASSERT_THROWS_NOTHING(alg.execute())
-    TS_ASSERT( alg.isExecuted() )
+    if (fails)
+    {
+      TS_ASSERT( !alg.isExecuted() )
+      return;
+    }
+    else
+    {
+      TS_ASSERT( alg.isExecuted() )
+    }
 
     //check output
     MatrixWorkspace_sptr output = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(alg.getProperty("Workspace")));
     
     const Run& wSpaceRun = output->run();
-    PropertyWithValue<std::string> *testProp = dynamic_cast<PropertyWithValue<std::string>*>(wSpaceRun.getLogData("my name"));
+    Property * prop;
+    TS_ASSERT_THROWS_NOTHING(prop = wSpaceRun.getLogData(LogName);)
+    if (!prop) return;
+
+    if (LogType == "String")
+    {
+      TS_ASSERT_EQUALS( prop->value(), LogText);
+    }
+    else if (LogType == "Number")
+    {
+      PropertyWithValue<double> *testProp = dynamic_cast<PropertyWithValue<double>*>(prop);
+      TS_ASSERT(testProp);
+      TS_ASSERT_DELTA((*testProp)(), expectedValue, 1e-5);
+    }
+    else if (LogType == "Number Series")
+    {
+      TimeSeriesProperty<double> *testProp = dynamic_cast<TimeSeriesProperty<double>*>(prop);
+      TS_ASSERT(testProp);
+      TS_ASSERT_DELTA(testProp->firstValue(), expectedValue, 1e-5);
+    }
     
-    TS_ASSERT(testProp)
-    TS_ASSERT_EQUALS(testProp->value(), "my data")
     //cleanup
     AnalysisDataService::Instance().remove(output->getName());
     
-- 
GitLab