/Framework/SINQ/test/ProjectMDTest.h

https://github.com/wdzhou/mantid · C Header · 254 lines · 214 code · 36 blank · 4 comment · 6 complexity · d6a44956fd09f95fd667f7adc7070bd2 MD5 · raw file

  1. #ifndef __PROJECTMDTEST
  2. #define __PROJECTMDTEST
  3. #include <cxxtest/TestSuite.h>
  4. #include "MantidSINQ/ProjectMD.h"
  5. #include "MantidAPI/AnalysisDataService.h"
  6. #include "MantidGeometry/MDGeometry/MDHistoDimension.h"
  7. #include "MantidAPI/IMDHistoWorkspace.h"
  8. #include "MantidAPI/Run.h"
  9. #include "MantidKernel/Property.h"
  10. #include "MantidKernel/cow_ptr.h"
  11. #include "MantidDataObjects/MDHistoWorkspace.h"
  12. using namespace Mantid::API;
  13. using namespace Mantid::Geometry;
  14. using namespace Mantid::Kernel;
  15. using namespace Mantid;
  16. using namespace Mantid::DataObjects;
  17. class ProjectMDTest : public CxxTest::TestSuite {
  18. public:
  19. void testName() {
  20. ProjectMD loader;
  21. TS_ASSERT_EQUALS(loader.name(), "ProjectMD");
  22. }
  23. void testInit() {
  24. ProjectMD loader;
  25. TS_ASSERT_THROWS_NOTHING(loader.initialize());
  26. TS_ASSERT(loader.isInitialized());
  27. }
  28. void testProjectZ() {
  29. makeTestMD();
  30. ProjectMD pmd;
  31. pmd.initialize();
  32. pmd.setPropertyValue("InputWorkspace", "PMDTest");
  33. pmd.setPropertyValue("ProjectDirection", "Z");
  34. pmd.setPropertyValue("StartIndex", "0");
  35. pmd.setPropertyValue("EndIndex", "20");
  36. std::string outputSpace = "PMD_out";
  37. pmd.setPropertyValue("OutputWorkspace", outputSpace);
  38. TS_ASSERT_THROWS_NOTHING(pmd.execute());
  39. IMDHistoWorkspace_sptr data =
  40. AnalysisDataService::Instance().retrieveWS<IMDHistoWorkspace>(
  41. outputSpace);
  42. TS_ASSERT_EQUALS(2, data->getNumDims());
  43. long nBin = static_cast<long>(data->getNPoints());
  44. long sum = 0;
  45. double *sdata = data->getSignalArray();
  46. for (long i = 0; i < nBin; i++) {
  47. sum += (long)sdata[i];
  48. }
  49. TS_ASSERT_EQUALS(sum, 2400);
  50. // test dimensions
  51. boost::shared_ptr<const IMDDimension> dimi = data->getDimension(0);
  52. TS_ASSERT_EQUALS(dimi->getNBins(), 10);
  53. TS_ASSERT_DELTA(dimi->getMinimum(), -5., .01);
  54. TS_ASSERT_DELTA(dimi->getMaximum(), 5., .01);
  55. dimi = data->getDimension(1);
  56. TS_ASSERT_EQUALS(dimi->getNBins(), 12);
  57. TS_ASSERT_DELTA(dimi->getMinimum(), -6., .01);
  58. TS_ASSERT_DELTA(dimi->getMaximum(), 6., .01);
  59. AnalysisDataService::Instance().clear();
  60. }
  61. void testProjectHalfZ() {
  62. makeTestMD();
  63. ProjectMD pmd;
  64. pmd.initialize();
  65. pmd.setPropertyValue("InputWorkspace", "PMDTest");
  66. pmd.setPropertyValue("ProjectDirection", "Z");
  67. pmd.setPropertyValue("StartIndex", "5");
  68. pmd.setPropertyValue("EndIndex", "15");
  69. std::string outputSpace = "PMD_out";
  70. pmd.setPropertyValue("OutputWorkspace", outputSpace);
  71. TS_ASSERT_THROWS_NOTHING(pmd.execute());
  72. IMDHistoWorkspace_sptr data =
  73. AnalysisDataService::Instance().retrieveWS<IMDHistoWorkspace>(
  74. outputSpace);
  75. TS_ASSERT_EQUALS(2, data->getNumDims());
  76. long nBin = static_cast<long>(data->getNPoints());
  77. long sum = 0;
  78. double *sdata = data->getSignalArray();
  79. for (long i = 0; i < nBin; i++) {
  80. sum += (long)sdata[i];
  81. }
  82. TS_ASSERT_EQUALS(sum, 1200);
  83. // test dimensions
  84. boost::shared_ptr<const IMDDimension> dimi = data->getDimension(0);
  85. TS_ASSERT_EQUALS(dimi->getNBins(), 10);
  86. TS_ASSERT_DELTA(dimi->getMinimum(), -5., .01);
  87. TS_ASSERT_DELTA(dimi->getMaximum(), 5., .01);
  88. dimi = data->getDimension(1);
  89. TS_ASSERT_EQUALS(dimi->getNBins(), 12);
  90. TS_ASSERT_DELTA(dimi->getMinimum(), -6., .01);
  91. TS_ASSERT_DELTA(dimi->getMaximum(), 6., .01);
  92. AnalysisDataService::Instance().clear();
  93. }
  94. void testProjectX() {
  95. makeTestMD();
  96. ProjectMD pmd;
  97. pmd.initialize();
  98. pmd.setPropertyValue("InputWorkspace", "PMDTest");
  99. pmd.setPropertyValue("ProjectDirection", "X");
  100. pmd.setPropertyValue("StartIndex", "0");
  101. pmd.setPropertyValue("EndIndex", "10");
  102. std::string outputSpace = "PMD_out";
  103. pmd.setPropertyValue("OutputWorkspace", outputSpace);
  104. TS_ASSERT_THROWS_NOTHING(pmd.execute());
  105. IMDHistoWorkspace_sptr data =
  106. AnalysisDataService::Instance().retrieveWS<IMDHistoWorkspace>(
  107. outputSpace);
  108. TS_ASSERT_EQUALS(2, data->getNumDims());
  109. long nBin = static_cast<long>(data->getNPoints());
  110. long sum = 0;
  111. double *sdata = data->getSignalArray();
  112. for (long i = 0; i < nBin; i++) {
  113. sum += (long)sdata[i];
  114. }
  115. TS_ASSERT_EQUALS(sum, 2400);
  116. // test dimensions
  117. boost::shared_ptr<const IMDDimension> dimi = data->getDimension(0);
  118. TS_ASSERT_EQUALS(dimi->getNBins(), 12);
  119. TS_ASSERT_DELTA(dimi->getMinimum(), -6., .01);
  120. TS_ASSERT_DELTA(dimi->getMaximum(), 6., .01);
  121. dimi = data->getDimension(1);
  122. TS_ASSERT_EQUALS(dimi->getNBins(), 20);
  123. TS_ASSERT_DELTA(dimi->getMinimum(), -10., .01);
  124. TS_ASSERT_DELTA(dimi->getMaximum(), 10., .01);
  125. AnalysisDataService::Instance().clear();
  126. }
  127. void testProjectY() {
  128. makeTestMD();
  129. ProjectMD pmd;
  130. pmd.initialize();
  131. pmd.setPropertyValue("InputWorkspace", "PMDTest");
  132. pmd.setPropertyValue("ProjectDirection", "Y");
  133. pmd.setPropertyValue("StartIndex", "0");
  134. pmd.setPropertyValue("EndIndex", "12");
  135. std::string outputSpace = "PMD_out";
  136. pmd.setPropertyValue("OutputWorkspace", outputSpace);
  137. TS_ASSERT_THROWS_NOTHING(pmd.execute());
  138. IMDHistoWorkspace_sptr data =
  139. AnalysisDataService::Instance().retrieveWS<IMDHistoWorkspace>(
  140. outputSpace);
  141. TS_ASSERT_EQUALS(2, data->getNumDims());
  142. long nBin = static_cast<long>(data->getNPoints());
  143. long sum = 0;
  144. double *sdata = data->getSignalArray();
  145. for (long i = 0; i < nBin; i++) {
  146. sum += (long)sdata[i];
  147. }
  148. TS_ASSERT_EQUALS(sum, 2400);
  149. // test dimensions
  150. boost::shared_ptr<const IMDDimension> dimi = data->getDimension(0);
  151. TS_ASSERT_EQUALS(dimi->getNBins(), 10);
  152. TS_ASSERT_DELTA(dimi->getMinimum(), -5., .1);
  153. TS_ASSERT_DELTA(dimi->getMaximum(), 5., .1);
  154. dimi = data->getDimension(1);
  155. TS_ASSERT_EQUALS(dimi->getNBins(), 20);
  156. TS_ASSERT_DELTA(dimi->getMinimum(), -10., .1);
  157. TS_ASSERT_DELTA(dimi->getMaximum(), 10., .1);
  158. AnalysisDataService::Instance().clear();
  159. }
  160. void testMetaDataCopy() {
  161. makeTestMD();
  162. IMDHistoWorkspace_sptr data =
  163. AnalysisDataService::Instance().retrieveWS<IMDHistoWorkspace>(
  164. std::string("PMDTest"));
  165. data->setTitle("Hugo");
  166. if (data->getNumExperimentInfo() == 0) {
  167. data->addExperimentInfo((ExperimentInfo_sptr) new ExperimentInfo());
  168. }
  169. Run &rr = data->getExperimentInfo(0)->mutableRun();
  170. rr.addProperty("Gwendolin", 27.8, true);
  171. ProjectMD pmd;
  172. pmd.initialize();
  173. pmd.setPropertyValue("InputWorkspace", "PMDTest");
  174. pmd.setPropertyValue("ProjectDirection", "Y");
  175. pmd.setPropertyValue("StartIndex", "0");
  176. pmd.setPropertyValue("EndIndex", "12");
  177. std::string outputSpace = "PMD_out";
  178. pmd.setPropertyValue("OutputWorkspace", outputSpace);
  179. TS_ASSERT_THROWS_NOTHING(pmd.execute());
  180. data = AnalysisDataService::Instance().retrieveWS<IMDHistoWorkspace>(
  181. outputSpace);
  182. std::string tst = data->getTitle();
  183. size_t found = tst.find("Hugo");
  184. TS_ASSERT_DIFFERS(found, std::string::npos);
  185. ExperimentInfo_sptr info;
  186. info = data->getExperimentInfo(0);
  187. const Run r = info->run();
  188. Mantid::Kernel::Property *p = r.getProperty("Gwendolin");
  189. std::string cd = p->value();
  190. found = cd.find("27.8");
  191. TS_ASSERT_DIFFERS(found, std::string::npos);
  192. AnalysisDataService::Instance().clear();
  193. }
  194. private:
  195. MDHistoWorkspace_sptr makeTestMD() {
  196. IMDDimension_sptr dim;
  197. Mantid::Geometry::GeneralFrame frame(
  198. Mantid::Geometry::GeneralFrame::GeneralFrameDistance, "mm");
  199. std::vector<IMDDimension_sptr> dimensions;
  200. dim = MDHistoDimension_sptr(
  201. new MDHistoDimension(std::string("x"), std::string("ID0"), frame,
  202. coord_t(-5), coord_t(5), size_t(10)));
  203. dimensions.push_back(boost::const_pointer_cast<IMDDimension>(dim));
  204. dim = MDHistoDimension_sptr(
  205. new MDHistoDimension(std::string("y"), std::string("ID1"), frame,
  206. coord_t(-6), coord_t(6), size_t(12)));
  207. dimensions.push_back(boost::const_pointer_cast<IMDDimension>(dim));
  208. dim = MDHistoDimension_sptr(
  209. new MDHistoDimension(std::string("z"), std::string("ID2"), frame,
  210. coord_t(-10), coord_t(10), size_t(20)));
  211. dimensions.push_back(boost::const_pointer_cast<IMDDimension>(dim));
  212. MDHistoWorkspace_sptr outWS(new MDHistoWorkspace(dimensions));
  213. outWS->setTo(1., 1., .0);
  214. AnalysisDataService::Instance().add("PMDTest", outWS);
  215. return outWS;
  216. }
  217. };
  218. #endif