public void CalculateRatio(SrmOptions options) { if (this.IsPaired) { CalculateRatioAndArea(options.DeductBaseLine); if (options.RatioByArea) { this.Ratio = this.LightArea / this.HeavyArea; } } }
protected override IFileProcessor GetFileProcessor() { SrmOptions options = new SrmOptions() { DistillerSoftware = this.Text, AskForSmooth = smooth.Checked, DeductBaseLine = deductBaseLine.Checked, RangeSelectionByNoise = peakPickingByBaseline.Checked, ValidationMinSignalToNoise = validateSignalToNoise.Value, ValidationMinRegressionCorrelation = validateCorrel.Value, MzTolerance = mzTolerance.Value, MinValidTransitionPair = minValidTransactionPair.Value, //MinRetentionWindowInMinute = 0, MinEnabledScan = minEnabledScan.Value, HasDecoy = hasDecoy.Checked, DecoyPattern = decoyPattern.Text, RatioByArea = cbRatioByArea.Checked, RefineData = cbRefinePeakPicking.Checked }; if (peakPickingByBaseline.Checked) { options.MinPeakPickingSignalToNoise = signalToNoise.Value; options.LowestPercentageForNoise = baseLinePercentage.Value / 100; } else { options.PercentageOfHighestPeak = highestPeakPercentage.Value / 100; } if (clusterByPredefine.Checked) { options.DefinitionFile = predefinedFile.FullName; options.DefinitionFileFormat = formats.SelectedItem.GetName(); } else { options.PrecursorMassDistance = ParseGaps(); options.RetentionTimeToleranceInSecond = rtToleranceInSecond.Value; } options.RawFiles = dataDirs.SelectPathMap; options.ToXml(true).Save(this.GetOriginFile()); return(new SrmDistiller()); }
public SrmPairedResult() { Options = new SrmOptions(); Modified = false; }
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); }
/// <summary> /// 根据给定算法进行区间选择 /// </summary> /// <param name="peakPicking">区间选择算法</param> /// <param name="deductBaseLine">是否需要去除基线</param> public void PeakPicking(IRangeSelection peakPicking, SrmOptions options) { //首先,每个独立进行peakpicking。 foreach (var product in ProductIonPairs) { product.PeakPicking(peakPicking); product.CalculateRatio(options); product.Enabled = false; } if (options.RefineData && ProductIonPairs.Count > 1) { //如果所有scan都是false,直接返回。 if (!ProductIonPairs.Any(m => m.EnabledScanCount > 0)) { return; } int maxIndex; if (IsPaired) { //选择correlation最高的一个作为标准 var maxCorr = double.MinValue; maxIndex = -1; for (int i = 0; i < ProductIonPairs.Count; i++) { if (ProductIonPairs[i].EnabledScanCount == 0) { continue; } if (maxCorr < ProductIonPairs[i].RegressionCorrelation) { maxCorr = ProductIonPairs[i].RegressionCorrelation; maxIndex = i; } } } else//只有轻标结果 { var maxIntensity = 0.0; maxIndex = 0; for (int i = 0; i < ProductIonPairs.Count; i++) { var intensities = (from s in ProductIonPairs[i].Light.Intensities where s.Enabled select s.Intensity).ToList(); if (intensities.Count > 0) { var maxInt = intensities.Max(); if (maxIntensity < maxInt) { maxIntensity = maxInt; maxIndex = i; } } } } var rts = (from m in ProductIonPairs[maxIndex].Light.Intensities where m.Enabled orderby m.RetentionTime select m.RetentionTime).ToList(); this.SetEnabledRetentionTimeRange(rts.First(), rts.Last()); } this.CalculateTransactionRatio(options); }
/// <summary> /// 计算每个离子对的轻重比及面积 /// </summary> /// <param name="deductBaseLine">是否去除基线。当去除基线时,结果为Light = a * Heavy,过原点。否则为Light = a * Heavy + b,b为截距。</param> public void CalculateTransactionRatio(SrmOptions options) { this.ProductIonPairs.ForEach(m => m.CalculateRatio(options)); }