public bool Find(PeakList <Peak> ms1, ChromatographProfile chro, double mzTolerancePPM, int minimumProfileLength, ref ChromatographProfileScan result)
        {
            var rawPeaks = ms1.GetRange(chro.IsotopicIons[0].MinimumMzWithinTolerance, chro.IsotopicIons[chro.IsotopicIons.Length - 1].MaximumMzWithinTolerance);

            if (rawPeaks.Count < minimumProfileLength)
            {
                return(false);
            }

            List <List <Peak> > envelope = new List <List <Peak> >();
            int peakIndex = 0;

            foreach (var peak in chro.IsotopicIons)
            {
                List <Peak> findPeaks = new List <Peak>();
                while (peakIndex < rawPeaks.Count)
                {
                    var curPeak = rawPeaks[peakIndex];
                    if (curPeak.Mz < peak.MinimumMzWithinTolerance)
                    {
                        peakIndex++;
                        continue;
                    }

                    if (curPeak.Mz > peak.MaximumMzWithinTolerance)
                    {
                        break;
                    }

                    findPeaks.Add(curPeak);
                    peakIndex++;
                }

                if (findPeaks.Count == 0)
                {
                    break;
                }
                else
                {
                    envelope.Add(findPeaks);
                }
            }

            if (envelope.Count < minimumProfileLength)
            {
                return(false);
            }

            result               = new ChromatographProfileScan();
            result.Scan          = ms1.FirstScan;
            result.RetentionTime = ms1.ScanTimes[0].RetentionTime;
            result.RawPeaks      = new List <Peak>();

            List <Peak> resolved = Resolve(chro, envelope);

            foreach (var findPeak in rawPeaks)
            {
                var isotopicIndex = resolved.IndexOf(findPeak);
                if (isotopicIndex == -1)
                {
                    result.RawPeaks.Add(findPeak);
                }
                else
                {
                    var ion = chro.IsotopicIons[isotopicIndex];
                    result.Add(new ChromatographProfileScanPeak()
                    {
                        Isotopic    = isotopicIndex + 1,
                        Mz          = findPeak.Mz,
                        Intensity   = findPeak.Intensity,
                        Noise       = findPeak.Noise,
                        PPMDistance = PrecursorUtils.mz2ppm(findPeak.Mz, findPeak.Mz - ion.Mz)
                    });
                }
            }

            return(true);
        }