private Tuple <double, string> GetFragmentScoreAndModifications(int seqIndex, int modIndex, IScorer scorer, double?[][] nodeScore, Tuple <double, string>[][] maxScoreAndMods) { var scoreAndMods = maxScoreAndMods[seqIndex][modIndex]; if (scoreAndMods != null) { return(scoreAndMods); } var node = _graph[seqIndex][modIndex]; var curNodeScore = nodeScore[seqIndex][modIndex] ?? (nodeScore[seqIndex][modIndex] = scorer.GetFragmentScore(GetComplementaryComposition(seqIndex, modIndex), GetComposition(seqIndex, modIndex))); var bestPrevNodeIndex = -1; var bestPrevNodeScore = double.NegativeInfinity; string bestPrevSequence = null; foreach (var prevNodeIndex in node.GetPrevNodeIndices()) { var prevNodeScoreAndSequence = GetFragmentScoreAndModifications(seqIndex - 1, prevNodeIndex, scorer, nodeScore, maxScoreAndMods); var prevNodeScore = prevNodeScoreAndSequence.Item1; if (prevNodeScore > bestPrevNodeScore) { bestPrevNodeIndex = prevNodeIndex; bestPrevNodeScore = prevNodeScore; bestPrevSequence = prevNodeScoreAndSequence.Item2; } } if (bestPrevNodeIndex < 0) // source { return(maxScoreAndMods[seqIndex][modIndex] = new Tuple <double, string>((double)curNodeScore, "")); } var modPos = _index - seqIndex; var aminoAcid = _aminoAcidSequence[seqIndex]; var modAa = aminoAcid as ModifiedAminoAcid; if (modAa != null) { var modificationName = modAa.Modification.Name; if (string.IsNullOrEmpty(bestPrevSequence)) { bestPrevSequence = modificationName + " " + modPos; } else { bestPrevSequence = modificationName + " " + modPos + "," + bestPrevSequence; } } var prevModCombIndex = _graph[seqIndex - 1][bestPrevNodeIndex].ModificationCombinationIndex; var curModCombIndex = node.ModificationCombinationIndex; if (prevModCombIndex != curModCombIndex) // modified { var modificationName = ModificationParams.GetModificationIndexBetween(prevModCombIndex, curModCombIndex).Name; string newModSequence; if (string.IsNullOrEmpty(bestPrevSequence)) { newModSequence = modificationName + " " + modPos; } else { newModSequence = modificationName + " " + modPos + ","; } return(maxScoreAndMods[seqIndex][modIndex] = new Tuple <double, string> ((double)curNodeScore + bestPrevNodeScore, newModSequence + bestPrevSequence)); } return(maxScoreAndMods[seqIndex][modIndex] = new Tuple <double, string> ((double)curNodeScore + bestPrevNodeScore, bestPrevSequence)); }
/// <summary> /// Get the fragment score and modifications /// </summary> /// <param name="seqIndex"></param> /// <param name="modIndex"></param> /// <param name="scorer"></param> /// <param name="nodeScore"></param> /// <param name="maxScoreAndMods"></param> /// <returns></returns> private Tuple <double, LinkedList <ModificationInstance> > GetFragmentScoreAndModifications( int seqIndex, int modIndex, IScorer scorer, IReadOnlyList <double?[]> nodeScore, IReadOnlyList <Tuple <double, LinkedList <ModificationInstance> >[]> maxScoreAndMods) { var scoreAndMods = maxScoreAndMods[seqIndex][modIndex]; if (scoreAndMods != null) { return(scoreAndMods); } var node = _graph[seqIndex][modIndex]; var curNodeScore = nodeScore[seqIndex][modIndex] ?? (nodeScore[seqIndex][modIndex] = _isForward ? scorer.GetFragmentScore(GetComposition(seqIndex, modIndex), GetComplementaryComposition(seqIndex, modIndex)) : scorer.GetFragmentScore(GetComplementaryComposition(seqIndex, modIndex), GetComposition(seqIndex, modIndex)) ); var bestPrevNodeIndex = -1; var bestPrevNodeScore = double.NegativeInfinity; LinkedList <ModificationInstance> bestPrevMods = null; foreach (var prevNodeIndex in node.GetPrevNodeIndices()) { var prevNodeScoreAndSequence = GetFragmentScoreAndModifications(seqIndex - 1, prevNodeIndex, scorer, nodeScore, maxScoreAndMods); var prevNodeScore = prevNodeScoreAndSequence.Item1; if (prevNodeScore > bestPrevNodeScore) { bestPrevNodeIndex = prevNodeIndex; bestPrevNodeScore = prevNodeScore; bestPrevMods = prevNodeScoreAndSequence.Item2; } } if (bestPrevNodeIndex < 0) // source { return(maxScoreAndMods[seqIndex][modIndex] = new Tuple <double, LinkedList <ModificationInstance> >((double)curNodeScore, new LinkedList <ModificationInstance>())); } var modPos = _isForward ? seqIndex : _index - seqIndex; if (modPos <= 1) { --modPos; } var aminoAcid = _aminoAcidSequence[seqIndex]; var modAa = aminoAcid as ModifiedAminoAcid; LinkedList <ModificationInstance> newMods = null; if (modAa != null) { newMods = bestPrevMods == null ? new LinkedList <ModificationInstance>() : new LinkedList <ModificationInstance>(bestPrevMods); var modIns = new ModificationInstance(modAa.Modification, modPos); if (_isForward) { newMods.AddLast(modIns); } else { newMods.AddFirst(modIns); } } var prevModCombIndex = _graph[seqIndex - 1][bestPrevNodeIndex].ModificationCombinationIndex; var curModCombIndex = node.ModificationCombinationIndex; if (prevModCombIndex != curModCombIndex) // modified { if (newMods == null) { newMods = bestPrevMods == null ? new LinkedList <ModificationInstance>() : new LinkedList <ModificationInstance>(bestPrevMods); } var modification = ModificationParams.GetModificationIndexBetween(prevModCombIndex, curModCombIndex); var modIns = new ModificationInstance(modification, modPos); if (_isForward) { newMods.AddLast(modIns); } else { newMods.AddFirst(modIns); } } return(maxScoreAndMods[seqIndex][modIndex] = new Tuple <double, LinkedList <ModificationInstance> > ((double)curNodeScore + bestPrevNodeScore, newMods ?? bestPrevMods)); }