Пример #1
0
        private PeakList <T> NewSubPeakList()
        {
            var result = new PeakList <T>();

            result.AssignInforamtion(this);
            return(result);
        }
        public static PeakList <T> NormalizePeakIntensities <T>(PeakList <T> pkl, double maxPeakMass) where T : IPeak, new()
        {
            PeakList <T> result = new PeakList <T>();

            result.AssignInforamtion(pkl);
            foreach (var p in pkl)
            {
                result.Add(new T()
                {
                    Mz        = p.Mz,
                    Intensity = p.Intensity,
                    Charge    = p.Charge
                });
            }

            result.RemoveAll(m => m.Mz > maxPeakMass);

            int maxBins;

            if (maxPeakMass > 512)
            {
                maxBins = (int)Math.Ceiling(maxPeakMass / 1024) * 1024;
            }
            else
            {
                maxBins = 512;
            }

            // Section the original peak array in 10 regions and find the
            // base peak in each region. Also, square-root the peak intensities
            const int numberOfRegions = 10;

            double[] basePeakIntensityByRegion = new double[numberOfRegions];
            for (int i = 0; i < basePeakIntensityByRegion.Length; i++)
            {
                basePeakIntensityByRegion[i] = 1;
            }

            int regionSelector = (int)(maxPeakMass / numberOfRegions);

            foreach (var peak in result)
            {
                peak.Intensity = Math.Sqrt(peak.Intensity);

                int mzBin = (int)Math.Round(peak.Mz / binWidth);
                int normalizationIndex = mzBin / regionSelector;
                if (IsValidIndex(normalizationIndex, numberOfRegions))
                {
                    basePeakIntensityByRegion[normalizationIndex] = Math.Max(basePeakIntensityByRegion[normalizationIndex], peak.Intensity);
                }
            }

            // Normalize peaks in each region from 0 to 50.
            // Use base peak in each region for normalization.
            foreach (var peak in result)
            {
                int mzBin = (int)Math.Round(peak.Mz / binWidth);
                int normalizationIndex = mzBin / regionSelector;
                if (IsValidIndex(normalizationIndex, numberOfRegions))
                {
                    peak.Intensity = (peak.Intensity / basePeakIntensityByRegion[normalizationIndex]) * 50;
                }
            }

            return(result);
        }