public Xic GetProductExtractedIonChromatogram(double productIonMz, double precursorIonMz, Tolerance tolerance, int minScanNum, int maxScanNum) { var productXic = new Xic(); for (var scanNum = minScanNum; scanNum <= maxScanNum; scanNum++) { if (GetMsLevel(scanNum) == 1) { continue; } var productSpec = _scanNumSpecMap[scanNum] as ProductSpectrum; if (productSpec == null) { continue; } if (!productSpec.IsolationWindow.Contains(precursorIonMz)) { continue; } var peak = productSpec.FindPeak(productIonMz, tolerance); if (peak != null) { productXic.Add(new XicPoint(scanNum, peak.Mz, peak.Intensity)); } } return(productXic); }
private static Xic GetXicPointsWithin(double minMz, double maxMz, List <LcMsPeak> peakList) { var xic = new Xic(); var index = peakList.BinarySearch(new LcMsPeak((minMz + maxMz) / 2, 0, 0)); if (index < 0) { index = ~index; } // go down var i = index - 1; while (i >= 0 && i < peakList.Count) { var peak = peakList[i]; if (peak.Mz <= minMz) { break; } xic.Add(new XicPoint(peak)); --i; } // go up i = index; while (i >= 0 && i < peakList.Count) { var peak = peakList[i]; if (peak.Mz >= maxMz) { break; } xic.Add(new XicPoint(peak)); ++i; } return(xic); }
/// <summary> /// Gets the extracted ion chromatogram of the specified m/z range (using only MS2 spectra) /// </summary> /// <param name="minMz">min m/z</param> /// <param name="maxMz">max m/z</param> /// <param name="precursorIonMz">precursor m/z of the precursor ion</param> /// <param name="minScanNum">minimum scan number (inclusive)</param> /// <param name="maxScanNum">maximum scan number (inclusive)</param> /// <returns>XIC as an Xic object</returns> public Xic GetProductExtractedIonChromatogram(double minMz, double maxMz, double precursorIonMz, int minScanNum, int maxScanNum) { var xic = new Xic(); //for (var scanNum = minScanNum; scanNum <= maxScanNum; scanNum++) foreach (var scanNum in GetFragmentationSpectraScanNums(precursorIonMz)) { if (scanNum < minScanNum || scanNum > maxScanNum) { continue; } var spec = GetSpectrum(scanNum) as ProductSpectrum; if (spec == null) { continue; } var peak = spec.FindPeak(minMz, maxMz); xic.Add(peak != null ? new XicPoint(scanNum, peak.Mz, peak.Intensity) : new XicPoint(scanNum, 0, 0)); } return(xic); }
/// <summary> /// Get a segment of Xic containing the targetScanNum /// </summary> /// <param name="xic">xic to be trimmed</param> /// <param name="targetScanNum">target scan number to generate xic</param> /// <param name="tolerance">number of scans that can be tolerated</param> /// <returns>Trimmed XIC around targetScanNum</returns> public Xic GetTrimmedXic(Xic xic, int targetScanNum, int tolerance = 3) { var index = xic.BinarySearch(new XicPoint(targetScanNum, 0, 0)); if (index < 0) index = ~index; var xicSegment = new Xic(); var curScanNum = targetScanNum; // go down var i = index - 1; while (i >= 0 && i < xic.Count) { var xicPeak = xic[i]; // check whether there's no MS1 scan in between var isConsecutive = true; var numMissingScans = 0; for (var scanNum = xicPeak.ScanNum + 1; scanNum < curScanNum; scanNum++) { if (GetMsLevel(scanNum) == 1) ++numMissingScans; if (numMissingScans > tolerance) { isConsecutive = false; break; } } if (isConsecutive) xicSegment.Add(xicPeak); else break; curScanNum = xicPeak.ScanNum; --i; } // go up i = index; curScanNum = targetScanNum; while (i >= 0 && i < xic.Count) { var xicPeak = xic[i]; // check whether there's no MS1 scan in between var numMissingScans = 0; var isConsecutive = true; for (var scanNum = curScanNum + 1; scanNum < xicPeak.ScanNum; scanNum++) { if (GetMsLevel(scanNum) == 1) ++numMissingScans; if (numMissingScans > tolerance) { isConsecutive = false; break; } } if (isConsecutive) xicSegment.Add(xicPeak); else break; curScanNum = xicPeak.ScanNum; ++i; } xicSegment.Sort(); return xicSegment; }
private static Xic GetXicPointsWithin(double minMz, double maxMz, List<LcMsPeak> peakList) { var xic = new Xic(); var index = peakList.BinarySearch(new LcMsPeak((minMz + maxMz) / 2, 0, 0)); if (index < 0) index = ~index; // go down var i = index - 1; while (i >= 0 && i < peakList.Count) { var peak = peakList[i]; if (peak.Mz <= minMz) break; xic.Add(new XicPoint(peak)); --i; } // go up i = index; while (i >= 0 && i < peakList.Count) { var peak = peakList[i]; if (peak.Mz >= maxMz) break; xic.Add(new XicPoint(peak)); ++i; } return xic; }
public Xic GetProductExtractedIonChromatogram(double productIonMz, double precursorIonMz, Tolerance tolerance, int minScanNum, int maxScanNum) { var productXic = new Xic(); for (var scanNum = minScanNum; scanNum <= maxScanNum; scanNum++) { if (GetMsLevel(scanNum) == 1) continue; var productSpec = _scanNumSpecMap[scanNum] as ProductSpectrum; if (productSpec == null) continue; if (!productSpec.IsolationWindow.Contains(precursorIonMz)) continue; var peak = productSpec.FindPeak(productIonMz, tolerance); if (peak != null) productXic.Add(new XicPoint(scanNum, peak.Mz, peak.Intensity)); } return productXic; }
/// <summary> /// Gets the extracted ion chromatogram of the specified m/z range (using only MS2 spectra) /// </summary> /// <param name="minMz">min m/z</param> /// <param name="maxMz">max m/z</param> /// <param name="precursorIonMz">precursor m/z of the precursor ion</param> /// <param name="minScanNum">minimum scan number (inclusive)</param> /// <param name="maxScanNum">maximum scan number (inclusive)</param> /// <returns>XIC as an Xic object</returns> public Xic GetProductExtractedIonChromatogram(double minMz, double maxMz, double precursorIonMz, int minScanNum, int maxScanNum) { var xic = new Xic(); //for (var scanNum = minScanNum; scanNum <= maxScanNum; scanNum++) foreach (var scanNum in GetFragmentationSpectraScanNums(precursorIonMz)) { if (scanNum < minScanNum || scanNum > maxScanNum) continue; var spec = GetSpectrum(scanNum) as ProductSpectrum; if (spec == null) continue; var peak = spec.FindPeak(minMz, maxMz); xic.Add(peak != null ? new XicPoint(scanNum, peak.Mz, peak.Intensity) : new XicPoint(scanNum, 0, 0)); } return xic; }
/// <summary> /// Get a segment of Xic containing the targetScanNum /// </summary> /// <param name="xic">xic to be trimmed</param> /// <param name="targetScanNum">target scan number to generate xic</param> /// <param name="tolerance">number of scans that can be tolerated</param> /// <returns>Trimmed XIC around targetScanNum</returns> public Xic GetTrimmedXic(Xic xic, int targetScanNum, int tolerance = 3) { var index = xic.BinarySearch(new XicPoint(targetScanNum, 0, 0)); if (index < 0) { index = ~index; } var xicSegment = new Xic(); var curScanNum = targetScanNum; // go down var i = index - 1; while (i >= 0 && i < xic.Count) { var xicPeak = xic[i]; // check whether there's no MS1 scan in between var isConsecutive = true; var numMissingScans = 0; for (var scanNum = xicPeak.ScanNum + 1; scanNum < curScanNum; scanNum++) { if (GetMsLevel(scanNum) == 1) { ++numMissingScans; } if (numMissingScans > tolerance) { isConsecutive = false; break; } } if (isConsecutive) { xicSegment.Add(xicPeak); } else { break; } curScanNum = xicPeak.ScanNum; --i; } // go up i = index; curScanNum = targetScanNum; while (i >= 0 && i < xic.Count) { var xicPeak = xic[i]; // check whether there's no MS1 scan in between var numMissingScans = 0; var isConsecutive = true; for (var scanNum = curScanNum + 1; scanNum < xicPeak.ScanNum; scanNum++) { if (GetMsLevel(scanNum) == 1) { ++numMissingScans; } if (numMissingScans > tolerance) { isConsecutive = false; break; } } if (isConsecutive) { xicSegment.Add(xicPeak); } else { break; } curScanNum = xicPeak.ScanNum; ++i; } xicSegment.Sort(); return(xicSegment); }