Ejemplo n.º 1
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);
        }
Ejemplo n.º 2
0
        private SrmPairedResult BuildResultBasedOnRealData(List <SrmTransition> mrms)
        {
            SrmPairedResult mrmPairs;
            //将Transaction转换为MRMPeptideItem
            var peptides = new List <SrmPeptideItem>();

            foreach (var mrm in mrms)
            {
                bool bFound = false;
                foreach (var pep in peptides)
                {
                    if (mrm.IsBrother(pep.ProductIons[0], this.options.RetentionTimeToleranceInSecond, 0.0001))
                    {
                        pep.ProductIons.Add(mrm);
                        bFound = true;
                        break;
                    }
                }

                if (!bFound)
                {
                    SrmPeptideItem item = new SrmPeptideItem();
                    item.PrecursorMZ = mrm.PrecursorMZ;
                    item.ProductIons.Add(mrm);
                    peptides.Add(item);
                }
            }

            //按照precursormz排序
            foreach (var pep in peptides)
            {
                pep.ProductIons.Sort((m1, m2) => m1.ProductIon.CompareTo(m2.ProductIon));
            }

            mrmPairs = new SrmPairedResult();
            mrmPairs.AddRange(from p in peptides
                              orderby p.PrecursorMZ
                              select new SrmPairedPeptideItem(p));

            //合并ProductIon完全一样或者差距相同的Item
            for (int i = 0; i < mrmPairs.Count; i++)
            {
                var iLight = mrmPairs[i];

                for (int j = i + 1; j < mrmPairs.Count; j++)
                {
                    var jLight = mrmPairs[j];

                    if (Math.Abs(iLight.LightPrecursorMZ - jLight.LightPrecursorMZ) > this.options.MaxPrecursorDistance)
                    {
                        continue;
                    }

                    if (iLight.AddPerfectPairedPeptideItem(jLight, this.options.AllowedGaps, this.options.MzTolerance, this.options.RetentionTimeToleranceInSecond))
                    {
                        mrmPairs.RemoveAt(j);
                        break;
                    }
                }
            }

            //容错情况下,合并ProductIon完全一样或者差距相同的Item
            for (int i = 0; i < mrmPairs.Count; i++)
            {
                var iLight = mrmPairs[i];
                if (iLight.IsPaired)
                {
                    continue;
                }

                for (int j = i + 1; j < mrmPairs.Count; j++)
                {
                    var jLight = mrmPairs[j];

                    if (jLight.IsPaired)
                    {
                        continue;
                    }

                    if (Math.Abs(iLight.LightPrecursorMZ - jLight.LightPrecursorMZ) > this.options.MaxPrecursorDistance)
                    {
                        continue;
                    }

                    if (iLight.AddErrorPairedPeptideItem(jLight, this.options.AllowedGaps, this.options.MzTolerance, this.options.RetentionTimeToleranceInSecond))
                    {
                        mrmPairs.RemoveAt(j);
                        break;
                    }
                }
            }
            return(mrmPairs);
        }