//TODO: remove code duplication (see DeconToolsPeakDetector) public override List <Peak> FindPeaks(XYData xyData, double xMin = 0, double xMax = 0) { var peakList = new List <Peak>(); if (xyData == null) { return(peakList); } if (UseNewPeakDetector) { _peakDetectorV2.FindPeaks(xyData, xMin, xMax); } else { var xVals = xyData.Xvalues.ToList(); var yVals = xyData.Yvalues.ToList(); if (_oldPeakProcessor == null) { _oldPeakProcessor = new PeakProcessor(); } BackgroundIntensity = _oldPeakProcessor.GetBackgroundIntensity(yVals); _oldPeakProcessor.SetOptions(SigNoise, BackgroundIntensity * PeakBackgroundRatio, false, PeakFitType.Quadratic); //Find peaks using DeconEngine var largestXValue = xyData.Xvalues[xyData.Xvalues.Length - 1]; try { _oldPeakProcessor.DiscoverPeaks(xVals, yVals, 0, largestXValue); } catch (Exception ex) { Logger.Instance.AddEntry("ChromPeakDetector failed: " + ex.Message, true); throw; } _oldDeconEnginePeaklist = _oldPeakProcessor.PeakData.PeakTops; foreach (var peak in _oldDeconEnginePeaklist) { var chromPeak = new ChromPeak { XValue = peak.Mz, // here, mz is actually the scan / or NET Height = (float)peak.Intensity, SignalToNoise = peak.SignalToNoise, Width = (float)peak.FWHM }; peakList.Add(chromPeak); } } //resultList.Run.PeakList = new List<IPeak>(); return(peakList); }
protected override void ExecuteWorkflow(IqResult result) { var children = result.Target.ChildTargets().ToList(); foreach (var child in children) { child.DoWorkflow(); var childResult = child.GetResult(); var chromPeakLevelResults = childResult.ChildResults(); var filteredChromPeakResults = chromPeakLevelResults.Where(r => r.IsotopicProfileFound).ToList(); childResult.FavoriteChild = SelectBestChromPeakIqResult(childResult, filteredChromPeakResults); GetDataFromFavoriteChild(childResult); } result.FavoriteChild = SelectBestChargeStateChildResult(result); GetDataFromFavoriteChild(result); var favResult = result.FavoriteChild; double?rsquaredVal, slope; getRsquaredVal(result, out rsquaredVal, out slope); var favChargeState = result.FavoriteChild == null ? 0 : result.FavoriteChild.Target.ChargeState; var favMz = result.FavoriteChild == null ? 0 : result.FavoriteChild.Target.MZTheor; if (!_headerLogged) { _headerLogged = true; IqLogger.Log.Info("\t" + "TargetID" + "\t\t\t" + "M/Z" + "\t" + "Charge" + "\t" + "LCScan" + "\t" + "RSquared" + "\t" + "Slope"); } IqLogger.Log.Info("\t" + result.Target.ID + "\t\t\t" + favMz.ToString("0.000") + "\t" + favChargeState + "\t" + result.LcScanObs + "\t" + rsquaredVal + "\t" + slope); //now get the mass spectrum given the info from the favorite child charge state result if (favResult != null) { var scanset = new ScanSetFactory().CreateScanSet(Run, favResult.LCScanSetSelected.PrimaryScanNumber, WorkflowParameters.NumMSScansToSum); var selectedChromPeak = favResult.ChromPeakSelected; var sigma = selectedChromPeak.Width / 2.35; var chromScanWindowWidth = 4 * sigma; //Determines where to start and stop chromatogram correlation var startScan = scanset.PrimaryScanNumber - (int)Math.Round(chromScanWindowWidth / 2, 0); var stopScan = scanset.PrimaryScanNumber + (int)Math.Round(chromScanWindowWidth / 2, 0); var massSpectrum = MSGenerator.GenerateMS(Run, scanset); foreach (var iqTarget in children) { var childStateIqResult = (O16O18IqResult)iqTarget.GetResult(); childStateIqResult.IqResultDetail.MassSpectrum = massSpectrum.TrimData(iqTarget.MZTheor - 3, iqTarget.MZTheor + 8); var mspeakList = _mspeakDetector.FindPeaks(childStateIqResult.IqResultDetail.MassSpectrum.Xvalues, childStateIqResult.IqResultDetail.MassSpectrum.Yvalues); childStateIqResult.CorrelationData = ChromatogramCorrelator.CorrelateData(Run, childStateIqResult, startScan, stopScan); childStateIqResult.CorrelationO16O18SingleLabel = childStateIqResult.GetCorrelationO16O18SingleLabel(); childStateIqResult.CorrelationO16O18DoubleLabel = childStateIqResult.GetCorrelationO16O18DoubleLabel(); childStateIqResult.CorrelationBetweenSingleAndDoubleLabel = childStateIqResult.GetCorrelationBetweenSingleAndDoubleLabel(); childStateIqResult.RatioO16O18DoubleLabel = childStateIqResult.GetRatioO16O18DoubleLabel(); childStateIqResult.RatioO16O18SingleLabel = childStateIqResult.GetRatioO16O18SingleLabel(); childStateIqResult.RatioSingleToDoubleLabel = childStateIqResult.GetRatioSingleToDoubleLabel(); childStateIqResult.ObservedIsotopicProfile = MsfeatureFinder.IterativelyFindMSFeature(childStateIqResult.IqResultDetail.MassSpectrum, iqTarget.TheorIsotopicProfile); if (childStateIqResult.ObservedIsotopicProfile != null) { var observedIsoList = childStateIqResult.ObservedIsotopicProfile.Peaklist.Cast <Peak>().Take(4).ToList(); //first 4 peaks excludes the O18 double label peak (fifth peak) var theorPeakList = iqTarget.TheorIsotopicProfile.Peaklist.Select(p => (Peak)p).Take(4).ToList(); childStateIqResult.FitScore = PeakFitter.GetFit(theorPeakList, observedIsoList, 0.05, WorkflowParameters.MSToleranceInPPM); var o18Iso = childStateIqResult.ConvertO16ProfileToO18(iqTarget.TheorIsotopicProfile, 4); theorPeakList = o18Iso.Peaklist.Select(p => (Peak)p).ToList(); observedIsoList = childStateIqResult.ObservedIsotopicProfile.Peaklist.Cast <Peak>().Skip(4).ToList(); //skips the first 4 peaks and thus includes the O18 double label isotopic profile childStateIqResult.FitScoreO18Profile = PeakFitter.GetFit(theorPeakList, observedIsoList, 0.05, WorkflowParameters.MSToleranceInPPM); childStateIqResult.InterferenceScore = InterferenceScorer.GetInterferenceScore(childStateIqResult.ObservedIsotopicProfile, mspeakList); childStateIqResult.MZObs = childStateIqResult.ObservedIsotopicProfile.MonoPeakMZ; childStateIqResult.MonoMassObs = childStateIqResult.ObservedIsotopicProfile.MonoIsotopicMass; childStateIqResult.MZObsCalibrated = Run.GetAlignedMZ(childStateIqResult.MZObs); childStateIqResult.MonoMassObsCalibrated = (childStateIqResult.MZObsCalibrated - DeconTools.Backend.Globals.PROTON_MASS) * childStateIqResult.Target.ChargeState; childStateIqResult.ElutionTimeObs = ((ChromPeak)favResult.ChromPeakSelected).NETValue; } else { childStateIqResult.FitScore = -1; childStateIqResult.InterferenceScore = -1; } getRsquaredVal(childStateIqResult, out rsquaredVal, out slope); IqLogger.Log.Info("\t\t\t" + childStateIqResult.Target.ID + "\t" + childStateIqResult.Target.MZTheor.ToString("0.000") + "\t" + childStateIqResult.Target.ChargeState + "\t" + childStateIqResult.LcScanObs + "\t" + childStateIqResult.FitScore.ToString("0.000") + "\t" + rsquaredVal + "\t" + slope); childStateIqResult.LCScanSetSelected = favResult.LCScanSetSelected; childStateIqResult.LcScanObs = favResult.LcScanObs; if (GraphsAreOutputted) { if (_graphGenerator == null) { _graphGenerator = new BasicGraphControl(); } ExportGraphs(childStateIqResult); } } } }