private PeptideModificationState[] ApplyVariableModificationFixedNumber(PeptideModificationState peptide, Modification mod, int n, out bool incomplete) { incomplete = false; if (n == 0) { return(new PeptideModificationState[0]); } if (mod.GetPosition() == ModificationPosition.anyNterm) { if (n > 1) { return(new PeptideModificationState[0]); } if (peptide.GetNTermModification() == ushort.MaxValue) { PeptideModificationState q = peptide.Clone(); q.SetNTermModification(mod.Index); return(new PeptideModificationState[] { q }); } return(new PeptideModificationState[0]); } if (mod.GetPosition() == ModificationPosition.anyCterm) { if (n > 1) { return(new PeptideModificationState[0]); } if (peptide.GetCTermModification() == ushort.MaxValue) { PeptideModificationState q = peptide.Clone(); q.SetCTermModification(mod.Index); return(new PeptideModificationState[] { q }); } return(new PeptideModificationState[0]); } if (mod.GetPosition() == ModificationPosition.proteinNterm) { if (n > 1) { return(new PeptideModificationState[0]); } if (peptide.GetNTermModification() == ushort.MaxValue) { PeptideModificationState q = peptide.Clone(); q.SetNTermModification(mod.Index); return(new PeptideModificationState[] { q }); } return(new PeptideModificationState[0]); } if (mod.GetPosition() == ModificationPosition.proteinCterm) { if (n > 1) { return(new PeptideModificationState[0]); } if (peptide.GetCTermModification() == ushort.MaxValue) { PeptideModificationState q = peptide.Clone(); q.SetCTermModification(mod.Index); return(new PeptideModificationState[] { q }); } return(new PeptideModificationState[0]); } string s = Sequence; switch (mod.GetTermType(0)) { case ModificationSiteType.aa: { HashSet <int> ind = new HashSet <int>(); for (int j = 0; j < s.Length; j++) { for (int i = 0; i < mod.AaCount; i++) { if (s[j] == mod.GetAaAt(i) && peptide.GetModificationAt(j) == ushort.MaxValue) { ind.Add(j); } } } int[] indices = ind.ToArray(); if (indices.Length < n) { return(new PeptideModificationState[0]); } List <PeptideModificationState> result = new List <PeptideModificationState>(); bool incompl; int[][] comb = NumUtil.GetCombinations(indices.Length, n, 10000, out incompl); if (incompl) { incomplete = incompl; } for (int j = 0; j < comb.Length; j++) { int[] iind = ArrayUtil.SubArray(indices, comb[j]); PeptideModificationState q = peptide.Clone(); for (int k = 0; k < iind.Length; k++) { q.SetModificationAt(iind[k], mod.Index); } result.Add(q); } return(result.ToArray()); } case ModificationSiteType.nterm: { if (n > 1) { return(new PeptideModificationState[0]); } for (int i = 0; i < mod.AaCount; i++) { List <PeptideModificationState> toBeAdded = new List <PeptideModificationState>(); if (s[0] == mod.GetAaAt(i) && peptide.GetNTermModification() == ushort.MaxValue) { PeptideModificationState q = peptide.Clone(); q.SetNTermModification(mod.Index); toBeAdded.Add(q); } if (toBeAdded.Count > 0) { return(toBeAdded.ToArray()); } } return(new PeptideModificationState[0]); } case ModificationSiteType.cterm: { if (n > 1) { return(new PeptideModificationState[0]); } for (int i = 0; i < mod.AaCount; i++) { List <PeptideModificationState> toBeAdded = new List <PeptideModificationState>(); if (s[s.Length - 1] == mod.GetAaAt(i) && peptide.GetCTermModification() == ushort.MaxValue) { PeptideModificationState q = peptide.Clone(); q.SetCTermModification(mod.Index); toBeAdded.Add(q); } if (toBeAdded.Count > 0) { return(toBeAdded.ToArray()); } } return(new PeptideModificationState[0]); } } throw new Exception("Never get here."); }