public static ModifiedSequence GetFragmentSequence(ModifiedSequence modifiedSequence, IonType ionType, int ordinal) { string unmodifiedSequence = modifiedSequence.GetUnmodifiedSequence(); switch (ionType) { case IonType.a: case IonType.b: case IonType.c: return(new ModifiedSequence(unmodifiedSequence.Substring(0, ordinal), modifiedSequence.GetModifications().Where(mod => mod.IndexAA < ordinal), MassType.Monoisotopic)); } int offset = unmodifiedSequence.Length - ordinal; string fragmentSequence = unmodifiedSequence.Substring(offset); var newModifications = modifiedSequence.GetModifications() .Where(mod => mod.IndexAA >= offset) .Select(mod => mod.ChangeIndexAa(mod.IndexAA - offset)); return(new ModifiedSequence(fragmentSequence, newModifications, MassType.Monoisotopic)); }
private static Molecule GetSequenceFormula(ModifiedSequence modifiedSequence, MassType massType, out double unexplainedMassShift) { unexplainedMassShift = 0; var molecule = new Dictionary <string, int>(); string unmodifiedSequence = modifiedSequence.GetUnmodifiedSequence(); var modifications = modifiedSequence.GetModifications().ToLookup(mod => mod.IndexAA); for (int i = 0; i < unmodifiedSequence.Length; i++) { char aminoAcid = unmodifiedSequence[i]; AddAminoAcidFormula(massType, aminoAcid, molecule, ref unexplainedMassShift); foreach (var mod in modifications[i]) { string formula = mod.Formula; if (formula == null) { var staticMod = mod.StaticMod; var aa = unmodifiedSequence[i]; if ((staticMod.LabelAtoms & LabelAtoms.LabelsAA) != LabelAtoms.None && AminoAcid.IsAA(aa)) { formula = SequenceMassCalc.GetHeavyFormula(aa, staticMod.LabelAtoms); } } if (formula != null) { var modFormula = Molecule.ParseExpression(formula); Add(molecule, modFormula); } else { unexplainedMassShift += massType.IsMonoisotopic() ? mod.MonoisotopicMass : mod.AverageMass; } } } return(Molecule.FromDict(molecule)); }