diff --git a/Code/Mantid/Framework/SINQ/inc/MantidSINQ/PoldiUtilities/Poldi2DFunction.h b/Code/Mantid/Framework/SINQ/inc/MantidSINQ/PoldiUtilities/Poldi2DFunction.h index 3c5b9dc6ed4c..f96edb10ad38 100644 --- a/Code/Mantid/Framework/SINQ/inc/MantidSINQ/PoldiUtilities/Poldi2DFunction.h +++ b/Code/Mantid/Framework/SINQ/inc/MantidSINQ/PoldiUtilities/Poldi2DFunction.h @@ -50,6 +50,10 @@ class MANTID_SINQ_DLL Poldi2DFunction : virtual public API::IFunction1DSpectrum, virtual void functionDeriv(const API::FunctionDomain &domain, API::Jacobian &jacobian); virtual void function1DSpectrum(const API::FunctionDomain1DSpectrum &domain, API::FunctionValues &values) const; + + void iterationFinished(); +private: + size_t m_iteration; }; diff --git a/Code/Mantid/Framework/SINQ/src/PoldiUtilities/Poldi2DFunction.cpp b/Code/Mantid/Framework/SINQ/src/PoldiUtilities/Poldi2DFunction.cpp index 265de7da6055..eb9f1e765ee1 100644 --- a/Code/Mantid/Framework/SINQ/src/PoldiUtilities/Poldi2DFunction.cpp +++ b/Code/Mantid/Framework/SINQ/src/PoldiUtilities/Poldi2DFunction.cpp @@ -8,7 +8,8 @@ using namespace API; Poldi2DFunction::Poldi2DFunction() : IFunction1DSpectrum(), - CompositeFunction() + CompositeFunction(), + m_iteration(0) { } @@ -24,6 +25,12 @@ Poldi2DFunction::Poldi2DFunction() : void Poldi2DFunction::function(const FunctionDomain &domain, FunctionValues &values) const { CompositeFunction::function(domain, values); + + if(m_iteration > 0) { + for(size_t i = 0; i < values.size(); ++i) { + values.setFitWeight(i, 1.0/sqrt(values.getCalculated(i) + 0.1)); + } + } } /** @@ -50,6 +57,11 @@ void Poldi2DFunction::function1DSpectrum(const FunctionDomain1DSpectrum &domain, UNUSED_ARG(values); } +void Poldi2DFunction::iterationFinished() +{ + ++m_iteration; +} + } // namespace Poldi diff --git a/Code/Mantid/Framework/SINQ/test/Poldi2DFunctionTest.h b/Code/Mantid/Framework/SINQ/test/Poldi2DFunctionTest.h index 4c7275c5c479..dfa5170163dc 100644 --- a/Code/Mantid/Framework/SINQ/test/Poldi2DFunctionTest.h +++ b/Code/Mantid/Framework/SINQ/test/Poldi2DFunctionTest.h @@ -56,6 +56,39 @@ class Poldi2DFunctionTest : public CxxTest::TestSuite TS_ASSERT_EQUALS(values[9], 2.0); } + void testIterationBehavior() + { + boost::shared_ptr function2D(new Poldi2DFunction); + + IFunction_sptr first(new SummingFunction); + IFunction_sptr second(new SummingFunction); + + function2D->addFunction(first); + function2D->addFunction(second); + + // x doesn't matter for that function + std::vector x(10, 1.0); + + FunctionDomain1DSpectrum domain(0, x); + FunctionValues values(domain); + + + function2D->function(domain, values); + + for(size_t i = 0; i < values.size(); ++i) { + TS_ASSERT_THROWS(values.getFitWeight(i), std::runtime_error); + } + + function2D->iterationFinished(); + + function2D->function(domain, values); + + for(size_t i = 0; i < values.size(); ++i) { + TS_ASSERT_THROWS_NOTHING(values.getFitWeight(i)); + TS_ASSERT_EQUALS(values.getFitWeight(i), 1.0/sqrt(fabs(values.getCalculated(i) + 0.1))); + } + } + private: /* small test function that behaves like PoldiSpectrumDomainFunction * in that it uses FunctionValues::addToCalculated.