public void TestCalcMaxPeakIndex() { 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[] { 1, 1, 2, 4, 4, 5, 6, 6 }; for (int i = 0; i < spectrum.Count; i++) { var actual = spectrum.CalcMaxPeakIndex(i); Assert.AreEqual(expected[i], actual); } }
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); }