From 7ffb39638be07d668b9a7f7da1da386183f624f8 Mon Sep 17 00:00:00 2001 From: weaversd Date: Thu, 15 Sep 2022 13:00:48 -0500 Subject: [PATCH 01/24] Added Precursor Mass and Precursor M/z histograms --- GUI/MetaDraw/PlotModelStat.cs | 85 ++++++++++++++++++++++------------- 1 file changed, 55 insertions(+), 30 deletions(-) diff --git a/GUI/MetaDraw/PlotModelStat.cs b/GUI/MetaDraw/PlotModelStat.cs index 87c95a3de..76a0e9b78 100644 --- a/GUI/MetaDraw/PlotModelStat.cs +++ b/GUI/MetaDraw/PlotModelStat.cs @@ -25,6 +25,8 @@ public class PlotModelStat : INotifyPropertyChanged, IPlotModel //"Histogram of Fragment PPM Errors", //TODO: implement fragment PPM error reading in MetaDraw "Histogram of Precursor Charges", "Histogram of Fragment Charges", + "Histogram of Precursor Masses", + "Histogram of Precursor M/z", "Precursor PPM Error vs. RT", //"Fragment PPM Error vs. RT", //TODO: implement fragment PPM error reading in MetaDraw "Histogram of PTM Spectral Counts", @@ -86,37 +88,38 @@ public PlotModelStat(string plotName, ObservableCollection psms, Dic private void createPlot(string plotType) { - if (plotType.Equals("Histogram of Precursor PPM Errors (around 0 Da mass-difference notch only)")) - { - histogramPlot(1); - } - else if (plotType.Equals("Histogram of Fragment PPM Errors")) - { - histogramPlot(2); - } - else if (plotType.Equals("Histogram of Precursor Charges")) - { - histogramPlot(3); - } - else if (plotType.Equals("Histogram of Fragment Charges")) - { - histogramPlot(4); - } - else if (plotType.Equals("Precursor PPM Error vs. RT")) - { - linePlot(1); - } - else if (plotType.Equals("Fragment PPM Error vs. RT")) - { - linePlot(2); - } - else if (plotType.Equals("Histogram of PTM Spectral Counts")) - { - histogramPlot(5); - } - else if (plotType.Equals("Predicted RT vs. Observed RT")) + switch (plotType) { - linePlot(3); + case "Histogram of Precursor PPM Errors (around 0 Da mass-difference notch only)": + histogramPlot(1); + break; + case "Histogram of Fragment PPM Errors": + histogramPlot(2); + break; + case "Histogram of Precursor Charges": + histogramPlot(3); + break; + case "Histogram of Fragment Charges": + histogramPlot(4); + break; + case "Histogram of Precursor Masses": + histogramPlot(6); + break; + case "Histogram of Precursor M/z": + histogramPlot(7); + break; + case "Precursor PPM Error vs. RT": + linePlot(1); + break; + case "Fragment PPM Error vs. RT": + linePlot(2); + break; + case "Histogram of PTM Spectral Counts": + histogramPlot(5); + break; + case "Predicted RT vs. Observed RT": + linePlot(3); + break; } } @@ -182,6 +185,28 @@ private void histogramPlot(int plotType) dictsBySourceFile.Add(key, groupedMods.ToDictionary(p => p.Key, v => v.Count())); } break; + case 6: // Histogram of Precursor mass + xAxisTitle = "Precursor Mass (Da)"; + binSize = 100; + labelAngle = -50; + foreach (string key in psmsBySourceFile.Keys) + { + numbersBySourceFile.Add(key, psmsBySourceFile[key].Select(p => (double)(p.PrecursorMass))); + var results = numbersBySourceFile[key].GroupBy(p => roundToBin(p, binSize)).OrderBy(p => p.Key).Select(p => p); + dictsBySourceFile.Add(key, results.ToDictionary(p => p.Key.ToString(), v => v.Count())); + } + break; + case 7: // Histogram of Precursor m/z + xAxisTitle = "Precursor mass/charge"; + binSize = 50; + labelAngle = -50; + foreach (string key in psmsBySourceFile.Keys) + { + numbersBySourceFile.Add(key, psmsBySourceFile[key].Select(p => (double)(p.PrecursorMz))); + var results = numbersBySourceFile[key].GroupBy(p => roundToBin(p, binSize)).OrderBy(p => p.Key).Select(p => p); + dictsBySourceFile.Add(key, results.ToDictionary(p => p.Key.ToString(), v => v.Count())); + } + break; } String[] category; // for labeling bottom axis From b14019d8510d6b67f156bdfe980fda0587d42c78 Mon Sep 17 00:00:00 2001 From: weaversd Date: Thu, 15 Sep 2022 14:20:13 -0500 Subject: [PATCH 02/24] Moved PlotModelStat to GuiFunctions, added histogram test --- .../MetaDraw/PlotModelStat.cs | 2 +- Test/MetaDrawTest.cs | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) rename {GUI => GuiFunctions}/MetaDraw/PlotModelStat.cs (99%) diff --git a/GUI/MetaDraw/PlotModelStat.cs b/GuiFunctions/MetaDraw/PlotModelStat.cs similarity index 99% rename from GUI/MetaDraw/PlotModelStat.cs rename to GuiFunctions/MetaDraw/PlotModelStat.cs index 76a0e9b78..0929b707e 100644 --- a/GUI/MetaDraw/PlotModelStat.cs +++ b/GuiFunctions/MetaDraw/PlotModelStat.cs @@ -12,7 +12,7 @@ using System.Linq; using System.Globalization; -namespace MetaMorpheusGUI +namespace GuiFunctions { public class PlotModelStat : INotifyPropertyChanged, IPlotModel { diff --git a/Test/MetaDrawTest.cs b/Test/MetaDrawTest.cs index 7eb4f3873..df6612168 100644 --- a/Test/MetaDrawTest.cs +++ b/Test/MetaDrawTest.cs @@ -9,6 +9,7 @@ using Proteomics.ProteolyticDigestion; using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Reflection; @@ -1282,5 +1283,39 @@ public static void TestMetaDrawSequenceDisplayOutputs() Directory.Delete(outputFolder, true); } + + + [Test] + public static void TestMetaDrawHistogramPlots() + { + SearchTask searchTask = new SearchTask(); + + string myFile = Path.Combine(TestContext.CurrentContext.TestDirectory, @"TestData\PrunedDbSpectra.mzml"); + string myDatabase = Path.Combine(TestContext.CurrentContext.TestDirectory, @"TestData\DbForPrunedDb.fasta"); + string folderPath = Path.Combine(TestContext.CurrentContext.TestDirectory, @"TestMetaDrawReadPsmFile"); + + DbForTask db = new DbForTask(myDatabase, false); + Directory.CreateDirectory(folderPath); + + searchTask.RunTask(folderPath, new List { db }, new List { myFile }, "metadraw"); + string psmFile = Directory.GetFiles(folderPath).First(f => f.Contains("AllPSMs.psmtsv")); + + List parsedPsms = PsmTsvReader.ReadTsv(psmFile, out var warnings); + ObservableCollection psms = new(parsedPsms); + + var psmDict = parsedPsms.GroupBy(p => p.FileNameWithoutExtension) + .ToDictionary(p => p.Key, p => new ObservableCollection(p)); + + + PlotModelStat plot = new PlotModelStat("Histogram of Precursor Masses", psms, psmDict); + + + Assert.AreEqual(2, plot.Model.Axes.Count); + Assert.AreEqual("Count", plot.Model.Axes[1].Title); + Assert.AreEqual(0, plot.Model.Axes[1].AbsoluteMinimum); + Assert.AreEqual(60, plot.Model.Axes[0].IntervalLength); + + Directory.Delete(folderPath, true); + } } } \ No newline at end of file From 19ebb414cd7d0769df01e1728b930be821ed1ca6 Mon Sep 17 00:00:00 2001 From: weaversd Date: Thu, 15 Sep 2022 16:41:32 -0500 Subject: [PATCH 03/24] added additional tests --- Test/MetaDrawTest.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Test/MetaDrawTest.cs b/Test/MetaDrawTest.cs index df6612168..c0f404236 100644 --- a/Test/MetaDrawTest.cs +++ b/Test/MetaDrawTest.cs @@ -16,6 +16,7 @@ using System.Threading; using System.Windows; using System.Windows.Controls; +using Easy.Common.Extensions; using TaskLayer; namespace Test @@ -1307,14 +1308,22 @@ public static void TestMetaDrawHistogramPlots() .ToDictionary(p => p.Key, p => new ObservableCollection(p)); - PlotModelStat plot = new PlotModelStat("Histogram of Precursor Masses", psms, psmDict); - + var plot = new PlotModelStat("Histogram of Precursor Masses", psms, psmDict); + // Ensure axes are labelled correctly, and intervals are correct Assert.AreEqual(2, plot.Model.Axes.Count); Assert.AreEqual("Count", plot.Model.Axes[1].Title); Assert.AreEqual(0, plot.Model.Axes[1].AbsoluteMinimum); Assert.AreEqual(60, plot.Model.Axes[0].IntervalLength); + PlotModelStat plot2 = new PlotModelStat("Histogram of Precursor Charges", psms, psmDict); + var series = plot2.Model.Series.ToList()[0]; + var items = (List)series.GetType().GetProperty("Items", BindingFlags.Public | BindingFlags.Instance).GetValue(series); + // Ensure there are the correct number of values in each bin + + Assert.AreEqual(items[0].Value, 9); + Assert.AreEqual(items[1].Value, 1); + Directory.Delete(folderPath, true); } } From f23ad84b240b98241f68f9c41d25b91a7d7eec70 Mon Sep 17 00:00:00 2001 From: weaversd Date: Fri, 16 Sep 2022 09:51:37 -0500 Subject: [PATCH 04/24] added test coverage for all plot types --- Test/MetaDrawTest.cs | 75 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/Test/MetaDrawTest.cs b/Test/MetaDrawTest.cs index c0f404236..9596e8c3d 100644 --- a/Test/MetaDrawTest.cs +++ b/Test/MetaDrawTest.cs @@ -18,6 +18,7 @@ using System.Windows.Controls; using Easy.Common.Extensions; using TaskLayer; +using ThermoFisher.CommonCore.Data.Business; namespace Test { @@ -1307,22 +1308,82 @@ public static void TestMetaDrawHistogramPlots() var psmDict = parsedPsms.GroupBy(p => p.FileNameWithoutExtension) .ToDictionary(p => p.Key, p => new ObservableCollection(p)); + // check aspects of each histogram type: var plot = new PlotModelStat("Histogram of Precursor Masses", psms, psmDict); - // Ensure axes are labelled correctly, and intervals are correct Assert.AreEqual(2, plot.Model.Axes.Count); Assert.AreEqual("Count", plot.Model.Axes[1].Title); Assert.AreEqual(0, plot.Model.Axes[1].AbsoluteMinimum); Assert.AreEqual(60, plot.Model.Axes[0].IntervalLength); - PlotModelStat plot2 = new PlotModelStat("Histogram of Precursor Charges", psms, psmDict); - var series = plot2.Model.Series.ToList()[0]; - var items = (List)series.GetType().GetProperty("Items", BindingFlags.Public | BindingFlags.Instance).GetValue(series); - // Ensure there are the correct number of values in each bin + var plot2 = new PlotModelStat("Histogram of Precursor Charges", psms, psmDict); + var series2 = plot2.Model.Series.ToList()[0]; + var items2 = (List)series2.GetType() + .GetProperty("Items", BindingFlags.Public | BindingFlags.Instance).GetValue(series2); + Assert.AreEqual(items2[0].Value, 9); + Assert.AreEqual(items2[1].Value, 1); + + var plot3 = new PlotModelStat("Histogram of Precursor PPM Errors (around 0 Da mass-difference notch only)", + psms, psmDict); + var series3 = plot3.Model.Series.ToList()[0]; + var items3 = (List)series3.GetType() + .GetProperty("Items", BindingFlags.Public | BindingFlags.Instance).GetValue(series3); + Assert.AreEqual(items3[7].Value, 2); + + var plot4 = new PlotModelStat("Histogram of Fragment Charges", + psms, psmDict); + var series4 = plot4.Model.Series.ToList()[0]; + var items4 = (List)series4.GetType() + .GetProperty("Items", BindingFlags.Public | BindingFlags.Instance).GetValue(series4); + Assert.AreEqual(items4[0].Value, 101); + + var plot5 = new PlotModelStat("Histogram of Precursor M/z", + psms, psmDict); + var series5 = plot5.Model.Series.ToList()[0]; + var items5 = (List)series5.GetType() + .GetProperty("Items", BindingFlags.Public | BindingFlags.Instance).GetValue(series5); + Assert.AreEqual(items5.Count, 5); + Assert.AreEqual(items5[0].Value, 5); + + var plot6 = new PlotModelStat("Histogram of PTM Spectral Counts", + psms, psmDict); + var series6 = plot6.Model.Series.ToList()[0]; + var items6 = (List)series6.GetType() + .GetProperty("Items", BindingFlags.Public | BindingFlags.Instance).GetValue(series6); + Assert.AreEqual(items6.Count, 1); + Assert.AreEqual(items6[0].Value, 2); + + var plot7 = new PlotModelStat("Precursor PPM Error vs. RT", + psms, psmDict); + var series7 = plot7.Model.Series.ToList()[0]; + var points7 = (List)series7.GetType() + .GetProperty("Points", BindingFlags.Public | BindingFlags.Instance).GetValue(series7); + Assert.AreEqual(points7.Count, 9); + Assert.AreEqual(points7[1].X, 42.07841); + Assert.AreEqual(points7[1].Y, -1.48); + Assert.AreEqual(points7[1].Tag, "LSRIDTPK"); + + var plot8 = new PlotModelStat("Fragment PPM Error vs. RT", + psms, psmDict); + var series8 = plot8.Model.Series.ToList()[0]; + var points8 = (List)series8.GetType() + .GetProperty("Points", BindingFlags.Public | BindingFlags.Instance).GetValue(series8); + Assert.AreEqual(points8.Count, 101); + Assert.AreEqual(points8[1].X, 0); + Assert.AreEqual(points8[1].Y, 42.04222); + Assert.AreEqual(points8[1].Tag, "M[Common Variable:Oxidation on M]KETAESYLGAK"); + + var plot9 = new PlotModelStat("Predicted RT vs. Observed RT", + psms, psmDict); + var series9 = plot9.Model.Series.ToList()[0]; + var points9 = (List)series9.GetType() + .GetProperty("Points", BindingFlags.Public | BindingFlags.Instance).GetValue(series9); + Assert.AreEqual(points9.Count, 10); + Assert.AreEqual(points9[7].X, 42.06171); + Assert.AreEqual(points9[7].Y, 19.00616880619646); + Assert.AreEqual(points9[7].Tag, "AFISYHDEAQK"); - Assert.AreEqual(items[0].Value, 9); - Assert.AreEqual(items[1].Value, 1); Directory.Delete(folderPath, true); } From b948cc00c03f8374d790d80a96ed2146893c42db Mon Sep 17 00:00:00 2001 From: weaversd Date: Fri, 16 Sep 2022 11:16:39 -0500 Subject: [PATCH 05/24] removed tests for plots that are not options in gui --- GuiFunctions/MetaDraw/PlotModelStat.cs | 52 +++++++++++++------------- Test/MetaDrawTest.cs | 20 +++------- 2 files changed, 32 insertions(+), 40 deletions(-) diff --git a/GuiFunctions/MetaDraw/PlotModelStat.cs b/GuiFunctions/MetaDraw/PlotModelStat.cs index 0929b707e..8f153e494 100644 --- a/GuiFunctions/MetaDraw/PlotModelStat.cs +++ b/GuiFunctions/MetaDraw/PlotModelStat.cs @@ -93,9 +93,9 @@ private void createPlot(string plotType) case "Histogram of Precursor PPM Errors (around 0 Da mass-difference notch only)": histogramPlot(1); break; - case "Histogram of Fragment PPM Errors": - histogramPlot(2); - break; + //case "Histogram of Fragment PPM Errors": //TODO: implement fragment PPM error reading in MetaDraw + // histogramPlot(2); + // break; case "Histogram of Precursor Charges": histogramPlot(3); break; @@ -111,9 +111,9 @@ private void createPlot(string plotType) case "Precursor PPM Error vs. RT": linePlot(1); break; - case "Fragment PPM Error vs. RT": - linePlot(2); - break; + //case "Fragment PPM Error vs. RT": //TODO: implement fragment PPM error reading in MetaDraw + // linePlot(2); + // break; case "Histogram of PTM Spectral Counts": histogramPlot(5); break; @@ -146,14 +146,16 @@ private void histogramPlot(int plotType) dictsBySourceFile.Add(key, results.ToDictionary(p => p.Key.ToString(), v => v.Count())); } break; - case 2: // Histogram of Fragment PPM Errors TODO not shown as an option in gui - xAxisTitle = "Fragment error (ppm)"; - binSize = 0.1; - foreach (string key in psmsBySourceFile.Keys) - { - numbersBySourceFile.Add(key, psmsBySourceFile[key].SelectMany(p => p.MatchedIons.Select(v => v.MassErrorPpm))); - } - break; + //case 2: // Histogram of Fragment PPM Errors TODO not shown as an option in gui + // xAxisTitle = "Fragment error (ppm)"; + // binSize = 0.1; + // foreach (string key in psmsBySourceFile.Keys) + // { + // numbersBySourceFile.Add(key, psmsBySourceFile[key].SelectMany(p => p.MatchedIons.Select(v => v.MassErrorPpm))); + // var results = numbersBySourceFile[key].GroupBy(p => roundToBin(p, binSize)).OrderBy(p => p.Key).Select(p => p); + // dictsBySourceFile.Add(key, results.ToDictionary(p => p.Key.ToString(), v => v.Count())); + // } + // break; case 3: // Histogram of Precursor Charges xAxisTitle = "Precursor charge"; binSize = 1; @@ -337,17 +339,17 @@ private void linePlot(int plotType) } } break; - case 2: // Fragment PPM Error vs. RT - yAxisTitle = "Retention time"; - xAxisTitle = "Fragment error (ppm)"; - foreach (var psm in allPsms) - { - foreach (var ion in psm.MatchedIons) - { - xy.Add(new Tuple((double)psm.RetentionTime, ion.MassErrorPpm, psm.FullSequence)); - } - } - break; + //case 2: // Fragment PPM Error vs. RT //TODO: implement fragment PPM error reading in MetaDraw + // yAxisTitle = "Retention time"; + // xAxisTitle = "Fragment error (ppm)"; + // foreach (var psm in allPsms) + // { + // foreach (var ion in psm.MatchedIons) + // { + // xy.Add(new Tuple((double)psm.RetentionTime, ion.MassErrorPpm, psm.FullSequence)); + // } + // } + // break; case 3: // Predicted RT vs. Observed RT yAxisTitle = "Predicted Hydrophobicity"; xAxisTitle = "Observed retention time"; diff --git a/Test/MetaDrawTest.cs b/Test/MetaDrawTest.cs index 9596e8c3d..27ded981e 100644 --- a/Test/MetaDrawTest.cs +++ b/Test/MetaDrawTest.cs @@ -1364,25 +1364,15 @@ public static void TestMetaDrawHistogramPlots() Assert.AreEqual(points7[1].Y, -1.48); Assert.AreEqual(points7[1].Tag, "LSRIDTPK"); - var plot8 = new PlotModelStat("Fragment PPM Error vs. RT", + var plot8 = new PlotModelStat("Predicted RT vs. Observed RT", psms, psmDict); var series8 = plot8.Model.Series.ToList()[0]; var points8 = (List)series8.GetType() .GetProperty("Points", BindingFlags.Public | BindingFlags.Instance).GetValue(series8); - Assert.AreEqual(points8.Count, 101); - Assert.AreEqual(points8[1].X, 0); - Assert.AreEqual(points8[1].Y, 42.04222); - Assert.AreEqual(points8[1].Tag, "M[Common Variable:Oxidation on M]KETAESYLGAK"); - - var plot9 = new PlotModelStat("Predicted RT vs. Observed RT", - psms, psmDict); - var series9 = plot9.Model.Series.ToList()[0]; - var points9 = (List)series9.GetType() - .GetProperty("Points", BindingFlags.Public | BindingFlags.Instance).GetValue(series9); - Assert.AreEqual(points9.Count, 10); - Assert.AreEqual(points9[7].X, 42.06171); - Assert.AreEqual(points9[7].Y, 19.00616880619646); - Assert.AreEqual(points9[7].Tag, "AFISYHDEAQK"); + Assert.AreEqual(points8.Count, 10); + Assert.AreEqual(points8[7].X, 42.06171); + Assert.AreEqual(points8[7].Y, 19.00616880619646); + Assert.AreEqual(points8[7].Tag, "AFISYHDEAQK"); Directory.Delete(folderPath, true); From b271c204c175e8e4a330511be865d525f575dcf0 Mon Sep 17 00:00:00 2001 From: weaversd Date: Fri, 16 Sep 2022 12:15:04 -0500 Subject: [PATCH 06/24] added test coverage for variants --- Test/MetaDrawTest.cs | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/Test/MetaDrawTest.cs b/Test/MetaDrawTest.cs index 27ded981e..34cc59046 100644 --- a/Test/MetaDrawTest.cs +++ b/Test/MetaDrawTest.cs @@ -10,6 +10,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.ComponentModel; using System.IO; using System.Linq; using System.Reflection; @@ -1375,6 +1376,36 @@ public static void TestMetaDrawHistogramPlots() Assert.AreEqual(points8[7].Tag, "AFISYHDEAQK"); + //test variant plotting + string variantFile = Path.Combine(TestContext.CurrentContext.TestDirectory, @"TestData\VariantCrossTest.psmtsv"); + List warningsVariants = new List(); + List parsedPsmsWithVariants; + parsedPsmsWithVariants = PsmTsvReader.ReadTsv(variantFile, out warningsVariants); + ObservableCollection psmsWithVariants = new(parsedPsmsWithVariants); + + var psmVariantDict = psmsWithVariants.GroupBy(p => p.FileNameWithoutExtension) + .ToDictionary(p => p.Key, p => new ObservableCollection(p)); + + var variantPlot1 = new PlotModelStat("Precursor PPM Error vs. RT", psmsWithVariants, psmVariantDict); + var variantSeries1 = variantPlot1.Model.Series.ToList()[0]; + var variantPoints1 = (List)variantSeries1.GetType() + .GetProperty("Points", BindingFlags.Public | BindingFlags.Instance).GetValue(variantSeries1); + Assert.AreEqual(variantPoints1.Count, 1); + Assert.AreEqual(variantPoints1[0].X, 97.8357); + Assert.AreEqual(variantPoints1[0].Y, 0.35); + Assert.AreEqual(variantPoints1[0].Tag, "MQVDQEEPHVEEQQQQTPAENKAESEEMETSQAGSK"); + + var variantPlot2 = new PlotModelStat("Predicted RT vs. Observed RT", psmsWithVariants, psmVariantDict); + var variantSeries2 = variantPlot2.Model.Series.ToList()[0]; + var variantPoints2 = (List)variantSeries2.GetType() + .GetProperty("Points", BindingFlags.Public | BindingFlags.Instance).GetValue(variantSeries2); + Assert.AreEqual(variantPoints2.Count, 1); + Assert.AreEqual(variantPoints2[0].X, 97.8357); + Assert.AreEqual(variantPoints2[0].Y, 16.363848874371111); + Assert.AreEqual(variantPoints2[0].Tag, "MQVDQEEPHVEEQQQQTPAENKAESEEMETSQAGSK"); + + + Directory.Delete(folderPath, true); } } From 2d9604bd96914d55acc716cff1c5487dccaea126 Mon Sep 17 00:00:00 2001 From: weaversd Date: Tue, 20 Sep 2022 15:32:12 -0500 Subject: [PATCH 07/24] Added plots for fragment error. Allowed parsing of fragment error from psmtsv files --- EngineLayer/PsmTsv/PsmFromTsv.cs | 24 +++++++++-- EngineLayer/PsmTsv/PsmTsvReader.cs | 1 + GuiFunctions/MetaDraw/PlotModelStat.cs | 58 +++++++++++++------------- Test/MetaDrawTest.cs | 25 +++++++++-- 4 files changed, 72 insertions(+), 36 deletions(-) diff --git a/EngineLayer/PsmTsv/PsmFromTsv.cs b/EngineLayer/PsmTsv/PsmFromTsv.cs index 6b52bcd4b..38e288664 100644 --- a/EngineLayer/PsmTsv/PsmFromTsv.cs +++ b/EngineLayer/PsmTsv/PsmFromTsv.cs @@ -7,6 +7,7 @@ using System.Text.RegularExpressions; using EngineLayer.GlycoSearch; using System.IO; +using Easy.Common.Extensions; namespace EngineLayer { @@ -127,7 +128,7 @@ public PsmFromTsv(string line, char[] split, Dictionary parsedHeade QValue = double.Parse(spl[parsedHeader[PsmTsvHeader.QValue]].Trim(), CultureInfo.InvariantCulture); MatchedIons = (spl[parsedHeader[PsmTsvHeader.MatchedIonMzRatios]].StartsWith("{")) ? ReadChildScanMatchedIons(spl[parsedHeader[PsmTsvHeader.MatchedIonMzRatios]].Trim(), spl[parsedHeader[PsmTsvHeader.MatchedIonIntensities]].Trim(), BaseSeq).First().Value : - ReadFragmentIonsFromString(spl[parsedHeader[PsmTsvHeader.MatchedIonMzRatios]].Trim(), spl[parsedHeader[PsmTsvHeader.MatchedIonIntensities]].Trim(), BaseSeq); + ReadFragmentIonsFromString(spl[parsedHeader[PsmTsvHeader.MatchedIonMzRatios]].Trim(), spl[parsedHeader[PsmTsvHeader.MatchedIonIntensities]].Trim(), BaseSeq, spl[parsedHeader[PsmTsvHeader.MatchedIonMassDiffDa]].Trim()); AmbiguityLevel = (parsedHeader[PsmTsvHeader.AmbiguityLevel] < 0) ? null : spl[parsedHeader[PsmTsvHeader.AmbiguityLevel]].Trim(); //For general psms @@ -386,7 +387,7 @@ public static void RemoveSpecialCharacters(ref string fullSeq, string replacemen } - private static List ReadFragmentIonsFromString(string matchedMzString, string matchedIntensityString, string peptideBaseSequence) + private static List ReadFragmentIonsFromString(string matchedMzString, string matchedIntensityString, string peptideBaseSequence, string matchedMassErrorDaString = null) { List matchedIons = new List(); @@ -394,6 +395,12 @@ private static List ReadFragmentIonsFromString(string matche { List peakMzs = CleanMatchedIonString(matchedMzString); List peakIntensities = CleanMatchedIonString(matchedIntensityString); + List peakMassErrorDa = null; + + if (matchedMassErrorDaString.IsNotNullOrEmpty()) + { + peakMassErrorDa = CleanMatchedIonString(matchedMassErrorDaString); + } for (int index = 0; index < peakMzs.Count; index++) { @@ -460,13 +467,24 @@ private static List ReadFragmentIonsFromString(string matche fragmentNumber; } + //get mass error in Daltons + double errorDa = 0; + if (matchedMassErrorDaString.IsNotNullOrEmpty() && peakMassErrorDa[index].IsNotNullOrEmpty()) + { + string peakError = peakMassErrorDa[index]; + string[] errorSplit = peakError.Split(new char[] { '+', ':', ']' }); + errorDa = double.Parse(errorSplit[2], CultureInfo.InvariantCulture); + } + //get charge and mz int z = int.Parse(split[1]); double mz = double.Parse(split[2], CultureInfo.InvariantCulture); + double theoreticalMass = mz.ToMass(z); + double experimentalMass = theoreticalMass + errorDa; Product p = new Product(productType, terminus, - mz.ToMass(z), + experimentalMass, fragmentNumber, aminoAcidPosition, neutralLoss, diff --git a/EngineLayer/PsmTsv/PsmTsvReader.cs b/EngineLayer/PsmTsv/PsmTsvReader.cs index 7691bc2d9..5489d3be7 100644 --- a/EngineLayer/PsmTsv/PsmTsvReader.cs +++ b/EngineLayer/PsmTsv/PsmTsvReader.cs @@ -97,6 +97,7 @@ private static Dictionary ParseHeader(string header) parsedHeader.Add(PsmTsvHeader.DecoyContaminantTarget, Array.IndexOf(spl, PsmTsvHeader.DecoyContaminantTarget)); parsedHeader.Add(PsmTsvHeader.MatchedIonMzRatios, Array.IndexOf(spl, PsmTsvHeader.MatchedIonMzRatios)); parsedHeader.Add(PsmTsvHeader.MatchedIonIntensities, Array.IndexOf(spl, PsmTsvHeader.MatchedIonIntensities)); + parsedHeader.Add(PsmTsvHeader.MatchedIonMassDiffDa, Array.IndexOf(spl, PsmTsvHeader.MatchedIonMassDiffDa)); parsedHeader.Add(PsmTsvHeader.SpectralAngle, Array.IndexOf(spl, PsmTsvHeader.SpectralAngle)); parsedHeader.Add(PsmTsvHeader.QValue, Array.IndexOf(spl, PsmTsvHeader.QValue)); parsedHeader.Add(PsmTsvHeader.QValueNotch, Array.IndexOf(spl, PsmTsvHeader.QValueNotch)); diff --git a/GuiFunctions/MetaDraw/PlotModelStat.cs b/GuiFunctions/MetaDraw/PlotModelStat.cs index 8f153e494..c66f22540 100644 --- a/GuiFunctions/MetaDraw/PlotModelStat.cs +++ b/GuiFunctions/MetaDraw/PlotModelStat.cs @@ -22,13 +22,13 @@ public class PlotModelStat : INotifyPropertyChanged, IPlotModel public static List PlotNames = new List { "Histogram of Precursor PPM Errors (around 0 Da mass-difference notch only)", - //"Histogram of Fragment PPM Errors", //TODO: implement fragment PPM error reading in MetaDraw + "Histogram of Fragment PPM Errors", "Histogram of Precursor Charges", "Histogram of Fragment Charges", "Histogram of Precursor Masses", "Histogram of Precursor M/z", "Precursor PPM Error vs. RT", - //"Fragment PPM Error vs. RT", //TODO: implement fragment PPM error reading in MetaDraw + "Fragment PPM Error vs. RT", "Histogram of PTM Spectral Counts", "Predicted RT vs. Observed RT" }; @@ -93,9 +93,9 @@ private void createPlot(string plotType) case "Histogram of Precursor PPM Errors (around 0 Da mass-difference notch only)": histogramPlot(1); break; - //case "Histogram of Fragment PPM Errors": //TODO: implement fragment PPM error reading in MetaDraw - // histogramPlot(2); - // break; + case "Histogram of Fragment PPM Errors": + histogramPlot(2); + break; case "Histogram of Precursor Charges": histogramPlot(3); break; @@ -111,9 +111,9 @@ private void createPlot(string plotType) case "Precursor PPM Error vs. RT": linePlot(1); break; - //case "Fragment PPM Error vs. RT": //TODO: implement fragment PPM error reading in MetaDraw - // linePlot(2); - // break; + case "Fragment PPM Error vs. RT": + linePlot(2); + break; case "Histogram of PTM Spectral Counts": histogramPlot(5); break; @@ -146,16 +146,16 @@ private void histogramPlot(int plotType) dictsBySourceFile.Add(key, results.ToDictionary(p => p.Key.ToString(), v => v.Count())); } break; - //case 2: // Histogram of Fragment PPM Errors TODO not shown as an option in gui - // xAxisTitle = "Fragment error (ppm)"; - // binSize = 0.1; - // foreach (string key in psmsBySourceFile.Keys) - // { - // numbersBySourceFile.Add(key, psmsBySourceFile[key].SelectMany(p => p.MatchedIons.Select(v => v.MassErrorPpm))); - // var results = numbersBySourceFile[key].GroupBy(p => roundToBin(p, binSize)).OrderBy(p => p.Key).Select(p => p); - // dictsBySourceFile.Add(key, results.ToDictionary(p => p.Key.ToString(), v => v.Count())); - // } - // break; + case 2: // Histogram of Fragment PPM Errors + xAxisTitle = "Fragment error (ppm)"; + binSize = 1; + foreach (string key in psmsBySourceFile.Keys) + { + numbersBySourceFile.Add(key, psmsBySourceFile[key].SelectMany(p => p.MatchedIons.Select(v => v.MassErrorPpm))); + var results = numbersBySourceFile[key].GroupBy(p => roundToBin(p, binSize)).OrderBy(p => p.Key).Select(p => p); + dictsBySourceFile.Add(key, results.ToDictionary(p => p.Key.ToString(), v => v.Count())); + } + break; case 3: // Histogram of Precursor Charges xAxisTitle = "Precursor charge"; binSize = 1; @@ -339,17 +339,17 @@ private void linePlot(int plotType) } } break; - //case 2: // Fragment PPM Error vs. RT //TODO: implement fragment PPM error reading in MetaDraw - // yAxisTitle = "Retention time"; - // xAxisTitle = "Fragment error (ppm)"; - // foreach (var psm in allPsms) - // { - // foreach (var ion in psm.MatchedIons) - // { - // xy.Add(new Tuple((double)psm.RetentionTime, ion.MassErrorPpm, psm.FullSequence)); - // } - // } - // break; + case 2: // Fragment PPM Error vs. RT + yAxisTitle = "Fragment error (ppm)"; + xAxisTitle = "Retention time"; + foreach (var psm in allPsms) + { + foreach (var ion in psm.MatchedIons) + { + xy.Add(new Tuple(ion.MassErrorPpm, (double)psm.RetentionTime, psm.FullSequence)); + } + } + break; case 3: // Predicted RT vs. Observed RT yAxisTitle = "Predicted Hydrophobicity"; xAxisTitle = "Observed retention time"; diff --git a/Test/MetaDrawTest.cs b/Test/MetaDrawTest.cs index 34cc59046..4cb02131d 100644 --- a/Test/MetaDrawTest.cs +++ b/Test/MetaDrawTest.cs @@ -975,7 +975,7 @@ public static void TestPsmFromTsvIonParsing() double mz = double.Parse(split[2]); Assert.That(mz == parsedIon.Mz); - Assert.That(mz.ToMass(charge) == parsedIon.NeutralTheoreticalProduct.NeutralMass); + Assert.That(mz.ToMass(charge) - parsedIon.MassErrorDa == parsedIon.NeutralTheoreticalProduct.NeutralMass); Assert.That(charge == parsedIon.Charge); Assert.That(ion == parsedIon.NeutralTheoreticalProduct.ProductType.ToString() + parsedIon.NeutralTheoreticalProduct.FragmentNumber); } @@ -1308,11 +1308,13 @@ public static void TestMetaDrawHistogramPlots() var psmDict = parsedPsms.GroupBy(p => p.FileNameWithoutExtension) .ToDictionary(p => p.Key, p => new ObservableCollection(p)); + + // check that fragment mass error was read in correctly + Assert.AreEqual(0.27631621395185291, psms[1].MatchedIons[1].MassErrorPpm); // check aspects of each histogram type: - var plot = new PlotModelStat("Histogram of Precursor Masses", psms, psmDict); - // Ensure axes are labelled correctly, and intervals are correct + // Ensure axes are labeled correctly, and intervals are correct Assert.AreEqual(2, plot.Model.Axes.Count); Assert.AreEqual("Count", plot.Model.Axes[1].Title); Assert.AreEqual(0, plot.Model.Axes[1].AbsoluteMinimum); @@ -1375,6 +1377,22 @@ public static void TestMetaDrawHistogramPlots() Assert.AreEqual(points8[7].Y, 19.00616880619646); Assert.AreEqual(points8[7].Tag, "AFISYHDEAQK"); + var plot9 = new PlotModelStat("Histogram of Fragment PPM Errors", + psms, psmDict); + var series9 = plot9.Model.Series.ToList()[0]; + var items9 = (List)series9.GetType() + .GetProperty("Items", BindingFlags.Public | BindingFlags.Instance).GetValue(series9); + Assert.AreEqual(items9[11].Value, 18); + + var plot10 = new PlotModelStat("Fragment PPM Error vs. RT", + psms, psmDict); + var series10 = plot10.Model.Series.ToList()[0]; + var points10 = (List)series10.GetType() + .GetProperty("Points", BindingFlags.Public | BindingFlags.Instance).GetValue(series10); + Assert.AreEqual(points10.Count, 101); + Assert.AreEqual(points10[4].X, 42.07841); + Assert.AreEqual(points10[4].Y, -8.7093352300406828); + Assert.AreEqual(points10[4].Tag, "NKMPALEK"); //test variant plotting string variantFile = Path.Combine(TestContext.CurrentContext.TestDirectory, @"TestData\VariantCrossTest.psmtsv"); @@ -1405,7 +1423,6 @@ public static void TestMetaDrawHistogramPlots() Assert.AreEqual(variantPoints2[0].Tag, "MQVDQEEPHVEEQQQQTPAENKAESEEMETSQAGSK"); - Directory.Delete(folderPath, true); } } From 05feeb5bd457e480ff73ccf2c90343a27a316cd0 Mon Sep 17 00:00:00 2001 From: weaversd Date: Wed, 21 Sep 2022 09:16:40 -0500 Subject: [PATCH 08/24] Removed fragment ppm error vs RT because of long load time --- GuiFunctions/MetaDraw/PlotModelStat.cs | 30 +++++++++++++------------- Test/MetaDrawTest.cs | 18 ++++++++-------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/GuiFunctions/MetaDraw/PlotModelStat.cs b/GuiFunctions/MetaDraw/PlotModelStat.cs index c66f22540..f13800a27 100644 --- a/GuiFunctions/MetaDraw/PlotModelStat.cs +++ b/GuiFunctions/MetaDraw/PlotModelStat.cs @@ -28,7 +28,7 @@ public class PlotModelStat : INotifyPropertyChanged, IPlotModel "Histogram of Precursor Masses", "Histogram of Precursor M/z", "Precursor PPM Error vs. RT", - "Fragment PPM Error vs. RT", + //"Fragment PPM Error vs. RT", //Math works, but takes a very long time to load. "Histogram of PTM Spectral Counts", "Predicted RT vs. Observed RT" }; @@ -111,9 +111,9 @@ private void createPlot(string plotType) case "Precursor PPM Error vs. RT": linePlot(1); break; - case "Fragment PPM Error vs. RT": - linePlot(2); - break; + //case "Fragment PPM Error vs. RT": //Math works, but takes a very long time to load. Leaving out for now. + // linePlot(2); + // break; case "Histogram of PTM Spectral Counts": histogramPlot(5); break; @@ -339,17 +339,17 @@ private void linePlot(int plotType) } } break; - case 2: // Fragment PPM Error vs. RT - yAxisTitle = "Fragment error (ppm)"; - xAxisTitle = "Retention time"; - foreach (var psm in allPsms) - { - foreach (var ion in psm.MatchedIons) - { - xy.Add(new Tuple(ion.MassErrorPpm, (double)psm.RetentionTime, psm.FullSequence)); - } - } - break; + //case 2: // Fragment PPM Error vs. RT //Math works, but takes a very long time to load. + // yAxisTitle = "Fragment error (ppm)"; + // xAxisTitle = "Retention time"; + // foreach (var psm in allPsms) + // { + // foreach (var ion in psm.MatchedIons) + // { + // xy.Add(new Tuple(ion.MassErrorPpm, (double)psm.RetentionTime, psm.FullSequence)); + // } + // } + // break; case 3: // Predicted RT vs. Observed RT yAxisTitle = "Predicted Hydrophobicity"; xAxisTitle = "Observed retention time"; diff --git a/Test/MetaDrawTest.cs b/Test/MetaDrawTest.cs index 4cb02131d..004c77c0f 100644 --- a/Test/MetaDrawTest.cs +++ b/Test/MetaDrawTest.cs @@ -1384,15 +1384,15 @@ public static void TestMetaDrawHistogramPlots() .GetProperty("Items", BindingFlags.Public | BindingFlags.Instance).GetValue(series9); Assert.AreEqual(items9[11].Value, 18); - var plot10 = new PlotModelStat("Fragment PPM Error vs. RT", - psms, psmDict); - var series10 = plot10.Model.Series.ToList()[0]; - var points10 = (List)series10.GetType() - .GetProperty("Points", BindingFlags.Public | BindingFlags.Instance).GetValue(series10); - Assert.AreEqual(points10.Count, 101); - Assert.AreEqual(points10[4].X, 42.07841); - Assert.AreEqual(points10[4].Y, -8.7093352300406828); - Assert.AreEqual(points10[4].Tag, "NKMPALEK"); + //var plot10 = new PlotModelStat("Fragment PPM Error vs. RT", //Math works, but takes a very long time to load. + // psms, psmDict); + //var series10 = plot10.Model.Series.ToList()[0]; + //var points10 = (List)series10.GetType() + // .GetProperty("Points", BindingFlags.Public | BindingFlags.Instance).GetValue(series10); + //Assert.AreEqual(points10.Count, 101); + //Assert.AreEqual(points10[4].X, 42.07841); + //Assert.AreEqual(points10[4].Y, -8.7093352300406828); + //Assert.AreEqual(points10[4].Tag, "NKMPALEK"); //test variant plotting string variantFile = Path.Combine(TestContext.CurrentContext.TestDirectory, @"TestData\VariantCrossTest.psmtsv"); From e7517e2f08b9f7abe865fc2336c4ca954f24a8cf Mon Sep 17 00:00:00 2001 From: weaversd Date: Thu, 22 Sep 2022 14:01:52 -0500 Subject: [PATCH 09/24] Fix pdf export bug --- GuiFunctions/MetaDraw/PlotModelStat.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/GuiFunctions/MetaDraw/PlotModelStat.cs b/GuiFunctions/MetaDraw/PlotModelStat.cs index f13800a27..930e75ea6 100644 --- a/GuiFunctions/MetaDraw/PlotModelStat.cs +++ b/GuiFunctions/MetaDraw/PlotModelStat.cs @@ -11,6 +11,7 @@ using System.ComponentModel; using System.Linq; using System.Globalization; +using ThermoFisher.CommonCore.Data.Business; namespace GuiFunctions { @@ -26,7 +27,7 @@ public class PlotModelStat : INotifyPropertyChanged, IPlotModel "Histogram of Precursor Charges", "Histogram of Fragment Charges", "Histogram of Precursor Masses", - "Histogram of Precursor M/z", + "Histogram of Precursor M over z", "Precursor PPM Error vs. RT", //"Fragment PPM Error vs. RT", //Math works, but takes a very long time to load. "Histogram of PTM Spectral Counts", @@ -105,7 +106,7 @@ private void createPlot(string plotType) case "Histogram of Precursor Masses": histogramPlot(6); break; - case "Histogram of Precursor M/z": + case "Histogram of Precursor M over z": histogramPlot(7); break; case "Precursor PPM Error vs. RT": @@ -198,7 +199,7 @@ private void histogramPlot(int plotType) dictsBySourceFile.Add(key, results.ToDictionary(p => p.Key.ToString(), v => v.Count())); } break; - case 7: // Histogram of Precursor m/z + case 7: // Histogram of Precursor M over z xAxisTitle = "Precursor mass/charge"; binSize = 50; labelAngle = -50; From f8f67f1307b0e4c655fb60828e93c66868bcc6ca Mon Sep 17 00:00:00 2001 From: weaversd Date: Thu, 22 Sep 2022 14:08:47 -0500 Subject: [PATCH 10/24] Fixed bug for exporting data visualization. Will now create export directory if it doesn't already exist. --- GUI/MetaDraw/MetaDraw.xaml.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/GUI/MetaDraw/MetaDraw.xaml.cs b/GUI/MetaDraw/MetaDraw.xaml.cs index fde2ca0ac..1f1ed79e5 100644 --- a/GUI/MetaDraw/MetaDraw.xaml.cs +++ b/GUI/MetaDraw/MetaDraw.xaml.cs @@ -658,6 +658,11 @@ private void CreatePlotPdf_Click(object sender, RoutedEventArgs e) plotViewStat.UpdateLayout(); PlotViewStat_SizeChanged(plotViewStat, null); + if (!Directory.Exists(fileDirectory)) + { + Directory.CreateDirectory(fileDirectory); + } + using (Stream writePDF = File.Create(Path.Combine(fileDirectory, fileName))) { PdfExporter.Export(plotViewStat.Model, writePDF, 1000, 700); From 50eac8f31fe9421451e4261303566c6605c4d8dd Mon Sep 17 00:00:00 2001 From: weaversd Date: Thu, 22 Sep 2022 14:18:00 -0500 Subject: [PATCH 11/24] changed plot name in test --- Test/MetaDrawTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Test/MetaDrawTest.cs b/Test/MetaDrawTest.cs index 004c77c0f..f0199d6c4 100644 --- a/Test/MetaDrawTest.cs +++ b/Test/MetaDrawTest.cs @@ -1341,7 +1341,7 @@ public static void TestMetaDrawHistogramPlots() .GetProperty("Items", BindingFlags.Public | BindingFlags.Instance).GetValue(series4); Assert.AreEqual(items4[0].Value, 101); - var plot5 = new PlotModelStat("Histogram of Precursor M/z", + var plot5 = new PlotModelStat("Histogram of Precursor M over z", psms, psmDict); var series5 = plot5.Model.Series.ToList()[0]; var items5 = (List)series5.GetType() From 7e9eb2a7f5fd647affcf8c53ee772780911e6a92 Mon Sep 17 00:00:00 2001 From: weaversd Date: Wed, 5 Oct 2022 12:42:06 -0500 Subject: [PATCH 12/24] renamed variables for clarity between experimental and theoretical --- EngineLayer/PsmTsv/PsmFromTsv.cs | 11 ++++++----- Test/MetaDrawTest.cs | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/EngineLayer/PsmTsv/PsmFromTsv.cs b/EngineLayer/PsmTsv/PsmFromTsv.cs index 38e288664..ac0b3820c 100644 --- a/EngineLayer/PsmTsv/PsmFromTsv.cs +++ b/EngineLayer/PsmTsv/PsmFromTsv.cs @@ -479,19 +479,20 @@ private static List ReadFragmentIonsFromString(string matche //get charge and mz int z = int.Parse(split[1]); double mz = double.Parse(split[2], CultureInfo.InvariantCulture); - double theoreticalMass = mz.ToMass(z); - double experimentalMass = theoreticalMass + errorDa; + double neutralExperimentalMass = mz.ToMass(z); //read in m/z converted to mass + double neutralTheoreticalMass = neutralExperimentalMass - errorDa; //theoretical mass is measured mass - measured error - Product p = new Product(productType, + //The product created here is the theoretical product, with the mass back-calculated from the measured mass and measured error + Product theoreticalProduct = new Product(productType, terminus, - experimentalMass, + neutralTheoreticalMass, fragmentNumber, aminoAcidPosition, neutralLoss, secondaryProductType, secondaryFragmentNumber); - matchedIons.Add(new MatchedFragmentIon(ref p, mz, intensity, z)); + matchedIons.Add(new MatchedFragmentIon(ref theoreticalProduct, mz, intensity, z)); } } return matchedIons; diff --git a/Test/MetaDrawTest.cs b/Test/MetaDrawTest.cs index f0199d6c4..cdc59506f 100644 --- a/Test/MetaDrawTest.cs +++ b/Test/MetaDrawTest.cs @@ -1310,7 +1310,7 @@ public static void TestMetaDrawHistogramPlots() .ToDictionary(p => p.Key, p => new ObservableCollection(p)); // check that fragment mass error was read in correctly - Assert.AreEqual(0.27631621395185291, psms[1].MatchedIons[1].MassErrorPpm); + Assert.AreEqual(Math.Round(-0.27631606125063707, 5), Math.Round(psms[1].MatchedIons[1].MassErrorPpm, 5)); // check aspects of each histogram type: var plot = new PlotModelStat("Histogram of Precursor Masses", psms, psmDict); From c1b1533986d4ca942efb461e654555b07edc1ee1 Mon Sep 17 00:00:00 2001 From: weaversd Date: Wed, 5 Oct 2022 15:45:13 -0500 Subject: [PATCH 13/24] updated naming of "m over z" to "m/z" --- GuiFunctions/MetaDraw/PlotModelStat.cs | 4 ++-- Test/MetaDrawTest.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/GuiFunctions/MetaDraw/PlotModelStat.cs b/GuiFunctions/MetaDraw/PlotModelStat.cs index 930e75ea6..eea42c90c 100644 --- a/GuiFunctions/MetaDraw/PlotModelStat.cs +++ b/GuiFunctions/MetaDraw/PlotModelStat.cs @@ -27,7 +27,7 @@ public class PlotModelStat : INotifyPropertyChanged, IPlotModel "Histogram of Precursor Charges", "Histogram of Fragment Charges", "Histogram of Precursor Masses", - "Histogram of Precursor M over z", + "Histogram of Precursor m/z", "Precursor PPM Error vs. RT", //"Fragment PPM Error vs. RT", //Math works, but takes a very long time to load. "Histogram of PTM Spectral Counts", @@ -106,7 +106,7 @@ private void createPlot(string plotType) case "Histogram of Precursor Masses": histogramPlot(6); break; - case "Histogram of Precursor M over z": + case "Histogram of Precursor m/z": histogramPlot(7); break; case "Precursor PPM Error vs. RT": diff --git a/Test/MetaDrawTest.cs b/Test/MetaDrawTest.cs index cdc59506f..5173a4fd4 100644 --- a/Test/MetaDrawTest.cs +++ b/Test/MetaDrawTest.cs @@ -1341,7 +1341,7 @@ public static void TestMetaDrawHistogramPlots() .GetProperty("Items", BindingFlags.Public | BindingFlags.Instance).GetValue(series4); Assert.AreEqual(items4[0].Value, 101); - var plot5 = new PlotModelStat("Histogram of Precursor M over z", + var plot5 = new PlotModelStat("Histogram of Precursor m/z", psms, psmDict); var series5 = plot5.Model.Series.ToList()[0]; var items5 = (List)series5.GetType() From 61b8091c655a1c0f90e035f022cba0ecd0ffcd3d Mon Sep 17 00:00:00 2001 From: weaversd Date: Thu, 6 Oct 2022 08:17:37 -0500 Subject: [PATCH 14/24] removed commented code --- GuiFunctions/MetaDraw/PlotModelStat.cs | 17 +---------------- Test/MetaDrawTest.cs | 10 ---------- 2 files changed, 1 insertion(+), 26 deletions(-) diff --git a/GuiFunctions/MetaDraw/PlotModelStat.cs b/GuiFunctions/MetaDraw/PlotModelStat.cs index eea42c90c..ae2f996b9 100644 --- a/GuiFunctions/MetaDraw/PlotModelStat.cs +++ b/GuiFunctions/MetaDraw/PlotModelStat.cs @@ -29,7 +29,6 @@ public class PlotModelStat : INotifyPropertyChanged, IPlotModel "Histogram of Precursor Masses", "Histogram of Precursor m/z", "Precursor PPM Error vs. RT", - //"Fragment PPM Error vs. RT", //Math works, but takes a very long time to load. "Histogram of PTM Spectral Counts", "Predicted RT vs. Observed RT" }; @@ -112,9 +111,6 @@ private void createPlot(string plotType) case "Precursor PPM Error vs. RT": linePlot(1); break; - //case "Fragment PPM Error vs. RT": //Math works, but takes a very long time to load. Leaving out for now. - // linePlot(2); - // break; case "Histogram of PTM Spectral Counts": histogramPlot(5); break; @@ -199,7 +195,7 @@ private void histogramPlot(int plotType) dictsBySourceFile.Add(key, results.ToDictionary(p => p.Key.ToString(), v => v.Count())); } break; - case 7: // Histogram of Precursor M over z + case 7: // Histogram of Precursor m/z xAxisTitle = "Precursor mass/charge"; binSize = 50; labelAngle = -50; @@ -340,17 +336,6 @@ private void linePlot(int plotType) } } break; - //case 2: // Fragment PPM Error vs. RT //Math works, but takes a very long time to load. - // yAxisTitle = "Fragment error (ppm)"; - // xAxisTitle = "Retention time"; - // foreach (var psm in allPsms) - // { - // foreach (var ion in psm.MatchedIons) - // { - // xy.Add(new Tuple(ion.MassErrorPpm, (double)psm.RetentionTime, psm.FullSequence)); - // } - // } - // break; case 3: // Predicted RT vs. Observed RT yAxisTitle = "Predicted Hydrophobicity"; xAxisTitle = "Observed retention time"; diff --git a/Test/MetaDrawTest.cs b/Test/MetaDrawTest.cs index 5173a4fd4..fa187df53 100644 --- a/Test/MetaDrawTest.cs +++ b/Test/MetaDrawTest.cs @@ -1384,16 +1384,6 @@ public static void TestMetaDrawHistogramPlots() .GetProperty("Items", BindingFlags.Public | BindingFlags.Instance).GetValue(series9); Assert.AreEqual(items9[11].Value, 18); - //var plot10 = new PlotModelStat("Fragment PPM Error vs. RT", //Math works, but takes a very long time to load. - // psms, psmDict); - //var series10 = plot10.Model.Series.ToList()[0]; - //var points10 = (List)series10.GetType() - // .GetProperty("Points", BindingFlags.Public | BindingFlags.Instance).GetValue(series10); - //Assert.AreEqual(points10.Count, 101); - //Assert.AreEqual(points10[4].X, 42.07841); - //Assert.AreEqual(points10[4].Y, -8.7093352300406828); - //Assert.AreEqual(points10[4].Tag, "NKMPALEK"); - //test variant plotting string variantFile = Path.Combine(TestContext.CurrentContext.TestDirectory, @"TestData\VariantCrossTest.psmtsv"); List warningsVariants = new List(); From d728aadd7a9d779793fd038c412a55c3b1f58b5e Mon Sep 17 00:00:00 2001 From: weaversd Date: Mon, 10 Oct 2022 12:07:19 -0500 Subject: [PATCH 15/24] Added hydrophobicity score histogram --- GuiFunctions/MetaDraw/PlotModelStat.cs | 28 +++++++++++++++++++++++--- Test/MetaDrawTest.cs | 8 ++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/GuiFunctions/MetaDraw/PlotModelStat.cs b/GuiFunctions/MetaDraw/PlotModelStat.cs index ae2f996b9..d042c106c 100644 --- a/GuiFunctions/MetaDraw/PlotModelStat.cs +++ b/GuiFunctions/MetaDraw/PlotModelStat.cs @@ -28,6 +28,7 @@ public class PlotModelStat : INotifyPropertyChanged, IPlotModel "Histogram of Fragment Charges", "Histogram of Precursor Masses", "Histogram of Precursor m/z", + "Histogram of Hydrophobicity scores", "Precursor PPM Error vs. RT", "Histogram of PTM Spectral Counts", "Predicted RT vs. Observed RT" @@ -45,9 +46,9 @@ public class PlotModelStat : INotifyPropertyChanged, IPlotModel private static List columnColors = new List { - OxyColors.Teal, OxyColors.CadetBlue, OxyColors.LightSeaGreen, OxyColors.DarkTurquoise, OxyColors.LightSkyBlue, - OxyColors.LightBlue, OxyColors.Aquamarine, OxyColors.PaleGreen, OxyColors.MediumAquamarine, OxyColors.DarkSeaGreen, - OxyColors.MediumSeaGreen, OxyColors.SeaGreen, OxyColors.DarkSlateGray, OxyColors.Gray, OxyColors.Gainsboro + OxyColors.Blue, OxyColors.Red, OxyColors.Green, OxyColors.DarkGoldenrod, OxyColors.DarkViolet, + OxyColors.DeepPink, OxyColors.SkyBlue, OxyColors.LawnGreen, OxyColors.Sienna, OxyColors.DarkBlue, + OxyColors.PeachPuff, OxyColors.DarkSlateGray, OxyColors.SpringGreen, OxyColors.Peru, OxyColors.OrangeRed }; @@ -108,6 +109,9 @@ private void createPlot(string plotType) case "Histogram of Precursor m/z": histogramPlot(7); break; + case "Histogram of Hydrophobicity scores": + histogramPlot(8); + break; case "Precursor PPM Error vs. RT": linePlot(1); break; @@ -206,6 +210,24 @@ private void histogramPlot(int plotType) dictsBySourceFile.Add(key, results.ToDictionary(p => p.Key.ToString(), v => v.Count())); } break; + case 8: // Histogram of Hydrophobicity Scores + xAxisTitle = "Hydrophobicity Score (Determined by SSRCalc)"; + binSize = 2; + labelAngle = -50; + SSRCalc3 sSRCalc3 = new SSRCalc3("A100", SSRCalc3.Column.A100); + foreach (string key in psmsBySourceFile.Keys) + { + var values = new List(); + foreach (var psm in psmsBySourceFile[key]) + { + values.Add(sSRCalc3.ScoreSequence(new PeptideWithSetModifications(psm.BaseSeq.Split("|")[0], null))); + + } + numbersBySourceFile.Add(key, values); + var results = numbersBySourceFile[key].GroupBy(p => roundToBin(p, binSize)).OrderBy(p => p.Key).Select(p => p); + dictsBySourceFile.Add(key, results.ToDictionary(p => p.Key.ToString(), v => v.Count())); + } + break; } String[] category; // for labeling bottom axis diff --git a/Test/MetaDrawTest.cs b/Test/MetaDrawTest.cs index fa187df53..112a835d4 100644 --- a/Test/MetaDrawTest.cs +++ b/Test/MetaDrawTest.cs @@ -1384,6 +1384,14 @@ public static void TestMetaDrawHistogramPlots() .GetProperty("Items", BindingFlags.Public | BindingFlags.Instance).GetValue(series9); Assert.AreEqual(items9[11].Value, 18); + var plot10 = new PlotModelStat("Histogram of Hydrophobicity scores", + psms, psmDict); + var series10 = plot10.Model.Series.ToList()[0]; + var items10 = (List)series10.GetType() + .GetProperty("Items", BindingFlags.Public | BindingFlags.Instance).GetValue(series10); + Assert.AreEqual(items10.Count, 5); + Assert.AreEqual(items10[1].Value, 3); + //test variant plotting string variantFile = Path.Combine(TestContext.CurrentContext.TestDirectory, @"TestData\VariantCrossTest.psmtsv"); List warningsVariants = new List(); From 3fb1edded487e7a0048430154514b4bdbc6caab0 Mon Sep 17 00:00:00 2001 From: weaversd Date: Wed, 26 Oct 2022 11:48:07 -0500 Subject: [PATCH 16/24] added checkboxes and CZE plots --- GUI/MetaDraw/MetaDraw.xaml | 9 +- GUI/MetaDraw/MetaDraw.xaml.cs | 32 ++++++- GuiFunctions/MetaDraw/MetaDrawSettings.cs | 9 ++ .../MetaDraw/MetaDrawSettingsSnapshot.cs | 2 + GuiFunctions/MetaDraw/PlotModelStat.cs | 94 ++++++++++++++++++- 5 files changed, 139 insertions(+), 7 deletions(-) diff --git a/GUI/MetaDraw/MetaDraw.xaml b/GUI/MetaDraw/MetaDraw.xaml index daea8cb77..6da815b9d 100644 --- a/GUI/MetaDraw/MetaDraw.xaml +++ b/GUI/MetaDraw/MetaDraw.xaml @@ -439,6 +439,7 @@ + @@ -472,7 +473,13 @@ - + + + + + + +