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);
    }
Example #2
0
        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);
        }