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 GetExtractedIonChromatogram(double minMz, double maxMz, List <LcMsPeak> peakList) { var xic = GetXicPointsWithin(minMz, maxMz, peakList); xic.Sort(); return(Xic.GetSelectedXic(xic)); }
/// <summary> /// Smooth and snip tails off a single XIC. /// </summary> /// <param name="xic">The XIC to refine.</param> /// <returns>Refined XIC.</returns> public Xic RefineXic(Xic xic) { // Here we smooth the points...and remove any features with from and trailing zero points if (xic.Count == 0) { return(xic); } var unsmoothedPoints = xic.Select(xicp => new XYData(xicp.ScanNum, xicp.Intensity)) .OrderBy(p => p.X).ToList(); var points = smoother.Smooth(unsmoothedPoints); // Find the biggest peak... var maxScanIndex = 0; double maxAbundance = 0; for (var i = 0; i < xic.Count; i++) { if (maxAbundance < xic[i].Intensity) { maxScanIndex = i; maxAbundance = xic[i].Intensity; } } // Then find when the feature goes to zero // Start from max to left var startIndex = maxScanIndex; // If we hit zero, then keep for (; startIndex > 0; startIndex--) { if ((xic[startIndex].Intensity / maxAbundance) < this.relativeIntensityThreshold) { break; } } // Start from max to right var stopIndex = maxScanIndex; for (; stopIndex < xic.Count - 1; stopIndex++) { if ((xic[stopIndex].Intensity / maxAbundance) < this.relativeIntensityThreshold) { break; } } // Add the features back for (var i = startIndex; i <= stopIndex; i++) { xic[i] = new XicPoint(Convert.ToInt32(xic[i].ScanNum), xic[i].Mz, Convert.ToInt64(points[i].Y)); } return(xic); }
public new Xic GetFullProductExtractedIonChromatogram(double minMz, double maxMz, double precursorIonMz) { var xic = GetProductExtractedIonChromatogram(minMz, maxMz, precursorIonMz); var scanToXicPoint = new XicPoint[MaxLcScan - MinLcScan + 1]; foreach (var xicPoint in xic) scanToXicPoint[xicPoint.ScanNum - MinLcScan] = xicPoint; var newXic = new Xic(); newXic.AddRange(GetFragmentationSpectraScanNums(precursorIonMz).Select(scanNum => scanToXicPoint[scanNum - MinLcScan] ?? new XicPoint(scanNum, 0, 0))); return newXic; }
public Xic GetProductExtractedIonChromatogram(double minMz, double maxMz, double precursorIonMz) { var xic = new Xic(); foreach (var isolationWindow in GetIsoWindows(precursorIonMz)) { var peakList = _isoWindowToChromPeaks[isolationWindow]; xic.AddRange(GetXicPointsWithin(minMz, maxMz, peakList)); } xic.Sort(); return Xic.GetSelectedXic(xic); }
public Xic GetProductExtractedIonChromatogram(double minMz, double maxMz, double precursorIonMz) { var xic = new Xic(); foreach (var isolationWindow in GetIsoWindows(precursorIonMz)) { var peakList = _isoWindowToChromPeaks[isolationWindow]; xic.AddRange(GetXicPointsWithin(minMz, maxMz, peakList)); } xic.Sort(); return(Xic.GetSelectedXic(xic)); }
public new Xic GetFullProductExtractedIonChromatogram(double minMz, double maxMz, double precursorIonMz) { var xic = GetProductExtractedIonChromatogram(minMz, maxMz, precursorIonMz); var scanToXicPoint = new XicPoint[MaxLcScan - MinLcScan + 1]; foreach (var xicPoint in xic) { scanToXicPoint[xicPoint.ScanNum - MinLcScan] = xicPoint; } var newXic = new Xic(); newXic.AddRange(GetFragmentationSpectraScanNums(precursorIonMz).Select(scanNum => scanToXicPoint[scanNum - MinLcScan] ?? new XicPoint(scanNum, 0, 0))); return(newXic); }
private List <Xic> ReadXicDatabase(string path) { var lines = File.ReadAllLines(path).ToList(); var xic = new Xic(); var data = new List <Xic>(); var found = false; foreach (var line in lines) { if (line.Contains("id")) { if (found) { data.Add(xic); } found = true; xic = new Xic(); var splitLine = line.Split('\t'); xic.id = Convert.ToInt32(splitLine[1]); xic.charge = Convert.ToInt32(splitLine[3]); xic.x = new List <double>(); xic.y = new List <double>(); } else if (line.Contains("score")) { var splitLine = line.Split('\t'); xic.score = Convert.ToInt32(splitLine[1]); xic.scoreName = splitLine[3]; } else if (line.Contains("reviewer")) { var splitLine = line.Split('\t'); xic.reviewer = splitLine[1]; } else if (!line.Contains("mz")) { var splitLine = line.Split('\t'); xic.x.Add(Convert.ToDouble(splitLine[1])); xic.y.Add(Convert.ToDouble(splitLine[2])); xic.mz = Convert.ToDouble(splitLine[0]); } } if (found) { data.Add(xic); } return(data); }
public SpectrumSearchResult(ProductSpectrum hcdSpectrum, ProductSpectrum cidSpectrum, Spectrum precursorSpectrum, List <MsMsSearchResult> hcdSearchResultList, List <MsMsSearchResult> cidSearchResultList, Xic xic, LcMsRun lcMsRun, ScoreModel scoreModel = null, LipidTarget lipidTarget = null) { HcdSpectrum = hcdSpectrum; CidSpectrum = cidSpectrum; PrecursorSpectrum = precursorSpectrum; HcdSearchResultList = hcdSearchResultList; CidSearchResultList = cidSearchResultList; Xic = xic; LcMsRun = lcMsRun; PeakArea = null; RunLength = lcMsRun.GetElutionTime(lcMsRun.MaxLcScan); ApexScanNum = Xic.GetNearestApexScanNum(PrecursorSpectrum.ScanNum, performSmoothing: true); ApexIntensity = Xic.Where(x => x.ScanNum == ApexScanNum).Sum(x => x.Intensity); RetentionTime = LcMsRun.GetElutionTime(ApexScanNum); if (scoreModel != null && lipidTarget != null) { ModelScore = scoreModel.ScoreLipid(lipidTarget, this); } }
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; }
/// <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); }
public void SolveAsymmetricGaussianFactory(string path, BasisFunctionsEnum functionChoise) { var data = ReadXicDatabase(Path.Combine(TestPathSingleton.TestDirectory, path)); var newData = new List <Xic>(); foreach (var xic in data) { var basisFunction = BasisFunctionFactory.BasisFunctionSelector(functionChoise); var coefficients = basisFunction.Coefficients; var start = xic.x.Min() - .5; var stop = xic.x.Max() + .5; var A = xic.y.Max(); A += (A * .05); var width = Math.Abs(stop - start); coefficients[0] = start + ((stop - start) / 2); coefficients[1] = A; coefficients[2] = width * .5; coefficients[3] = coefficients[2]; //Console.WriteLine("Xic {0}", xic.id); //Console.WriteLine(); for (var i = 0; i < xic.x.Count; i++) { // Console.WriteLine("{0}\t{1}", xic.x[i], xic.y[i]); } SolverReport worked = null; Console.WriteLine(); var showDetails = false; try { worked = EvaluateFunction(xic.x, xic.y, basisFunction, ref coefficients, showDetails); } catch (Exception) { continue; } // First solve for the function var solver = new LevenburgMarquadtSolver(); var numberOfSamples = 100; // Calculate the width an spacing of each of the trapezoids. var delta = width / Convert.ToDouble(numberOfSamples); var x = start; var newXic = new Xic(); newXic.x = new List <double>(); newXic.y = new List <double>(); newXic.charge = xic.charge; newXic.scoreName = xic.scoreName; newXic.score = xic.score; newXic.id = xic.id; newXic.prevXic = xic; newXic.report = worked; newXic.reviewer = xic.reviewer; // We already evaluated the first point, now for each element within for (var i = 0; i < numberOfSamples + 1; i++) { x += delta; var y = basisFunction.Evaluate(coefficients, x); newXic.x.Add(x); newXic.y.Add(y); // Console.WriteLine("{0}\t{1}", x, y); } //Console.WriteLine(); newData.Add(newXic); } var newPath = path.Replace(".xic", functionChoise + "_fit.xic"); using (TextWriter writer = File.CreateText(newPath)) { foreach (var feature in newData) { writer.WriteLine("id\t{0}\tcharge\t{1}", feature.id, feature.charge); writer.WriteLine("score\t{0}\tscoreName\t{1}", feature.score, feature.scoreName); writer.WriteLine("reviewer\t{0}", feature.reviewer); writer.WriteLine("R2\t{0}", feature.report.RSquared); writer.WriteLine("Rms\t{0}", feature.report.RmsError); writer.WriteLine("Converged\t{0}", feature.report.DidConverge); writer.WriteLine("mz\ttime\tintensity"); var prev = feature.prevXic; for (var i = 0; i < feature.x.Count; i++) { var prevTime = ""; var prevInt = ""; if (prev != null && i < prev.x.Count) { prevTime = prev.x[i].ToString(); prevInt = prev.y[i].ToString(); } writer.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", feature.mz, feature.x[i], feature.y[i], prevTime, prevInt); } writer.WriteLine(); } } }
/// <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; }
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; }