Пример #1
0
        public void TestCalcMinPeakIndex()
        {
            var spectrum = new Spectrum(new[] { 1, 2, 3, 4, 5, 6, 7.0 }, new[] { 2.0, 1, 2, 5, 2, 3, 6 });
            var expected = new[] { 0, 1, 1, 1, 4, 4, 4, 4 };

            for (int i = 0; i < spectrum.Count; i++)
            {
                var actual = spectrum.CalcMinPeakIndex(i);
                Assert.AreEqual(expected[i], actual);
            }
        }
Пример #2
0
        public static void DetectPeaks(Spectrum s, double intensityThreshold, out double[] peakCenterMass,
                                       out float[] peakMinMass, out float[] peakMaxMass, out float[] peakIntensity,
                                       bool maxIntensity, int npoints, CentroidPosition centroidPosition)
        {
            peakCenterMass = new double[s.Count];
            peakMinMass    = new float[s.Count];
            peakMaxMass    = new float[s.Count];
            peakIntensity  = new float[s.Count];
            int peakCount = 0;

            for (int i = 2; i < s.Count - 2; i++)
            {
                float m2 = s.GetIntensity(i - 2);
                float m1 = s.GetIntensity(i - 1);
                float x  = s.GetIntensity(i);
                float p1 = s.GetIntensity(i + 1);
                float p2 = s.GetIntensity(i + 2);
                if (x >= intensityThreshold)
                {
                    if (s.IsMax(x, m1, p1, m2, p2))
                    {
                        int minInd = s.CalcMinPeakIndex(i);
                        int maxInd = s.CalcMaxPeakIndex(i);
                        if (maxInd - minInd > 2)
                        {
                            if (maxInd > i && minInd < i)
                            {
                                maxInd--;
                                minInd++;
                            }
                            else if (maxInd > i)
                            {
                                maxInd = i + 1;
                            }
                            else if (minInd < i)
                            {
                                minInd = i - 1;
                            }
                            CalcCenterMass(minInd, i, maxInd, s, out peakIntensity[peakCount],
                                           out peakCenterMass[peakCount], maxIntensity, npoints, centroidPosition);
                            if ((!double.IsNaN(peakCenterMass[peakCount])) && (!float.IsNaN(peakIntensity[peakCount])))
                            {
                                if (minInd > 0)
                                {
                                    peakMinMass[peakCount] = (float)(0.5 * (s.GetMass(minInd) + s.GetMass(minInd - 1)));
                                }
                                else
                                {
                                    peakMinMass[peakCount] = (float)(1.5 * s.GetMass(0) - 0.5 * s.GetMass(1));
                                }
                                if (maxInd < s.Count - 1)
                                {
                                    peakMaxMass[peakCount] = (float)(0.5 * (s.GetMass(maxInd) + s.GetMass(maxInd + 1)));
                                }
                                else
                                {
                                    peakMaxMass[peakCount] = (float)(1.5 * s.GetMass(maxInd) - 0.5 * s.GetMass(maxInd - 1));
                                }
                                peakCount++;
                            }
                        }
                    }
                }
            }
            peakCenterMass = ArrayUtil.SubArray(peakCenterMass, peakCount);
            peakMinMass    = ArrayUtil.SubArray(peakMinMass, peakCount);
            peakMaxMass    = ArrayUtil.SubArray(peakMaxMass, peakCount);
            peakIntensity  = ArrayUtil.SubArray(peakIntensity, peakCount);
        }