diff --git a/Code/Mantid/Framework/Algorithms/src/FindPeakBackground.cpp b/Code/Mantid/Framework/Algorithms/src/FindPeakBackground.cpp index 19fe1ed6bdb8520a6eae6e4c539eaa9d53bdd515..3f7cbc496e0633beca4d2fa42c952c8c1df93914 100644 --- a/Code/Mantid/Framework/Algorithms/src/FindPeakBackground.cpp +++ b/Code/Mantid/Framework/Algorithms/src/FindPeakBackground.cpp @@ -310,6 +310,13 @@ namespace Algorithms throw std::runtime_error("i_min cannot larger or equal to i_max"); if (p_min >= p_max) throw std::runtime_error("p_min cannot larger or equal to p_max"); + + // set all parameters to zero + out_bg0 = 0.; + out_bg1 = 0.; + out_bg2 = 0.; + + // accumulate sum double sum = 0.0; double sumX = 0.0; double sumY = 0.0; @@ -325,22 +332,75 @@ namespace Algorithms sumXY += X[i]*Y[i]; } - // Estimate - out_bg0 = 0.; - out_bg1 = 0.; - out_bg2 = 0.; - if (m_backgroundType.compare("Linear") == 0) // linear background + // Estimate flat background + double bg0_flat = 0.; + if(sum != 0.) + bg0_flat = sumY/sum; + + // Estimate linear - use Cramer's rule for 2 x 2 matrix + double bg0_linear = 0.; + double bg1_linear = 0.; + double determinant = sum*sumX2-sumX*sumX; + if (determinant != 0) + { + bg0_linear = (sumY*sumX2-sumX*sumXY) / determinant; + bg1_linear = (sum*sumXY-sumY*sumX) / determinant; + } + + // TODO Estimate quadratic background + double bg0_quadratic = 0.; + double bg1_quadratic = 0.; + double bg2_quadratic = 0.; + + // calculate the chisq - not normalized by the number of points + const double INVALID_CHISQ(1.e10); // big invalid value + double chisq_flat = 0.; + double chisq_linear = 0.; + double chisq_quadratic = INVALID_CHISQ; + if (sum !=0) { - // Cramer's rule for 2 x 2 matrix - double divisor = sum*sumX2-sumX*sumX; - if (divisor != 0) + for (size_t i = i_min; i < i_max; ++i) { - out_bg0 = (sumY*sumX2-sumX*sumXY)/divisor; - out_bg1 = (sum*sumXY-sumY*sumX)/divisor; + if(i >= p_min && i < p_max) continue; + + // accumulate for flat + chisq_flat += (bg0_flat - Y[i])*(bg0_flat - Y[i]); + + // accumulate for linear + double temp = bg0_linear + bg1_linear * X[i] - Y[i]; + chisq_linear += (temp * temp); + + // accumulate for quadratic + temp = bg0_quadratic + bg1_quadratic * X[i] + bg2_quadratic * X[i] * X[i] - Y[i]; + chisq_quadratic += (temp * temp); } } - else // flat background - { if(sum != 0) out_bg0 = sumY/sum; + chisq_quadratic = INVALID_CHISQ; // TODO + if (m_backgroundType == "Flat") + { + chisq_linear = INVALID_CHISQ; + chisq_quadratic = INVALID_CHISQ; + } + else if (m_backgroundType == "Linear") + { + chisq_quadratic = INVALID_CHISQ; + } + + // choose the right background function to apply + if ((chisq_quadratic < chisq_flat) && (chisq_quadratic < chisq_linear)) + { + out_bg0 = bg0_quadratic; + out_bg1 = bg1_quadratic; + out_bg2 = bg2_quadratic; + } + else if ((chisq_linear < chisq_flat) && (chisq_linear < chisq_quadratic)) + { + out_bg0 = bg0_linear; + out_bg1 = bg1_linear; + } + else + { + out_bg0 = bg0_flat; } g_log.debug() << "Estimated background: A0 = " << out_bg0 << ", A1 = "