private List<int> FindPeakIdx(float[] argMZAry, int argTargetIdx, int argCharge, float argPPM) { List<int> Peak = new List<int>(); float Interval = 1 / (float)argCharge; float FirstMZ = argMZAry[argTargetIdx]; int CurrentIdx = argTargetIdx; Peak.Add(argTargetIdx); //Forward Peak for (int i = argTargetIdx - 1; i >= 0; i--) { if (argMZAry[argTargetIdx] - argMZAry[i] >= Interval * 10) { break; } List<int> ClosedPeaks = MassUtility.GetClosestMassIdxsWithinPPM(argMZAry, argMZAry[CurrentIdx] - Interval, argPPM); if (ClosedPeaks.Count == 1) { CurrentIdx = ClosedPeaks[0]; Peak.Insert(0, ClosedPeaks[0]); } else if (ClosedPeaks.Count > 1) { double minPPM = 100; int minPPMIdx = 0; for (int j = 0; j < ClosedPeaks.Count; j++) { if (MassUtility.GetMassPPM(argMZAry[ClosedPeaks[j]], argMZAry[CurrentIdx] - Interval) < minPPM) { minPPMIdx = ClosedPeaks[j]; minPPM = MassUtility.GetMassPPM(argMZAry[ClosedPeaks[j]], argMZAry[CurrentIdx] + Interval); } } CurrentIdx = minPPMIdx; Peak.Insert(0, CurrentIdx); } } //Backward Peak CurrentIdx = argTargetIdx; for (int i = argTargetIdx + 1; i < argMZAry.Length; i++) { if (argMZAry[i] - argMZAry[argTargetIdx] >= Interval * 10) { break; } List<int> ClosedPeaks = MassUtility.GetClosestMassIdxsWithinPPM(argMZAry, argMZAry[CurrentIdx] + Interval, argPPM); if (ClosedPeaks.Count == 1) { CurrentIdx = ClosedPeaks[0]; Peak.Add(ClosedPeaks[0]); } else if (ClosedPeaks.Count > 1) { double minPPM = 100; int minPPMIdx = 0; for (int j = 0; j < ClosedPeaks.Count; j++) { if (MassUtility.GetMassPPM(argMZAry[ClosedPeaks[j]], argMZAry[CurrentIdx] + Interval) < minPPM) { minPPMIdx = ClosedPeaks[j]; minPPM = MassUtility.GetMassPPM(argMZAry[ClosedPeaks[j]], argMZAry[CurrentIdx] + Interval); } } CurrentIdx = minPPMIdx; Peak.Add(CurrentIdx); } } return Peak; }