From 4a32c2d2d3da48513d41d432d8a17adf5e3fe00c Mon Sep 17 00:00:00 2001 From: Nicholas Shulman Date: Thu, 10 Oct 2024 09:11:21 -0700 Subject: [PATCH 1/2] Fix AssumptionException in PeakMatcher.cs Fixed error doing "Apply peak to all" when a particular replicate has no chromatograms that match transitions in the document but does have some hidden MS1 chromatograms (reported by Jeannie) --- pwiz_tools/Skyline/Model/PeakMatcher.cs | 57 +++++++++++++++---------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/pwiz_tools/Skyline/Model/PeakMatcher.cs b/pwiz_tools/Skyline/Model/PeakMatcher.cs index dc2618744f7..10fdf552972 100644 --- a/pwiz_tools/Skyline/Model/PeakMatcher.cs +++ b/pwiz_tools/Skyline/Model/PeakMatcher.cs @@ -54,14 +54,9 @@ private static void GetReferenceData(SrmDocument doc, PeptideDocNode nodePep, Tr if (tranGroupChromInfo == null) return; - var chromSet = doc.Settings.MeasuredResults.Chromatograms[resultsIndex]; - if (!doc.Settings.MeasuredResults.TryLoadChromatogram(chromSet, nodePep, nodeTranGroup, mzMatchTolerance, out var chromGroupInfos)) + var chromGroupInfo = GetChromatogramGroupInfo(doc, nodePep, nodeTranGroup, resultsIndex, resultsFile); + if (chromGroupInfo == null) return; - - var chromGroupInfo = chromGroupInfos.FirstOrDefault(info => Equals(chromSet.GetFileInfo(tranGroupChromInfo.FileId).FilePath, info.FilePath)); - if (chromGroupInfo == null || chromGroupInfo.NumPeaks == 0 || !chromGroupInfo.TimeIntensitiesGroup.HasAnyPoints) - return; - runTime = chromGroupInfo.RunStartTime; if (!tranGroupChromInfo.RetentionTime.HasValue || !tranGroupChromInfo.StartRetentionTime.HasValue || !tranGroupChromInfo.EndRetentionTime.HasValue) @@ -157,7 +152,7 @@ public static SrmDocument ApplyPeak(IProgressMonitor progressMonitor, IProgressS continue; } - var bestMatch = GetPeakMatch(doc, chromSet, fileInfo, nodeTranGroup, referenceTarget, referenceMatchData); + var bestMatch = GetPeakMatch(doc, i, fileInfo, peptideDocNode, nodeTranGroup, referenceTarget, referenceMatchData); if (bestMatch != null) doc = bestMatch.ChangePeak(doc, peptideGroup, peptideDocNode, nodeTranGroup, chromSet.Name, fileInfo.FilePath); } @@ -206,22 +201,18 @@ public static TransitionGroupDocNode PickTransitionGroup(SrmDocument doc, Peptid return best; } - private static PeakMatch GetPeakMatch(SrmDocument doc, ChromatogramSet chromSet, IPathContainer fileInfo, TransitionGroupDocNode nodeTranGroup, + private static PeakMatch GetPeakMatch(SrmDocument doc, int resultIndex, ChromFileInfo fileInfo, PeptideDocNode peptideDocNode, TransitionGroupDocNode nodeTranGroup, PeakMatchData referenceTarget, IEnumerable referenceMatchData) { + if (referenceTarget == null) return new PeakMatch(0, 0); var mzMatchTolerance = (float) doc.Settings.TransitionSettings.Instrument.MzMatchTolerance; - - ChromatogramGroupInfo[] loadInfos; - if (!nodeTranGroup.HasResults || !doc.Settings.MeasuredResults.TryLoadChromatogram(chromSet, null, nodeTranGroup, mzMatchTolerance, out loadInfos)) - return null; - - var chromGroupInfo = loadInfos.FirstOrDefault(info => Equals(info.FilePath, fileInfo.FilePath)); - if (chromGroupInfo == null || chromGroupInfo.NumPeaks == 0 || !chromGroupInfo.TimeIntensitiesGroup.HasAnyPoints) + var chromGroupInfo = + GetChromatogramGroupInfo(doc, peptideDocNode, nodeTranGroup, resultIndex, fileInfo.FileId); + if (chromGroupInfo == null) return null; - var matchData = new List(); double totalArea = chromGroupInfo.TransitionPointSets.Sum(chromInfo => chromInfo.Peaks.Sum(peak => peak.Area)); for (int i = 0; i < chromGroupInfo.NumPeaks; i++) @@ -306,18 +297,40 @@ private static PeakMatch GetPeakMatch(SrmDocument doc, ChromatogramSet chromSet, ChromatogramGroupInfo chromGroupInfo, int peakIndex, float mzMatchTolerance) { ChromPeak? largestPeak = null; - foreach (var peak in - from transitionDocNode in nodeTranGroup.Transitions - select chromGroupInfo.GetTransitionInfo(transitionDocNode, mzMatchTolerance) - into chromInfo where chromInfo != null - select chromInfo.GetPeak(peakIndex)) + foreach (var peak in GetTransitionChromatogramInfos(nodeTranGroup, chromGroupInfo, mzMatchTolerance) + .Select(chromInfo => chromInfo.GetPeak(peakIndex))) { if (largestPeak == null || peak.Height > largestPeak.Value.Height) largestPeak = peak; } + return largestPeak; } + private static IEnumerable GetTransitionChromatogramInfos(TransitionGroupDocNode nodeTranGroup, + ChromatogramGroupInfo chromGroupInfo, float mzMatchTolerance) + { + return nodeTranGroup.Transitions + .Select(transition => chromGroupInfo.GetTransitionInfo(transition, mzMatchTolerance)) + .Where(chromatogramInfo => chromatogramInfo != null); + } + + private static ChromatogramGroupInfo GetChromatogramGroupInfo(SrmDocument doc, PeptideDocNode nodePep, + TransitionGroupDocNode nodeTranGroup, int resultsIndex, ChromFileInfoId resultsFile) + { + float mzMatchTolerance = (float)doc.Settings.TransitionSettings.Instrument.MzMatchTolerance; + var chromSet = doc.Settings.MeasuredResults.Chromatograms[resultsIndex]; + if (!doc.Settings.MeasuredResults.TryLoadChromatogram(chromSet, nodePep, nodeTranGroup, mzMatchTolerance, out var chromGroupInfos)) + return null; + + var chromGroupInfo = chromGroupInfos.FirstOrDefault(info => Equals(chromSet.GetFileInfo(resultsFile).FilePath, info.FilePath)); + if (chromGroupInfo == null || chromGroupInfo.NumPeaks == 0 || !chromGroupInfo.TimeIntensitiesGroup.HasAnyPoints) + return null; + if (!GetTransitionChromatogramInfos(nodeTranGroup, chromGroupInfo, mzMatchTolerance).Any()) + return null; + return chromGroupInfo; + } + private static PeakMatch MakePeakMatchBetween(float scale, PeakMatchData referenceTarget, PeakAlignment prev, PeakAlignment next) { if (prev == null && next == null) From 929dfaf1fb0e819352f97efb2040bcbb1ffbfa34 Mon Sep 17 00:00:00 2001 From: Nicholas Shulman Date: Thu, 10 Oct 2024 13:54:55 -0700 Subject: [PATCH 2/2] Fix intermittent failure in TestApplyPeakToAll --- pwiz_tools/Skyline/Model/PeakMatcher.cs | 46 +++++++++++-------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/pwiz_tools/Skyline/Model/PeakMatcher.cs b/pwiz_tools/Skyline/Model/PeakMatcher.cs index 10fdf552972..118e819457f 100644 --- a/pwiz_tools/Skyline/Model/PeakMatcher.cs +++ b/pwiz_tools/Skyline/Model/PeakMatcher.cs @@ -54,9 +54,16 @@ private static void GetReferenceData(SrmDocument doc, PeptideDocNode nodePep, Tr if (tranGroupChromInfo == null) return; - var chromGroupInfo = GetChromatogramGroupInfo(doc, nodePep, nodeTranGroup, resultsIndex, resultsFile); - if (chromGroupInfo == null) + var chromSet = doc.Settings.MeasuredResults.Chromatograms[resultsIndex]; + if (!doc.Settings.MeasuredResults.TryLoadChromatogram(chromSet, nodePep, nodeTranGroup, mzMatchTolerance, out var chromGroupInfos)) + return; + + var chromGroupInfo = chromGroupInfos.FirstOrDefault(info => Equals(chromSet.GetFileInfo(tranGroupChromInfo.FileId).FilePath, info.FilePath)); + if (chromGroupInfo == null || chromGroupInfo.NumPeaks == 0 || !chromGroupInfo.TimeIntensitiesGroup.HasAnyPoints) + return; + if (!GetTransitionChromatogramInfos(nodeTranGroup, chromGroupInfo, mzMatchTolerance).Any()) return; + runTime = chromGroupInfo.RunStartTime; if (!tranGroupChromInfo.RetentionTime.HasValue || !tranGroupChromInfo.StartRetentionTime.HasValue || !tranGroupChromInfo.EndRetentionTime.HasValue) @@ -152,7 +159,7 @@ public static SrmDocument ApplyPeak(IProgressMonitor progressMonitor, IProgressS continue; } - var bestMatch = GetPeakMatch(doc, i, fileInfo, peptideDocNode, nodeTranGroup, referenceTarget, referenceMatchData); + var bestMatch = GetPeakMatch(doc, chromSet, fileInfo, nodeTranGroup, referenceTarget, referenceMatchData); if (bestMatch != null) doc = bestMatch.ChangePeak(doc, peptideGroup, peptideDocNode, nodeTranGroup, chromSet.Name, fileInfo.FilePath); } @@ -201,18 +208,24 @@ public static TransitionGroupDocNode PickTransitionGroup(SrmDocument doc, Peptid return best; } - private static PeakMatch GetPeakMatch(SrmDocument doc, int resultIndex, ChromFileInfo fileInfo, PeptideDocNode peptideDocNode, TransitionGroupDocNode nodeTranGroup, + private static PeakMatch GetPeakMatch(SrmDocument doc, ChromatogramSet chromSet, IPathContainer fileInfo, TransitionGroupDocNode nodeTranGroup, PeakMatchData referenceTarget, IEnumerable referenceMatchData) { - if (referenceTarget == null) return new PeakMatch(0, 0); var mzMatchTolerance = (float) doc.Settings.TransitionSettings.Instrument.MzMatchTolerance; - var chromGroupInfo = - GetChromatogramGroupInfo(doc, peptideDocNode, nodeTranGroup, resultIndex, fileInfo.FileId); - if (chromGroupInfo == null) + + ChromatogramGroupInfo[] loadInfos; + if (!nodeTranGroup.HasResults || !doc.Settings.MeasuredResults.TryLoadChromatogram(chromSet, null, nodeTranGroup, mzMatchTolerance, out loadInfos)) + return null; + + var chromGroupInfo = loadInfos.FirstOrDefault(info => Equals(info.FilePath, fileInfo.FilePath)); + if (chromGroupInfo == null || chromGroupInfo.NumPeaks == 0 || !chromGroupInfo.TimeIntensitiesGroup.HasAnyPoints) + return null; + if (!GetTransitionChromatogramInfos(nodeTranGroup, chromGroupInfo, mzMatchTolerance).Any()) return null; + var matchData = new List(); double totalArea = chromGroupInfo.TransitionPointSets.Sum(chromInfo => chromInfo.Peaks.Sum(peak => peak.Area)); for (int i = 0; i < chromGroupInfo.NumPeaks; i++) @@ -303,7 +316,6 @@ private static PeakMatch GetPeakMatch(SrmDocument doc, int resultIndex, ChromFil if (largestPeak == null || peak.Height > largestPeak.Value.Height) largestPeak = peak; } - return largestPeak; } @@ -315,22 +327,6 @@ private static IEnumerable GetTransitionChromatogramInfos(Tran .Where(chromatogramInfo => chromatogramInfo != null); } - private static ChromatogramGroupInfo GetChromatogramGroupInfo(SrmDocument doc, PeptideDocNode nodePep, - TransitionGroupDocNode nodeTranGroup, int resultsIndex, ChromFileInfoId resultsFile) - { - float mzMatchTolerance = (float)doc.Settings.TransitionSettings.Instrument.MzMatchTolerance; - var chromSet = doc.Settings.MeasuredResults.Chromatograms[resultsIndex]; - if (!doc.Settings.MeasuredResults.TryLoadChromatogram(chromSet, nodePep, nodeTranGroup, mzMatchTolerance, out var chromGroupInfos)) - return null; - - var chromGroupInfo = chromGroupInfos.FirstOrDefault(info => Equals(chromSet.GetFileInfo(resultsFile).FilePath, info.FilePath)); - if (chromGroupInfo == null || chromGroupInfo.NumPeaks == 0 || !chromGroupInfo.TimeIntensitiesGroup.HasAnyPoints) - return null; - if (!GetTransitionChromatogramInfos(nodeTranGroup, chromGroupInfo, mzMatchTolerance).Any()) - return null; - return chromGroupInfo; - } - private static PeakMatch MakePeakMatchBetween(float scale, PeakMatchData referenceTarget, PeakAlignment prev, PeakAlignment next) { if (prev == null && next == null)