Exemple #1
0
        public static void GetXICs(ThermoSpectrum currentSpectrum, int specNumber, double rt)
        {
            List <LFPeptide> donePeptides = targetPeptides.Where(x => x.LastScan < specNumber).ToList();

            foreach (var pep in donePeptides)
            {
                pep.doneBuildingXIC = true;
            }

            List <LFPeptide> currPeptides = targetPeptides.Where(x => x.FirstScan <= specNumber && x.LastScan >= specNumber).ToList();

            foreach (var pep in currPeptides)
            {
                List <ThermoMzPeak> outPeaks = new List <ThermoMzPeak>();
                if (currentSpectrum.TryGetPeaks(pep.lookupRange, out outPeaks))
                {
                    var matchPeak = GetClosestPeak(outPeaks, pep.UserMZ);
                    var newRTPeak = new RTPeak(matchPeak, rt);
                    pep.XICLibrary.Add(newRTPeak);
                }
                else
                {
                    var newRTPeak = new RTPeak(pep.UserMZ, 0, rt);
                    pep.XICLibrary.Add(newRTPeak);
                }
            }
        }
Exemple #2
0
        public static List <RTPeak> GetRollingAveragePeaks(List <RTPeak> peaks, int period)
        {
            List <RTPeak> outPeaks = new List <RTPeak>();

            if (peaks.Count > 0)
            {
                for (int i = 0; i < peaks.Count; i++)
                {
                    if (i >= period)
                    {
                        double total          = 0;
                        double totalIntensity = 0;
                        for (int x = i; x > (i - period); x--)
                        {
                            total          += peaks[x].SN;
                            totalIntensity += peaks[x].Intensity;
                        }
                        double average    = total / (double)period;
                        double averageInt = totalIntensity / (double)period;
                        RTPeak newPeak    = new RTPeak(peaks[i].MZ, averageInt, average, peaks[i - (period / 2)].RT);
                        outPeaks.Add(newPeak);
                    }
                }
            }
            return(outPeaks);
        }
Exemple #3
0
        public static List <RTPeak> GetBoxcarAvgPeaks(List <RTPeak> peaks, int period)
        {
            var tmpList    = new List <RTPeak>();
            int peaksToAdd = (period / 2) + 1;
            var startPeak  = new RTPeak(0, 0, 0);
            var stopPeak   = new RTPeak(0, 0, 100000);

            for (int i = 0; i < peaksToAdd; i++)
            {
                tmpList.Add(startPeak);
            }
            foreach (var peak in peaks)
            {
                tmpList.Add(peak);
            }
            for (int i = 0; i < peaksToAdd - 1; i++)
            {
                tmpList.Add(stopPeak);
            }
            List <RTPeak> outPeaks = new List <RTPeak>();

            if (tmpList.Count > 0)
            {
                for (int i = 0; i < tmpList.Count; i++)
                {
                    if (i >= period)
                    {
                        double total          = 0;
                        double totalIntensity = 0;
                        for (int x = i; x > (i - period); x--)
                        {
                            //total += tmpList[x].SN;
                            totalIntensity += tmpList[x].Intensity;
                        }
                        // double average = total / (double)period;
                        double averageInt = totalIntensity / (double)period;
                        RTPeak newPeak    = new RTPeak(tmpList[i].MZ, averageInt, 0, tmpList[i - (period / 2)].RT);
                        outPeaks.Add(newPeak);
                    }
                }
            }
            return(outPeaks);
        }
Exemple #4
0
        public static List <RTPeak> GetRollingAveragePeaks(LFPeptide targetPeptide, int period, bool isLibrary = true)
        {
            //add three null points to the beginning and end of the peptide
            //you should update this so you can change the smoothing
            RTPeak        start     = new RTPeak(0, 0, 0);
            RTPeak        end       = new RTPeak(0, 0, 100000);
            List <RTPeak> copyPeaks = new List <RTPeak>();

            if (isLibrary)
            {
                copyPeaks.Add(start);
                copyPeaks.Add(start);
                copyPeaks.Add(start);
                copyPeaks.Add(start);
                foreach (var peak in targetPeptide.XICLibrary)
                {
                    copyPeaks.Add(peak);
                }
                copyPeaks.Add(end);
                copyPeaks.Add(end);
                copyPeaks.Add(end);
                copyPeaks.Add(end);
                copyPeaks = FillInXICGaps(copyPeaks);
                return(GetRollingAveragePeaks(copyPeaks, 7));
            }
            else
            {
                copyPeaks.Add(start);
                copyPeaks.Add(start);
                copyPeaks.Add(start);
                copyPeaks.Add(start);
                foreach (var peak in targetPeptide.XICExperiment)
                {
                    copyPeaks.Add(peak);
                }
                copyPeaks.Add(end);
                copyPeaks.Add(end);
                copyPeaks.Add(end);
                copyPeaks.Add(end);
                copyPeaks = FillInXICGaps(copyPeaks);
                return(GetRollingAveragePeaks(copyPeaks, 7));
            }
        }
Exemple #5
0
        private static List <RTPeak> FillInXICGaps(List <RTPeak> peaks)
        {
            List <RTPeak> returnList = new List <RTPeak>();

            returnList.Add(peaks[0]);
            for (int i = 1; i < peaks.Count - 1; i++)
            {
                if (peaks[i - 1].Intensity != 0 && peaks[i].Intensity == 0 && peaks[i + 1].Intensity != 0)
                {
                    //this is a drop out which confuses analysis so fill it in
                    double intermediateIntensity = peaks[i - 1].Intensity + peaks[i + 1].Intensity;
                    intermediateIntensity = intermediateIntensity / 2;
                    double intermediateSN = peaks[i - 1].Sn + peaks[i + 1].Sn;
                    intermediateSN = intermediateSN / 2;
                    RTPeak newPeak = new RTPeak(peaks[i].MZ, intermediateIntensity, intermediateSN, peaks[i].RT);
                    returnList.Add(newPeak);
                }
                else
                {
                    returnList.Add(peaks[i]);
                }
            }
            return(returnList);
        }
        public static void GetFWHMWindow(LFPeptide peptide)
        {
            var apexPeak   = peptide.apexPeakLibrary;
            var threshold  = apexPeak.Intensity * .5;
            var startIndex = peptide.SmoothLibrary.BinarySearch(apexPeak);

            if (startIndex < 0)
            {
                startIndex = ~startIndex;
            }

            RTPeak LeftFWHM  = null;
            RTPeak RightFWHM = null;

            for (int i = startIndex; i < peptide.SmoothLibrary.Count; i++)
            {
                var currPeak = peptide.SmoothLibrary[i];
                if (currPeak.Intensity < threshold)
                {
                    break;
                }
                RightFWHM = currPeak;
            }
            for (int i = startIndex; i >= 0; i--)
            {
                var currPeak = peptide.SmoothLibrary[i];
                if (currPeak.Intensity < threshold)
                {
                    break;
                }
                LeftFWHM = currPeak;
            }

            peptide.LeftFWHM  = LeftFWHM;
            peptide.RightFWHM = RightFWHM;
        }
Exemple #7
0
 public bool Equals(RTPeak obj)
 {
     return(obj is RTPeak && Equals((RTPeak)obj));
 }
Exemple #8
0
        public int CompareTo(Object other)
        {
            RTPeak otherPeak = (RTPeak)other;

            return(RT.CompareTo(otherPeak.RT));
        }
Exemple #9
0
 public int CompareTo(RTPeak other)
 {
     return(RT.CompareTo(other.RT));
 }
Exemple #10
0
 public void AddExperimentPeak(RTPeak peak)
 {
     XICExperiment.Add(peak);
 }
Exemple #11
0
        public void AddExperimentPeak(MZPeak peak, double RT)
        {
            var newRTPeak = new RTPeak(peak, RT);

            XICExperiment.Add(newRTPeak);
        }
Exemple #12
0
 public void AddLibraryPeak(RTPeak peak)
 {
     XICLibrary.Add(peak);
 }
Exemple #13
0
        public void AddLibraryPeak(MZPeak peak, double RT)
        {
            var newRTPeak = new RTPeak(peak, RT);

            XICLibrary.Add(newRTPeak);
        }
        public static ChromaPeak GetChromaPeak(RTPeak startPeak, List <RTPeak> XICPeaks)
        {
            int startIndex = XICPeaks.BinarySearch(startPeak);

            if (startIndex < 0)
            {
                startIndex = ~startIndex;
            }
            int leftIndex  = 0;
            int apexIndex  = startIndex;
            int rightIndex = 0;

            double sumLeft  = 0;
            double sumRight = 0;

            for (int i = 1; i <= 5; i++)
            {
                if ((apexIndex - i) >= 0)
                {
                    sumLeft += XICPeaks[apexIndex - i].Intensity;
                }
                if ((apexIndex + i) < XICPeaks.Count)
                {
                    sumRight += XICPeaks[apexIndex + i].Intensity;
                }
            }
            if (sumLeft == 0 && sumRight == 0)
            {
                return(null);
            }
            var returnPeak = new ChromaPeak();

            returnPeak.initialPeak = startPeak;
            try
            {
                if (sumRight > sumLeft) //assume that the max lies to the right
                {
                    bool   isAscending     = true;
                    bool   isDescending    = false;
                    RTPeak currentMax      = XICPeaks[startIndex];
                    double threshold       = currentMax.Intensity * 0.01;
                    RTPeak currentMinRight = null;
                    RTPeak currentMinLeft  = null;
                    int    currentIndex    = 1 + startIndex;
                    while (isAscending)
                    {
                        if (currentIndex < XICPeaks.Count)
                        {
                            var currentPeak = XICPeaks[currentIndex];
                            if (currentPeak.Intensity > currentMax.Intensity) //Reset max and threshold, continue on
                            {
                                currentMax = currentPeak;
                                threshold  = currentMax.Intensity * 0.01;
                                currentIndex++;
                                continue;
                            }
                            else //Could be that I was at the apex, or I'm in a dip
                            {
                                if (currentPeak.Intensity < (currentMax.Intensity * (1.0 / 1.8)))
                                //I was at the max, so I want to keep this point
                                {
                                    //and start looking for the right minimum
                                    isAscending  = false;
                                    isDescending = true;
                                    break;
                                }
                                else
                                //could be the start of the descent or some weird dip. Look ahead to the next peaks to find out.
                                {
                                    int AdditionalCounter = 1;
                                    while (true) //keep in this loop until one of the conditions is satisfied.
                                    {
                                        int aheadIndex = currentIndex + AdditionalCounter;
                                        if ((aheadIndex) < XICPeaks.Count)
                                        {
                                            var aheadPeak = XICPeaks[aheadIndex];
                                            if (aheadPeak.Intensity < (currentMax.Intensity * (1.0 / 1.8)))
                                            {
                                                isAscending  = false;
                                                isDescending = true;
                                                break;
                                            }
                                            if (aheadPeak.Intensity > currentMax.Intensity)
                                            {
                                                currentMax    = aheadPeak;
                                                currentIndex += AdditionalCounter;
                                                //currentIndex++;
                                                break;
                                            }
                                            AdditionalCounter++;
                                        }
                                        else
                                        {
                                            isAscending  = false;
                                            isDescending = true;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    //you have located the max. assume that the peak to right is the local minima
                    currentIndex++;
                    if (currentIndex < XICPeaks.Count)
                    {
                        currentMinRight = XICPeaks[currentIndex];
                    }
                    currentIndex++;
                    while (isDescending)
                    {
                        if (currentIndex < XICPeaks.Count)
                        {
                            var currentPeak = XICPeaks[currentIndex];
                            if (currentPeak.Intensity <= currentMinRight.Intensity)
                            {
                                currentMinRight = currentPeak;
                                if (currentPeak.Intensity < threshold)
                                {
                                    isDescending = false;
                                    break;
                                }
                            }
                            if (currentPeak.Intensity > currentMinRight.Intensity)
                            //could be the local min or some weird dip
                            {
                                int AdditionalCounter = 1;
                                while (true)
                                {
                                    int aheadIndex = currentIndex + AdditionalCounter;
                                    if ((aheadIndex) < XICPeaks.Count)
                                    {
                                        var aheadPeak = XICPeaks[aheadIndex];
                                        if (aheadPeak.Intensity > (1.8 * currentMinRight.Intensity))
                                        //There is a new peak coming up. You have found the local min. Break out.
                                        {
                                            isDescending = false;
                                            break;
                                        }
                                        if (aheadPeak.Intensity < currentMinRight.Intensity || aheadPeak.Intensity == 0)
                                        {
                                            currentMinRight = aheadPeak;
                                            currentIndex   += AdditionalCounter;
                                            //currentIndex++;
                                            break;
                                        }
                                        AdditionalCounter++;
                                    }
                                    else
                                    {
                                        isDescending = false;
                                        break;
                                    }
                                }
                            }
                            currentIndex++;
                        }
                        else
                        {
                            isDescending = false;
                        }
                    }
                    //you now have the max, and the right minima. Assume that the peak to the left of the start point is the left minima.
                    currentIndex = startIndex - 1;
                    if (currentIndex >= 0)
                    {
                        currentMinLeft = XICPeaks[currentIndex];
                    }
                    currentIndex--;
                    isDescending = true;
                    while (isDescending)
                    {
                        if (currentIndex >= 0)
                        {
                            var currentPeak = XICPeaks[currentIndex];
                            if (currentPeak.Intensity <= currentMinLeft.Intensity)
                            {
                                currentMinLeft = currentPeak;
                                if (currentPeak.Intensity < threshold)
                                {
                                    isDescending = false;
                                    break;
                                }
                            }
                            if (currentPeak.Intensity > currentMinLeft.Intensity)
                            //could be the local min or some weird dip
                            {
                                int AdditionalCounter = 1;
                                while (true)
                                {
                                    int aheadIndex = currentIndex - AdditionalCounter;
                                    if ((aheadIndex) >= 0)
                                    {
                                        var aheadPeak = XICPeaks[aheadIndex];
                                        if (aheadPeak.Intensity > (1.8 * currentMinLeft.Intensity))
                                        //There is a new peak coming up. You have found the local min. Break out.
                                        {
                                            isDescending = false;
                                            break;
                                        }
                                        if (aheadPeak.Intensity < currentMinLeft.Intensity || aheadPeak.Intensity == 0)
                                        {
                                            currentMinLeft = aheadPeak;
                                            currentIndex  -= AdditionalCounter;
                                            //currentIndex--;
                                            break;
                                        }
                                        AdditionalCounter++;
                                    }
                                    else
                                    {
                                        isDescending = false;
                                        break;
                                    }
                                }
                            }
                            currentIndex--;
                        }
                        else
                        {
                            isDescending = false;
                        }
                    }

                    returnPeak.apexPeak  = currentMax;
                    returnPeak.leftPeak  = currentMinLeft;
                    returnPeak.rightPeak = currentMinRight;
                    return(returnPeak);
                }
                else //assume the max lies to the left;
                {
                    bool   isAscending     = true;
                    bool   isDescending    = false;
                    RTPeak currentMax      = XICPeaks[startIndex];
                    double threshold       = currentMax.Intensity * 0.01;
                    RTPeak currentMinRight = null;
                    RTPeak currentMinLeft  = null;
                    int    currentIndex    = startIndex - 1;
                    while (isAscending)
                    {
                        if (currentIndex >= 0)
                        {
                            var currentPeak = XICPeaks[currentIndex];
                            if (currentPeak.Intensity > currentMax.Intensity) //Reset max and threshold, continue on
                            {
                                currentMax = currentPeak;
                                threshold  = currentMax.Intensity * 0.01;
                                currentIndex--;
                                continue;
                            }
                            else //Could be that I was at the apex, or I'm in a dip
                            {
                                if (currentPeak.Intensity < (currentMax.Intensity * (1.0 / 1.8)))
                                //I was at the max, so I want to keep this point
                                {
                                    //and start looking for the right minimum
                                    isAscending  = false;
                                    isDescending = true;
                                    break;
                                }
                                else
                                //could be the start of the descent or some weird dip. Look ahead to the next peaks to find out.
                                {
                                    int AdditionalCounter = 1;
                                    while (true) //keep in this loop until one of the conditions is satisfied.
                                    {
                                        int aheadIndex = currentIndex - AdditionalCounter;
                                        if ((aheadIndex) >= 0)
                                        {
                                            var aheadPeak = XICPeaks[aheadIndex];
                                            if (aheadPeak.Intensity < (currentMax.Intensity * (1.0 / 1.8)))
                                            {
                                                isAscending  = false;
                                                isDescending = true;
                                                break;
                                            }
                                            if (aheadPeak.Intensity > currentMax.Intensity)
                                            {
                                                currentMax    = aheadPeak;
                                                currentIndex -= AdditionalCounter;
                                                //currentIndex--;
                                                break;
                                            }
                                            AdditionalCounter++;
                                        }
                                        else
                                        {
                                            isAscending  = false;
                                            isDescending = true;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            isAscending = false;
                            break;
                        }
                    }
                    currentIndex--;
                    if (currentIndex >= 0)
                    {
                        currentMinLeft = XICPeaks[currentIndex];
                    }
                    currentIndex--;
                    isDescending = true;
                    while (isDescending)
                    {
                        if (currentIndex >= 0)
                        {
                            var currentPeak = XICPeaks[currentIndex];
                            if (currentPeak.Intensity <= currentMinLeft.Intensity)
                            {
                                currentMinLeft = currentPeak;
                                if (currentPeak.Intensity < threshold)
                                {
                                    isDescending = false;
                                    break;
                                }
                            }
                            if (currentPeak.Intensity > currentMinLeft.Intensity)
                            //could be the local min or some weird dip
                            {
                                int AdditionalCounter = 1;
                                while (true)
                                {
                                    int aheadIndex = currentIndex - AdditionalCounter;
                                    if ((aheadIndex) >= 0)
                                    {
                                        var aheadPeak = XICPeaks[aheadIndex];
                                        if (aheadPeak.Intensity > (1.8 * currentMinLeft.Intensity))
                                        //There is a new peak coming up. You have found the local min. Break out.
                                        {
                                            isDescending = false;
                                            break;
                                        }
                                        if (aheadPeak.Intensity < currentMinLeft.Intensity || aheadPeak.Intensity == 0)
                                        {
                                            currentMinLeft = aheadPeak;
                                            currentIndex  -= AdditionalCounter;
                                            //currentIndex--;
                                            break;
                                        }
                                        AdditionalCounter++;
                                    }
                                    else
                                    {
                                        isDescending = false;
                                        break;
                                    }
                                }
                            }
                            currentIndex--;
                        }
                        else
                        {
                            isDescending = false;
                        }
                    }
                    isDescending = true;
                    currentIndex = startIndex + 1;
                    if (currentIndex < XICPeaks.Count)
                    {
                        currentMinRight = XICPeaks[currentIndex];
                    }
                    currentIndex++;
                    while (isDescending)
                    {
                        if (currentIndex < XICPeaks.Count)
                        {
                            var currentPeak = XICPeaks[currentIndex];
                            if (currentPeak.Intensity <= currentMinRight.Intensity)
                            {
                                currentMinRight = currentPeak;
                                if (currentPeak.Intensity < threshold)
                                {
                                    isDescending = false;
                                    break;
                                }
                            }
                            if (currentPeak.Intensity > currentMinRight.Intensity)
                            //could be the local min or some weird dip
                            {
                                int AdditionalCounter = 1;
                                while (true)
                                {
                                    int aheadIndex = currentIndex + AdditionalCounter;
                                    if ((aheadIndex) < XICPeaks.Count)
                                    {
                                        var aheadPeak = XICPeaks[aheadIndex];
                                        if (aheadPeak.Intensity > (1.8 * currentMinRight.Intensity))
                                        //There is a new peak coming up. You have found the local min. Break out.
                                        {
                                            isDescending = false;
                                            break;
                                        }
                                        if (aheadPeak.Intensity < currentMinRight.Intensity || aheadPeak.Intensity == 0)
                                        {
                                            currentMinRight = aheadPeak;
                                            currentIndex   += AdditionalCounter;
                                            //currentIndex++;
                                            break;
                                        }
                                        AdditionalCounter++;
                                    }
                                    else
                                    {
                                        isDescending = false;
                                        break;
                                    }
                                }
                            }
                            currentIndex++;
                        }
                        else
                        {
                            isDescending = false;
                        }
                    }

                    returnPeak.apexPeak  = currentMax;
                    returnPeak.leftPeak  = currentMinLeft;
                    returnPeak.rightPeak = currentMinRight;
                    return(returnPeak);
                }
            }
            catch (Exception e)
            {
                return(null);
            }
        }
        public static void GetApexPeak(LFPeptide targetPeptide, bool isLibrary = true)
        {
            List <RTPeak> XICPeaks   = new List <RTPeak>();
            int           startIndex = 0;

            if (isLibrary)
            {
                XICPeaks.AddRange(targetPeptide.SmoothLibrary);
                startIndex = XICPeaks.BinarySearch(new RTPeak(0, 0, targetPeptide.parentMS1Time));
                if (startIndex < 0)
                {
                    startIndex = ~startIndex;
                }
            }
            else
            {
                XICPeaks.AddRange(targetPeptide.SmoothExperiment);
                startIndex = XICPeaks.BinarySearch(targetPeptide.ExperimentLookupPeak);
                if (startIndex < 0)
                {
                    startIndex = ~startIndex;
                }
            }
            int leftIndex  = 0;
            int apexIndex  = startIndex;
            int rightIndex = 0;

            double sumLeft  = 0;
            double sumRight = 0;

            for (int i = 1; i <= 5; i++)
            {
                if ((apexIndex - i) >= 0)
                {
                    sumLeft += XICPeaks[apexIndex - i].Intensity;
                }
                if ((apexIndex + i) < XICPeaks.Count)
                {
                    sumRight += XICPeaks[apexIndex + i].Intensity;
                }
            }
            if (sumLeft == 0 && sumRight == 0 && isLibrary)
            {
                targetPeptide.apexPeakLibrary  = new RTPeak(targetPeptide.AdjustedMZ_Library, 0, targetPeptide.parentMS1Time);
                targetPeptide.rightPeakLibrary = new RTPeak(targetPeptide.AdjustedMZ_Library, 0, targetPeptide.parentMS1Time);
                targetPeptide.leftPeakLibrary  = new RTPeak(targetPeptide.AdjustedMZ_Library, 0, targetPeptide.parentMS1Time);
                return;
            }
            if (sumLeft == 0 && sumRight == 0 && !isLibrary)
            {
                targetPeptide.apexPeakExperiment  = new RTPeak(targetPeptide.AdjustedMZ_Experiment, 0, targetPeptide.parentMS1Time);
                targetPeptide.rightPeakExperiment = new RTPeak(targetPeptide.AdjustedMZ_Experiment, 0, targetPeptide.parentMS1Time);
                targetPeptide.leftPeakExperiment  = new RTPeak(targetPeptide.AdjustedMZ_Experiment, 0, targetPeptide.parentMS1Time);
                return;
            }
            try
            {
                if (sumRight > sumLeft) //assume that the max lies to the right
                {
                    bool   isAscending     = true;
                    bool   isDescending    = false;
                    RTPeak currentMax      = XICPeaks[startIndex];
                    double threshold       = currentMax.Intensity * 0.01;
                    RTPeak currentMinRight = null;
                    RTPeak currentMinLeft  = null;
                    int    currentIndex    = 1 + startIndex;
                    while (isAscending)
                    {
                        if (currentIndex < XICPeaks.Count)
                        {
                            var currentPeak = XICPeaks[currentIndex];
                            if (currentPeak.Intensity > currentMax.Intensity) //Reset max and threshold, continue on
                            {
                                currentMax = currentPeak;
                                threshold  = currentMax.Intensity * 0.01;
                                currentIndex++;
                                continue;
                            }
                            else //Could be that I was at the apex, or I'm in a dip
                            {
                                if (currentPeak.Intensity < (currentMax.Intensity * (1.0 / 1.8)))
                                //I was at the max, so I want to keep this point
                                {
                                    //and start looking for the right minimum
                                    isAscending  = false;
                                    isDescending = true;
                                    break;
                                }
                                else
                                //could be the start of the descent or some weird dip. Look ahead to the next peaks to find out.
                                {
                                    int AdditionalCounter = 1;
                                    while (true) //keep in this loop until one of the conditions is satisfied.
                                    {
                                        int aheadIndex = currentIndex + AdditionalCounter;
                                        if ((aheadIndex) < XICPeaks.Count)
                                        {
                                            var aheadPeak = XICPeaks[aheadIndex];
                                            if (aheadPeak.Intensity < (currentMax.Intensity * (1.0 / 1.8)))
                                            {
                                                isAscending  = false;
                                                isDescending = true;
                                                break;
                                            }
                                            if (aheadPeak.Intensity > currentMax.Intensity)
                                            {
                                                currentMax    = aheadPeak;
                                                currentIndex += AdditionalCounter;
                                                //currentIndex++;
                                                break;
                                            }
                                            AdditionalCounter++;
                                        }
                                        else
                                        {
                                            isAscending  = false;
                                            isDescending = true;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    //you have located the max. assume that the peak to right is the local minima
                    currentIndex++;
                    if (currentIndex < XICPeaks.Count)
                    {
                        currentMinRight = XICPeaks[currentIndex];
                    }
                    currentIndex++;
                    while (isDescending)
                    {
                        if (currentIndex < XICPeaks.Count)
                        {
                            var currentPeak = XICPeaks[currentIndex];
                            if (currentPeak.Intensity <= currentMinRight.Intensity)
                            {
                                currentMinRight = currentPeak;
                                if (currentPeak.Intensity < threshold)
                                {
                                    isDescending = false;
                                    break;
                                }
                            }
                            if (currentPeak.Intensity > currentMinRight.Intensity)
                            //could be the local min or some weird dip
                            {
                                int AdditionalCounter = 1;
                                while (true)
                                {
                                    int aheadIndex = currentIndex + AdditionalCounter;
                                    if ((aheadIndex) < XICPeaks.Count)
                                    {
                                        var aheadPeak = XICPeaks[aheadIndex];
                                        if (aheadPeak.Intensity > (1.8 * currentMinRight.Intensity))
                                        //There is a new peak coming up. You have found the local min. Break out.
                                        {
                                            isDescending = false;
                                            break;
                                        }
                                        if (aheadPeak.Intensity < currentMinRight.Intensity || aheadPeak.Intensity == 0)
                                        {
                                            currentMinRight = aheadPeak;
                                            currentIndex   += AdditionalCounter;
                                            //currentIndex++;
                                            break;
                                        }
                                        AdditionalCounter++;
                                    }
                                    else
                                    {
                                        isDescending = false;
                                        break;
                                    }
                                }
                            }
                        }
                        else
                        {
                            isDescending = false;
                            break;
                        }
                        currentIndex++;
                    }
                    //you now have the max, and the right minima. Assume that the peak to the left of the start point is the left minima.
                    currentIndex = startIndex - 1;
                    if (currentIndex >= 0)
                    {
                        currentMinLeft = XICPeaks[currentIndex];
                    }
                    currentIndex--;
                    isDescending = true;
                    while (isDescending)
                    {
                        if (currentIndex >= 0)
                        {
                            var currentPeak = XICPeaks[currentIndex];
                            if (currentPeak.Intensity <= currentMinLeft.Intensity)
                            {
                                currentMinLeft = currentPeak;
                                if (currentPeak.Intensity < threshold)
                                {
                                    isDescending = false;
                                    break;
                                }
                            }
                            if (currentPeak.Intensity > currentMinLeft.Intensity)
                            //could be the local min or some weird dip
                            {
                                int AdditionalCounter = 1;
                                while (true)
                                {
                                    int aheadIndex = currentIndex - AdditionalCounter;
                                    if ((aheadIndex) >= 0)
                                    {
                                        var aheadPeak = XICPeaks[aheadIndex];
                                        if (aheadPeak.Intensity > (1.8 * currentMinLeft.Intensity))
                                        //There is a new peak coming up. You have found the local min. Break out.
                                        {
                                            isDescending = false;
                                            break;
                                        }
                                        if (aheadPeak.Intensity < currentMinLeft.Intensity || aheadPeak.Intensity == 0)
                                        {
                                            currentMinLeft = aheadPeak;
                                            currentIndex  -= AdditionalCounter;
                                            //currentIndex--;
                                            break;
                                        }
                                        AdditionalCounter++;
                                    }
                                    else
                                    {
                                        isDescending = false;
                                        break;
                                    }
                                }
                            }
                            currentIndex--;
                        }
                        else
                        {
                            isDescending = false;
                        }
                    }
                    if (isLibrary)
                    {
                        targetPeptide.apexPeakLibrary  = currentMax;
                        targetPeptide.leftPeakLibrary  = currentMinLeft;
                        targetPeptide.rightPeakLibrary = currentMinRight;
                    }
                    else
                    {
                        targetPeptide.apexPeakExperiment  = currentMax;
                        targetPeptide.leftPeakExperiment  = currentMinLeft;
                        targetPeptide.rightPeakExperiment = currentMinRight;
                    }
                }
                else //assume the max lies to the left;
                {
                    bool   isAscending     = true;
                    bool   isDescending    = false;
                    RTPeak currentMax      = XICPeaks[startIndex];
                    double threshold       = currentMax.Intensity * 0.01;
                    RTPeak currentMinRight = null;
                    RTPeak currentMinLeft  = null;
                    int    currentIndex    = startIndex - 1;
                    while (isAscending)
                    {
                        if (currentIndex >= 0)
                        {
                            var currentPeak = XICPeaks[currentIndex];
                            if (currentPeak.Intensity > currentMax.Intensity) //Reset max and threshold, continue on
                            {
                                currentMax = currentPeak;
                                threshold  = currentMax.Intensity * 0.01;
                                currentIndex--;
                                continue;
                            }
                            else //Could be that I was at the apex, or I'm in a dip
                            {
                                if (currentPeak.Intensity < (currentMax.Intensity * (1.0 / 1.8)))
                                //I was at the max, so I want to keep this point
                                {
                                    //and start looking for the right minimum
                                    isAscending  = false;
                                    isDescending = true;
                                    break;
                                }
                                else
                                //could be the start of the descent or some weird dip. Look ahead to the next peaks to find out.
                                {
                                    int AdditionalCounter = 1;
                                    while (true) //keep in this loop until one of the conditions is satisfied.
                                    {
                                        int aheadIndex = currentIndex - AdditionalCounter;
                                        if ((aheadIndex) >= 0)
                                        {
                                            var aheadPeak = XICPeaks[aheadIndex];
                                            if (aheadPeak.Intensity < (currentMax.Intensity * (1.0 / 1.8)))
                                            {
                                                isAscending  = false;
                                                isDescending = true;
                                                break;
                                            }
                                            if (aheadPeak.Intensity > currentMax.Intensity)
                                            {
                                                currentMax    = aheadPeak;
                                                currentIndex -= AdditionalCounter;
                                                //currentIndex--;
                                                break;
                                            }
                                            AdditionalCounter++;
                                        }
                                        else
                                        {
                                            isAscending  = false;
                                            isDescending = true;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    currentIndex--;
                    if (currentIndex >= 0)
                    {
                        currentMinLeft = XICPeaks[currentIndex];
                    }
                    currentIndex--;
                    isDescending = true;
                    while (isDescending)
                    {
                        if (currentIndex >= 0)
                        {
                            var currentPeak = XICPeaks[currentIndex];
                            if (currentPeak.Intensity <= currentMinLeft.Intensity)
                            {
                                currentMinLeft = currentPeak;
                                if (currentPeak.Intensity < threshold)
                                {
                                    isDescending = false;
                                    break;
                                }
                            }
                            if (currentPeak.Intensity > currentMinLeft.Intensity)
                            //could be the local min or some weird dip
                            {
                                int AdditionalCounter = 1;
                                while (true)
                                {
                                    int aheadIndex = currentIndex - AdditionalCounter;
                                    if ((aheadIndex) >= 0)
                                    {
                                        var aheadPeak = XICPeaks[aheadIndex];
                                        if (aheadPeak.Intensity > (1.8 * currentMinLeft.Intensity))
                                        //There is a new peak coming up. You have found the local min. Break out.
                                        {
                                            isDescending = false;
                                            break;
                                        }
                                        if (aheadPeak.Intensity < currentMinLeft.Intensity || aheadPeak.Intensity == 0)
                                        {
                                            currentMinLeft = aheadPeak;
                                            currentIndex  -= AdditionalCounter;
                                            //currentIndex--;
                                            break;
                                        }
                                        AdditionalCounter++;
                                    }
                                    else
                                    {
                                        isDescending = false;
                                        break;
                                    }
                                }
                            }
                            currentIndex--;
                        }
                        else
                        {
                            isDescending = false;
                        }
                    }
                    isDescending = true;
                    currentIndex = startIndex + 1;
                    if (currentIndex < XICPeaks.Count)
                    {
                        currentMinRight = XICPeaks[currentIndex];
                    }
                    currentIndex++;
                    while (isDescending)
                    {
                        if (currentIndex < XICPeaks.Count)
                        {
                            var currentPeak = XICPeaks[currentIndex];
                            if (currentPeak.Intensity <= currentMinRight.Intensity)
                            {
                                currentMinRight = currentPeak;
                                if (currentPeak.Intensity < threshold)
                                {
                                    isDescending = false;
                                    break;
                                }
                            }
                            if (currentPeak.Intensity > currentMinRight.Intensity)
                            //could be the local min or some weird dip
                            {
                                int AdditionalCounter = 1;
                                while (true)
                                {
                                    int aheadIndex = currentIndex + AdditionalCounter;
                                    if ((aheadIndex) < XICPeaks.Count)
                                    {
                                        var aheadPeak = XICPeaks[aheadIndex];
                                        if (aheadPeak.Intensity > (1.8 * currentMinRight.Intensity))
                                        //There is a new peak coming up. You have found the local min. Break out.
                                        {
                                            isDescending = false;
                                            break;
                                        }
                                        if (aheadPeak.Intensity < currentMinRight.Intensity || aheadPeak.Intensity == 0)
                                        {
                                            currentMinRight = aheadPeak;
                                            currentIndex   += AdditionalCounter;
                                            //currentIndex++;
                                            break;
                                        }
                                        AdditionalCounter++;
                                    }
                                    else
                                    {
                                        isDescending = false;
                                        break;
                                    }
                                }
                            }
                            currentIndex++;
                        }
                        else
                        {
                            isDescending = false;
                        }
                    }
                    if (isLibrary)
                    {
                        targetPeptide.apexPeakLibrary  = currentMax;
                        targetPeptide.leftPeakLibrary  = currentMinLeft;
                        targetPeptide.rightPeakLibrary = currentMinRight;
                    }
                    else
                    {
                        targetPeptide.apexPeakExperiment  = currentMax;
                        targetPeptide.leftPeakExperiment  = currentMinLeft;
                        targetPeptide.rightPeakExperiment = currentMinRight;
                    }
                }
            }
            catch (Exception e)
            {
                if (isLibrary)
                {
                    targetPeptide.apexPeakLibrary  = new RTPeak(targetPeptide.AdjustedMZ_Library, 0, targetPeptide.parentMS1Time);
                    targetPeptide.leftPeakLibrary  = new RTPeak(targetPeptide.AdjustedMZ_Library, 0, targetPeptide.parentMS1Time);
                    targetPeptide.rightPeakLibrary = new RTPeak(targetPeptide.AdjustedMZ_Library, 0, targetPeptide.parentMS1Time);
                }
                else
                {
                    targetPeptide.apexPeakExperiment  = new RTPeak(targetPeptide.AdjustedMZ_Library, 0, targetPeptide.parentMS1Time);
                    targetPeptide.leftPeakExperiment  = new RTPeak(targetPeptide.AdjustedMZ_Library, 0, targetPeptide.parentMS1Time);
                    targetPeptide.rightPeakExperiment = new RTPeak(targetPeptide.AdjustedMZ_Library, 0, targetPeptide.parentMS1Time);
                }
                return;
            }
        }