private static void ValidateDecoys(SrmDocument document, SrmDocument decoysDoc, bool modifiesSequences) { AssertEx.IsDocumentState(decoysDoc, 1, document.PeptideGroupCount + 1, document.PeptideCount * 2, document.PeptideTransitionGroupCount * 2, document.PeptideTransitionCount * 2); // Check for the existence of the Decoys peptide group and that everything under it is marked as a decoy. var nodePeptideGroupDecoy = decoysDoc.PeptideGroups.Single(nodePeptideGroup => nodePeptideGroup.IsDecoy); var dictModsToPep = document.Peptides.ToDictionary(nodePep => nodePep.ModifiedSequence); foreach (var nodePep in nodePeptideGroupDecoy.Peptides) { Assert.AreEqual(true, nodePep.IsDecoy); PeptideDocNode nodePepSource = null; if (!modifiesSequences) { Assert.IsNull(nodePep.SourceKey); } else { Assert.IsNotNull(nodePep.SourceKey, string.Format("Source key for {0}{1} is null", nodePep.ModifiedSequence, nodePep.IsDecoy ? " - decoy" : string.Empty)); Assert.IsTrue(FastaSequence.IsExSequence(nodePep.SourceKey.Sequence)); Assert.AreEqual(nodePep.SourceKey.ModifiedSequence, SequenceMassCalc.NormalizeModifiedSequence(nodePep.SourceKey.ModifiedSequence)); if (nodePep.HasExplicitMods) { Assert.IsNotNull(nodePep.SourceKey.ExplicitMods); } Assert.IsTrue(dictModsToPep.TryGetValue(nodePep.SourceTextId, out nodePepSource)); var sourceKey = new ModifiedSequenceMods(nodePepSource.Peptide.Sequence, nodePepSource.ExplicitMods); Assert.AreEqual(sourceKey.ExplicitMods, nodePep.SourceExplicitMods); } for (int i = 0; i < nodePep.TransitionGroupCount; i++) { var nodeGroup = nodePep.TransitionGroups.ElementAt(i); Assert.AreEqual(true, nodeGroup.IsDecoy); TransitionGroupDocNode nodeGroupSource = null; double shift = SequenceMassCalc.GetPeptideInterval(nodeGroup.TransitionGroup.DecoyMassShift); if (nodePepSource != null && nodeGroup.TransitionGroup.DecoyMassShift.HasValue) { nodeGroupSource = nodePepSource.TransitionGroups.ElementAt(i); Assert.AreEqual(nodeGroupSource.PrecursorMz + shift, nodeGroup.PrecursorMz, SequenceMassCalc.MassTolerance); } for (int j = 0; j < nodeGroup.TransitionCount; j++) { var nodeTran = nodeGroup.Transitions.ElementAt(j); Assert.IsTrue(nodeTran.IsDecoy); if (nodeTran.Transition.IsPrecursor()) { Assert.AreEqual(nodeGroup.TransitionGroup.DecoyMassShift, nodeTran.Transition.DecoyMassShift); if (nodeGroupSource != null) { Assert.AreEqual(nodeGroupSource.Transitions.ElementAt(j).Mz + shift, nodeTran.Mz, SequenceMassCalc.MassTolerance); } } } } } // Check that the resulting document persists correctly by passing the SrmDocument to AssertEx.IsSerializable(). AssertEx.Serializable(decoysDoc); }
private static SrmDocument GenerateDecoysFunc(SrmDocument document, int numDecoys, bool multiCycle, Func<SequenceMods, SequenceMods> genDecoySequence) { // Loop through the existing tree in random order creating decoys var settings = document.Settings; var enzyme = settings.PeptideSettings.Enzyme; var decoyNodePepList = new List<PeptideDocNode>(); var setDecoyKeys = new HashSet<PeptideModKey>(); while (numDecoys > 0) { int startDecoys = numDecoys; foreach (var nodePep in document.Peptides.ToArray().RandomOrder()) { if (numDecoys == 0) break; // Decoys should not be based on standard peptides if (nodePep.GlobalStandardType != null) continue; // If the non-terminal end of the peptide sequence is all a single character, skip this peptide, // since it can't support decoy generation. var sequence = nodePep.Peptide.Sequence; if (genDecoySequence != null && sequence.Substring(0, sequence.Length - 1).Distinct().Count() == 1) continue; var seqMods = new SequenceMods(nodePep); if (genDecoySequence != null) { seqMods = genDecoySequence(seqMods); } var peptide = nodePep.Peptide; var decoyPeptide = new Peptide(null, seqMods.Sequence, null, null, enzyme.CountCleavagePoints(seqMods.Sequence), true); if (seqMods.Mods != null) seqMods.Mods = seqMods.Mods.ChangePeptide(decoyPeptide); foreach (var comparableGroups in PeakFeatureEnumerator.ComparableGroups(nodePep)) { var decoyNodeTranGroupList = GetDecoyGroups(nodePep, decoyPeptide, seqMods.Mods, comparableGroups, document, Equals(seqMods.Sequence, peptide.Sequence)); if (decoyNodeTranGroupList.Count == 0) continue; var nodePepNew = new PeptideDocNode(decoyPeptide, settings, seqMods.Mods, null, nodePep.ExplicitRetentionTime, decoyNodeTranGroupList.ToArray(), false); if (!Equals(nodePep.ModifiedSequence, nodePepNew.ModifiedSequence)) { var sourceKey = new ModifiedSequenceMods(nodePep.ModifiedSequence, nodePep.ExplicitMods); nodePepNew = nodePepNew.ChangeSourceKey(sourceKey); } // Avoid adding duplicate peptides if (setDecoyKeys.Contains(nodePepNew.Key)) continue; setDecoyKeys.Add(nodePepNew.Key); decoyNodePepList.Add(nodePepNew); numDecoys--; } } // Stop if not multi-cycle or the number of decoys has not changed. if (!multiCycle || startDecoys == numDecoys) break; } var decoyNodePepGroup = new PeptideGroupDocNode(new PeptideGroup(true), Annotations.EMPTY, PeptideGroup.DECOYS, null, decoyNodePepList.ToArray(), false); decoyNodePepGroup = decoyNodePepGroup.ChangeSettings(document.Settings, SrmSettingsDiff.ALL); return (SrmDocument)document.Add(decoyNodePepGroup); }
private static void ValidateDecoys(SrmDocument document, SrmDocument decoysDoc, bool modifiesSequences) { AssertEx.IsDocumentState(decoysDoc, 1, document.PeptideGroupCount + 1, document.PeptideCount*2, document.PeptideTransitionGroupCount*2, document.PeptideTransitionCount*2); // Check for the existence of the Decoys peptide group and that everything under it is marked as a decoy. var nodePeptideGroupDecoy = decoysDoc.PeptideGroups.Single(nodePeptideGroup => nodePeptideGroup.IsDecoy); var dictModsToPep = document.Peptides.ToDictionary(nodePep => nodePep.ModifiedSequence); foreach (var nodePep in nodePeptideGroupDecoy.Peptides) { Assert.AreEqual(true, nodePep.IsDecoy); PeptideDocNode nodePepSource = null; if (!modifiesSequences) Assert.IsNull(nodePep.SourceKey); else { Assert.IsNotNull(nodePep.SourceKey, string.Format("Source key for {0}{1} is null", nodePep.ModifiedSequence, nodePep.IsDecoy ? " - decoy" : string.Empty)); Assert.IsTrue(FastaSequence.IsExSequence(nodePep.SourceKey.Sequence)); Assert.AreEqual(nodePep.SourceKey.ModifiedSequence, SequenceMassCalc.NormalizeModifiedSequence(nodePep.SourceKey.ModifiedSequence)); if (nodePep.HasExplicitMods) Assert.IsNotNull(nodePep.SourceKey.ExplicitMods); Assert.IsTrue(dictModsToPep.TryGetValue(nodePep.SourceTextId, out nodePepSource)); var sourceKey = new ModifiedSequenceMods(nodePepSource.Peptide.Sequence, nodePepSource.ExplicitMods); Assert.AreEqual(sourceKey.ExplicitMods, nodePep.SourceExplicitMods); } for (int i = 0; i < nodePep.TransitionGroupCount; i++) { var nodeGroup = nodePep.TransitionGroups.ElementAt(i); Assert.AreEqual(true, nodeGroup.IsDecoy); TransitionGroupDocNode nodeGroupSource = null; double shift = SequenceMassCalc.GetPeptideInterval(nodeGroup.TransitionGroup.DecoyMassShift); if (nodePepSource != null && nodeGroup.TransitionGroup.DecoyMassShift.HasValue) { nodeGroupSource = nodePepSource.TransitionGroups.ElementAt(i); Assert.AreEqual(nodeGroupSource.PrecursorMz + shift, nodeGroup.PrecursorMz, SequenceMassCalc.MassTolerance); } for (int j = 0; j < nodeGroup.TransitionCount; j++) { var nodeTran = nodeGroup.Transitions.ElementAt(j); Assert.IsTrue(nodeTran.IsDecoy); if (nodeTran.Transition.IsPrecursor()) { Assert.AreEqual(nodeGroup.TransitionGroup.DecoyMassShift, nodeTran.Transition.DecoyMassShift); if (nodeGroupSource != null) { Assert.AreEqual(nodeGroupSource.Transitions.ElementAt(j).Mz + shift, nodeTran.Mz, SequenceMassCalc.MassTolerance); } } } } } // Check that the resulting document persists correctly by passing the SrmDocument to AssertEx.IsSerializable(). AssertEx.Serializable(decoysDoc); }
public PeptideDocNode ChangeSourceKey(ModifiedSequenceMods prop) { return ChangeProp(ImClone(this), im => im.SourceKey = prop); }
public PeptideDocNode(Peptide id, SrmSettings settings, ExplicitMods mods, ModifiedSequenceMods sourceKey, string standardType, int? rank, ExplicitRetentionTimeInfo explicitRetentionTimeInfo, Annotations annotations, Results<PeptideChromInfo> results, TransitionGroupDocNode[] children, bool autoManageChildren) : base(id, annotations, children, autoManageChildren) { ExplicitMods = mods; SourceKey = sourceKey; GlobalStandardType = standardType; Rank = rank; ExplicitRetentionTime = explicitRetentionTimeInfo; Results = results; BestResult = CalcBestResult(); if (settings != null) { var calcPre = settings.GetPrecursorCalc(IsotopeLabelType.light, ExplicitMods); ModifiedSequence = calcPre.GetModifiedSequence(Peptide.Sequence, false); ModifiedSequenceDisplay = calcPre.GetModifiedSequence(Peptide.Sequence, true); } }
public PeptideDocNode(Peptide id, SrmSettings settings, ExplicitMods mods, ModifiedSequenceMods sourceKey, ExplicitRetentionTimeInfo explicitRetentionTime, TransitionGroupDocNode[] children, bool autoManageChildren) : this(id, settings, mods, sourceKey, null, null, explicitRetentionTime, Annotations.EMPTY, null, children, autoManageChildren) { }