public void GenerateDecoysTest() { TestFilesDir testFilesDir = new TestFilesDir(TestContext, @"TestA\SimpleDecoys.zip"); string docPath = testFilesDir.GetTestPath("SimpleDecoys.sky"); SrmDocument simpleDecoysDoc = ResultsUtil.DeserializeDocument(docPath); AssertEx.IsDocumentState(simpleDecoysDoc, 0, 1, 18, 18, 56); // First check right number of decoy peptide groups and transtions are generated var refineSettings = new RefinementSettings(); int numDecoys = simpleDecoysDoc.PeptideCount; var decoysDoc = refineSettings.GenerateDecoys(simpleDecoysDoc, numDecoys, DecoyGeneration.ADD_RANDOM); ValidateDecoys(simpleDecoysDoc, decoysDoc, false); // Second call to generate decoys to make sure that it removes the original Decoys group and generates a completely new one. var newDecoysDoc = refineSettings.GenerateDecoys(decoysDoc, numDecoys, DecoyGeneration.ADD_RANDOM); Assert.AreNotEqual(decoysDoc.PeptideGroups.First(nodePeptideGroup => nodePeptideGroup.IsDecoy), newDecoysDoc.PeptideGroups.First(nodePeptideGroup => nodePeptideGroup.IsDecoy)); // MS1 document with precursors and variable modifications, shuffled docPath = testFilesDir.GetTestPath("Ms1FilterTutorial.sky"); SrmDocument variableDecoysDoc = ResultsUtil.DeserializeDocument(docPath); AssertEx.IsDocumentState(variableDecoysDoc, 0, 11, 50, 51, 153); numDecoys = variableDecoysDoc.PeptideCount; var decoysVariableShuffle = refineSettings.GenerateDecoys(variableDecoysDoc, numDecoys, DecoyGeneration.SHUFFLE_SEQUENCE); ValidateDecoys(variableDecoysDoc, decoysVariableShuffle, true); // Document with explicit modifications, reversed SrmDocument docStudy7 = ResultsUtil.DeserializeDocument("Study7.sky", GetType()); AssertEx.IsDocumentState(docStudy7, 0, 7, 11, 22, 66); numDecoys = docStudy7.PeptideCount; var decoysExplicitReverse = refineSettings.GenerateDecoys(docStudy7, numDecoys, DecoyGeneration.REVERSE_SEQUENCE); ValidateDecoys(docStudy7, decoysExplicitReverse, true); // Random mass shifts with precursors (used to throw an exception due to bad range check that assumed product ions only) while (true) { // As this is random we may need to make a few attempts before we get the values we need SrmDocument doc = ResultsUtil.DeserializeDocument(testFilesDir.GetTestPath("precursor_decoy_test.sky")); AssertEx.IsDocumentState(doc, null, 1, 1, 2, 6); numDecoys = 2; var decoysRandom = refineSettings.GenerateDecoys(doc, numDecoys, DecoyGeneration.ADD_RANDOM); // Verify that we successfully set a precursor transition decoy mass outside the allowed range of product transitions if (decoysRandom.PeptideTransitions.Any(x => x.IsDecoy && (x.Transition.DecoyMassShift > Transition.MAX_PRODUCT_DECOY_MASS_SHIFT || x.Transition.DecoyMassShift < Transition.MIN_PRODUCT_DECOY_MASS_SHIFT))) { break; } } }