private void DisplayCalibrationCurve() { Text = TabText = _originalFormTitle; CalibrationCurveOptions options = Settings.Default.CalibrationCurveOptions; zedGraphControl.GraphPane.YAxis.Type = options.LogYAxis ? AxisType.Log : AxisType.Linear; zedGraphControl.GraphPane.XAxis.Type = options.LogXAxis ? AxisType.Log : AxisType.Linear; bool logPlot = options.LogXAxis || options.LogYAxis; zedGraphControl.GraphPane.Legend.IsVisible = options.ShowLegend; _scatterPlots = null; CalibrationCurve = null; FiguresOfMerit = FiguresOfMerit.EMPTY; SrmDocument document = DocumentUiContainer.DocumentUI; if (!document.Settings.HasResults) { zedGraphControl.GraphPane.Title.Text = QuantificationStrings.CalibrationForm_DisplayCalibrationCurve_No_results_available; return; } PeptideDocNode peptide; PeptideGroupDocNode peptideGroup; if (!TryGetSelectedPeptide(out peptideGroup, out peptide)) { zedGraphControl.GraphPane.Title.Text = ModeUIAwareStringFormat(QuantificationStrings .CalibrationForm_DisplayCalibrationCurve_Select_a_peptide_to_see_its_calibration_curve); return; } if (-1 == document.Children.IndexOf(peptideGroup)) { zedGraphControl.GraphPane.Title.Text = ModeUIAwareStringFormat(QuantificationStrings.CalibrationForm_DisplayCalibrationCurve_The_selected_peptide_is_no_longer_part_of_the_Skyline_document_); return; } PeptideQuantifier peptideQuantifier = PeptideQuantifier.GetPeptideQuantifier(document, peptideGroup, peptide); CalibrationCurveFitter curveFitter = new CalibrationCurveFitter(peptideQuantifier, document.Settings); if (curveFitter.IsEnableSingleBatch && Settings.Default.CalibrationCurveOptions.SingleBatch) { curveFitter.SingleBatchReplicateIndex = _skylineWindow.SelectedResultsIndex; } Text = TabText = GetFormTitle(curveFitter); if (peptideQuantifier.QuantificationSettings.RegressionFit == RegressionFit.NONE) { if (!(peptideQuantifier.NormalizationMethod is NormalizationMethod.RatioToLabel)) { zedGraphControl.GraphPane.Title.Text = ModeUIAwareStringFormat(QuantificationStrings.CalibrationForm_DisplayCalibrationCurve_Use_the_Quantification_tab_on_the_Peptide_Settings_dialog_to_control_the_conversion_of_peak_areas_to_concentrations_); } else { if (!peptide.InternalStandardConcentration.HasValue) { zedGraphControl.GraphPane.Title.Text = ModeUIAwareStringFormat(QuantificationStrings.CalibrationForm_DisplayCalibrationCurve_To_convert_peak_area_ratios_to_concentrations__specify_the_internal_standard_concentration_for__0__, peptide); } else { zedGraphControl.GraphPane.Title.Text = null; } } } else { if (curveFitter.GetStandardConcentrations().Any()) { zedGraphControl.GraphPane.Title.Text = null; } else { zedGraphControl.GraphPane.Title.Text = QuantificationStrings.CalibrationForm_DisplayCalibrationCurve_To_fit_a_calibration_curve__set_the_Sample_Type_of_some_replicates_to_Standard__and_specify_their_concentration_; } } zedGraphControl.GraphPane.XAxis.Title.Text = curveFitter.GetXAxisTitle(); zedGraphControl.GraphPane.YAxis.Title.Text = curveFitter.GetYAxisTitle(); CalibrationCurve = curveFitter.GetCalibrationCurve(); FiguresOfMerit = curveFitter.GetFiguresOfMerit(CalibrationCurve); double minX = double.MaxValue, maxX = double.MinValue; double minY = double.MaxValue; _scatterPlots = new CurveList(); IEnumerable <SampleType> sampleTypes = SampleType.ListSampleTypes() .Where(Options.DisplaySampleType); foreach (var sampleType in sampleTypes) { PointPairList pointPairList = new PointPairList(); PointPairList pointPairListExcluded = new PointPairList(); foreach (var standardIdentifier in curveFitter.EnumerateCalibrationPoints()) { if (!Equals(sampleType, curveFitter.GetSampleType(standardIdentifier))) { continue; } double?y = curveFitter.GetYValue(standardIdentifier); double?xCalculated = curveFitter.GetCalculatedXValue(CalibrationCurve, standardIdentifier); double?x = curveFitter.GetSpecifiedXValue(standardIdentifier) ?? xCalculated; if (y.HasValue && x.HasValue) { PointPair point = new PointPair(x.Value, y.Value) { Tag = standardIdentifier }; if (sampleType.AllowExclude && null == standardIdentifier.LabelType && peptide.IsExcludeFromCalibration(standardIdentifier.ReplicateIndex)) { pointPairListExcluded.Add(point); } else { pointPairList.Add(point); } if (!IsNumber(x) || !IsNumber(y)) { continue; } if (!logPlot || x.Value > 0) { minX = Math.Min(minX, x.Value); } if (!logPlot || y.Value > 0) { minY = Math.Min(minY, y.Value); } maxX = Math.Max(maxX, x.Value); if (IsNumber(xCalculated)) { maxX = Math.Max(maxX, xCalculated.Value); if (!logPlot || xCalculated.Value > 0) { minX = Math.Min(minX, xCalculated.Value); } } } } if (pointPairList.Any()) { var lineItem = zedGraphControl.GraphPane.AddCurve(sampleType.ToString(), pointPairList, sampleType.Color, sampleType.SymbolType); lineItem.Line.IsVisible = false; lineItem.Symbol.Fill = new Fill(sampleType.Color); _scatterPlots.Add(lineItem); } if (pointPairListExcluded.Any()) { string curveLabel = pointPairList.Any() ? null : sampleType.ToString(); var lineItem = zedGraphControl.GraphPane.AddCurve(curveLabel, pointPairListExcluded, sampleType.Color, sampleType.SymbolType); lineItem.Line.IsVisible = false; _scatterPlots.Add(lineItem); } } List <string> labelLines = new List <String>(); RegressionFit regressionFit = document.Settings.PeptideSettings.Quantification.RegressionFit; if (regressionFit != RegressionFit.NONE) { if (minX <= maxX) { int interpolatedLinePointCount = 100; if (!logPlot && regressionFit != RegressionFit.LINEAR_IN_LOG_SPACE) { if (regressionFit == RegressionFit.LINEAR_THROUGH_ZERO) { minX = Math.Min(0, minX); } if (regressionFit != RegressionFit.QUADRATIC) { interpolatedLinePointCount = 2; } } double[] xValues; if (CalibrationCurve.TurningPoint.HasValue) { xValues = new[] { minX, CalibrationCurve.TurningPoint.Value, maxX }; } else { xValues = new[] { minX, maxX }; } Array.Sort(xValues); LineItem interpolatedLine = CreateInterpolatedLine(CalibrationCurve, xValues, interpolatedLinePointCount, logPlot); if (null != interpolatedLine) { zedGraphControl.GraphPane.CurveList.Add(interpolatedLine); } } labelLines.Add(CalibrationCurve.ToString()); if (CalibrationCurve.RSquared.HasValue) { labelLines.Add(CalibrationCurve.RSquaredDisplayText(CalibrationCurve.RSquared.Value)); } if (!Equals(curveFitter.QuantificationSettings.RegressionWeighting, RegressionWeighting.NONE)) { labelLines.Add(string.Format(@"{0}: {1}", QuantificationStrings.Weighting, curveFitter.QuantificationSettings.RegressionWeighting)); } if (options.ShowFiguresOfMerit) { string strFiguresOfMerit = FiguresOfMerit.ToString(); if (!string.IsNullOrEmpty(strFiguresOfMerit)) { labelLines.Add(strFiguresOfMerit); } } } CalibrationPoint?selectionIdentifier = null; if (options.ShowSelection) { if (curveFitter.IsotopologResponseCurve) { var labelType = (_skylineWindow.SequenceTree.SelectedNode as SrmTreeNode) ?.GetNodeOfType <TransitionGroupTreeNode>()?.DocNode.LabelType; if (labelType != null) { selectionIdentifier = new CalibrationPoint(_skylineWindow.SelectedResultsIndex, labelType); } } else { selectionIdentifier = new CalibrationPoint(_skylineWindow.SelectedResultsIndex, null); } } if (selectionIdentifier.HasValue) { double?ySelected = curveFitter.GetYValue(selectionIdentifier.Value); if (IsNumber(ySelected)) { double? xSelected = curveFitter.GetCalculatedXValue(CalibrationCurve, selectionIdentifier.Value); var selectedLineColor = Color.FromArgb(128, GraphSummary.ColorSelected); const float selectedLineWidth = 2; double? xSpecified = curveFitter.GetSpecifiedXValue(selectionIdentifier.Value); if (IsNumber(xSelected)) { ArrowObj arrow = new ArrowObj(xSelected.Value, ySelected.Value, xSelected.Value, ySelected.Value) { Line = { Color = GraphSummary.ColorSelected } }; zedGraphControl.GraphPane.GraphObjList.Insert(0, arrow); var verticalLine = new LineObj(xSelected.Value, ySelected.Value, xSelected.Value, options.LogYAxis ? minY / 10 : 0) { Line = { Color = selectedLineColor, Width = selectedLineWidth }, Location = { CoordinateFrame = CoordType.AxisXYScale }, ZOrder = ZOrder.E_BehindCurves, IsClippedToChartRect = true }; zedGraphControl.GraphPane.GraphObjList.Add(verticalLine); if (IsNumber(xSpecified)) { var horizontalLine = new LineObj(xSpecified.Value, ySelected.Value, xSelected.Value, ySelected.Value) { Line = { Color = selectedLineColor, Width = selectedLineWidth }, Location = { CoordinateFrame = CoordType.AxisXYScale }, ZOrder = ZOrder.E_BehindCurves, IsClippedToChartRect = true }; zedGraphControl.GraphPane.GraphObjList.Add(horizontalLine); } } else { // We were not able to map the observed intensity back to the calibration curve, but we still want to // indicate where the currently selected point is. if (IsNumber(xSpecified)) { // If the point has a specified concentration, then use that. ArrowObj arrow = new ArrowObj(xSpecified.Value, ySelected.Value, xSpecified.Value, ySelected.Value) { Line = { Color = GraphSummary.ColorSelected } }; zedGraphControl.GraphPane.GraphObjList.Insert(0, arrow); } else { // Otherwise, draw a horizontal line at the appropriate y-value. var horizontalLine = new LineObj(minX, ySelected.Value, maxX, ySelected.Value) { Line = { Color = selectedLineColor, Width = selectedLineWidth }, Location = { CoordinateFrame = CoordType.AxisXYScale }, IsClippedToChartRect = true, }; ZedGraphControl.GraphPane.GraphObjList.Add(horizontalLine); } } } QuantificationResult quantificationResult = null; double?calculatedConcentration; if (curveFitter.IsotopologResponseCurve) { calculatedConcentration = curveFitter.GetCalculatedConcentration(CalibrationCurve, selectionIdentifier.Value); } else { quantificationResult = curveFitter.GetPeptideQuantificationResult(selectionIdentifier.Value.ReplicateIndex); calculatedConcentration = quantificationResult?.CalculatedConcentration; } if (calculatedConcentration.HasValue) { labelLines.Add(string.Format(@"{0} = {1}", QuantificationStrings.Calculated_Concentration, QuantificationResult.FormatCalculatedConcentration(calculatedConcentration.Value, curveFitter.QuantificationSettings.Units))); } else if (quantificationResult != null && !quantificationResult.NormalizedArea.HasValue) { labelLines.Add(QuantificationStrings.CalibrationForm_DisplayCalibrationCurve_The_selected_replicate_has_missing_or_truncated_transitions); } } if (Options.ShowFiguresOfMerit) { if (IsNumber(FiguresOfMerit.LimitOfDetection)) { var lodLine = new LineObj(Color.DarkMagenta, FiguresOfMerit.LimitOfDetection.Value, 0, FiguresOfMerit.LimitOfDetection.Value, 1) { Location = { CoordinateFrame = CoordType.XScaleYChartFraction } }; zedGraphControl.GraphPane.GraphObjList.Add(lodLine); } if (IsNumber(FiguresOfMerit.LimitOfQuantification)) { var loqLine = new LineObj(Color.DarkCyan, FiguresOfMerit.LimitOfQuantification.Value, 0, FiguresOfMerit.LimitOfQuantification.Value, 1) { Location = { CoordinateFrame = CoordType.XScaleYChartFraction } }; zedGraphControl.GraphPane.GraphObjList.Add(loqLine); } } if (labelLines.Any()) { TextObj text = new TextObj(TextUtil.LineSeparate(labelLines), .01, 0, CoordType.ChartFraction, AlignH.Left, AlignV.Top) { IsClippedToChartRect = true, ZOrder = ZOrder.E_BehindCurves, FontSpec = GraphSummary.CreateFontSpec(Color.Black), }; zedGraphControl.GraphPane.GraphObjList.Add(text); } }
private void DisplayCalibrationCurve() { CalibrationCurveOptions options = Settings.Default.CalibrationCurveOptions; zedGraphControl.GraphPane.YAxis.Type = zedGraphControl.GraphPane.XAxis.Type = options.LogPlot ? AxisType.Log : AxisType.Linear; zedGraphControl.GraphPane.Legend.IsVisible = options.ShowLegend; _scatterPlots = null; CalibrationCurve = null; FiguresOfMerit = FiguresOfMerit.EMPTY; SrmDocument document = DocumentUiContainer.DocumentUI; if (!document.Settings.HasResults) { zedGraphControl.GraphPane.Title.Text = QuantificationStrings.CalibrationForm_DisplayCalibrationCurve_No_results_available; return; } PeptideDocNode peptide; PeptideGroupDocNode peptideGroup; if (!TryGetSelectedPeptide(out peptideGroup, out peptide)) { zedGraphControl.GraphPane.Title.Text = QuantificationStrings .CalibrationForm_DisplayCalibrationCurve_Select_a_peptide_to_see_its_calibration_curve; return; } if (-1 == document.Children.IndexOf(peptideGroup)) { zedGraphControl.GraphPane.Title.Text = QuantificationStrings.CalibrationForm_DisplayCalibrationCurve_The_selected_peptide_is_no_longer_part_of_the_Skyline_document_; return; } PeptideQuantifier peptideQuantifier = PeptideQuantifier.GetPeptideQuantifier(document, peptideGroup, peptide); CalibrationCurveFitter curveFitter = new CalibrationCurveFitter(peptideQuantifier, document.Settings); if (peptideQuantifier.QuantificationSettings.RegressionFit == RegressionFit.NONE) { if (!(peptideQuantifier.NormalizationMethod is NormalizationMethod.RatioToLabel)) { zedGraphControl.GraphPane.Title.Text = QuantificationStrings.CalibrationForm_DisplayCalibrationCurve_Use_the_Quantification_tab_on_the_Peptide_Settings_dialog_to_control_the_conversion_of_peak_areas_to_concentrations_; } else { if (!peptide.InternalStandardConcentration.HasValue) { zedGraphControl.GraphPane.Title.Text = string.Format(QuantificationStrings.CalibrationForm_DisplayCalibrationCurve_To_convert_peak_area_ratios_to_concentrations__specify_the_internal_standard_concentration_for__0__, peptide); } else { zedGraphControl.GraphPane.Title.Text = null; } } } else { if (curveFitter.GetStandardConcentrations().Any()) { zedGraphControl.GraphPane.Title.Text = null; } else { zedGraphControl.GraphPane.Title.Text = QuantificationStrings.CalibrationForm_DisplayCalibrationCurve_To_fit_a_calibration_curve__set_the_Sample_Type_of_some_replicates_to_Standard__and_specify_their_concentration_; } } zedGraphControl.GraphPane.XAxis.Title.Text = curveFitter.GetXAxisTitle(); zedGraphControl.GraphPane.YAxis.Title.Text = curveFitter.GetYAxisTitle(); CalibrationCurve = curveFitter.GetCalibrationCurve(); FiguresOfMerit = curveFitter.GetFiguresOfMerit(CalibrationCurve); double minX = double.MaxValue, maxX = double.MinValue; double minY = double.MaxValue; _scatterPlots = new CurveList(); foreach (var sampleType in SampleType.ListSampleTypes()) { if (!Options.DisplaySampleType(sampleType)) { continue; } PointPairList pointPairList = new PointPairList(); PointPairList pointPairListExcluded = new PointPairList(); for (int iReplicate = 0; iReplicate < document.Settings.MeasuredResults.Chromatograms.Count; iReplicate++) { ChromatogramSet chromatogramSet = document.Settings.MeasuredResults.Chromatograms[iReplicate]; if (!Equals(sampleType, chromatogramSet.SampleType)) { continue; } double?y = curveFitter.GetYValue(iReplicate); double?xCalculated = curveFitter.GetCalculatedXValue(CalibrationCurve, iReplicate); double?x = curveFitter.GetSpecifiedXValue(iReplicate) ?? xCalculated; if (y.HasValue && x.HasValue) { PointPair point = new PointPair(x.Value, y.Value) { Tag = iReplicate }; if (sampleType.AllowExclude && peptide.IsExcludeFromCalibration(iReplicate)) { pointPairListExcluded.Add(point); } else { pointPairList.Add(point); } if (double.IsNaN(x.Value) || double.IsInfinity(x.Value) || double.IsNaN(y.Value) || double.IsInfinity(y.Value)) { continue; } if (!Options.LogPlot || x.Value > 0) { minX = Math.Min(minX, x.Value); } if (!Options.LogPlot || y.Value > 0) { minY = Math.Min(minY, y.Value); } maxX = Math.Max(maxX, x.Value); if (xCalculated.HasValue) { maxX = Math.Max(maxX, xCalculated.Value); if (!Options.LogPlot || xCalculated.Value > 0) { minX = Math.Min(minX, xCalculated.Value); } } } } if (pointPairList.Any()) { var lineItem = zedGraphControl.GraphPane.AddCurve(sampleType.ToString(), pointPairList, sampleType.Color, sampleType.SymbolType); lineItem.Line.IsVisible = false; lineItem.Symbol.Fill = new Fill(sampleType.Color); _scatterPlots.Add(lineItem); } if (pointPairListExcluded.Any()) { string curveLabel = pointPairList.Any() ? null : sampleType.ToString(); var lineItem = zedGraphControl.GraphPane.AddCurve(curveLabel, pointPairListExcluded, sampleType.Color, sampleType.SymbolType); lineItem.Line.IsVisible = false; _scatterPlots.Add(lineItem); } } List <string> labelLines = new List <String>(); RegressionFit regressionFit = document.Settings.PeptideSettings.Quantification.RegressionFit; if (regressionFit != RegressionFit.NONE) { if (minX <= maxX) { int interpolatedLinePointCount = 100; if (!options.LogPlot) { if (regressionFit == RegressionFit.LINEAR_THROUGH_ZERO) { minX = Math.Min(0, minX); } if (regressionFit != RegressionFit.QUADRATIC) { interpolatedLinePointCount = 2; } } double[] xValues; if (CalibrationCurve.TurningPoint.HasValue) { xValues = new[] { minX, CalibrationCurve.TurningPoint.Value, maxX }; } else { xValues = new[] { minX, maxX }; } Array.Sort(xValues); LineItem interpolatedLine = CreateInterpolatedLine(CalibrationCurve, xValues, interpolatedLinePointCount, Options.LogPlot); if (null != interpolatedLine) { zedGraphControl.GraphPane.CurveList.Add(interpolatedLine); } } labelLines.Add(CalibrationCurve.ToString()); if (CalibrationCurve.RSquared.HasValue) { labelLines.Add(QuantificationStrings.CalibrationForm_DisplayCalibrationCurve_ + CalibrationCurve.RSquared.Value.ToString("0.####")); // Not L10N } if (!Equals(curveFitter.QuantificationSettings.RegressionWeighting, RegressionWeighting.NONE)) { labelLines.Add(string.Format("{0}: {1}", // Not L10N QuantificationStrings.Weighting, curveFitter.QuantificationSettings.RegressionWeighting)); } string strFiguresOfMerit = FiguresOfMerit.ToString(); if (!string.IsNullOrEmpty(strFiguresOfMerit)) { labelLines.Add(strFiguresOfMerit); } } if (options.ShowSelection) { double?ySelected = curveFitter.GetYValue(_skylineWindow.SelectedResultsIndex); double?xSelected = curveFitter.GetCalculatedXValue(CalibrationCurve, _skylineWindow.SelectedResultsIndex); if (xSelected.HasValue && ySelected.HasValue) { const float selectedLineWidth = 2; ArrowObj arrow = new ArrowObj(xSelected.Value, ySelected.Value, xSelected.Value, ySelected.Value) { Line = { Color = GraphSummary.ColorSelected } }; zedGraphControl.GraphPane.GraphObjList.Insert(0, arrow); var selectedLineColor = Color.FromArgb(128, GraphSummary.ColorSelected); var verticalLine = new LineObj(xSelected.Value, ySelected.Value, xSelected.Value, options.LogPlot ? double.MinValue : 0) { Line = { Color = selectedLineColor, Width = selectedLineWidth }, Location = { CoordinateFrame = CoordType.AxisXYScale }, ZOrder = ZOrder.E_BehindCurves, IsClippedToChartRect = true }; zedGraphControl.GraphPane.GraphObjList.Add(verticalLine); double?xSpecified = curveFitter.GetSpecifiedXValue(_skylineWindow.SelectedResultsIndex); if (xSpecified.HasValue) { var horizontalLine = new LineObj(xSpecified.Value, ySelected.Value, xSelected.Value, ySelected.Value) { Line = { Color = selectedLineColor, Width = selectedLineWidth }, Location = { CoordinateFrame = CoordType.AxisXYScale }, ZOrder = ZOrder.E_BehindCurves, IsClippedToChartRect = true }; zedGraphControl.GraphPane.GraphObjList.Add(horizontalLine); } } var quantificationResult = curveFitter.GetQuantificationResult(_skylineWindow.SelectedResultsIndex); if (quantificationResult.CalculatedConcentration.HasValue) { labelLines.Add(string.Format("{0} = {1}", // Not L10N QuantificationStrings.Calculated_Concentration, quantificationResult)); } else if (!quantificationResult.NormalizedArea.HasValue) { labelLines.Add(QuantificationStrings.CalibrationForm_DisplayCalibrationCurve_The_selected_replicate_has_missing_or_truncated_transitions); } } if (labelLines.Any()) { TextObj text = new TextObj(TextUtil.LineSeparate(labelLines), .01, 0, CoordType.ChartFraction, AlignH.Left, AlignV.Top) { IsClippedToChartRect = true, ZOrder = ZOrder.E_BehindCurves, FontSpec = GraphSummary.CreateFontSpec(Color.Black), }; zedGraphControl.GraphPane.GraphObjList.Add(text); } }