private IEnumerable <FlankingMassMatch> GetBackwardMatches( MatchedTag matchedTag, ShiftedSequenceGraph backwardGraph, double?featureMass = null ) { for (var j = matchedTag.StartIndex - 1; j >= -1; j--) { var residue = j >= 0 ? _proteinSequence[j] : AminoAcid.ProteinNTerm.Residue; var location = j > 0 ? SequenceLocation.Everywhere : SequenceLocation.ProteinNTerm; if (!backwardGraph.AddAminoAcid(residue, location)) { yield break; } if (j == 0) { continue; } var backwardMatch = GetBestMatchInTheGraph(backwardGraph, _spec, featureMass); if (backwardMatch != null) { backwardMatch.Index = Math.Max(j, 0); yield return(backwardMatch); } } }
// private readonly int _minProductIonCharge; // private readonly int _maxProductIonCharge; private IEnumerable <FlankingMassMatch> GetForwardMatches( MatchedTag matchedTag, ShiftedSequenceGraph forwardGraph, double?featureMass = null ) { for (var i = matchedTag.EndIndex; i <= _proteinSequence.Length; i++) { var residue = i < _proteinSequence.Length ? _proteinSequence[i] : AminoAcid.ProteinCTerm.Residue; var location = i < _proteinSequence.Length - 1 ? SequenceLocation.Everywhere : SequenceLocation.ProteinCTerm; if (!forwardGraph.AddAminoAcid(residue, location)) { yield break; } if (i == _proteinSequence.Length - 1) { continue; } var forwardMatch = GetBestMatchInTheGraph(forwardGraph, _spec, featureMass); if (forwardMatch != null) { forwardMatch.Index = Math.Min(i + 1, _proteinSequence.Length); yield return(forwardMatch); } } }
private IEnumerable <TagMatch> FindMatchesWithFeatureMass(MatchedTag matchedTag) { if (matchedTag.NTermFlankingMass == null || matchedTag.CTermFlankingMass == null) { yield break; } var featureMass = (double)matchedTag.NTermFlankingMass + matchedTag.Mass + (double)matchedTag.CTermFlankingMass + Composition.H2O.Mass; var shiftMass = matchedTag.Mass + (double)matchedTag.NTermFlankingMass; var backwardGraph = new ShiftedSequenceGraph(_aaSet, shiftMass, false, matchedTag.StartIndex, featureMass - MinSumModificationMasses); foreach (var backwardMatch in GetBackwardMatches(matchedTag, backwardGraph, featureMass)) { // Make a forward graph var nTermShiftMass = backwardMatch.Mass + matchedTag.Mass; var forwardGraph = new ShiftedSequenceGraph(_aaSet, nTermShiftMass, true, _proteinSequence.Length - matchedTag.EndIndex, featureMass - MinSumModificationMasses); foreach ( var forwardMatch in GetForwardMatches(matchedTag, forwardGraph, featureMass)) { var mass = forwardMatch.Mass + matchedTag.Mass + backwardMatch.Mass; if (mass > _maxSequenceMass) { continue; } var offset = matchedTag.EndIndex - backwardMatch.Index - 1; var modStr = string.Join(",", backwardMatch.Modifications.Concat(forwardMatch.Modifications.Select(m => m.GetModificationInstanceWithOffset(offset)))); var modList = new List <Modification>(); foreach (var mod in backwardMatch.Modifications) { modList.Add(mod.Modification); } foreach (var mod in forwardMatch.Modifications) { modList.Add(mod.Modification); } var tagMatch = new TagMatch( backwardMatch.Index, forwardMatch.Index, matchedTag.Length, backwardMatch.Charge, backwardMatch.Score, forwardMatch.Score, mass, new ModificationCombination(modList), modStr); yield return(tagMatch); } } }
private FlankingMassMatch GetBestMatchInTheGraph(ShiftedSequenceGraph seqGraph, ProductSpectrum spec, double?featureMass) { FlankingMassMatch match = null; var bestScore = double.NegativeInfinity; var protCompositions = seqGraph.GetSequenceCompositions(); for (var modIndex = 0; modIndex < protCompositions.Length; modIndex++) { seqGraph.SetSink(modIndex); var protCompositionWithH2O = seqGraph.GetSinkSequenceCompositionWithH2O(); var sequenceMass = protCompositionWithH2O.Mass; if (featureMass != null && !_tolerance.IsWithin(sequenceMass, (double)featureMass)) { continue; } var charge = (int) Math.Round(sequenceMass / (spec.IsolationWindow.IsolationWindowTargetMz - Constants.Proton)); var mostAbundantIsotopeMz = Ion.GetIsotopeMz(sequenceMass, charge, Averagine.GetIsotopomerEnvelope(sequenceMass).MostAbundantIsotopeIndex); if (!spec.IsolationWindow.Contains(mostAbundantIsotopeMz)) { continue; } //var feature = new TargetFeature(sequenceMass, charge, spec.ScanNum); if (_featureFinder != null) { var ms1Corr = _featureFinder.GetMs1EvidenceScore(spec.ScanNum, sequenceMass, charge); if (ms1Corr < Ms1CorrThreshold) { continue; } } var curScoreAndModifications = seqGraph.GetScoreAndModifications(_ms2Scorer); var curScore = curScoreAndModifications.Item1; // var curScore = seqGraph.GetFragmentScore(_ms2Scorer); if (curScore > bestScore) { match = new FlankingMassMatch(curScore, sequenceMass - Composition.H2O.Mass - seqGraph.ShiftMass, charge, curScoreAndModifications.Item2); //match = new FlankingMassMatch(curScore, // sequenceMass - Composition.H2O.Mass - seqGraph.ShiftMass, charge, new ModificationInstance[0]); bestScore = curScore; } } return(match); }