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); } } }
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; }
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); } } }