Esempio n. 1
0
        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.");
        }