Skip to content
Snippets Groups Projects
ReflectometryReductionOneAuto2Test.h 63.6 KiB
Newer Older
    auto outQGroup = retrieveOutWS("IvsQ");
    auto outLamGroup = retrieveOutWS("IvsLam");

    TS_ASSERT_DELTA(outQGroup[0]->x(0)[0], 2.8022, 0.0001);
    TS_ASSERT_DELTA(outQGroup[0]->x(0)[3], 11.2088, 0.0001);

    TS_ASSERT_DELTA(outQGroup[0]->y(0)[0], 1.3484, 0.0001);
    TS_ASSERT_DELTA(outQGroup[0]->y(0)[2], 0.9207, 0.0001);

    TS_ASSERT_DELTA(outLamGroup[0]->x(0)[0], 0.1946, 0.0001);
    TS_ASSERT_DELTA(outLamGroup[0]->x(0)[3], 0.7787, 0.0001);

    TS_ASSERT_DELTA(outLamGroup[0]->y(0)[0], 0.9207, 0.0001);
    TS_ASSERT_DELTA(outLamGroup[0]->y(0)[2], 1.3484, 0.0001);

    ADS.clear();
  }

  void test_polarization_with_transmissionrun() {
    const double startX = 1000;
    const int nBins = 3;
    const double deltaX = 1000;
    const std::vector<double> yValues1 = {1, 2, 3};
    const std::vector<double> yValues2 = {4, 5, 6};
    MatrixWorkspace_sptr input =
        createWorkspaceSingle(startX, nBins, deltaX, yValues1);
    ADS.addOrReplace("input", input);

    MatrixWorkspace_sptr input2 =
        createWorkspaceSingle(startX, nBins, deltaX, yValues1);
    ADS.addOrReplace("input2", input2);

    MatrixWorkspace_sptr first =
        createWorkspaceSingle(startX, nBins, deltaX, yValues1);
    ADS.addOrReplace("first", first);
    MatrixWorkspace_sptr second =
        createWorkspaceSingle(startX, nBins, deltaX, yValues2);
    ADS.addOrReplace("second", second);

    GroupWorkspaces mkGroup;
    mkGroup.initialize();
    mkGroup.setProperty("InputWorkspaces", "input,input2");
    mkGroup.setProperty("OutputWorkspace", "inputWSGroup");
    mkGroup.execute();

    mkGroup.setProperty("InputWorkspaces", "first,second");
    mkGroup.setProperty("OutputWorkspace", "transWSGroup");
    mkGroup.execute();

    ReflectometryReductionOneAuto2 alg;
    alg.initialize();
    alg.setChild(true);
    alg.setPropertyValue("InputWorkspace", "inputWSGroup");
    alg.setProperty("WavelengthMin", 0.0000000001);
    alg.setProperty("WavelengthMax", 15.0);
    alg.setProperty("ThetaIn", 10.0);
    alg.setProperty("ProcessingInstructions", "2");
    alg.setProperty("MomentumTransferStep", 0.04);
    alg.setProperty("PolarizationAnalysis", "PNR");
    alg.setProperty("CPp", "1");
    alg.setProperty("CRho", "1");
    alg.setPropertyValue("OutputWorkspace", "IvsQ");
    alg.setPropertyValue("OutputWorkspaceBinned", "IvsQ_binned");
    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
    alg.setPropertyValue("FirstTransmissionRun", "transWSGroup");
    TS_ASSERT_THROWS_NOTHING(alg.execute());

    auto outQGroup = retrieveOutWS("IvsQ");
    auto outLamGroup = retrieveOutWS("IvsLam");

    TS_ASSERT_DELTA(outQGroup[0]->x(0)[0], 2.8022, 0.0001);
    TS_ASSERT_DELTA(outQGroup[0]->x(0)[3], 11.2088, 0.0001);

    TS_ASSERT_DELTA(outQGroup[0]->y(0)[0], 1.3484, 0.0001);
    TS_ASSERT_DELTA(outQGroup[0]->y(0)[2], 0.9207, 0.0001);

    TS_ASSERT_DELTA(outLamGroup[0]->x(0)[0], 0.1946, 0.0001);
    TS_ASSERT_DELTA(outLamGroup[0]->x(0)[3], 0.7787, 0.0001);

    TS_ASSERT_DELTA(outLamGroup[0]->y(0)[0], 0.9207, 0.0001);
    TS_ASSERT_DELTA(outLamGroup[0]->y(0)[2], 1.3484, 0.0001);

    ADS.clear();
  }

  void test_second_transmissionrun() {
    const double startX = 1000;
    const int nBins = 3;
    const double deltaX = 1000;
    const std::vector<double> yValues1 = {1, 2, 3};
    const std::vector<double> yValues2 = {4, 5, 6};
    MatrixWorkspace_sptr input =
        createWorkspaceSingle(startX, nBins, deltaX, yValues1);
    ADS.addOrReplace("input", input);

    MatrixWorkspace_sptr first =
        createWorkspaceSingle(startX, nBins, deltaX, yValues1);
    ADS.addOrReplace("first", first);
    MatrixWorkspace_sptr second =
        createWorkspaceSingle(startX, nBins, deltaX, yValues2);
    ADS.addOrReplace("second", second);

    MatrixWorkspace_sptr first2 =
        createWorkspaceSingle(startX, nBins, deltaX, yValues1);
    ADS.addOrReplace("first2", first2);
    MatrixWorkspace_sptr second2 =
        createWorkspaceSingle(startX, nBins, deltaX, yValues2);
    ADS.addOrReplace("second2", second2);

    GroupWorkspaces mkGroup;
    mkGroup.initialize();
    mkGroup.setProperty("InputWorkspaces", "input");
    mkGroup.setProperty("OutputWorkspace", "inputWSGroup");
    mkGroup.execute();

    mkGroup.setProperty("InputWorkspaces", "first,second");
    mkGroup.setProperty("OutputWorkspace", "transWSGroup");
    mkGroup.execute();

    mkGroup.setProperty("InputWorkspaces", "first2,second2");
    mkGroup.setProperty("OutputWorkspace", "transWSGroup2");
    mkGroup.execute();

    ReflectometryReductionOneAuto2 alg;
    alg.initialize();
    alg.setChild(true);
    alg.setPropertyValue("InputWorkspace", "inputWSGroup");
    alg.setProperty("WavelengthMin", 0.0000000001);
    alg.setProperty("WavelengthMax", 15.0);
    alg.setProperty("ThetaIn", 10.0);
    alg.setProperty("ProcessingInstructions", "2");
    alg.setProperty("MomentumTransferStep", 0.04);
    alg.setPropertyValue("OutputWorkspace", "IvsQ");
    alg.setPropertyValue("OutputWorkspaceBinned", "IvsQ_binned");
    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
    alg.setPropertyValue("FirstTransmissionRun", "transWSGroup");
    alg.setPropertyValue("SecondTransmissionRun", "transWSGroup2");
    alg.setProperty("Debug", true);
    TS_ASSERT_THROWS_NOTHING(alg.execute());

    auto outQGroup = retrieveOutWS("IvsQ");
    auto outLamGroup = retrieveOutWS("IvsLam");

    TS_ASSERT_DELTA(outQGroup[0]->x(0)[0], 2.8022, 0.0001);
    TS_ASSERT_DELTA(outQGroup[0]->x(0)[3], 11.2088, 0.0001);

    TS_ASSERT_DELTA(outQGroup[0]->y(0)[0], 1.3484, 0.0001);
    TS_ASSERT_DELTA(outQGroup[0]->y(0)[2], 0.9207, 0.0001);

    TS_ASSERT_DELTA(outLamGroup[0]->x(0)[0], 0.1946, 0.0001);
    TS_ASSERT_DELTA(outLamGroup[0]->x(0)[3], 0.7787, 0.0001);

    TS_ASSERT_DELTA(outLamGroup[0]->y(0)[0], 0.9207, 0.0001);
    TS_ASSERT_DELTA(outLamGroup[0]->y(0)[2], 1.3484, 0.0001);

    ADS.clear();
  }
  void test_polarization_correction_default_Wildes() {

    std::string const name = "input";
    prepareInputGroup(name, "Wildes");
    applyPolarizationEfficiencies(name);

    ReflectometryReductionOneAuto2 alg;
    alg.initialize();
    alg.setPropertyValue("InputWorkspace", name);
    alg.setProperty("ThetaIn", 10.0);
    alg.setProperty("WavelengthMin", 1.0);
    alg.setProperty("WavelengthMax", 15.0);
    alg.setProperty("ProcessingInstructions", "2");
    alg.setProperty("MomentumTransferStep", 0.04);
    alg.setProperty("PolarizationAnalysis", "ParameterFile");
    alg.setPropertyValue("OutputWorkspace", "IvsQ");
    alg.setPropertyValue("OutputWorkspaceBinned", "IvsQ_binned");
    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
    alg.execute();

    auto outQGroup = retrieveOutWS("IvsQ");
    auto outLamGroup = retrieveOutWS("IvsLam");

    TS_ASSERT_EQUALS(outQGroup.size(), 4);
    TS_ASSERT_EQUALS(outLamGroup.size(), 4);

    TS_ASSERT_EQUALS(outLamGroup[0]->blocksize(), 9);
    // X range in outLam
    TS_ASSERT_DELTA(outLamGroup[0]->x(0).front(), 2.0729661466, 0.0001);
    TS_ASSERT_DELTA(outLamGroup[0]->x(0).back(), 14.2963182408, 0.0001);

    TS_ASSERT_DELTA(outLamGroup[0]->y(0)[0], 0.9368, 0.0001);
    TS_ASSERT_DELTA(outLamGroup[1]->y(0)[0], 0.7813, 0.0001);
    TS_ASSERT_DELTA(outLamGroup[2]->y(0)[0], 0.6797, 0.0001);
    TS_ASSERT_DELTA(outLamGroup[3]->y(0)[0], 0.5242, 0.0001);

    TS_ASSERT_EQUALS(outQGroup[0]->blocksize(), 9);

    TS_ASSERT_DELTA(outQGroup[0]->y(0)[0], 0.9368, 0.0001);
    TS_ASSERT_DELTA(outQGroup[1]->y(0)[0], 0.7813, 0.0001);
    TS_ASSERT_DELTA(outQGroup[2]->y(0)[0], 0.6797, 0.0001);
    TS_ASSERT_DELTA(outQGroup[3]->y(0)[0], 0.5242, 0.0001);

    ADS.clear();
  }

  void test_monitor_index_in_group() {
    std::string const name = "input";
    prepareInputGroup(name);

    ReflectometryReductionOneAuto2 alg;
    alg.setRethrows(true);
    alg.setPropertyValue("InputWorkspace", name);
    alg.setProperty("WavelengthMin", 1.0);
    alg.setProperty("WavelengthMax", 5.0);
    alg.setProperty("ProcessingInstructions", "1");
    alg.setProperty("MomentumTransferStep", 0.04);
    alg.setProperty("PolarizationAnalysis", "ParameterFile");
    alg.setPropertyValue("OutputWorkspace", "IvsQ");
    alg.setPropertyValue("OutputWorkspaceBinned", "IvsQ_binned");
    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
    TS_ASSERT_THROWS_EQUALS(alg.execute(), std::invalid_argument & e,
                            std::string(e.what()),
                            "A detector is expected at workspace index 0 (Was "
                            "converted from specnum), found a monitor");
  void test_I0MonitorIndex_is_detector() {
    std::string const name = "input";
    prepareInputGroup(name);

    ReflectometryReductionOneAuto2 alg;
    alg.setRethrows(true);
    alg.initialize();
    alg.setPropertyValue("InputWorkspace", name);
    alg.setProperty("WavelengthMin", 1.0);
    alg.setProperty("WavelengthMax", 5.0);
    alg.setProperty("MonitorBackgroundWavelengthMin", 1.0);
    alg.setProperty("MonitorBackgroundWavelengthMax", 5.0);
    alg.setPropertyValue("I0MonitorIndex", "1");
    alg.setProperty("ProcessingInstructions", "2");
    alg.setProperty("MomentumTransferStep", 0.04);
    alg.setPropertyValue("OutputWorkspace", "IvsQ");
    alg.setPropertyValue("OutputWorkspaceBinned", "IvsQ_binned");
    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
    TS_ASSERT_THROWS_EQUALS(alg.execute(), std::invalid_argument & e,
                            std::string(e.what()),
                            "A monitor is expected at spectrum index 1");
  void test_QStep_QMin_and_QMax() {
    auto inter = loadRun("INTER00013460.nxs");
    const double theta = 0.7;

    ReflectometryReductionOneAuto2 alg;
    alg.initialize();
    momentumTransferHelper(alg, inter, theta);
    alg.setProperty("MomentumTransferStep", 0.1);
    alg.setProperty("MomentumTransferMin", 0.1);
    alg.setProperty("MomentumTransferMax", 1.0);
    alg.execute();

    MatrixWorkspace_sptr outQBin = alg.getProperty("OutputWorkspaceBinned");

    const auto &outX = outQBin->x(0);
    const auto &outY = outQBin->y(0);
    TS_ASSERT_DELTA(outX[0], 0.1, 0.0001);
    TS_ASSERT_DELTA(outY[0], 0.0, 0.0001);

    TS_ASSERT_DELTA(outX[24], 1.0, 0.0001);
    TS_ASSERT_DELTA(outY[23], 0, 0.0001);

    TS_ASSERT_EQUALS(outX.size(), 25);
    TS_ASSERT_EQUALS(outY.size(), 24);
  void test_QMin_alone() {
    auto inter = loadRun("INTER00013460.nxs");
    const double theta = 0.7;

    ReflectometryReductionOneAuto2 alg;
    alg.initialize();
    momentumTransferHelper(alg, inter, theta);
    alg.setProperty("MomentumTransferMin", 0.1);
    alg.execute();

    MatrixWorkspace_sptr outQbinned = alg.getProperty("OutputWorkspaceBinned");

    const auto &outX = outQbinned->x(0);
    const auto &outY = outQbinned->y(0);

    TS_ASSERT_DELTA(outX[0], 0.1, 0.0001);
    TS_ASSERT_DELTA(outY[0], 0.0, 0.0001);

    TS_ASSERT_DELTA(outX[1], 0.1018, 0.0001);

    TS_ASSERT_EQUALS(outX.size(), 2);
    TS_ASSERT_EQUALS(outY.size(), 1);
  void test_QMax_alone() {
    auto inter = loadRun("INTER00013460.nxs");
    const double theta = 0.7;

    ReflectometryReductionOneAuto2 alg;
    alg.initialize();
    momentumTransferHelper(alg, inter, theta);
    alg.setProperty("MomentumTransferMax", 0.1);
    alg.execute();

    MatrixWorkspace_sptr outQBin = alg.getProperty("OutputWorkspaceBinned");

    const auto &outX = outQBin->x(0);
    const auto &outY = outQBin->y(0);

    TS_ASSERT_DELTA(outX[0], 0.009, 0.0001);
    TS_ASSERT_DELTA(outY[0], 0.0006, 0.0001);

    TS_ASSERT_DELTA(outX[72], 0.1, 0.0001);
    TS_ASSERT_DELTA(outY[71], 3.8e-06, 0.0001);

    TS_ASSERT_EQUALS(outX.size(), 73);
    TS_ASSERT_EQUALS(outY.size(), 72);
  void test_QMax_and_QMin() {
    auto inter = loadRun("INTER00013460.nxs");
    const double theta = 0.7;

    ReflectometryReductionOneAuto2 alg;
    alg.initialize();
    momentumTransferHelper(alg, inter, theta);
    alg.setProperty("MomentumTransferMin", 0.1);
    alg.setProperty("MomentumTransferMax", 1.0);
    alg.execute();

    MatrixWorkspace_sptr outQBin = alg.getProperty("OutputWorkspaceBinned");

    const auto &outX = outQBin->x(0);
    const auto &outY = outQBin->y(0);

    TS_ASSERT_DELTA(outX[0], 0.1, 0.0001);
    TS_ASSERT_DELTA(outY[0], 0.0, 0.0001);

    TS_ASSERT_DELTA(outX[69], 1.0, 0.0001);
    TS_ASSERT_DELTA(outY[68], 0.0, 0.0001);

    TS_ASSERT_EQUALS(outX.size(), 70);
    TS_ASSERT_EQUALS(outY.size(), 69);
  void test_QStep_alone() {
    auto inter = loadRun("INTER00013460.nxs");
    const double theta = 0.7;

    ReflectometryReductionOneAuto2 alg;
    alg.initialize();
    momentumTransferHelper(alg, inter, theta);
    alg.setProperty("MomentumTransferStep", 0.1);
    alg.execute();

    MatrixWorkspace_sptr outQBin = alg.getProperty("OutputWorkspaceBinned");

    const auto &outX = outQBin->x(0);
    const auto &outY = outQBin->y(0);

    TS_ASSERT_DELTA(outX[0], 0.009, 0.0001);
    TS_ASSERT_DELTA(outY[0], 0.0021, 0.0001);

    TS_ASSERT_DELTA(outX[26], 0.1018, 0.0001);
    TS_ASSERT_DELTA(outY[25], 4.4e-06, 0.0001);

    TS_ASSERT_EQUALS(outX.size(), 27);
    TS_ASSERT_EQUALS(outY.size(), 26);
  void test_QStep_QMin_alone() {
    auto inter = loadRun("INTER00013460.nxs");
    const double theta = 0.7;

    ReflectometryReductionOneAuto2 alg;
    alg.initialize();
    momentumTransferHelper(alg, inter, theta);
    alg.setProperty("MomentumTransferStep", 0.1);
    alg.setProperty("MomentumTransferMin", 0.1);
    alg.execute();

    MatrixWorkspace_sptr outQBin = alg.getProperty("OutputWorkspaceBinned");

    const auto &outX = outQBin->x(0);
    const auto &outY = outQBin->y(0);

    TS_ASSERT_DELTA(outX[0], 0.1, 0.0001);
    TS_ASSERT_DELTA(outY[0], 0.0, 0.0001);

    TS_ASSERT_DELTA(outX[1], 0.1018, 0.0001);

    TS_ASSERT_EQUALS(outX.size(), 2);
    TS_ASSERT_EQUALS(outY.size(), 1);
  void test_QStep_QMax_alone() {
    auto inter = loadRun("INTER00013460.nxs");
    const double theta = 0.7;

    ReflectometryReductionOneAuto2 alg;
    alg.initialize();
    momentumTransferHelper(alg, inter, theta);
    alg.setProperty("MomentumTransferStep", 0.1);
    alg.setProperty("MomentumTransferMax", 0.1);
    alg.execute();

    MatrixWorkspace_sptr outQBin = alg.getProperty("OutputWorkspaceBinned");

    const auto &outX = outQBin->x(0);
    const auto &outY = outQBin->y(0);
    TS_ASSERT_DELTA(outX[0], 0.009, 0.0001);
    TS_ASSERT_DELTA(outY[0], 0.0021, 0.0001);

    TS_ASSERT_DELTA(outX[25], 0.1, 0.0001);
    TS_ASSERT_DELTA(outY[24], 2.3e-05, 0.0001);

    TS_ASSERT_EQUALS(outX.size(), 26);
    TS_ASSERT_EQUALS(outY.size(), 25);
  }

  void test_flood_correction() {
    auto inputWS =
        create2DWorkspaceWithReflectometryInstrumentMultiDetector(0, 0.1);
    auto flood = createFloodWorkspace(inputWS->getInstrument());

    // Correct by rotating detectors around the sample
    ReflectometryReductionOneAuto2 alg;
    alg.initialize();
    alg.setChild(true);
    alg.setProperty("InputWorkspace", inputWS);
    alg.setProperty("FloodWorkspace", flood);
    alg.setProperty("ThetaIn", 1.5);
    alg.setProperty("DetectorCorrectionType", "RotateAroundSample");
    alg.setProperty("AnalysisMode", "MultiDetectorAnalysis");
    alg.setProperty("CorrectionAlgorithm", "None");
    alg.setProperty("MomentumTransferStep", 0.01);
    alg.setProperty("WavelengthMin", 1.0);
    alg.setProperty("WavelengthMax", 15.0);
    alg.setProperty("ProcessingInstructions", "2+3");
    alg.execute();
    MatrixWorkspace_sptr out = alg.getProperty("OutputWorkspace");
    TS_ASSERT_DELTA(out->y(0)[0], 4.5, 0.000001);
    AnalysisDataService::Instance().clear();
  }

  void test_flood_correction_transmission() {
    auto inputWS =
        create2DWorkspaceWithReflectometryInstrumentMultiDetector(0, 0.1);
    auto transWS =
        create2DWorkspaceWithReflectometryInstrumentMultiDetector(0, 0.1);
    for (size_t i = 0; i < transWS->getNumberHistograms(); ++i) {
      auto &y = transWS->mutableY(i);
      y.assign(y.size(), 10.0 * double(i + 1));
    }
    auto flood = createFloodWorkspace(inputWS->getInstrument());

    ReflectometryReductionOneAuto2 alg;
    alg.initialize();
    alg.setChild(true);
    alg.setProperty("InputWorkspace", inputWS);
    alg.setProperty("FloodWorkspace", flood);
    alg.setProperty("ThetaIn", 1.5);
    alg.setProperty("DetectorCorrectionType", "RotateAroundSample");
    alg.setProperty("AnalysisMode", "MultiDetectorAnalysis");
    alg.setProperty("CorrectionAlgorithm", "None");
    alg.setProperty("MomentumTransferStep", 0.01);
    alg.setProperty("WavelengthMin", 1.0);
    alg.setProperty("WavelengthMax", 15.0);
    alg.setProperty("ProcessingInstructions", "2+3");
    alg.setProperty("FirstTransmissionRun", transWS);
    alg.execute();
    MatrixWorkspace_sptr out = alg.getProperty("OutputWorkspace");
    TS_ASSERT_DELTA(out->y(0)[0], 0.0782608695, 0.000001);
    AnalysisDataService::Instance().clear();
  }

  void test_flood_correction_group() {
    auto inputWS1 =
        create2DWorkspaceWithReflectometryInstrumentMultiDetector(0, 0.1);
    auto inputWS2 =
        create2DWorkspaceWithReflectometryInstrumentMultiDetector(0, 0.1);
    inputWS2 *= 2.0;
    auto group = boost::make_shared<WorkspaceGroup>();
    group->addWorkspace(inputWS1);
    group->addWorkspace(inputWS2);
    AnalysisDataService::Instance().addOrReplace("input", group);
    auto flood = createFloodWorkspace(inputWS1->getInstrument());

    // Correct by rotating detectors around the sample
    ReflectometryReductionOneAuto2 alg;
    alg.initialize();
    alg.setProperty("InputWorkspace", "input");
    alg.setProperty("FloodWorkspace", flood);
    alg.setProperty("ThetaIn", 1.5);
    alg.setProperty("DetectorCorrectionType", "RotateAroundSample");
    alg.setProperty("AnalysisMode", "MultiDetectorAnalysis");
    alg.setProperty("CorrectionAlgorithm", "None");
    alg.setProperty("MomentumTransferStep", 0.01);
    alg.setProperty("WavelengthMin", 1.0);
    alg.setProperty("WavelengthMax", 15.0);
    alg.setProperty("ProcessingInstructions", "2+3");
    alg.setProperty("OutputWorkspaceWavelength", "IvsLam");
    alg.setProperty("OutputWorkspace", "IvsQ");
    alg.setProperty("OutputWorkspaceBinned", "IvsQb");
    alg.execute();
    WorkspaceGroup_sptr out =
        AnalysisDataService::Instance().retrieveWS<WorkspaceGroup>("IvsQ");
    auto out1 = boost::dynamic_pointer_cast<MatrixWorkspace>(out->getItem(0));
    TS_ASSERT_DELTA(out1->y(0)[0], 4.5, 0.000001);
    auto out2 = boost::dynamic_pointer_cast<MatrixWorkspace>(out->getItem(1));
    TS_ASSERT_DELTA(out2->y(0)[0], 9.0, 0.000001);
    AnalysisDataService::Instance().clear();
  }

  void test_flood_correction_polarization_correction() {
    std::string const name = "input";
    prepareInputGroup(name, "Fredrikze");
    applyPolarizationEfficiencies(name);
    auto const inputWS =
        AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>(name +
                                                                    "_1");
    auto flood = createFloodWorkspace(inputWS->getInstrument(), 257);

    ReflectometryReductionOneAuto2 alg;
    alg.initialize();
    alg.setPropertyValue("InputWorkspace", name);
    alg.setProperty("FloodWorkspace", flood);
    alg.setProperty("ThetaIn", 10.0);
    alg.setProperty("WavelengthMin", 1.0);
    alg.setProperty("WavelengthMax", 15.0);
    alg.setProperty("ProcessingInstructions", "2");
    alg.setProperty("MomentumTransferStep", 0.04);
    alg.setProperty("PolarizationAnalysis", "ParameterFile");
    alg.setPropertyValue("OutputWorkspace", "IvsQ");
    alg.setPropertyValue("OutputWorkspaceBinned", "IvsQ_binned");
    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
    alg.execute();
    TS_ASSERT(alg.isExecuted());
    WorkspaceGroup_sptr out =
        AnalysisDataService::Instance().retrieveWS<WorkspaceGroup>("IvsQ");
    TS_ASSERT(out);
    auto out1 = boost::dynamic_pointer_cast<MatrixWorkspace>(out->getItem(0));
    TS_ASSERT_DELTA(out1->y(0)[0], 90.0, 0.001);
    auto out2 = boost::dynamic_pointer_cast<MatrixWorkspace>(out->getItem(1));
    TS_ASSERT_DELTA(out2->y(0)[0], 80.0, 0.001);
    auto out3 = boost::dynamic_pointer_cast<MatrixWorkspace>(out->getItem(2));
    TS_ASSERT_DELTA(out3->y(0)[0], 70.0, 0.003);
    auto out4 = boost::dynamic_pointer_cast<MatrixWorkspace>(out->getItem(3));
    TS_ASSERT_DELTA(out4->y(0)[0], 60.0, 0.003);
    AnalysisDataService::Instance().clear();
  }

  void test_flood_correction_parameter_file() {

    std::string const name = "input";
    prepareInputGroup(name, "Flood");
    auto const inputWS =
        AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>(name +
                                                                    "_1");
    auto flood = createFloodWorkspace(inputWS->getInstrument(), 257);

    ReflectometryReductionOneAuto2 alg;
    alg.initialize();
    alg.setPropertyValue("InputWorkspace", name);
    alg.setProperty("FloodCorrection", "ParameterFile");
    alg.setProperty("ThetaIn", 10.0);
    alg.setProperty("WavelengthMin", 1.0);
    alg.setProperty("WavelengthMax", 15.0);
    alg.setProperty("ProcessingInstructions", "2");
    alg.setProperty("MomentumTransferStep", 0.04);
    alg.setPropertyValue("OutputWorkspace", "IvsQ");
    alg.setPropertyValue("OutputWorkspaceBinned", "IvsQ_binned");
    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
    alg.execute();
    TS_ASSERT(alg.isExecuted());
    WorkspaceGroup_sptr out =
        AnalysisDataService::Instance().retrieveWS<WorkspaceGroup>("IvsQ");
    TS_ASSERT(out);
    auto out1 = boost::dynamic_pointer_cast<MatrixWorkspace>(out->getItem(0));
    TS_ASSERT_DELTA(out1->y(0)[0], 90.0, 1e-15);
    auto out2 = boost::dynamic_pointer_cast<MatrixWorkspace>(out->getItem(1));
    TS_ASSERT_DELTA(out2->y(0)[0], 80.0, 1e-15);
    auto out3 = boost::dynamic_pointer_cast<MatrixWorkspace>(out->getItem(2));
    TS_ASSERT_DELTA(out3->y(0)[0], 70.0, 1e-15);
    auto out4 = boost::dynamic_pointer_cast<MatrixWorkspace>(out->getItem(3));
    TS_ASSERT_DELTA(out4->y(0)[0], 60.0, 1e-14);
    AnalysisDataService::Instance().clear();
  }

  void test_flood_correction_parameter_file_no_flood_parameters() {

    std::string const name = "input";
    prepareInputGroup(name, "No_Flood");

    ReflectometryReductionOneAuto2 alg;
    alg.initialize();
    alg.setRethrows(true);
    alg.setPropertyValue("InputWorkspace", name);
    alg.setProperty("FloodCorrection", "ParameterFile");
    alg.setProperty("ThetaIn", 10.0);
    alg.setProperty("WavelengthMin", 1.0);
    alg.setProperty("WavelengthMax", 15.0);
    alg.setProperty("ProcessingInstructions", "2");
    alg.setProperty("MomentumTransferStep", 0.04);
    alg.setPropertyValue("OutputWorkspace", "IvsQ");
    alg.setPropertyValue("OutputWorkspaceBinned", "IvsQ_binned");
    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
    TS_ASSERT_THROWS_EQUALS(
        alg.execute(), std::invalid_argument & e, e.what(),
        std::string(
            "Instrument parameter file doesn't have the Flood_Run parameter."));
    AnalysisDataService::Instance().clear();
  }
private:
  MatrixWorkspace_sptr
  createFloodWorkspace(Mantid::Geometry::Instrument_const_sptr instrument,
                       size_t n = 4) {
    size_t detid = 1;
    auto flood = create2DWorkspace(int(n), 1);
    if (n == 4) {
      flood->mutableY(0)[0] = 0.7;
      flood->mutableY(1)[0] = 1.0;
      flood->mutableY(2)[0] = 0.8;
      flood->mutableY(3)[0] = 0.9;
    } else {
      for (size_t i = 0; i < n; ++i) {
        flood->mutableY(i)[0] = double(i) * 0.01;
      detid = 1000;
    }
    flood->setInstrument(instrument);
    for (size_t i = 0; i < flood->getNumberHistograms(); ++i) {
      flood->getSpectrum(i).setDetectorID(Mantid::detid_t(i + detid));
    flood->getAxis(0)->setUnit("TOF");

  void setup_alg_on_input_workspace_group_with_run_number(
      ReflectometryReductionOneAuto2 &alg) {
    std::string const name = "input";
    prepareInputGroup(name);
    WorkspaceGroup_sptr group = ADS.retrieveWS<WorkspaceGroup>("input");
    MatrixWorkspace_sptr ws =
        ADS.retrieveWS<MatrixWorkspace>(group->getNames()[0]);
    ws->mutableRun().addProperty<std::string>("run_number", "1234");

    alg.initialize();
    alg.setChild(true);
    alg.setPropertyValue("InputWorkspace", name);
    alg.setProperty("WavelengthMin", 0.0000000001);
    alg.setProperty("WavelengthMax", 15.0);
    alg.setProperty("ThetaIn", 10.0);
    alg.setProperty("ProcessingInstructions", "2");
    alg.setProperty("MomentumTransferStep", 0.04);
  }
#endif /* MANTID_ALGORITHMS_REFLECTOMETRYREDUCTIONONEAUTO2TEST_H_ */