Example #1
0
        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);
        }