public ViewLibraryPepMatching(SrmDocument document, Library library, LibrarySpec spec, LibKeyModificationMatcher matcher, IReadOnlyList <ViewLibraryPepInfo> peptides) { _document = document; _selectedLibrary = library; _selectedSpec = spec; _matcher = matcher; _libraryPepInfos = peptides; _chargeSettingsMap = new AdductMap <SrmSettings>(); }
public void UseCurrentData() { var arrayData = GetRegressionDatas(); if (arrayData == null) { return; } bool hasRegressionLines = false; var regressionLines = new AdductMap <RegressionLine>(); foreach (var i in arrayData.Keys) { if (arrayData[i] == null) { continue; } regressionLines[i] = arrayData[i].RegressionLine; if (regressionLines[i] != null) { hasRegressionLines = true; } } if (!hasRegressionLines) { MessageDlg.Show(this, Resources.EditCEDlg_UseCurrentData_Insufficient_data_found_to_calculate_a_new_regression); return; } gridRegression.Rows.Clear(); foreach (var i in regressionLines.Keys) { var regressionLine = regressionLines[i]; if (regressionLine == null) { continue; } gridRegression.Rows.Add(new object[] { i.AdductCharge.ToString(LocalizationHelper.CurrentCulture), string.Format("{0:F04}", regressionLine.Slope), // Not L10N string.Format("{0:F04}", regressionLine.Intercept) // Not L10N }); } }
private AdductMap <CERegressionData> GetRegressionDatas() { var document = Program.ActiveDocumentUI; if (!document.Settings.HasResults) { return(null); } if (!document.Settings.MeasuredResults.IsLoaded) { MessageBox.Show(this, Resources.EditCEDlg_GetRegressionDatas_Measured_results_must_be_completely_loaded_before_they_can_be_used_to_create_a_collision_energy_regression, Program.Name); return(null); } var regressionCurrent = _regression ?? document.Settings.TransitionSettings.Prediction.CollisionEnergy; var arrayData = new AdductMap <CERegressionData>(); var chromatograms = document.Settings.MeasuredResults.Chromatograms; for (int i = 0; i < chromatograms.Count; i++) { var chromSet = chromatograms[i]; var regression = chromSet.OptimizationFunction as CollisionEnergyRegression; if (regression == null) { continue; } foreach (var nodeGroup in document.MoleculeTransitionGroups) { var charge = nodeGroup.TransitionGroup.PrecursorAdduct; if (arrayData[charge] == null) { var chargeRegression = (regressionCurrent != null ? regressionCurrent.GetRegressionLine(charge) : null); arrayData[charge] = new CERegressionData(chargeRegression != null ? chargeRegression.RegressionLine : null); } arrayData[charge].Add(regression, nodeGroup, i); } } return(arrayData); }
public PeptideDocNode MatchSinglePeptide(ViewLibraryPepInfo pepInfo) { _chargeSettingsMap = new AdductMap <SrmSettings>(); var nodePep = AssociateMatchingPeptide(pepInfo, pepInfo.Key.Adduct).PeptideNode; if (nodePep == null) { return(null); } IList <ProteinInfo> matchedProteins = null; var target = nodePep.Peptide.Target; if (pepInfo.Target.IsProteomic) { // This is only set if the user has checked the associate peptide box. if (_backgroundProteome != null) { using (var proteomeDb = _backgroundProteome.OpenProteomeDb()) { var digestion = _backgroundProteome.GetDigestion(proteomeDb, Settings.PeptideSettings); if (digestion != null) { matchedProteins = digestion.GetProteinsWithSequence(target.Sequence) .Select(protein => new ProteinInfo(protein)).ToArray(); } } } } PeptideMatches = new Dictionary <PeptideSequenceModKey, PeptideMatch> { { nodePep.SequenceKey, new PeptideMatch(nodePep, matchedProteins, pepInfo.LibInfo, MatchesFilter(target, pepInfo.Key.Adduct)) } }; return(nodePep); }
private void TestAdductOperators() { // Test some underlying formula handling for fanciful user-supplied values Assert.IsTrue(Molecule.AreEquivalentFormulas("C10H30Si5O5H-CH4", "C9H27O5Si5")); Assert.AreEqual("C7H27O5Si4", BioMassCalc.MONOISOTOPIC.FindFormulaIntersection(new[] { "C8H30Si5O5H-CH4", "C9H27O5Si4", "C9H27O5Si5Na" })); Assert.AreEqual("C7H27O5Si4", BioMassCalc.MONOISOTOPIC.FindFormulaIntersectionUnlabeled(new[] { "C7C'H30Si5O5H-CH4", "C9H27O5Si4", "C9H25H'2O5Si5Na" })); // There is a difference between a proteomic adduct and non proteomic, primarily in how they display Assert.AreEqual(Adduct.FromStringAssumeChargeOnly("M+H"), Adduct.M_PLUS_H); Assert.AreEqual(Adduct.FromStringAssumeProtonatedNonProteomic("1"), Adduct.M_PLUS_H); Assert.AreEqual(Adduct.FromStringAssumeChargeOnly("1"), Adduct.M_PLUS); Assert.AreEqual(Adduct.FromStringAssumeProtonatedNonProteomic("M+H"), Adduct.M_PLUS_H); Assert.AreEqual(Adduct.FromStringAssumeProtonated("1"), Adduct.SINGLY_PROTONATED); Assert.AreEqual(Adduct.FromStringAssumeProtonated("M+H"), Adduct.SINGLY_PROTONATED); Assert.AreEqual(Adduct.FromStringAssumeChargeOnly("M+H").AsFormula(), Adduct.SINGLY_PROTONATED.AsFormula()); // But the underlying chemistry is the same Assert.AreEqual(Adduct.FromStringAssumeProtonated("[M+S]+"), Adduct.FromStringAssumeProtonated("M+S").ChangeCharge(1)); Assert.AreEqual(Adduct.FromStringAssumeProtonated("M(-1.234)+2Na"), Adduct.FromStringAssumeProtonated("M(-1.234)+3Na").ChangeCharge(2)); Assert.AreEqual(Adduct.FromStringAssumeProtonated("M1.234+2Na"), Adduct.FromStringAssumeProtonated("M1.234+3Na").ChangeCharge(2)); Assert.AreEqual(Adduct.FromStringAssumeProtonated("M2Cl37-2Na"), Adduct.FromStringAssumeProtonated("M2Cl37+3Na").ChangeCharge(-2)); Assert.AreEqual(Adduct.FromStringAssumeProtonated("M1.234-2Na"), Adduct.FromStringAssumeProtonated("M1.234+3Na").ChangeCharge(-2)); Assert.AreEqual(Adduct.FromStringAssumeProtonated("M(-1.234)-2Na"), Adduct.FromStringAssumeProtonated("M(-1.234)+3Na").ChangeCharge(-2)); Assert.IsFalse(Adduct.M_PLUS_H.IsProteomic); Assert.IsTrue(Adduct.M_PLUS_H.IsProtonated); Assert.IsTrue(Adduct.SINGLY_PROTONATED.IsProteomic); Assert.IsTrue(Adduct.SINGLY_PROTONATED.IsProtonated); Assert.IsFalse(Adduct.SINGLY_PROTONATED.IsEmpty); Assert.IsFalse(Adduct.EMPTY.IsProteomic); Assert.IsTrue(Adduct.EMPTY.IsEmpty); // Exercise the ability to work with masses and isotope labels Assert.IsTrue(ReferenceEquals(Adduct.SINGLY_PROTONATED, Adduct.SINGLY_PROTONATED.Unlabeled)); var nolabel = Adduct.FromStringAssumeProtonated("M-2Na"); var label = Adduct.FromStringAssumeProtonated("M2Cl37-2Na"); Assert.AreEqual(nolabel, label.Unlabeled); Assert.IsTrue(ReferenceEquals(nolabel, nolabel.Unlabeled)); Assert.IsFalse(nolabel.MassFromMz(300.0, MassType.Monoisotopic).IsHeavy()); Assert.IsFalse(label.MassFromMz(300.0, MassType.Monoisotopic).IsHeavy()); Assert.IsTrue(label.MassFromMz(300.0, MassType.MonoisotopicHeavy).IsHeavy()); Assert.IsTrue(label.MassFromMz(300.0, MassType.Monoisotopic).IsMonoIsotopic()); Assert.IsFalse(nolabel.MassFromMz(300.0, MassType.Average).IsHeavy()); Assert.IsFalse(label.MassFromMz(300.0, MassType.Average).IsHeavy()); Assert.IsTrue(label.MassFromMz(300.0, MassType.AverageHeavy).IsHeavy()); Assert.IsTrue(label.MassFromMz(300.0, MassType.Average).IsAverage()); var massHeavy = label.ApplyToMass(new TypedMass(300, MassType.MonoisotopicHeavy)); // Will not have isotope effect added in mz calc, as it's already heavy var massLight = label.ApplyToMass(new TypedMass(300, MassType.Monoisotopic)); // Will have isotope effect added in mz calc Assert.AreNotEqual(massHeavy, massLight); Assert.AreNotEqual(label.MzFromNeutralMass(massHeavy), label.MzFromNeutralMass(massLight)); Assert.IsTrue(Adduct.PossibleAdductDescriptionStart("[")); Assert.IsTrue(Adduct.PossibleAdductDescriptionStart("M")); Assert.IsTrue(Adduct.PossibleAdductDescriptionStart("[2M+CH3COO]")); Assert.AreEqual(Adduct.FromStringAssumeProtonated("M+2CH3COO"), Adduct.FromStringAssumeProtonated("M+CH3COO").ChangeCharge(-2)); Assert.AreEqual(Adduct.FromStringAssumeProtonated("M-2CH3COO"), Adduct.FromStringAssumeProtonated("M+CH3COO").ChangeCharge(2)); Assert.AreEqual(Adduct.FromStringAssumeProtonated("M-2Na"), Adduct.FromStringAssumeProtonated("M+Na").ChangeCharge(-2)); Assert.AreEqual(Adduct.FromStringAssumeProtonated("M+Na"), Adduct.FromStringAssumeProtonated("M+Na").ChangeCharge(1)); Assert.AreEqual(Adduct.FromStringAssumeProtonated("M+2Na"), Adduct.FromStringAssumeProtonated("M+Na").ChangeCharge(2)); Assert.AreEqual(Adduct.FromStringAssumeProtonated("M+2Na"), Adduct.FromStringAssumeProtonated("M+3Na").ChangeCharge(2)); Assert.AreEqual(Adduct.FromStringAssumeProtonated("M2Cl37+2Na"), Adduct.FromStringAssumeProtonated("M2Cl37+3Na").ChangeCharge(2)); AssertEx.ThrowsException <InvalidOperationException>(() => Adduct.FromStringAssumeProtonated("M+2Na-H").ChangeCharge(2)); // Too complex to adjust formula AssertEx.ThrowsException <InvalidOperationException>(() => Adduct.FromStringAssumeProtonatedNonProteomic("[M2")); // Seen in the wild, wasn't handled well Assert.AreEqual(Adduct.FromStringAssumeProtonated("M++++").AdductCharge, Adduct.FromChargeNoMass(4).AdductCharge); Assert.AreEqual(Adduct.FromStringAssumeProtonated("M+4"), Adduct.FromChargeNoMass(4)); Assert.AreEqual(Adduct.FromStringAssumeProtonated("M--").AdductCharge, Adduct.FromChargeNoMass(-2).AdductCharge); Assert.AreEqual(Adduct.FromStringAssumeProtonated("M-2"), Adduct.FromChargeNoMass(-2)); Assert.IsTrue(ReferenceEquals(Adduct.FromStringAssumeChargeOnly("M-"), Adduct.FromChargeNoMass(-1))); // Both should return Adduct.M_MINUS Assert.IsTrue(ReferenceEquals(Adduct.FromStringAssumeChargeOnly("M+"), Adduct.FromChargeNoMass(1))); // Both should return Adduct.M_PLUS Assert.IsTrue(ReferenceEquals(Adduct.FromStringAssumeChargeOnly("[M+]"), Adduct.FromChargeNoMass(1))); // Both should return Adduct.M_PLUS Assert.IsTrue(ReferenceEquals(Adduct.FromStringAssumeChargeOnly("M-H"), Adduct.M_MINUS_H)); Assert.IsTrue(ReferenceEquals(Adduct.FromStringAssumeChargeOnly("M+H"), Adduct.M_PLUS_H)); var a = Adduct.FromChargeProtonated(-1); var aa = Adduct.FromStringAssumeProtonated("M+CH3COO"); var b = Adduct.FromChargeProtonated(2); var bb = Adduct.FromChargeProtonated(2); var bbb = Adduct.FromChargeProtonated(2); var bbbb = Adduct.FromChargeProtonated(2); var c = Adduct.FromChargeProtonated(3); var cc = Adduct.FromStringAssumeChargeOnly("M+3H"); var ccc = Adduct.FromStringAssumeChargeOnly("[M+3H]"); Assert.AreEqual(a.AdductCharge, aa.AdductCharge); Assert.IsTrue(b == bb); Assert.IsTrue(b == bbb); Assert.IsTrue(ReferenceEquals(bbb, bbbb)); Assert.IsTrue(c.AdductCharge == cc.AdductCharge); Assert.IsFalse(c == cc); Assert.IsTrue(c != cc); Assert.IsTrue(cc == ccc); Assert.IsTrue(a < aa); Assert.IsTrue(a < b); Assert.IsTrue(b > a); Assert.IsTrue(b != a); var sorted = new List <Adduct> { a, aa, b, bb, bbb, bbbb, c, cc, ccc }; var unsorted = new List <Adduct> { bb, aa, ccc, b, c, bbb, a, bbbb, cc }; Assert.IsFalse(sorted.SequenceEqual(unsorted)); unsorted.Sort(); Assert.IsTrue(sorted.SequenceEqual(unsorted)); var ints = new AdductMap <int>(); Assert.AreEqual(0, ints[a]); ints[a] = 7; Assert.AreEqual(7, ints[a]); var adducts = new AdductMap <Adduct>(); Assert.AreEqual(null, adducts[a]); adducts[a] = b; Assert.AreEqual(b, adducts[a]); adducts[a] = c; Assert.AreEqual(c, adducts[a]); var d = Adduct.FromStringAssumeProtonated("[2M+3H]"); var dd = Adduct.FromStringAssumeProtonated("[M+3H]"); var ddd = Adduct.FromStringAssumeProtonated("[M-Na]"); Assert.IsTrue(d.ChangeMassMultiplier(1).SameEffect(dd)); Assert.IsTrue(dd.ChangeMassMultiplier(2).SameEffect(d)); Assert.AreEqual(dd.ChangeIonFormula("-Na"), ddd); Assert.AreEqual(d.ChangeMassMultiplier(1).ChangeIonFormula("-Na"), ddd); CheckLabel(BioMassCalc.Cl37); CheckLabel(BioMassCalc.Br81); CheckLabel(BioMassCalc.S33); CheckLabel(BioMassCalc.S34); CheckLabel(BioMassCalc.P32); CheckLabel(BioMassCalc.C14); CheckLabel(BioMassCalc.O17); CheckLabel(BioMassCalc.O18); var tips = Adduct.Tips; foreach (var nickname in Adduct.DICT_ADDUCT_NICKNAMES) { Assert.IsTrue(tips.Contains(nickname.Key)); } foreach (var nickname in Adduct.DICT_ADDUCT_ISOTOPE_NICKNAMES) { Assert.IsTrue(tips.Contains(nickname.Key)); } }
/// <summary> /// Tries to match each library peptide to document settings. /// </summary> public void MatchAllPeptides(ILongWaitBroker broker) { _chargeSettingsMap = new AdductMap <SrmSettings>(); // Build a dictionary mapping sequence to proteins because getting this information is slow. var dictSequenceProteins = new Dictionary <string, IList <ProteinInfo> >(); var dictNewNodePeps = new Dictionary <PeptideSequenceModKey, PeptideMatch>(); PeptideMatches = null; MatchedPeptideCount = 0; int peptides = 0; int totalPeptides = _libraryPepInfos.Count; ProteomeDb proteomeDb = null; IStatelessSession session = null; try { foreach (ViewLibraryPepInfo pepInfo in _libraryPepInfos) { if (broker.IsCanceled) { return; } var charge = pepInfo.Key.Adduct; // Find the matching peptide. var nodePepMatched = AssociateMatchingPeptide(pepInfo, charge).PeptideNode; if (nodePepMatched != null) { MatchedPeptideCount++; PeptideMatch peptideMatchInDict; // If peptide is already in the dictionary of peptides to add, merge the children. if (!dictNewNodePeps.TryGetValue(nodePepMatched.SequenceKey, out peptideMatchInDict)) { IList <ProteinInfo> matchedProteins = null; var target = nodePepMatched.Peptide.Target; // This is only set if the user has checked the associate peptide box. if (target.IsProteomic && _backgroundProteome != null) { var sequence = target.Sequence; // We want to query the background proteome as little as possible, // so sequences are mapped to protein lists in a dictionary. if (!dictSequenceProteins.TryGetValue(sequence, out matchedProteins)) { if (proteomeDb == null) { proteomeDb = _backgroundProteome.OpenProteomeDb(broker.CancellationToken); session = proteomeDb.OpenStatelessSession(false); } var digestion = proteomeDb.GetDigestion(); if (sequence.Length >= MIN_PEPTIDE_LENGTH) { matchedProteins = digestion.GetProteinsWithSequence(session, sequence) .Select(protein => new ProteinInfo(protein)).ToList(); } if (matchedProteins == null || matchedProteins.Count > MAX_PROTEIN_MATCHES) { // If the peptide was too short, or matched too many proteins, then // treat it as if it was not found in any proteins. matchedProteins = new List <ProteinInfo>(); } dictSequenceProteins.Add(sequence, matchedProteins); } } dictNewNodePeps.Add(nodePepMatched.SequenceKey, new PeptideMatch(nodePepMatched, matchedProteins, MatchesFilter(target, charge))); } else { PeptideDocNode nodePepInDictionary = peptideMatchInDict.NodePep; if (!nodePepInDictionary.HasChildCharge(charge)) { List <DocNode> newChildren = nodePepInDictionary.Children.ToList(); newChildren.AddRange(nodePepMatched.Children); newChildren.Sort(Peptide.CompareGroups); var key = nodePepMatched.SequenceKey; dictNewNodePeps.Remove(key); dictNewNodePeps.Add(key, new PeptideMatch((PeptideDocNode)nodePepInDictionary.ChangeChildren(newChildren), peptideMatchInDict.Proteins, peptideMatchInDict.MatchesFilterSettings)); } } } peptides++; int progressValue = (int)((peptides + 0.0) / totalPeptides * PERCENT_PEPTIDE_MATCH); broker.ProgressValue = progressValue; } PeptideMatches = dictNewNodePeps; } finally { using (proteomeDb) using (session) { } } }