public void Test() { ScoreDistribution s = new ScoreDistribution(); OptimalResultCondition or = new OptimalResultCondition(1, 1, 1, 1); s[or] = new List<OptimalResult>(){ new OptimalResult(1.0, 1.0, 100,10,0.1), new OptimalResult(2.0, 1.0, 200,10,0.05), new OptimalResult(3.0, 1.0, 1000,10,0.01) }; ScoreDistribution subset = new ScoreDistribution(); subset[or] = new List<OptimalResult>(){ new OptimalResult(2.0, 1.0, 100,0,0), new OptimalResult(3.0, 1.0, 900,0,0) }; IFalseDiscoveryRateCalculator calc = new TargetFalseDiscoveryRateCalculator(); double fdr = s.CalculateSubsetFdr(subset, calc); Assert.AreEqual(0.014, fdr); }
public override IEnumerable <string> Process(string optionFile) { var targetDirectory = Path.GetDirectoryName(optionFile); options = new SrmOptions(); options.FromXml(XElement.Load(optionFile)); var keys = options.RawFiles.Keys.ToList(); foreach (var key in keys) { if (string.IsNullOrEmpty(options.RawFiles[key])) { this.options.RawFiles[key] = key; } } List <string> result = new List <string>(); bool ignoreWarning = false; Dictionary <string, List <string> > map = GetGroupMap(); int totalCount = options.RawFiles.Count; int curIndex = 0; foreach (var groupKey in map.Keys) { var mrmFile = GetMrmFileName(targetDirectory, groupKey); SrmPairedResult taskResult = new SrmPairedResult() { Options = this.options }; var files = map[groupKey]; foreach (var rawFile in files) { curIndex++; this.prefix = MyConvert.Format("Processing {0}/{1}", curIndex, totalCount); SetProgressMessage(rawFile); Console.WriteLine(rawFile); if (Progress.IsCancellationPending()) { throw new UserTerminatedException(); } //读取所有scan信息 List <SrmScan> mrmIntensities = GetMRMScans(rawFile); //mrmIntensities.RemoveAll(m => !( Math.Abs(m.PrecursorMz - 767.4) < 0.1 || Math.Abs(m.PrecursorMz - 770.9) < 0.1)); SetProgressMessage("building mrm groups ..."); var mrms = ScanToTransaction(mrmIntensities); //将MRMPeptideItem转换为MRMPairedPeptideItem对象 SrmPairedResult mrmPairs; if (File.Exists(options.DefinitionFile)) { mrmPairs = BuildResultBasedOnDefinedFile(ref ignoreWarning, mrms); } else { mrmPairs = BuildResultBasedOnRealData(mrms); } mrmPairs.Options = this.options; mrmPairs.PeakPicking(); //固定阈值筛选。 var filter = mrmPairs.Options.GetFilter(); mrmPairs.ForEach(m => { m.ProductIonPairs.ForEach(n => n.Enabled = filter.Accept(n)); }); taskResult.AddRange(mrmPairs); } if (options.HasDecoy) { //设置decoy标签 taskResult.AssignDecoy(); //是否有真实的decoy transition var hasDecoy = taskResult.Any(m => m.ProductIonPairs.Any(n => n.IsDecoy)); if (hasDecoy) { //选取所有transition pairs,这些transition pairs有线性回归比值和回归系数 var pairs = (from m in taskResult from n in m.ProductIonPairs where n.IsPaired && n.Enabled orderby n.RegressionCorrelation descending select n).ToList(); //如果有这些pair,那么,那些不成pair的transition全部设置为disabled if (pairs.Count > 0) { taskResult.ForEach(m => m.ProductIonPairs.ForEach(n => n.Enabled = n.Enabled && n.IsPaired)); } //计算每个pair的qvalue TargetFalseDiscoveryRateCalculator calc = new TargetFalseDiscoveryRateCalculator(); var decoyCount = pairs.Count(m => m.IsDecoy); var targetCount = pairs.Count - decoyCount; for (int d = pairs.Count - 1; d >= 0; d--) { pairs[d].Qvalue = calc.Calculate(decoyCount, targetCount); if (pairs[d].IsDecoy) { decoyCount--; } else { targetCount--; } } //找到qvalue小于给定fdr的pair,qvalue大于该pair的全部设置为disable for (int d = pairs.Count - 1; d >= 0; d--) { if (!pairs[d].IsDecoy && pairs[d].Qvalue <= options.TransitionFdr) { for (int d2 = d + 1; d2 < pairs.Count - 1; d2++) { pairs[d2].Enabled = false; } break; } } } } taskResult.ForEach(m => { m.CheckEnabled(this.options.OutlierEvalue, this.options.MinValidTransitionPair); }); taskResult.CalculatePeptideRatio(); taskResult.Sort((m1, m2) => m1.LightPrecursorMZ.CompareTo(m2.LightPrecursorMZ)); new SrmPairedResultXmlFormat().WriteToFile(mrmFile, taskResult); result.Add(mrmFile); } Progress.End(); return(result); }