public PeptideModificationState GetTrueModifications()
        {
            PeptideModificationState result = GetFreshCopy(Length);

            if (NTermModification != ushort.MaxValue && Modification.IsStandardVarMod(NTermModification))
            {
                result.NTermModification = NTermModification;
            }
            if (CTermModification != ushort.MaxValue && Modification.IsStandardVarMod(CTermModification))
            {
                result.CTermModification = CTermModification;
            }
            for (int i = 0; i < Length; i++)
            {
                ushort m = GetModificationAt(i);
                if (m == ushort.MaxValue || !Modification.IsStandardVarMod(m))
                {
                    result.SetModificationAt(i, ushort.MaxValue);
                }
                else
                {
                    result.SetModificationAt(i, GetModificationAt(i));
                }
            }
            return(result);
        }
        public PeptideModificationState GetLabelModifications(ushort[] labelMods, string sequence)
        {
            PeptideModificationState result = GetFreshCopy(Length);

            if (NTermModification != ushort.MaxValue && !Modification.IsStandardVarMod(NTermModification))
            {
                result.NTermModification = NTermModification;
            }
            if (CTermModification != ushort.MaxValue && !Modification.IsStandardVarMod(CTermModification))
            {
                result.CTermModification = CTermModification;
            }
            for (int i = 0; i < Length; i++)
            {
                ushort m = GetModificationAt(i);
                if (m != ushort.MaxValue && !Modification.IsStandardVarMod(m))
                {
                    result.SetModificationAt(i, m);
                }
                else
                {
                    result.SetModificationAt(i, ushort.MaxValue);
                }
            }
            foreach (ushort labelMod in labelMods)
            {
                if (!Modification.IsStandardVarMod(labelMod))
                {
                    Modification mod = Tables.ModificationList[labelMod];
                    if (mod.IsInternal)
                    {
                        for (int j = 0; j < mod.AaCount; j++)
                        {
                            char c = mod.GetAaAt(j);
                            for (int i = 0; i < Length; i++)
                            {
                                if (sequence[i] == c)
                                {
                                    result.SetModificationAt(i, mod.Index);
                                }
                            }
                        }
                    }
                    else
                    {
                        if (mod.IsNterminal)
                        {
                            result.NTermModification = mod.Index;
                        }
                        else
                        {
                            result.CTermModification = mod.Index;
                        }
                    }
                }
            }
            return(result);
        }