public static double CalculatePeakFit(Peak observedPeak, Peak theoreticalPeak, double minYValueFactor) { var xValues = new List <double>(); var yValues1 = new List <double>(); var yValues2 = new List <double>(); observedPeak.GetMinAndMaxXValues(out var minimumXValue, out var maximumXValue); var observedInterpolation = GetLinearInterpolationMethod(observedPeak); var theoreticalInterpolation = GetLinearInterpolationMethod(theoreticalPeak); var maxObservedPeakValue = observedInterpolation.Interpolate(observedPeak.GetQuadraticFit()); var maxTheoreticalPeakValue = theoreticalInterpolation.Interpolate(theoreticalPeak.GetQuadraticFit()); var totalWidth = maximumXValue - minimumXValue; var pointWidth = totalWidth / 1000.0; var minValueToTest = maxObservedPeakValue * minYValueFactor; var numPointsTested = 0; var sumOfSquaredResiduals = 0.0; for (double i = 0; i < totalWidth; i += pointWidth) { var observedPeakValue = observedInterpolation.Interpolate(minimumXValue + i); if (observedPeakValue < minValueToTest) { continue; } var normalizedObservedPeakValue = observedPeakValue / maxObservedPeakValue; var normalizedTheoreticalPeakValue = theoreticalInterpolation.Interpolate(minimumXValue + i) / maxTheoreticalPeakValue; xValues.Add(minimumXValue + i); yValues1.Add(normalizedObservedPeakValue); yValues2.Add(normalizedTheoreticalPeakValue); var residualDifference = normalizedObservedPeakValue - normalizedTheoreticalPeakValue; //sumOfSquaredResiduals += Math.Pow(residualDifference, 2); sumOfSquaredResiduals += Math.Abs(residualDifference); numPointsTested++; } var fitScore = 1 - sumOfSquaredResiduals / numPointsTested; //Console.WriteLine(fitScore); //PeakWriter.Write(xValues, yValues1, yValues2); return(fitScore); }