//public void ExportCompoundModeHtml(string targetDir) //{ // if (pairedResults == null) // { // return; // } // btnCompoundMode.PerformClick(); // var oldViewDecoy = ViewDecoy; // ViewDecoy = true; // try // { // var mainFile = new FileInfo(targetDir + "\\compound.html").FullName; // var imageDir = FileUtils.ChangeExtension(mainFile, ".images"); // try // { // var imageDirName = new DirectoryInfo(imageDir).Name; // if (!Directory.Exists(imageDir)) // { // Directory.CreateDirectory(imageDir); // } // using (StreamWriter sw = new StreamWriter(mainFile)) // { // sw.WriteLine("<html>"); // sw.WriteLine("<head>"); // sw.WriteLine("<title>Compound Quantification Result</title>"); // sw.WriteLine("</head>"); // sw.WriteLine("<body>"); // Predicate<CompoundItem> accept = m => m.IsDecoy && m.Enabled; // var validDecoy = GetCompoundCount(visibleCompounds, accept); // if (validDecoy > 0) // { // sw.WriteLine("{0} valid decoy entries (blue highlighted)<br>", validDecoy); // OutputCompound(sw, visibleCompounds, accept, imageDir, imageDirName, Color.Blue); // } // GC.Collect(); // GC.WaitForFullGCComplete(); // accept = pep => !pep.IsDecoy && !pep.Enabled; // var invalidTarget = GetCount(pr, accept); // if (invalidTarget > 0) // { // sw.WriteLine("{0} invalid target entries (red highlighted)<br>", invalidTarget); // Output(sw, pr, accept, imageDir, imageDirName, Color.Red); // } // GC.Collect(); // GC.WaitForFullGCComplete(); // accept = pep => !pep.IsDecoy && pep.Enabled; // var validTarget = GetCount(pr, accept); // if (validTarget > 0) // { // sw.WriteLine("{0} valid target entries<br>", validTarget); // Output(sw, pr, accept, imageDir, imageDirName, Color.Black); // } // GC.Collect(); // GC.WaitForFullGCComplete(); // sw.WriteLine("</body>"); // sw.WriteLine("</html>"); // } // } // catch (Exception ex) // { // Console.WriteLine(ex.StackTrace); // MessageBox.Show(this, MyConvert.Format("Error when saving {0} : {1}", mainFile, ex.Message), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); // return; // } // } // finally // { // ViewDecoy = oldViewDecoy; // } // MessageBox.Show(this, "Srm result html format saved.", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); //} //private void OutputCompound(StreamWriter sw, List<CompoundItem> list, Predicate<CompoundItem> accept, string imageDir, string imageDirName, Color color) //{ // CurrencyManager cm = (CurrencyManager)this.BindingContext[visibleCompounds]; // var valid = new HashSet<CompoundItem>(from p in list // where accept(p) // select p); // for (int index = 0; index < visibleCompounds.Count; index++) // { // var comp = visibleCompounds[index]; // if (valid.Contains(comp)) // { // cm.Position = index; // //gvCompounds.Refresh(); // //gvCompounds_SelectionChanged(null, null); // //gvProductPair.Refresh(); // //gvProductPair_SelectionChanged(null, null); // //MessageBox.Show(comp.ObjectName + " " + comp.PrecursurFormula); // WritePeptide(sw, pep, color); // WriteImage(imageDir, imageDirName, sw, pep); // } // } //} //private int GetCompoundCount(List<CompoundItem> list, Predicate<CompoundItem> accept) //{ // return list.Count(m => accept(m)); //} private void Output(StreamWriter sw, SrmPairedResult node, Predicate <SrmPairedPeptideItem> accept, string imageDir, string imageDirName, Color color) { CurrencyManager cm = (CurrencyManager)this.BindingContext[visibleCompounds]; var valid = new HashSet <SrmPairedPeptideItem>(from p in node where accept(p) select p); for (int index = 0; index < visibleCompounds.Count; index++) { var comp = visibleCompounds[index]; var pep = comp.GetPeptideItem(node.PureFileName); if (valid.Contains(pep)) { cm.Position = index; //gvCompounds.Refresh(); //gvCompounds_SelectionChanged(null, null); //gvProductPair.Refresh(); //gvProductPair_SelectionChanged(null, null); //MessageBox.Show(comp.ObjectName + " " + comp.PrecursurFormula); WritePeptide(sw, pep, color); WriteImage(imageDir, imageDirName, sw, pep); } } }
public SrmFileItem(SrmPairedResult result, SrmPairedPeptideItem peptide, SrmPairedProductIon production) { this.PairedResult = result; this.PairedPeptide = peptide; this.PairedProductIon = production; _precursorMz = new Pair <double, double>(peptide.LightPrecursorMZ, peptide.HeavyPrecursorMZ); _productIonMz = new Pair <double, double>(production.LightProductIon, production.HeavyProductIon); }
public static SrmPairedResult ToPairedResult(this List <SrmTransition> transList) { SrmPairedResult result = new SrmPairedResult(); //所有母离子有相同名称、相同质荷比认为是来自相同precursor,合并为一个peptide。 var pepgroup = transList.GroupBy(m => m.PrecursorFormula + MyConvert.Format("{0:0.0000}", m.PrecursorMZ)); var peptides = new List <SrmPeptideItem>(); foreach (var g in pepgroup) { var pep = new SrmPeptideItem(); pep.PrecursorMZ = g.First().PrecursorMZ; pep.ProductIons = new List <SrmTransition>(g); peptides.Add(pep); } //具有相同母离子名称和电荷的transition认为是轻重标。 var lhgroup = peptides.GroupBy(m => m.ProductIons[0].PrecursorFormula + "_" + m.ProductIons[0].PrecursorCharge.ToString()).ToList(); // var lhgroup = peptides.GroupBy(m => m.ProductIons[0].PrecursorFormula + "_" + m.ProductIons[0].PrecursorCharge.ToString()).ToList(); foreach (var g in lhgroup) { if (g.Count() > 2) { throw new Exception(string.Format("There are {0} transition with same precursor formula and precursor charge: {1}, {2}", g.Count(), g.First().ProductIons[0].PrecursorFormula, g.First().ProductIons[0].PrecursorCharge)); } else if (g.Count() > 1) { var items = g.ToList(); items.Sort((m1, m2) => m1.PrecursorMZ.CompareTo(m2.PrecursorMZ)); SrmPairedPeptideItem light = new SrmPairedPeptideItem(items[0]); SrmPairedPeptideItem heavy = new SrmPairedPeptideItem(items[1]); if (!string.IsNullOrEmpty(light.ProductIonPairs[0].Light.Ion)) { light.SetHeavyPeptideItemByIon(heavy); } else { light.SetHeavyPeptideItem(heavy); } result.Add(light); } else { SrmPairedPeptideItem light = new SrmPairedPeptideItem(g.First()); result.Add(light); } } return(result); }
protected override void DoRealGo() { mrmFileName = GetOriginFile(); btnGo.Enabled = false; try { lblProgress.Text = "Reading MRM Scans ..."; mrmPairs = new SrmPairedResultXmlFormat().ReadFromFile(mrmFileName); lblProgress.Text = "Finished."; DisplayMRMTree(); } finally { btnGo.Enabled = true; } }
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); }
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); }
private int GetCount(SrmPairedResult node, Predicate <SrmPairedPeptideItem> pred) { return(node.Count(m => pred(m))); }