Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
ConvertToMDMinMaxLocalTest.h 10.04 KiB
#ifndef MANTID_MDALGORITHMS_CONVERTTOMDHELPER2TEST_H_
#define MANTID_MDALGORITHMS_CONVERTTOMDHELPER2TEST_H_

#include <cxxtest/TestSuite.h>

#include "MantidMDAlgorithms/ConvertToMDMinMaxLocal.h"
#include "MantidTestHelpers/WorkspaceCreationHelper.h"
#include "MantidKernel/ArrayProperty.h"
#include "MantidAPI/NumericAxis.h"
#include "MantidAPI/Sample.h"
#include "MantidDataHandling/LoadEventNexus.h"
#include "MantidGeometry/Instrument.h"
#include "MantidGeometry/Crystal/OrientedLattice.h"
#include "MantidAPI/FrameworkManager.h"
#include "MantidKernel/TimeSeriesProperty.h"

using Mantid::MDAlgorithms::ConvertToMDMinMaxLocal;
class ConvertToMDMinMaxLocalTest : public CxxTest::TestSuite {
public:
  // This pair of boilerplate methods prevent the suite being created statically
  // This means the constructor isn't called when running other tests
  static ConvertToMDMinMaxLocalTest *createSuite() {
    return new ConvertToMDMinMaxLocalTest();
  }
  static void destroySuite(ConvertToMDMinMaxLocalTest *suite) { delete suite; }

  ConvertToMDMinMaxLocalTest() : WSName("CMDHTest") {}

  void test_Init() {
    ConvertToMDMinMaxLocal alg;
    TS_ASSERT_THROWS_NOTHING(alg.initialize())
    TS_ASSERT(alg.isInitialized())
  }

  void test_direct1D() {

    Mantid::API::FrameworkManager::Instance();
    ConvertToMDMinMaxLocal alg;
    Mantid::API::MatrixWorkspace_sptr ws = MakeWorkspace(-50, 1, true, 60, 0);
    WorkspaceCreationHelper::storeWS(WSName, ws);

    TS_ASSERT_THROWS_NOTHING(alg.initialize())
    TS_ASSERT(alg.isInitialized())
    TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("InputWorkspace", WSName));
    TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("QDimensions", "|Q|"));
    TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("dEAnalysisMode", "Direct"));
    TS_ASSERT_THROWS_NOTHING(alg.execute(););
    TS_ASSERT(alg.isExecuted());
    // Check the results
    // this is spherical instrument
    // TS_ASSERT_EQUALS(alg.getPropertyValue("MinValues"),"0.,-50");
    // TS_ASSERT_EQUALS(alg.getPropertyValue("MaxValues"),"12.667,50");
    // real instrument produces as follows:
    TS_ASSERT_EQUALS("0.535435,-50", alg.getPropertyValue("MinValues"));
    TS_ASSERT_EQUALS("3.20262,50", alg.getPropertyValue("MaxValues"));
    // Remove workspace from the data service.
    Mantid::API::AnalysisDataService::Instance().remove(WSName);
  }

  void test_direct3D() {

    Mantid::API::FrameworkManager::Instance();
    ConvertToMDMinMaxLocal alg;
    Mantid::API::MatrixWorkspace_sptr ws = MakeWorkspace(-50, 1, true, 60, 0);
    WorkspaceCreationHelper::storeWS(WSName, ws);

    TS_ASSERT_THROWS_NOTHING(alg.initialize())
    TS_ASSERT(alg.isInitialized())
    TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("InputWorkspace", WSName));
    TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("QDimensions", "Q3D"));
    TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("dEAnalysisMode", "Direct"));
    TS_ASSERT_THROWS_NOTHING(
        alg.setPropertyValue("QConversionScales", "Q in A^-1"));
    TS_ASSERT_THROWS_NOTHING(alg.execute(););
    TS_ASSERT(alg.isExecuted());
    // Check the results
    double minS[] = {-0.724983, -0, -1.86877, -50};
    double maxS[] = {-0.218591, -0, 3.19515, 50};
    std::vector<double> minSample(minS, minS + 4), maxSample(maxS, maxS + 4);

    std::vector<double> minVal = alg.getProperty("MinValues");
    std::vector<double> maxVal = alg.getProperty("MaxValues");
    for (size_t i = 0; i < 4; i++) {
      TS_ASSERT_DELTA(minSample[i], minVal[i], 1.e-4);
      TS_ASSERT_DELTA(maxSample[i], maxVal[i], 1.e-4);
    }

    // Remove workspace from the data service.
    Mantid::API::AnalysisDataService::Instance().remove(WSName);
  }

  void test_direct3DHKL() {

    Mantid::API::FrameworkManager::Instance();
    ConvertToMDMinMaxLocal alg;
    Mantid::API::MatrixWorkspace_sptr ws = MakeWorkspace(-50, 1, true, 60, 0);
    WorkspaceCreationHelper::storeWS(WSName, ws);

    TS_ASSERT_THROWS_NOTHING(alg.initialize())
    TS_ASSERT(alg.isInitialized())
    TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("InputWorkspace", WSName));
    TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("QDimensions", "Q3D"));
    TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("dEAnalysisMode", "Direct"));
    TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("QConversionScales", "HKL"));
    TS_ASSERT_THROWS_NOTHING(alg.execute(););
    TS_ASSERT(alg.isExecuted());

    // Check the results
    double minS[] = {-0.724983, -0, -1.86877, -50};
    double maxS[] = {-0.218591, -0, 3.19515, 50};
    std::vector<double> minSample(minS, minS + 4), maxSample(maxS, maxS + 4);

    std::vector<double> minVal = alg.getProperty("MinValues");
    std::vector<double> maxVal = alg.getProperty("MaxValues");
    for (size_t i = 0; i < 4; i++) {
      TS_ASSERT_DELTA(minSample[i], minVal[i], 1.e-4);
      TS_ASSERT_DELTA(maxSample[i], maxVal[i], 1.e-4);
    }

    // Remove workspace from the data service.
    Mantid::API::AnalysisDataService::Instance().remove(WSName);
  }

  void test_indirect1D() {

    Mantid::API::FrameworkManager::Instance();
    ConvertToMDMinMaxLocal alg;
    Mantid::API::MatrixWorkspace_sptr ws =
        MakeWorkspace(-2.5, 0.05, true, 0, 5);

    WorkspaceCreationHelper::storeWS(WSName, ws);

    TS_ASSERT_THROWS_NOTHING(alg.initialize())
    TS_ASSERT(alg.isInitialized())
    TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("InputWorkspace", WSName));
    TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("QDimensions", "|Q|"));
    TS_ASSERT_THROWS_NOTHING(
        alg.setPropertyValue("dEAnalysisMode", "Indirect"));
    TS_ASSERT_THROWS_NOTHING(alg.execute(););
    TS_ASSERT(alg.isExecuted());
    // Check the results

    TS_ASSERT_EQUALS("0.53808,-2.5", alg.getPropertyValue("MinValues"));
    TS_ASSERT_EQUALS("0.55285,2.5", alg.getPropertyValue("MaxValues"));
    // Remove workspace from the data service.
    Mantid::API::AnalysisDataService::Instance().remove(WSName);
  }

  void test_elastic1D() {

    Mantid::API::FrameworkManager::Instance();
    ConvertToMDMinMaxLocal alg;
    Mantid::API::MatrixWorkspace_sptr ws =
        MakeWorkspace(25000, 10, false, 0, 0);
    WorkspaceCreationHelper::storeWS(WSName, ws);

    TS_ASSERT_THROWS_NOTHING(alg.initialize())
    TS_ASSERT(alg.isInitialized())
    TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("InputWorkspace", WSName));
    TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("QDimensions", "|Q|"));
    TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("dEAnalysisMode", "Elastic"));
    TS_ASSERT_THROWS_NOTHING(alg.execute(););
    TS_ASSERT(alg.isExecuted());
    // Check the results

    TS_ASSERT_EQUALS(alg.getPropertyValue("MinValues"), "0.12187");
    TS_ASSERT_EQUALS(alg.getPropertyValue("MaxValues"), "0.126745");
    // Remove workspace from the data service.
    Mantid::API::AnalysisDataService::Instance().remove(WSName);
  }

  void test_elastic1DandExtra() {

    Mantid::API::FrameworkManager::Instance();
    ConvertToMDMinMaxLocal alg;
    Mantid::API::MatrixWorkspace_sptr ws =
        MakeWorkspace(25000, 10, false, 0, 0);
    WorkspaceCreationHelper::storeWS(WSName, ws);

    TS_ASSERT_THROWS_NOTHING(alg.initialize())
    TS_ASSERT(alg.isInitialized())
    TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("InputWorkspace", WSName));
    TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("QDimensions", "|Q|"));
    TS_ASSERT_THROWS_NOTHING(alg.setPropertyValue("dEAnalysisMode", "Elastic"));
    TS_ASSERT_THROWS_NOTHING(
        alg.setPropertyValue("OtherDimensions", "doubleProp"));
    TS_ASSERT_THROWS_NOTHING(alg.execute(););
    TS_ASSERT(alg.isExecuted());
    // Check the results

    TS_ASSERT_EQUALS(alg.getPropertyValue("MinValues"), "0.12187,9.99");
    TS_ASSERT_EQUALS(alg.getPropertyValue("MaxValues"), "0.126745,9.99");
    // Remove workspace from the data service.
    Mantid::API::AnalysisDataService::Instance().remove(WSName);
  }

private:
  std::string WSName;

  Mantid::API::MatrixWorkspace_sptr MakeWorkspace(double xmin, double dx,
                                                  bool deltaEUnits, double Ei,
                                                  double Ef) {

    Mantid::API::MatrixWorkspace_sptr ws =
        WorkspaceCreationHelper::create2DWorkspaceBinned(1, 100, xmin, dx);

    if ((Ei > 0 || Ef > 0) && deltaEUnits) {
      ws->getAxis(0)->setUnit("DeltaE");
    } else {
      ws->getAxis(0)->setUnit("TOF");
    }

    Mantid::Geometry::Instrument_sptr testInst(
        new Mantid::Geometry::Instrument);
    // Define a source and sample position
    // Define a source component
    Mantid::Geometry::ObjComponent *source = new Mantid::Geometry::ObjComponent(
        "moderator", Mantid::Geometry::IObject_sptr(), testInst.get());
    source->setPos(Mantid::Kernel::V3D(0, 0.0, -15.));
    testInst->add(source);
    testInst->markAsSource(source);
    // Define a sample as a simple sphere
    Mantid::Geometry::ObjComponent *sample = new Mantid::Geometry::ObjComponent(
        "samplePos", Mantid::Geometry::IObject_sptr(), testInst.get());
    testInst->setPos(0.0, 0.0, 0.0);
    testInst->add(sample);
    testInst->markAsSamplePos(sample);
    // Detector
    Mantid::Geometry::Detector *physicalPixel =
        new Mantid::Geometry::Detector("pixel", 1, testInst.get());
    physicalPixel->setPos(0.5, 0, 5.0);
    testInst->add(physicalPixel);
    testInst->markAsDetector(physicalPixel);
    ws->setInstrument(testInst);

    ws->getSpectrum(0).addDetectorID(physicalPixel->getID());

    if (Ei > 0) {
      ws->mutableRun().addProperty(
          new Mantid::Kernel::PropertyWithValue<double>("Ei", Ei));
    }

    Mantid::Geometry::OrientedLattice latt(2, 3, 4, 90, 90, 90);
    ws->mutableSample().setOrientedLattice(&latt);

    Mantid::Kernel::TimeSeriesProperty<double> *p =
        new Mantid::Kernel::TimeSeriesProperty<double>("doubleProp");
    TS_ASSERT_THROWS_NOTHING(p->addValue("2007-11-30T16:17:00", 9.99));
    TS_ASSERT_THROWS_NOTHING(p->addValue("2007-11-30T16:17:10", 7.55));
    TS_ASSERT_THROWS_NOTHING(p->addValue("2007-11-30T16:17:20", 5.55));
    TS_ASSERT_THROWS_NOTHING(p->addValue("2007-11-30T16:17:30", 10.55));

    ws->mutableRun().addLogData(p);

    return ws;
  }
};

#endif /* MANTID_MDALGORITHMS_CONVERTTOMDHELPERTEST_H_ */