示例#1
0
        public void ProteinListTest()
        {
            // Too few columns
            const char sep = TextUtil.SEPARATOR_TSV;

            AssertEx.ThrowsException <LineColNumberedIoException>(() =>
                                                                  FastaImporter.ToFasta("PROT1\nPROT2\nPROT2", sep));
            // Invalid sequence
            string invalidSeq = PROTEINLIST_CLIPBOARD_TEXT.Replace("MDAL", "***");

            AssertEx.ThrowsException <LineColNumberedIoException>(() =>
                                                                  FastaImporter.ToFasta(invalidSeq, sep));

            string fastaText = FastaImporter.ToFasta(PROTEINLIST_CLIPBOARD_TEXT, sep);
            var    reader    = new StringReader(fastaText);
            int    countProt = 0;
            string line;

            while ((line = reader.ReadLine()) != null)
            {
                if (line.StartsWith(">"))
                {
                    countProt++;
                }
                else
                {
                    Assert.IsTrue(FastaSequence.IsExSequence(line.Trim('*')));
                }
            }
            Assert.AreEqual(3, countProt);
        }
示例#2
0
        public static bool ValidateRow(object[] columns, IWin32Window parent, int lineNumber, bool postiveTime)
        {
            if (columns.Length != 2)
            {
                MessageDlg.Show(parent, string.Format(Resources.PeptideGridViewDriver_ValidateRow_The_pasted_text_must_have_two_columns_));
                return(false);
            }

            string seq     = columns[COLUMN_SEQUENCE] as string;
            string time    = columns[COLUMN_TIME] as string;
            string message = null;

            if (string.IsNullOrWhiteSpace(seq))
            {
                message = string.Format(Resources.PeptideGridViewDriver_ValidateRow_Missing_peptide_sequence_on_line__0_, lineNumber);
            }
            else if (!FastaSequence.IsExSequence(seq))
            {
                message = string.Format(Resources.PeptideGridViewDriver_ValidateRow_The_text__0__is_not_a_valid_peptide_sequence_on_line__1_, seq, lineNumber);
            }
            else
            {
                try
                {
                    columns[COLUMN_SEQUENCE] = SequenceMassCalc.NormalizeModifiedSequence(seq);
                }
                catch (Exception x)
                {
                    message = x.Message;
                }

                if (message == null)
                {
                    double dTime;
                    if (string.IsNullOrWhiteSpace(time))
                    {
                        message = string.Format(Resources.PeptideGridViewDriver_ValidateRow_Missing_value_on_line__0_, lineNumber);
                    }
                    else if (!double.TryParse(time, out dTime))
                    {
                        message = string.Format(Resources.PeptideGridViewDriver_ValidateRow_Invalid_decimal_number_format__0__on_line__1_, time, lineNumber);
                    }
                    else if (postiveTime && dTime <= 0)
                    {
                        message = string.Format(Resources.PeptideGridViewDriver_ValidateRow_The_time__0__must_be_greater_than_zero_on_line__1_, time, lineNumber);
                    }
                    else
                    {
                        return(true);
                    }
                }
            }

            MessageDlg.Show(parent, message);
            return(false);
        }
 public static string ValidateSequence(string sequence)
 {
     if (sequence == null)
     {
         return(Resources.ValidatingIonMobilityPeptide_ValidateSequence_A_modified_peptide_sequence_is_required_for_each_entry_);
     }
     if (!FastaSequence.IsExSequence(sequence))
     {
         return(string.Format(Resources.ValidatingIonMobilityPeptide_ValidateSequence_The_sequence__0__is_not_a_valid_modified_peptide_sequence_, sequence));
     }
     return(null);
 }
示例#4
0
 public static string ValidateSequence(Target sequence)
 {
     if (sequence.IsEmpty || !sequence.IsProteomic)
     {
         return(Resources.MeasuredPeptide_ValidateSequence_A_modified_peptide_sequence_is_required_for_each_entry);
     }
     if (!FastaSequence.IsExSequence(sequence.Sequence))
     {
         return(string.Format(Resources.MeasuredPeptide_ValidateSequence_The_sequence__0__is_not_a_valid_modified_peptide_sequence, sequence));
     }
     return(null);
 }
示例#5
0
            public static string ValidateSequence(string sequenceText)
            {
                if (string.IsNullOrWhiteSpace(sequenceText))
                {
                    return(Resources.LibraryGridViewDriver_ValidateSequence_Sequence_cannot_be_empty_);
                }
                if (!FastaSequence.IsExSequence(Transition.StripChargeIndicators(sequenceText, TransitionGroup.MIN_PRECURSOR_CHARGE, TransitionGroup.MAX_PRECURSOR_CHARGE)))
                {
                    return(string.Format(Resources.EditOptimizationLibraryDlg_ValidateOptimizationList_The_value__0__is_not_a_valid_modified_peptide_sequence_, sequenceText));
                }

                return(null);
            }
 private bool ValidatePeptideList(IEnumerable <ValidatingIonMobilityPeptide> peptideList, string tableName)
 {
     foreach (ValidatingIonMobilityPeptide peptide in peptideList)
     {
         string seqModified = peptide.PeptideModSeq;
         // CONSIDER: Select the peptide row
         if (!FastaSequence.IsExSequence(seqModified))
         {
             MessageDlg.Show(this, string.Format(Resources.EditIonMobilityLibraryDlg_ValidatePeptideList_The_value__0__is_not_a_valid_modified_peptide_sequence_,
                                                 seqModified));
             return(false);
         }
     }
     return(true);
 }
        public static string ValidateMeasuredDriftTimeCellValues(string[] values)
        {
            int    tempInt;
            double tempDouble;

            if (values.Count() < 3)
            {
                return(Resources.MeasuredDriftTimeTable_ValidateMeasuredDriftTimeCellValues_The_pasted_text_must_have_three_columns_);
            }

            // Parse sequence
            var sequence = values[EditDriftTimePredictorDlg.COLUMN_SEQUENCE];

            if (string.IsNullOrEmpty(sequence))
            {
                return(Resources.MeasuredDriftTimeTable_ValidateMeasuredDriftTimeCellValues_A_modified_peptide_sequence_is_required_for_each_entry_);
            }

            if (!FastaSequence.IsExSequence(sequence))
            {
                return(string.Format(Resources.MeasuredDriftTimeTable_ValidateMeasuredDriftTimeCellValues_The_sequence__0__is_not_a_valid_modified_peptide_sequence_, sequence));
            }

            try
            {
                values[EditDriftTimePredictorDlg.COLUMN_SEQUENCE] = SequenceMassCalc.NormalizeModifiedSequence(sequence);
            }
            catch (Exception x)
            {
                return(x.Message);
            }

            // Parse charge
            if ((!int.TryParse(values[EditDriftTimePredictorDlg.COLUMN_CHARGE].Trim(), out tempInt)) || ValidateCharge(tempInt) != null)
            {
                return(string.Format(Resources.EditDriftTimePredictorDlg_ValidateCharge_The_entry__0__is_not_a_valid_charge__Precursor_charges_must_be_integer_values_between_1_and__1__,
                                     values[EditDriftTimePredictorDlg.COLUMN_CHARGE].Trim(), TransitionGroup.MAX_PRECURSOR_CHARGE));
            }

            // Parse drift time
            if (!double.TryParse(values[EditDriftTimePredictorDlg.COLUMN_DRIFT_TIME_MSEC].Trim(), out tempDouble))
            {
                return(string.Format(Resources.MeasuredDriftTimeTable_ValidateMeasuredDriftTimeCellValues_The_value__0__is_not_a_valid_drift_time_, values[EditDriftTimePredictorDlg.COLUMN_DRIFT_TIME_MSEC].Trim()));
            }

            return(null);
        }
示例#8
0
        private void VerifyReportFile(string fileName, int rowCount, IList <string> columnNames, bool invariantFormat = false)
        {
            var formatProvider = invariantFormat ? CultureInfo.InvariantCulture : CultureInfo.CurrentCulture;

            string[] lines = File.ReadAllLines(fileName);
            Assert.AreEqual(rowCount, lines.Length - 1);
            string[] columnHeaderNames = lines[0].ParseCsvFields();
            Assert.IsTrue(ArrayUtil.EqualsDeep(columnNames, columnHeaderNames));

            for (int i = 1; i < lines.Length; i++)
            {
                string[] values = lines[i].ParseCsvFields();
                for (int j = 0; j < columnHeaderNames.Length; j++)
                {
                    string columnName = columnNames[j];
                    string value      = values[j];

                    if (columnName.Equals("PeptideSequence"))
                    {
                        Assert.IsTrue(FastaSequence.IsExSequence(value) || (TestSmallMolecules && value.StartsWith("zzz")));
                    }
                    else if (columnName.StartsWith("Cv"))
                    {
                        Assert.IsTrue(TestSmallMolecules || invariantFormat || value.EndsWith("%"));
                        Assert.IsTrue(TestSmallMolecules || double.Parse(value.Substring(0, value.Length - 1), NumberStyles.Float, formatProvider) > 0);
                    }
                    else if (!columnName.Equals("ProteinName"))
                    {
                        double valueParsed;
                        if (!double.TryParse(value, NumberStyles.Float, formatProvider, out valueParsed))
                        {
                            if (!(TestSmallMolecules && value == TextUtil.EXCEL_NA))
                            {
                                Assert.Fail("Failed parsing {0} as a double", value);
                            }
                        }
                        else
                        {
                            Assert.IsTrue(valueParsed > 0);
                        }
                    }
                }
            }
        }
示例#9
0
        public static CrosslinkLibraryKey ParseCrosslinkLibraryKey(string str, int charge)
        {
            List <PeptideLibraryKey>             peptideSequences = new List <PeptideLibraryKey>();
            List <CrosslinkLibraryKey.Crosslink> crosslinks       = new List <CrosslinkLibraryKey.Crosslink>();
            bool inCrosslinkers = false;
            int  ich            = 0;

            foreach (var token in Tokenize(str))
            {
                if (token.StartsWith(@"[") && token.EndsWith(@"]"))
                {
                    inCrosslinkers = true;
                }

                if (inCrosslinkers)
                {
                    crosslinks.Add(ParseCrosslink(token, ich));
                }
                else
                {
                    string sequence = token;
                    if (sequence.EndsWith(@"-"))
                    {
                        sequence = sequence.Substring(sequence.Length - 1);
                    }

                    if (!FastaSequence.IsExSequence(sequence))
                    {
                        throw CommonException.Create(new ParseExceptionDetail(Resources.CrosslinkSequenceParser_ParseCrosslinkLibraryKey_Invalid_peptide_sequence, ich));
                    }
                    peptideSequences.Add(new PeptideLibraryKey(sequence, 0));
                }

                ich += token.Length;
            }
            return(new CrosslinkLibraryKey(peptideSequences, crosslinks, charge));
        }
示例#10
0
        private bool TryMakePeptide(out Peptide peptide)
        {
            peptide = null;
            if (cbxLooplink.Checked)
            {
                return(true);
            }
            var messageBoxHelper = new MessageBoxHelper(this);
            var peptideSequence  = tbxPeptideSequence.Text.Trim();

            if (string.IsNullOrEmpty(peptideSequence))
            {
                messageBoxHelper.ShowTextBoxError(tbxPeptideSequence, Resources.PasteDlg_ListPeptideSequences_The_peptide_sequence_cannot_be_blank);
                return(false);
            }
            if (!FastaSequence.IsExSequence(peptideSequence))
            {
                messageBoxHelper.ShowTextBoxError(tbxPeptideSequence, Resources.PasteDlg_ListPeptideSequences_This_peptide_sequence_contains_invalid_characters);
                return(false);
            }

            peptide = new Peptide(peptideSequence);
            return(true);
        }
示例#11
0
        public void OkDialog()
        {
            var reader           = new StringReader(PeptidesText);
            var invalidLines     = new List <string>();
            var notFoundLines    = new List <string>();
            var acceptedPeptides = new List <LibraryKey>();
            var peptideSequences = GetPeptideSequences();

            string line;

            while ((line = reader.ReadLine()) != null)
            {
                line = line.Trim();
                if (string.IsNullOrEmpty(line))
                {
                    continue;
                }
                int foundAt;
                var charge = Transition.GetChargeFromIndicator(line,
                                                               TransitionGroup.MIN_PRECURSOR_CHARGE, TransitionGroup.MAX_PRECURSOR_CHARGE, out foundAt);
                if (!charge.IsEmpty)
                {
                    line = line.Substring(0, foundAt);
                }
                Target target;
                try
                {
                    // CONSIDER(bspratt) small molecule equivalent?
                    if (!FastaSequence.IsExSequence(line))
                    {
                        invalidLines.Add(line);
                        continue;
                    }
                    line   = SequenceMassCalc.NormalizeModifiedSequence(line);
                    target = new Target(line);
                }
                catch (Exception)
                {
                    invalidLines.Add(line);
                    continue;
                }

                if (!peptideSequences.ContainsKey(target))
                {
                    notFoundLines.Add(line);
                }
                else
                {
                    acceptedPeptides.Add(new LibKey(target, charge).LibraryKey);
                }
            }

            if (invalidLines.Count > 0)
            {
                if (invalidLines.Count == 1)
                {
                    MessageDlg.Show(this, string.Format(Resources.RefineListDlg_OkDialog_The_sequence__0__is_not_a_valid_peptide, invalidLines[0]));
                }
                else
                {
                    MessageDlg.Show(this, TextUtil.LineSeparate(Resources.RefineListDlg_OkDialog_The_following_sequences_are_not_valid_peptides, string.Empty, TextUtil.LineSeparate(invalidLines)));
                }
                return;
            }
            if (acceptedPeptides.Count == 0)
            {
                MessageDlg.Show(this, Resources.RefineListDlg_OkDialog_None_of_the_specified_peptides_are_in_the_document);
                return;
            }
            if (notFoundLines.Count > 0)
            {
                string message;
                if (notFoundLines.Count == 1)
                {
                    message = string.Format(Resources.RefineListDlg_OkDialog_The_peptide__0__is_not_in_the_document_Do_you_want_to_continue, notFoundLines[0]);
                }
                else if (notFoundLines.Count < 15)
                {
                    message = TextUtil.LineSeparate(Resources.RefineListDlg_OkDialog_The_following_peptides_are_not_in_the_document, string.Empty,
                                                    TextUtil.LineSeparate(notFoundLines), string.Empty,
                                                    Resources.RefineListDlg_OkDialog_Do_you_want_to_continue);
                }
                else
                {
                    message = string.Format(Resources.RefineListDlg_OkDialog_Of_the_specified__0__peptides__1__are_not_in_the_document_Do_you_want_to_continue,
                                            notFoundLines.Count + acceptedPeptides.Count, notFoundLines.Count);
                }
                if (MultiButtonMsgDlg.Show(this, message, MultiButtonMsgDlg.BUTTON_OK) != DialogResult.OK)
                {
                    return;
                }
            }

            AcceptedPeptides = acceptedPeptides.ToArray();
            DialogResult     = DialogResult.OK;
        }
示例#12
0
        public static string ValidateMeasuredDriftTimeCellValues(string[] values)
        {
            Adduct tempAdduct;
            double tempDouble;

            if (values.Length < 3)
            {
                return(Resources.MeasuredDriftTimeTable_ValidateMeasuredDriftTimeCellValues_The_pasted_text_must_have_three_columns_);
            }

            // Parse sequence
            var sequence = values[EditDriftTimePredictorDlg.COLUMN_SEQUENCE];

            if (string.IsNullOrEmpty(sequence))
            {
                return(Resources.MeasuredDriftTimeTable_ValidateMeasuredDriftTimeCellValues_A_modified_peptide_sequence_is_required_for_each_entry_);
            }

            if (!FastaSequence.IsExSequence(sequence))
            {
                return(string.Format(Resources.MeasuredDriftTimeTable_ValidateMeasuredDriftTimeCellValues_The_sequence__0__is_not_a_valid_modified_peptide_sequence_, sequence));
            }

            try
            {
                values[EditDriftTimePredictorDlg.COLUMN_SEQUENCE] = SequenceMassCalc.NormalizeModifiedSequence(sequence);
            }
            catch (Exception x)
            {
                return(x.Message);
            }

            // Parse charge
            if ((!Adduct.TryParse(values[EditDriftTimePredictorDlg.COLUMN_CHARGE].Trim(), out tempAdduct)) || ValidateCharge(tempAdduct) != null)
            {
                return(string.Format(Resources.EditDriftTimePredictorDlg_ValidateCharge_The_entry__0__is_not_a_valid_charge__Precursor_charges_must_be_integer_values_between_1_and__1__,
                                     values[EditDriftTimePredictorDlg.COLUMN_CHARGE].Trim(), TransitionGroup.MAX_PRECURSOR_CHARGE));
            }

            // Parse drift time
            if (!double.TryParse(values[EditDriftTimePredictorDlg.COLUMN_ION_MOBILITY].Trim(), out tempDouble))
            {
                return(string.Format(Resources.MeasuredDriftTimeTable_ValidateMeasuredDriftTimeCellValues_The_value__0__is_not_a_valid_drift_time_, values[EditDriftTimePredictorDlg.COLUMN_ION_MOBILITY].Trim()));
            }

            if (values.Length > EditDriftTimePredictorDlg.COLUMN_CCS)
            {
                // Parse CCS, if any
                if (!string.IsNullOrEmpty(values[EditDriftTimePredictorDlg.COLUMN_CCS]) &&
                    !double.TryParse(values[EditDriftTimePredictorDlg.COLUMN_CCS].Trim(), out tempDouble))
                {
                    return(string.Format(Resources.MeasuredDriftTimeTable_ValidateMeasuredDriftTimeCellValues_The_value__0__is_not_a_valid_collisional_cross_section_, values[EditDriftTimePredictorDlg.COLUMN_CCS].Trim()));
                }
            }
            if (values.Length > EditDriftTimePredictorDlg.COLUMN_HIGH_ENERGY_OFFSET)
            {
                // Parse high energy offset, if any
                if (!string.IsNullOrEmpty(values[EditDriftTimePredictorDlg.COLUMN_HIGH_ENERGY_OFFSET]) &&
                    !double.TryParse(values[EditDriftTimePredictorDlg.COLUMN_HIGH_ENERGY_OFFSET].Trim(), out tempDouble))
                {
                    return(string.Format(Resources.MeasuredDriftTimeTable_ValidateMeasuredDriftTimeCellValues_The_value__0__is_not_a_valid_high_energy_offset_, values[EditDriftTimePredictorDlg.COLUMN_HIGH_ENERGY_OFFSET].Trim()));
                }
            }
            return(null);
        }
        public static string ValidateRow(object[] columns, int lineNumber)
        {
            if (columns.Length < 2)
            {
                return(Resources.CollisionalCrossSectionGridViewDriverBase_ValidateRow_The_pasted_text_must_have_at_least_two_columns_);
            }
            string seq = columns[EditIonMobilityLibraryDlg.COLUMN_SEQUENCE] as string;
            string collisionalcrosssection   = columns[EditIonMobilityLibraryDlg.COLUMN_COLLISIONAL_CROSS_SECTION] as string;
            string highenergydrifttimeoffset = (columns.Length > 2) ? columns[EditIonMobilityLibraryDlg.COLUMN_HIGH_ENERGY_DRIFT_TIME_OFFSET_MSEC] as string : string.Empty;
            string message = null;

            if (string.IsNullOrWhiteSpace(seq))
            {
                message = string.Format(Resources.CollisionalCrossSectionGridViewDriverBase_ValidateRow_Missing_peptide_sequence_on_line__0__, lineNumber);
            }
            else if (!FastaSequence.IsExSequence(seq))
            {
                message = string.Format(Resources.CollisionalCrossSectionGridViewDriverBase_ValidateRow_The_text__0__is_not_a_valid_peptide_sequence_on_line__1__, seq, lineNumber);
            }
            else
            {
                try
                {
                    columns[EditIonMobilityLibraryDlg.COLUMN_SEQUENCE] = SequenceMassCalc.NormalizeModifiedSequence(seq);
                }
                catch (Exception x)
                {
                    message = x.Message;
                }

                if (message == null)
                {
                    double dCollisionalCrossSection;
                    if (string.IsNullOrWhiteSpace(collisionalcrosssection))
                    {
                        message = string.Format(Resources.CollisionalCrossSectionGridViewDriverBase_ValidateRow_Missing_collisional_cross_section_value_on_line__0__, lineNumber);
                    }
                    else if (!double.TryParse(collisionalcrosssection, out dCollisionalCrossSection))
                    {
                        message = string.Format(Resources.CollisionalCrossSectionGridViewDriverBase_ValidateRow_Invalid_number_format__0__for_collisional_cross_section_on_line__1__,
                                                collisionalcrosssection,
                                                lineNumber);
                    }
                    else if (dCollisionalCrossSection <= 0)
                    {
                        message =
                            string.Format(Resources.CollisionalCrossSectionGridViewDriverBase_ValidateRow_The_collisional_cross_section__0__must_be_greater_than_zero_on_line__1__,
                                          dCollisionalCrossSection,
                                          lineNumber);
                    }
                }
                if (message == null)
                {
                    double dHighEnergyDriftTimeOffsetMsec;
                    if (!string.IsNullOrWhiteSpace(highenergydrifttimeoffset) && !double.TryParse(highenergydrifttimeoffset, out dHighEnergyDriftTimeOffsetMsec))
                    {
                        message = string.Format(Resources.CollisionalCrossSectionGridViewDriverBase_ValidateRow_Invalid_number_format__0__for_high_energy_drift_time_offset_on_line__1__,
                                                highenergydrifttimeoffset,
                                                lineNumber);
                    }
                }
            }
            return(message);
        }
示例#14
0
        private static void ValidateDecoys(SrmDocument document, SrmDocument decoysDoc, bool modifiesSequences)
        {
            AssertEx.IsDocumentState(decoysDoc, 1, document.PeptideGroupCount + 1, document.PeptideCount * 2,
                                     document.PeptideTransitionGroupCount * 2, document.PeptideTransitionCount * 2);

            // Check for the existence of the Decoys peptide group and that everything under it is marked as a decoy.
            var nodePeptideGroupDecoy = decoysDoc.PeptideGroups.Single(nodePeptideGroup => nodePeptideGroup.IsDecoy);
            var dictModsToPep         = document.Peptides.ToDictionary(nodePep => nodePep.ModifiedSequence);

            foreach (var nodePep in nodePeptideGroupDecoy.Peptides)
            {
                Assert.AreEqual(true, nodePep.IsDecoy);
                PeptideDocNode nodePepSource = null;
                if (!modifiesSequences)
                {
                    Assert.IsNull(nodePep.SourceKey);
                }
                else
                {
                    Assert.IsNotNull(nodePep.SourceKey, string.Format("Source key for {0}{1} is null", nodePep.ModifiedSequence,
                                                                      nodePep.IsDecoy ? " - decoy" : string.Empty));
                    Assert.IsTrue(FastaSequence.IsExSequence(nodePep.SourceKey.Sequence));
                    Assert.AreEqual(nodePep.SourceKey.ModifiedSequence,
                                    SequenceMassCalc.NormalizeModifiedSequence(nodePep.SourceKey.ModifiedSequence));
                    if (nodePep.HasExplicitMods)
                    {
                        Assert.IsNotNull(nodePep.SourceKey.ExplicitMods);
                    }
                    Assert.IsTrue(dictModsToPep.TryGetValue(nodePep.SourceTextId, out nodePepSource));
                    var sourceKey = new ModifiedSequenceMods(nodePepSource.Peptide.Sequence, nodePepSource.ExplicitMods);
                    Assert.AreEqual(sourceKey.ExplicitMods, nodePep.SourceExplicitMods);
                }
                for (int i = 0; i < nodePep.TransitionGroupCount; i++)
                {
                    var nodeGroup = nodePep.TransitionGroups.ElementAt(i);
                    Assert.AreEqual(true, nodeGroup.IsDecoy);
                    TransitionGroupDocNode nodeGroupSource = null;
                    double shift = SequenceMassCalc.GetPeptideInterval(nodeGroup.TransitionGroup.DecoyMassShift);
                    if (nodePepSource != null && nodeGroup.TransitionGroup.DecoyMassShift.HasValue)
                    {
                        nodeGroupSource = nodePepSource.TransitionGroups.ElementAt(i);
                        Assert.AreEqual(nodeGroupSource.PrecursorMz + shift, nodeGroup.PrecursorMz, SequenceMassCalc.MassTolerance);
                    }
                    for (int j = 0; j < nodeGroup.TransitionCount; j++)
                    {
                        var nodeTran = nodeGroup.Transitions.ElementAt(j);
                        Assert.IsTrue(nodeTran.IsDecoy);
                        if (nodeTran.Transition.IsPrecursor())
                        {
                            Assert.AreEqual(nodeGroup.TransitionGroup.DecoyMassShift, nodeTran.Transition.DecoyMassShift);
                            if (nodeGroupSource != null)
                            {
                                Assert.AreEqual(nodeGroupSource.Transitions.ElementAt(j).Mz + shift, nodeTran.Mz, SequenceMassCalc.MassTolerance);
                            }
                        }
                    }
                }
            }

            // Check that the resulting document persists correctly by passing the SrmDocument to AssertEx.IsSerializable().
            AssertEx.Serializable(decoysDoc);
        }