private void GetChromatogramCorrelationData(SipperLcmsTargetedResult result) { _chromScanWindowWidth = result.ChromPeakSelected.Width * 2; var startScan = result.ScanSet.PrimaryScanNumber - (int)Math.Round(_chromScanWindowWidth / 2, 0); var stopScan = result.ScanSet.PrimaryScanNumber + (int)Math.Round(_chromScanWindowWidth / 2, 0); result.ChromCorrelationData = _chromatogramCorrelatorTask.CorrelatePeaksWithinIsotopicProfile(result.Run, NormalizedIso, startScan, stopScan); ChromatogramRSquaredVals.AddRange( result.ChromCorrelationData.CorrelationDataItems.Select(p => p.CorrelationRSquaredVal.GetValueOrDefault(-1)). ToList()); //trim off zeros for (var i = ChromatogramRSquaredVals.Count - 1; i >= 0; i--) { if (ChromatogramRSquaredVals[i] <= 0) { ChromatogramRSquaredVals.RemoveAt(i); } else { break; } } result.ChromCorrelationMin = ChromatogramRSquaredVals.Min(); if (ChromatogramRSquaredVals.Count > 1) { //get the best rsquared value other than the base peak's rsquared value (which is always 1) result.ChromCorrelationMax = (from n in ChromatogramRSquaredVals orderby n descending select n).ToList().ElementAt(1); result.ChromCorrelationMedian = MathUtils.GetMedian(ChromatogramRSquaredVals); result.ChromCorrelationAverage = ChromatogramRSquaredVals.Average(); if (ChromatogramRSquaredVals.Count > 2) { result.ChromCorrelationStdev = MathUtils.GetStDev(ChromatogramRSquaredVals); } else { result.ChromCorrelationStdev = -1; } } else { result.ChromCorrelationMax = 1; } }
private void GetChromatogramCorrelationData(SipperLcmsTargetedResult result) { //NOTE: this is a very important step. If too wide, correlation data will be poor //and may lead to overly strict treatment of the data _chromScanWindowWidth = result.ChromPeakSelected.Width / 2.35 * 4; //TODO: change this! //_chromScanWindowWidth = 19; var startScan = result.ScanSet.PrimaryScanNumber - (int)Math.Round(_chromScanWindowWidth / 2, 0); var stopScan = result.ScanSet.PrimaryScanNumber + (int)Math.Round(_chromScanWindowWidth / 2, 0); result.ChromCorrelationData = _chromatogramCorrelatorTask.CorrelatePeaksWithinIsotopicProfile(result.Run, NormalizedIso, startScan, stopScan); if (result.ChromCorrelationData.CorrelationDataItems.Count > 0) { ChromatogramRSquaredVals.AddRange(result.ChromCorrelationData.CorrelationDataItems.Select(p => p.CorrelationRSquaredVal.GetValueOrDefault(-1)).ToList()); } //GORD: remove this console code later //Console.WriteLine(); //Console.WriteLine(result.Target.ID); //foreach (var item in result.ChromCorrelationData.CorrelationDataItems) //{ // Console.WriteLine(item.CorrelationRSquaredVal); //} //trim off zeros for (var i = ChromatogramRSquaredVals.Count - 1; i >= 1; i--) { if (ChromatogramRSquaredVals[i] <= 0) { ChromatogramRSquaredVals.RemoveAt(i); } else { break; } } if (ChromatogramRSquaredVals.Count > 1) { result.ChromCorrelationMin = ChromatogramRSquaredVals.Min(); //get the best rsquared value other than the base peak's rsquared value (which is always 1) result.ChromCorrelationMax = (from n in ChromatogramRSquaredVals orderby n descending select n).ToList().ElementAt(1); result.ChromCorrelationMedian = MathUtils.GetMedian(ChromatogramRSquaredVals); result.ChromCorrelationAverage = ChromatogramRSquaredVals.Average(); if (ChromatogramRSquaredVals.Count > 2) { result.ChromCorrelationStdev = MathUtils.GetStDev(ChromatogramRSquaredVals); } else { result.ChromCorrelationStdev = -1; } } else { result.ChromCorrelationMin = -1; result.ChromCorrelationMax = -1; } }
public override void Execute(ResultCollection resultList) { Check.Require(resultList.CurrentTargetedResult is SipperLcmsTargetedResult, "Sipper Quantifier only works on Sipper-type result objects"); Check.Require(resultList.Run.CurrentMassTag != null, this.Name + " failed; CurrentMassTag is empty"); Check.Require(resultList.Run.CurrentMassTag.IsotopicProfile != null, this.Name + " failed; Theor isotopic profile is empty. Run a TheorFeatureGenerator"); var result = (SipperLcmsTargetedResult)resultList.CurrentTargetedResult; result.AreaUnderDifferenceCurve = -9999; result.AreaUnderRatioCurve = -9999; RatioVals.Xvalues = new double[] { 1, 2, 3, 4, 5, 6, 7 }; RatioVals.Yvalues = new double[] { 0, 0, 0, 0, 0, 0, 0 }; RatioLogVals.Xvalues = new double[] { 1, 2, 3, 4, 5, 6, 7 }; RatioLogVals.Yvalues = new double[] { 0, 0, 0, 0, 0, 0, 0 }; ChromatogramRSquaredVals.Clear(); Check.Require(result != null, "No MassTagResult has been generated for CurrentMassTag"); if (result.IsotopicProfile == null || result.IsotopicProfile.Peaklist == null || result.IsotopicProfile.Peaklist.Count < 2) { return; } var theorUnlabelledIso = resultList.Run.CurrentMassTag.IsotopicProfile.CloneIsotopicProfile(); IsotopicProfileUtilities.NormalizeIsotopicProfile(theorUnlabelledIso); //PeakUtilities.TrimIsotopicProfile(unlabeledIso, 0.001); var sb = new StringBuilder(); sb.Append(result.Target.ID + "\t" + result.Target.MZ.ToString("0.0000") + "\t" + result.Target.ChargeState + "-----------------------------\n"); var indexMostAbundantTheorPeak = theorUnlabelledIso.GetIndexOfMostIntensePeak(); NormalizedIso = result.IsotopicProfile.CloneIsotopicProfile(); IsotopicProfileUtilities.NormalizeIsotopicProfileToSpecificPeak(NormalizedIso, indexMostAbundantTheorPeak); // return; if (result.Flags.Count > 0) { var flagstring = ""; foreach (var resultFlag in result.Flags) { flagstring += resultFlag.Description + ";"; } result.ErrorDescription = flagstring.TrimEnd(';'); result.FailedResult = true; if (flagstring.Contains("PeakToTheLeft")) { result.FailureType = Globals.TargetedResultFailureType.DeisotopingProblemDetected; } else { result.FailureType = Globals.TargetedResultFailureType.QuantifierFailure; } } var resultPassesMinimalCriteria = (result.Score < MaximumFitScoreForFurtherProcessing && result.Flags.Count == 0); if (resultPassesMinimalCriteria) { //------------------------------------- Get chromatogramCorrelation data ------------------------------- if (IsChromatogramCorrelationPerformed) { GetChromatogramCorrelationData(result); } NormalizedAdjustedIso = NormalizedIso.CloneIsotopicProfile(); //this is experimental!! it attempts to correct the problems caused by Orbitraps on isotopic profile intensities //UpdateIsoIntensitiesUsingChromCorrData(result.ChromCorrelationData, NormalizedAdjustedIso); //----------------- create ratio data ------------------------------------------------------- var ratioData = NormalizedAdjustedIso.CloneIsotopicProfile(); for (var i = 0; i < NormalizedIso.Peaklist.Count; i++) { if (i < theorUnlabelledIso.Peaklist.Count && theorUnlabelledIso.Peaklist[i].Height > MinimumRelativeIntensityForRatioCalc) { ratioData.Peaklist[i].Height = (NormalizedIso.Peaklist[i].Height / theorUnlabelledIso.Peaklist[i].Height - 1); } else { ratioData.Peaklist[i].Height = 0; } } //trim off zeros from ratio data for (var i = ratioData.Peaklist.Count - 1; i >= 0; i--) { if (ratioData.Peaklist[i].Height == 0) { ratioData.Peaklist.RemoveAt(i); } else { break; } } var xvals = ratioData.Peaklist.Select((p, i) => new { peak = p, index = i }).Select(n => (double)n.index).ToList(); var yvals = ratioData.Peaklist.Select(p => (double)p.Height).ToList(); result.AreaUnderRatioCurve = yvals.Sum(); RatioVals.Xvalues = xvals.ToArray(); RatioVals.Yvalues = yvals.ToArray(); GetLinearRegressionData(result, xvals, yvals); //------------- subtract unlabelled profile from normalized profile ---------------------- var subtractedIsoData = NormalizedAdjustedIso.CloneIsotopicProfile(); for (var i = 0; i < subtractedIsoData.Peaklist.Count; i++) { float intensityTheorPeak = 0; if (i < theorUnlabelledIso.Peaklist.Count) { intensityTheorPeak = theorUnlabelledIso.Peaklist[i].Height; } var subtractedIntensity = subtractedIsoData.Peaklist[i].Height - intensityTheorPeak; if (subtractedIntensity < 0) { subtractedIntensity = 0; } subtractedIsoData.Peaklist[i].Height = subtractedIntensity; } result.AreaUnderDifferenceCurve = subtractedIsoData.Peaklist.Select(p => p.Height).Sum(); result.NumCarbonsLabelled = calculateNumCarbonsFromSubtractedProfile(subtractedIsoData); //-------------- calculate Label Distribution ------------------------------------------------ double[] numLabelVals; double[] labelDistributionVals; var theorIntensityVals = theorUnlabelledIso.Peaklist.Select(p => (double)p.Height).ToList(); var normalizedCorrectedIntensityVals = NormalizedAdjustedIso.Peaklist.Select(p => (double)p.Height).ToList(); var numRightPads = 3; _labelingDistributionCalculator.CalculateLabelingDistribution(theorIntensityVals, normalizedCorrectedIntensityVals, LabeldistCalcIntensityThreshold, LabeldistCalcIntensityThreshold, out numLabelVals, out labelDistributionVals, true, true, 0, numRightPads, 0, 0); //negative distribution values are zeroed out. And, then the remaining values are adjusted such that they add up to 1. result.LabelDistributionVals = AdjustLabelDistributionVals(labelDistributionVals); double distFractionUnlabelled, distFractionLabelled, distAverageLabelsIncorporated; _labelingDistributionCalculator.OutputLabelingInfo(result.LabelDistributionVals, out distFractionUnlabelled, out distFractionLabelled, out distAverageLabelsIncorporated); //-------------- make calculations using inputs from chrom correlation data ------------------- HighQualitySubtractedProfile = GetIsoDataPassingChromCorrelation(result.ChromCorrelationData, subtractedIsoData); var highQualityRatioProfileData = GetIsoDataPassingChromCorrelation(result.ChromCorrelationData, ratioData); if (highQualityRatioProfileData.Peaklist != null && highQualityRatioProfileData.Peaklist.Count > 0) { result.AreaUnderDifferenceCurve = HighQualitySubtractedProfile.Peaklist.Select(p => p.Height).Sum(); } else { result.AreaUnderDifferenceCurve = 0; } if (HighQualitySubtractedProfile.Peaklist != null && HighQualitySubtractedProfile.Peaklist.Count > 0) { result.AreaUnderRatioCurveRevised = highQualityRatioProfileData.Peaklist.Select(p => p.Height).Sum(); } else { result.AreaUnderRatioCurveRevised = 0; } var numCarbonsLabelled = GetNumCarbonsLabelledUsingAverageMassDifferences(theorUnlabelledIso, HighQualitySubtractedProfile); //result.NumCarbonsLabelled = numCarbonsLabelled; result.NumCarbonsLabelled = distAverageLabelsIncorporated; var numCarbons = result.Target.GetAtomCountForElement("C"); result.PercentCarbonsLabelled = (result.NumCarbonsLabelled / numCarbons) * 100; result.PercentPeptideLabelled = distFractionLabelled * 100; //if (HighQualitySubtractedProfile.Peaklist != null && HighQualitySubtractedProfile.Peaklist.Count > 0) //{ // result.PercentPeptideLabelled = HighQualitySubtractedProfile.Peaklist.Max(p => p.Height) * 100; //} //else //{ // result.PercentPeptideLabelled = 0; //} result.NumHighQualityProfilePeaks = highQualityRatioProfileData.Peaklist != null ? highQualityRatioProfileData.Peaklist.Count : 0; //Console.WriteLine(); //Console.WriteLine(result); //foreach (var val in ChromatogramRSquaredVals) //{ // Console.WriteLine(val); //} } else { result.FailedResult = true; if (result.FailureType == Globals.TargetedResultFailureType.None) { result.FailureType = Globals.TargetedResultFailureType.MinimalCriteriaNotMet; } } }
public override void Execute(ResultCollection resultList) { Check.Require(resultList.CurrentTargetedResult is SipperLcmsTargetedResult, "Sipper Quantifier only works on Sipper-type result objects"); Check.Require(resultList.Run.CurrentMassTag != null, this.Name + " failed; CurrentMassTag is empty"); Check.Require(resultList.Run.CurrentMassTag.IsotopicProfile != null, this.Name + " failed; Theor isotopic profile is empty. Run a TheorFeatureGenerator"); ResetQuantifierData(); var result = (SipperLcmsTargetedResult)resultList.CurrentTargetedResult; result.AreaUnderDifferenceCurve = -9999; result.AreaUnderRatioCurve = -9999; RatioVals.Xvalues = new double[] { 1, 2, 3, 4, 5, 6, 7 }; RatioVals.Yvalues = new double[] { 0, 0, 0, 0, 0, 0, 0 }; ChromatogramRSquaredVals.Clear(); FitScoreData.Clear(); Check.Require(result != null, "No MassTagResult has been generated for CurrentMassTag"); if (result.IsotopicProfile == null || result.IsotopicProfile.Peaklist == null || result.IsotopicProfile.Peaklist.Count < 2) { return; } var theorUnlabelledIso = resultList.Run.CurrentMassTag.IsotopicProfile.CloneIsotopicProfile(); IsotopicProfileUtilities.NormalizeIsotopicProfile(theorUnlabelledIso); //PeakUtilities.TrimIsotopicProfile(unlabeledIso, 0.001); var indexOfCorrespondingObservedPeak = PeakUtilities.getIndexOfClosestValue(result.IsotopicProfile.Peaklist, theorUnlabelledIso.getMostIntensePeak().XValue, 0, result.IsotopicProfile.Peaklist.Count - 1, 0.1); NormalizedIso = result.IsotopicProfile.CloneIsotopicProfile(); if (indexOfCorrespondingObservedPeak >= 0) { IsotopicProfileUtilities.NormalizeIsotopicProfileToSpecificPeak(NormalizedIso, indexOfCorrespondingObservedPeak); } else { IsotopicProfileUtilities.NormalizeIsotopicProfile(NormalizedIso); } //insert zero intensity peaks into observed // return; if (result.Flags.Count > 0) { var flagstring = ""; foreach (var resultFlag in result.Flags) { flagstring += resultFlag.Description + ";"; } result.ErrorDescription = flagstring.TrimEnd(';'); result.FailedResult = true; if (flagstring.Contains("PeakToTheLeft")) { result.FailureType = Globals.TargetedResultFailureType.DeisotopingProblemDetected; } else { result.FailureType = Globals.TargetedResultFailureType.QuantifierFailure; } } var resultPassesMinimalCriteria = (result.Score < MaximumFitScoreForFurtherProcessing && result.Flags.Count == 0); if (resultPassesMinimalCriteria) { //------------------------------------- Get chromatogramCorrelation data ------------------------------- if (IsChromatogramCorrelationPerformed) { GetChromatogramCorrelationData(result); } NormalizedAdjustedIso = NormalizedIso.CloneIsotopicProfile(); //this is experimental!! it attempts to correct the problems caused by Orbitraps on isotopic profile intensities //UpdateIsoIntensitiesUsingChromCorrData(result.ChromCorrelationData, NormalizedAdjustedIso); //----------------- create ratio data ------------------------------------------------------- var ratioData = NormalizedAdjustedIso.CloneIsotopicProfile(); for (var i = 0; i < NormalizedIso.Peaklist.Count; i++) { if (i < theorUnlabelledIso.Peaklist.Count && theorUnlabelledIso.Peaklist[i].Height > MinimumRelativeIntensityForRatioCalc) { ratioData.Peaklist[i].Height = (NormalizedIso.Peaklist[i].Height / theorUnlabelledIso.Peaklist[i].Height - 1); } else { ratioData.Peaklist[i].Height = 0; } } //trim off zeros from ratio data for (var i = ratioData.Peaklist.Count - 1; i >= 0; i--) { if (ratioData.Peaklist[i].Height == 0) { ratioData.Peaklist.RemoveAt(i); } else { break; } } var xvals = ratioData.Peaklist.Select((p, i) => new { peak = p, index = i }).Select(n => (double)n.index).ToList(); var yvals = ratioData.Peaklist.Select(p => (double)p.Height).ToList(); result.AreaUnderRatioCurve = yvals.Sum(); RatioVals.Xvalues = xvals.ToArray(); RatioVals.Yvalues = yvals.ToArray(); //NOTE: Sept 23, 2013 - the 'R is no longer used. result.RSquaredValForRatioCurve = GetLinearRegressionData(result, xvals, yvals); //------------- subtract unlabelled profile from normalized profile ---------------------- var subtractedIsoData = NormalizedAdjustedIso.CloneIsotopicProfile(); for (var i = 0; i < subtractedIsoData.Peaklist.Count; i++) { float intensityTheorPeak = 0; if (i < theorUnlabelledIso.Peaklist.Count) { intensityTheorPeak = theorUnlabelledIso.Peaklist[i].Height; } var subtractedIntensity = subtractedIsoData.Peaklist[i].Height - intensityTheorPeak; if (subtractedIntensity < 0) { subtractedIntensity = 0; } subtractedIsoData.Peaklist[i].Height = subtractedIntensity; } result.AreaUnderDifferenceCurve = subtractedIsoData.Peaklist.Select(p => p.Height).Sum(); //----------- get data for the subtracted, labeled isotopic profile------------------------ var peaksForLabeledIsoQuant = new List <Peak>(subtractedIsoData.Peaklist.Where(p => p.Height > 0)); // var isoFromPartialLabelingQuantifier = _partialLabelingQuantifier.FindBestLabeledProfile(result.Target, peaksForLabeledIsoQuant); //FitScoreData = _partialLabelingQuantifier.FitScoreData; //result.FitScoreLabeledProfile = isoFromPartialLabelingQuantifier.IsotopicProfile == null ? 1.00d : isoFromPartialLabelingQuantifier.IsotopicProfile.Score; //result.PercentCarbonsLabelled = isoFromPartialLabelingQuantifier.PercentLabeling; //int numCarbons = result.Target.GetAtomCountForElement("C"); //result.NumCarbonsLabelled = result.PercentCarbonsLabelled * numCarbons / 100; //StringBuilder sb = new StringBuilder(); //sb.Append(result.Target.ID + "\t" + result.Target.MZ.ToString("0.0000") + "\t" + result.Target.ChargeState + // "-----------------------------\n"); //int counter = 0; //foreach (var fsData in _partialLabelingQuantifier.FitScoreData) //{ // sb.Append(fsData.Key + "\t" + fsData.Value.ToString("0.000") + "\n"); // counter++; //} //Console.WriteLine(sb.ToString()); //-------------- make calculations using inputs from chrom correlation data ------------------- HighQualitySubtractedProfile = GetIsoDataPassingChromCorrelation(result.ChromCorrelationData, subtractedIsoData); var contiguousnessScore = GetContiguousnessScore(HighQualitySubtractedProfile); result.ContiguousnessScore = contiguousnessScore; //GORD ------------- note this section is a duplicate of the above.... choose one or the other ------------------------ //Feb 26, 2013... I processed the results and these look really good. ROC curve nice peaksForLabeledIsoQuant = new List <Peak>(HighQualitySubtractedProfile.Peaklist.Where(p => p.Height > 0)); //calculate labeled fit score var isoFromPartialLabelingQuantifier = _partialLabelingQuantifier.FindBestLabeledProfile(result.Target, peaksForLabeledIsoQuant); FitScoreData = _partialLabelingQuantifier.FitScoreData; result.FitScoreLabeledProfile = isoFromPartialLabelingQuantifier.IsotopicProfile == null ? 1.00d : isoFromPartialLabelingQuantifier.IsotopicProfile.Score; result.PercentCarbonsLabelled = isoFromPartialLabelingQuantifier.PercentLabeling; var numCarbons = result.Target.GetAtomCountForElement("C"); result.NumCarbonsLabelled = result.PercentCarbonsLabelled * numCarbons / 100; //end of section -------------------------------------------------------------------------- //-------------- calculate Label Distribution ------------------------------------------------ // see Chik et al: http://pubs.acs.org/doi/abs/10.1021/ac050988l ; Also see Sipper paper. double[] numLabelVals; double[] labelDistributionVals; var theorIntensityVals = theorUnlabelledIso.Peaklist.Select(p => (double)p.Height).ToList(); if (isoFromPartialLabelingQuantifier.IsotopicProfile != null) { var normalizedCorrectedIntensityVals = NormalizedAdjustedIso.Peaklist.Select(p => (double)p.Height).ToList(); var numRightPads = 3; _labelingDistributionCalculator.CalculateLabelingDistribution(theorIntensityVals, normalizedCorrectedIntensityVals, LabeldistCalcIntensityThreshold, LabeldistCalcIntensityThreshold, out numLabelVals, out labelDistributionVals, true, true, 0, numRightPads, 0, 0); //negative distribution values are zeroed out. And, then the remaining values are adjusted such that they add up to 1. result.LabelDistributionVals = AdjustLabelDistributionVals(labelDistributionVals); double distFractionUnlabelled, distFractionLabelled, distAverageLabelsIncorporated; _labelingDistributionCalculator.OutputLabelingInfo(result.LabelDistributionVals, out distFractionUnlabelled, out distFractionLabelled, out distAverageLabelsIncorporated); result.PercentPeptideLabelled = distFractionLabelled * 100; } else { result.PercentCarbonsLabelled = 0; } var highQualityRatioProfileData = GetIsoDataPassingChromCorrelation(result.ChromCorrelationData, ratioData); if (highQualityRatioProfileData.Peaklist != null && highQualityRatioProfileData.Peaklist.Count > 0) { result.AreaUnderDifferenceCurve = HighQualitySubtractedProfile.Peaklist.Select(p => p.Height).Sum(); } else { result.AreaUnderDifferenceCurve = 0; } if (HighQualitySubtractedProfile.Peaklist != null && HighQualitySubtractedProfile.Peaklist.Count > 0) { result.AreaUnderRatioCurveRevised = highQualityRatioProfileData.Peaklist.Select(p => p.Height).Sum(); } else { result.AreaUnderRatioCurveRevised = 0; } result.NumHighQualityProfilePeaks = highQualityRatioProfileData.Peaklist != null ? highQualityRatioProfileData.Peaklist.Count : 0; } else { result.FailedResult = true; if (result.FailureType == Globals.TargetedResultFailureType.None) { result.FailureType = Globals.TargetedResultFailureType.MinimalCriteriaNotMet; } } }