private ModelAndFeatures CreateScoringModel(string modelName, bool decoys, bool secondBest) { _out.WriteLine(Resources.CommandLine_CreateScoringModel_Creating_scoring_model__0_, modelName); try { // Create new scoring model using the default calculators. var scoringModel = new MProphetPeakScoringModel(modelName, null as LinearModelParams, null, decoys, secondBest); var progressMonitor = new CommandProgressMonitor(_out, new ProgressStatus(String.Empty)); var targetDecoyGenerator = new TargetDecoyGenerator(_doc, scoringModel, progressMonitor); // Get scores for target and decoy groups. List<IList<float[]>> targetTransitionGroups; List<IList<float[]>> decoyTransitionGroups; targetDecoyGenerator.GetTransitionGroups(out targetTransitionGroups, out decoyTransitionGroups); // If decoy box is checked and no decoys, throw an error if (decoys && decoyTransitionGroups.Count == 0) { _out.WriteLine(Resources.CommandLine_CreateScoringModel_Error__There_are_no_decoy_peptides_in_the_document__Failed_to_create_scoring_model_); return null; } // Use decoys for training only if decoy box is checked if (!decoys) decoyTransitionGroups = new List<IList<float[]>>(); // Set intial weights based on previous model (with NaN's reset to 0) var initialWeights = new double[scoringModel.PeakFeatureCalculators.Count]; // But then set to NaN the weights that have unknown values for this dataset for (int i = 0; i < initialWeights.Length; ++i) { if (!targetDecoyGenerator.EligibleScores[i]) initialWeights[i] = double.NaN; } var initialParams = new LinearModelParams(initialWeights); // Train the model. scoringModel = (MProphetPeakScoringModel)scoringModel.Train(targetTransitionGroups, decoyTransitionGroups, initialParams, secondBest, true, progressMonitor); Settings.Default.PeakScoringModelList.SetValue(scoringModel); return new ModelAndFeatures(scoringModel, targetDecoyGenerator.PeakGroupFeatures); } catch (Exception x) { _out.WriteLine(Resources.CommandLine_CreateScoringModel_Error__Failed_to_create_scoring_model_); _out.WriteLine(x.Message); return null; } }
public void TestMProphetScoringModel() { var testFilesDir = new TestFilesDir(TestContext, ZIP_FILE); // Test our MProphet implementation against known good results. foreach (var fileWeights in _fileWeights) { // Load transition groups from data file. var filePath = testFilesDir.GetTestPath(fileWeights._fileName); ScoredGroupPeaksSet targetTransitionGroups; ScoredGroupPeaksSet decoyTransitionGroups; LoadData(filePath, out targetTransitionGroups, out decoyTransitionGroups); // Discard half the transition groups that are used for testing. targetTransitionGroups.DiscardHalf(); decoyTransitionGroups.DiscardHalf(); // Calculate weights for peak features. var scoringModel = new MProphetPeakScoringModel("mProphet", fileWeights._weights); // Not L10N scoringModel = (MProphetPeakScoringModel)scoringModel.Train(targetTransitionGroups.ToList(), decoyTransitionGroups.ToList(), new LinearModelParams(fileWeights._weights), false, false); Assert.AreEqual(scoringModel.Parameters.Weights.Count, fileWeights._weights.Length); for (int i = 0; i < scoringModel.Parameters.Weights.Count; i++) Assert.AreEqual(fileWeights._weights[i], scoringModel.Parameters.Weights[i], 1e-6); } }