From b160b856bb2722fae95f4a8f3d665764bec5fba9 Mon Sep 17 00:00:00 2001 From: trishorts Date: Thu, 7 Sep 2023 13:42:02 -0500 Subject: [PATCH 1/2] Fix string split in glyco protein parsimony (#2305) * reverted filtering method for psms passed to FlashLFQ * a separator that works * replace hashtag with tuple * add unit test * add orderby --------- Co-authored-by: Alex Co-authored-by: MICHAEL SHORTREED --- .../GlycoSearchTask/GlycoProteinParsimony.cs | 6 +-- .../TaskLayer/XLSearchTask/WriteFile.cs | 42 ++++++++++--------- .../P16150withHyphenInName.fasta | 8 ++++ MetaMorpheus/Test/Test.csproj | 3 ++ MetaMorpheus/Test/XLTestNGlyco.cs | 12 ------ MetaMorpheus/Test/XLTestOGlyco.cs | 26 +++++++++--- 6 files changed, 57 insertions(+), 40 deletions(-) create mode 100644 MetaMorpheus/Test/GlycoTestData/P16150withHyphenInName.fasta diff --git a/MetaMorpheus/TaskLayer/GlycoSearchTask/GlycoProteinParsimony.cs b/MetaMorpheus/TaskLayer/GlycoSearchTask/GlycoProteinParsimony.cs index cd595f60e..e22f1d9ba 100644 --- a/MetaMorpheus/TaskLayer/GlycoSearchTask/GlycoProteinParsimony.cs +++ b/MetaMorpheus/TaskLayer/GlycoSearchTask/GlycoProteinParsimony.cs @@ -41,10 +41,10 @@ public GlycoProteinParsimony(string proteinAccess, int proteinPos, char aminoAci public double MaxProbability { get; set; } - public static Dictionary ProteinLevelGlycoParsimony(List allPsmsGly) + public static Dictionary<(string proteinAccession, string proteinPosition, int glycanId), GlycoProteinParsimony> ProteinLevelGlycoParsimony(List allPsmsGly) { //key: proPosId - Dictionary localizedGlycan = new Dictionary(); + Dictionary<(string proteinAccession, string proteinPosition, int glycanId), GlycoProteinParsimony> localizedGlycan = new Dictionary<(string proteinAccession, string proteinPosition, int glycanId), GlycoProteinParsimony>(); foreach (var gsm in allPsmsGly) { @@ -59,7 +59,7 @@ public static Dictionary ProteinLevelGlycoParsimo { int proteinPos = local.Item1 + gsm.OneBasedStartResidueInProtein.Value - 2; - string proPosId = gsm.ProteinAccession + "-" + proteinPos.ToString() + "-" + local.Item2; + (string,string,int) proPosId = new (gsm.ProteinAccession, proteinPos.ToString(), local.Item2); double prob = -1; if (gsm.SiteSpeciLocalProb != null && gsm.SiteSpeciLocalProb.ContainsKey(local.Item1)) diff --git a/MetaMorpheus/TaskLayer/XLSearchTask/WriteFile.cs b/MetaMorpheus/TaskLayer/XLSearchTask/WriteFile.cs index d5f26cd3b..dc57e6208 100644 --- a/MetaMorpheus/TaskLayer/XLSearchTask/WriteFile.cs +++ b/MetaMorpheus/TaskLayer/XLSearchTask/WriteFile.cs @@ -9,6 +9,7 @@ using System.IO; using System.Linq; using System.Xml.Serialization; +using Easy.Common.Extensions; namespace TaskLayer { @@ -452,33 +453,35 @@ public static void WritePsmGlycoToTsv(List items, string fil } //The function is to summarize localized glycan by protein site. - public static void WriteSeenProteinGlycoLocalization(Dictionary glycoProteinParsimony, string outputPath) + public static void WriteSeenProteinGlycoLocalization(Dictionary<(string proteinAccession, string proteinPosition, int glycanId), GlycoProteinParsimony> glycoProteinParsimony, string outputPath) { - if (glycoProteinParsimony.Count == 0) + if (glycoProteinParsimony.Keys.Count == 0) { return; } var writtenFile = Path.Combine(outputPath); using (StreamWriter output = new StreamWriter(writtenFile)) { output.WriteLine("Protein Accession\tModification Site\tAminoAcid\tLocalized Glycans\tLocalized\tLowest Qvalue\tBest Localization Level\tMax Site Specific Probability"); - foreach (var item in glycoProteinParsimony.OrderBy(p=>p.Key)) + foreach (var item in glycoProteinParsimony.OrderBy(i=>i.Key.proteinAccession)) { - var x = item.Key.Split('-'); - output.WriteLine( - x[0] + "\t" + - x[1] + "\t" + - item.Value.AminoAcid + "\t" + - GlycanBox.GlobalOGlycans[int.Parse(x[2])].Composition + "\t" + - item.Value.IsLocalized + "\t" + - item.Value.MinQValue.ToString("0.000") + "\t" + - item.Value.BestLocalizeLevel + "\t" + - item.Value.MaxProbability.ToString("0.000") - ); + if (item.Value != null) + { + output.WriteLine( + item.Key.proteinAccession + "\t" + + item.Key.proteinPosition + "\t" + + item.Value.AminoAcid + "\t" + + GlycanBox.GlobalOGlycans[item.Key.glycanId].Composition + "\t" + + item.Value.IsLocalized + "\t" + + item.Value.MinQValue.ToString("0.000") + "\t" + + item.Value.BestLocalizeLevel + "\t" + + item.Value.MaxProbability.ToString("0.000")); + + } } } } //The function is to summarize localized glycosylation of each protein site. - public static void WriteProteinGlycoLocalization(Dictionary glycoProteinParsimony, string outputPath) + public static void WriteProteinGlycoLocalization(Dictionary<(string proteinAccession, string proteinPosition, int glycanId), GlycoProteinParsimony> glycoProteinParsimony, string outputPath) { if (glycoProteinParsimony.Count == 0) { return; } @@ -486,16 +489,15 @@ public static void WriteProteinGlycoLocalization(Dictionary> localizedglycans = new Dictionary>(); foreach (var item in glycoProteinParsimony.Where(p=>p.Value.IsLocalized && p.Value.MinQValue <= 0.01)) { - var x = item.Key.Split('-'); - var key = x[0] + "-" + x[1]; + var key = item.Key.proteinAccession + "#" + item.Key.proteinPosition; if ( localizedglycans.ContainsKey(key)) { - localizedglycans[key].Add(x[2]); + localizedglycans[key].Add(item.Key.glycanId.ToString()); } else { localizedglycans[key] = new HashSet(); - localizedglycans[key].Add(x[2]); + localizedglycans[key].Add(item.Key.glycanId.ToString()); } } @@ -506,7 +508,7 @@ public static void WriteProteinGlycoLocalization(Dictionary p.Key)) { - var x = local.Key.Split('-'); + var x = local.Key.Split('#'); output.WriteLine( x[0] + "\t" + x[1] + "\t" + diff --git a/MetaMorpheus/Test/GlycoTestData/P16150withHyphenInName.fasta b/MetaMorpheus/Test/GlycoTestData/P16150withHyphenInName.fasta new file mode 100644 index 000000000..d0408248b --- /dev/null +++ b/MetaMorpheus/Test/GlycoTestData/P16150withHyphenInName.fasta @@ -0,0 +1,8 @@ +>sp|P16150|LEUK_HUMAN Leuko-sialin OS=Homo sapiens OX=9606 GN=SPN PE=1 SV=1 +MATLLLLLGVLVVSPDALGSTTAVQTPTSGEPLVSTSEPLSSKMYTTSITSDPKADSTGD +QTSALPPSTSINEGSPLWTSIGASTGSPLPEPTTYQEVSIKMSSVPQETPHATSHPAVPI +TANSLGSHTVTGGTITTNSPETSSRTSGAPVTTAASSLETSRGTSGPPLTMATVSLETSK +GTSGPPVTMATDSLETSTGTTGPPVTMTTGSLEPSSGASGPQVSSVKLSTMMSPTTSTNA +STVPFRNPDENSRGMLPVAVLVALLAVIVLVALLLLWRRRQKRRTGALVLSRGGKRNGVV +DAWAGPAQVPEEGAVTVTVGGSGGDKGSGFPDGEGSSRRPTLTTFFGRRKSRQGSLAMEE +LKSGSGPSLKGEEEPLVASEDGAVDAPAPDEPEGGDGAAP diff --git a/MetaMorpheus/Test/Test.csproj b/MetaMorpheus/Test/Test.csproj index a714ad64f..65344d56a 100644 --- a/MetaMorpheus/Test/Test.csproj +++ b/MetaMorpheus/Test/Test.csproj @@ -132,6 +132,9 @@ PreserveNewest + + Always + PreserveNewest diff --git a/MetaMorpheus/Test/XLTestNGlyco.cs b/MetaMorpheus/Test/XLTestNGlyco.cs index b197c1b9e..7cac3f08f 100644 --- a/MetaMorpheus/Test/XLTestNGlyco.cs +++ b/MetaMorpheus/Test/XLTestNGlyco.cs @@ -63,18 +63,6 @@ public static void GlyTest_GlyGetTheoreticalFragments() var sites = GlycoSpectralMatch.GetPossibleModSites(aPeptideWithSetModifications.Last(), motifs); Glycan glycan = Glycan.Struct2Glycan("(N(F)(N(H(H(N))(H(N)))))", 0); - - //using (StreamWriter output = new StreamWriter(Path.Combine(TestContext.CurrentContext.TestDirectory, "GlycanFragmentions.txt"))) - //{ - // foreach (var product in fragmentIons) - // { - // foreach (var ion in product.Item2) - // { - // output.WriteLine(ion.Annotation + "\t" + ion.NeutralLoss.ToString() + "\t" + ion.NeutralMass.ToString()); - // } - // } - //} - CommonParameters commonParameters = new CommonParameters(deconvolutionMassTolerance: new PpmTolerance(20), trimMsMsPeaks: false); string filePath = Path.Combine(TestContext.CurrentContext.TestDirectory, @"GlycoTestData/Glyco_3383.mgf"); //"25170.mgf" MyFileManager myFileManager = new MyFileManager(true); diff --git a/MetaMorpheus/Test/XLTestOGlyco.cs b/MetaMorpheus/Test/XLTestOGlyco.cs index 8187e3552..0e0b7e91e 100644 --- a/MetaMorpheus/Test/XLTestOGlyco.cs +++ b/MetaMorpheus/Test/XLTestOGlyco.cs @@ -1,7 +1,4 @@ -using Chemistry; -using EngineLayer; -using EngineLayer.CrosslinkSearch; -using EngineLayer.Indexing; +using EngineLayer; using MassSpectrometry; using NUnit.Framework; using Proteomics; @@ -13,7 +10,6 @@ using System.Linq; using TaskLayer; using UsefulProteomicsDatabases; -using MzLibUtil; using Nett; using EngineLayer.GlycoSearch; @@ -443,6 +439,26 @@ public static void OGlycoTest_Run3() Directory.Delete(Path.Combine(Environment.CurrentDirectory, @"TESTGlycoData"), true); } + //make sure that hyphens in protein names don't produce a crash during protein inference from glycopeptides + [Test] + public static void OGlycoTest_Run4() + { + string outputFolder = Path.Combine(TestContext.CurrentContext.TestDirectory, @"TESTGlycoData"); + Directory.CreateDirectory(outputFolder); + + var glycoSearchTask = Toml.ReadFile(Path.Combine(TestContext.CurrentContext.TestDirectory, @"GlycoTestData\GlycoSearchTaskconfigOGlycoTest_Run.toml"), MetaMorpheusTask.tomlConfig); + + DbForTask db = new(Path.Combine(TestContext.CurrentContext.TestDirectory, @"GlycoTestData\P16150withHyphenInName.fasta"), false); + string spectraFile = Path.Combine(TestContext.CurrentContext.TestDirectory, @"GlycoTestData\2019_09_16_StcEmix_35trig_EThcD25_rep1_9906.mgf"); + new EverythingRunnerEngine(new List<(string, MetaMorpheusTask)> { ("Task", glycoSearchTask) }, new List { spectraFile }, new List { db }, outputFolder).Run(); + + var folders = Directory.GetDirectories(outputFolder).Select(b => Path.GetFileName(b)).ToList(); + var folderContents = Directory.GetFiles(Path.Combine(outputFolder, folders[0])).ToList(); + Assert.That(folderContents[6].Contains("_AllProteinGroups.tsv")); + + Directory.Delete(outputFolder, true); + } + [Test] public static void OGlycoTest_GetLeft() { From 9bb587fd1fdf65c6d961a50a3bcfe72487d74fa7 Mon Sep 17 00:00:00 2001 From: Nic Bollis Date: Thu, 7 Sep 2023 15:40:05 -0500 Subject: [PATCH 2/2] Hid Averaging Task Button (#2307) --- MetaMorpheus/GUI/MainWindow.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MetaMorpheus/GUI/MainWindow.xaml b/MetaMorpheus/GUI/MainWindow.xaml index 895dfa91d..1a68e3e86 100644 --- a/MetaMorpheus/GUI/MainWindow.xaml +++ b/MetaMorpheus/GUI/MainWindow.xaml @@ -514,7 +514,7 @@ - + @@ -524,7 +524,7 @@