示例#1
0
 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>();
 }
示例#2
0
        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
                });
            }
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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));
            }
        }
示例#6
0
        /// <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)
                    {
                    }
            }
        }