Exemplo n.º 1
0
        public LcMsPeakScorer(Ms1Spectrum spec, int numBits4WinSize = 19) // 19 bits -> 4096 ppm,  20 bits -> 2048
        {
            Spectrum = spec;
            var peaks = spec.Peaks;
            _windowComparer = new MzComparerWithBinning(numBits4WinSize);
            _minBinNum = _windowComparer.GetBinNumber(peaks[0].Mz);
            _maxBinNum = _windowComparer.GetBinNumber(peaks[peaks.Length - 1].Mz);
            var numberOfbins = _maxBinNum - _minBinNum + 1;

            _peakStartIndex     = new int[2][];
            _peakRanking        = new int[2][][];
            var intensities     = new List<double>[2][];

            for (var i = 0; i < 2; i++)
            {
                _peakStartIndex[i]  = new int[numberOfbins];
                _peakRanking[i]     = new int[numberOfbins][];
                intensities[i]      = new List<double>[numberOfbins];

                for (var j = 0; j < numberOfbins; j++)
                {
                    _peakStartIndex[i][j]   = peaks.Length - 1;
                    intensities[i][j]       = new List<double>();
                }
            }

            for (var i = 0; i < peaks.Length; i++)
            {
                var binNum = _windowComparer.GetBinNumber(peaks[i].Mz);
                var binMzAverage = _windowComparer.GetMzAverage(binNum);
                var binIdx = binNum - _minBinNum;

                intensities[0][binIdx].Add(peaks[i].Intensity);
                if (i < _peakStartIndex[0][binIdx]) _peakStartIndex[0][binIdx] = i;

                if (peaks[i].Mz < binMzAverage)
                {
                    intensities[1][binIdx].Add(peaks[i].Intensity);
                    if (i < _peakStartIndex[1][binIdx]) _peakStartIndex[1][binIdx] = i;
                }
                else if (binNum < _maxBinNum) // skip this at the rightmost bin
                {
                    intensities[1][binIdx + 1].Add(peaks[i].Intensity);
                    if (i < _peakStartIndex[1][binIdx + 1]) _peakStartIndex[1][binIdx + 1] = i;
                }
            }

            for (var i = 0; i < 2; i++)
            {
                for (var binIdx = 0; binIdx < numberOfbins; binIdx++)
                {
                    if (intensities[i][binIdx].Count < 1) continue;

                    double medianIntensity;
                    _peakRanking[i][binIdx] = GetRankings(intensities[i][binIdx].ToArray(), out medianIntensity);
                }
            }
        }
Exemplo n.º 2
0
        private bool CorrectChargeState(ObservedIsotopeEnvelope envelope, Ms1Spectrum spectrum)
        {
            if (envelope.Charge > 20) return true; //high charge (> +20), just pass

            var peaks = spectrum.Peaks;
            var peakStartIndex = envelope.MinMzPeak.IndexInSpectrum;
            var peakEndIndex = envelope.MaxMzPeak.IndexInSpectrum;
            var intensityThreshold = envelope.HighestIntensity * 0.15;
            
            var nPeaks = 0;
            for (var i = peakStartIndex; i <= peakEndIndex; i++)
            {
                if (peaks[i].Intensity > intensityThreshold) nPeaks++;
            }

            if (envelope.NumberOfPeaks > nPeaks * 0.7) return true;

            //var tolerance = new Tolerance(5);
            var tolerance = new Tolerance(Comparer.Ppm * 0.5);
            var threshold = nPeaks * 0.5;
            var threshold2 = envelope.NumberOfPeaks + (envelope.TheoreticalEnvelope.Size - 1) * 0.7;

            var mzTol = tolerance.GetToleranceAsTh(peaks[peakStartIndex].Mz);

            var minCheckCharge = Math.Max(envelope.Charge * 2 - 1, 4);
            var maxCheckCharge = Math.Min(envelope.Charge * 5 + 1, 60);
            var maxDeltaMz = Constants.C13MinusC12 / minCheckCharge + mzTol;
            var nChargeGaps = new int[maxCheckCharge - minCheckCharge + 1];
            
            for (var i = peakStartIndex; i <= peakEndIndex; i++)
            {
                if (!(peaks[i].Intensity > intensityThreshold)) continue;
                
                for (var j = i + 1; j <= peakEndIndex; j++)
                {
                    if (!(peaks[j].Intensity > intensityThreshold)) continue;
                    
                    var deltaMz = peaks[j].Mz - peaks[i].Mz;

                    if (deltaMz > maxDeltaMz) break;

                    if (Math.Abs(deltaMz - mzTol) < float.Epsilon)
                    {
                        // Peaks are too close together; continue 
                        continue;
                    }

                    for (var c = Math.Round(1 / (deltaMz + mzTol)); c <= Math.Round(1 / (deltaMz - mzTol)); c++)
                    {
                        if (c < minCheckCharge)
                            continue;

                        if (c > maxCheckCharge)
                            break;

                        var k = (int)c - minCheckCharge;
                        nChargeGaps[k]++;

                        if (nChargeGaps[k] + 1 > threshold && nChargeGaps[k] + 1 > threshold2) return false;
                    }
                }
            }

            return true;
        }
Exemplo n.º 3
0
        public LcMsPeakScorer(Ms1Spectrum spec, int numBits4WinSize = 19) // 19 bits -> 4096 ppm,  20 bits -> 2048
        {
            Spectrum = spec;
            var peaks = spec.Peaks;

            _windowComparer = new MzComparerWithBinning(numBits4WinSize);
            _minBinNum      = _windowComparer.GetBinNumber(peaks[0].Mz);
            _maxBinNum      = _windowComparer.GetBinNumber(peaks[peaks.Length - 1].Mz);
            var numberOfbins = _maxBinNum - _minBinNum + 1;

            _peakStartIndex = new int[2][];
            _peakRanking    = new int[2][][];
            var intensities = new List <double> [2][];

            for (var i = 0; i < 2; i++)
            {
                _peakStartIndex[i] = new int[numberOfbins];
                _peakRanking[i]    = new int[numberOfbins][];
                intensities[i]     = new List <double> [numberOfbins];

                for (var j = 0; j < numberOfbins; j++)
                {
                    _peakStartIndex[i][j] = peaks.Length - 1;
                    intensities[i][j]     = new List <double>();
                }
            }

            for (var i = 0; i < peaks.Length; i++)
            {
                var binNum       = _windowComparer.GetBinNumber(peaks[i].Mz);
                var binMzAverage = _windowComparer.GetMzAverage(binNum);
                var binIdx       = binNum - _minBinNum;

                intensities[0][binIdx].Add(peaks[i].Intensity);
                if (i < _peakStartIndex[0][binIdx])
                {
                    _peakStartIndex[0][binIdx] = i;
                }

                if (peaks[i].Mz < binMzAverage)
                {
                    intensities[1][binIdx].Add(peaks[i].Intensity);
                    if (i < _peakStartIndex[1][binIdx])
                    {
                        _peakStartIndex[1][binIdx] = i;
                    }
                }
                else if (binNum < _maxBinNum) // skip this at the rightmost bin
                {
                    intensities[1][binIdx + 1].Add(peaks[i].Intensity);
                    if (i < _peakStartIndex[1][binIdx + 1])
                    {
                        _peakStartIndex[1][binIdx + 1] = i;
                    }
                }
            }

            for (var i = 0; i < 2; i++)
            {
                for (var binIdx = 0; binIdx < numberOfbins; binIdx++)
                {
                    if (intensities[i][binIdx].Count < 1)
                    {
                        continue;
                    }

                    double medianIntensity;
                    _peakRanking[i][binIdx] = GetRankings(intensities[i][binIdx].ToArray(), out medianIntensity);
                }
            }
        }