diff --git a/pwiz_tools/Skyline/Controls/Graphs/Calibration/CalibrationGraphControl.cs b/pwiz_tools/Skyline/Controls/Graphs/Calibration/CalibrationGraphControl.cs index 70b43528ec2..dfe3780186a 100644 --- a/pwiz_tools/Skyline/Controls/Graphs/Calibration/CalibrationGraphControl.cs +++ b/pwiz_tools/Skyline/Controls/Graphs/Calibration/CalibrationGraphControl.cs @@ -78,7 +78,7 @@ protected override void OnHandleCreated(EventArgs e) private void Settings_OnPropertyChanged(object sender, PropertyChangedEventArgs e) { - if (e.PropertyName == nameof(Properties.Settings.Default.CalibrationCurveOptions )) + if (e.PropertyName == nameof(Properties.Settings.Default.CalibrationCurveOptions)) { Update(DisplaySettings); } @@ -355,6 +355,11 @@ private void DoUpdate(Settings displaySettings) labelLines.Add(CalibrationCurveMetrics.RSquaredDisplayText(CalibrationCurveMetrics.RSquared.Value)); } + if (CalibrationCurveMetrics.RelativeStandardError.HasValue) + { + labelLines.Add(CalibrationCurveMetrics.RelativeStandardErrorDisplayText(CalibrationCurveMetrics.RelativeStandardError.Value)); + } + if (!Equals(curveFitter.QuantificationSettings.RegressionWeighting, RegressionWeighting.NONE)) { labelLines.Add(string.Format(@"{0}: {1}", @@ -406,7 +411,7 @@ private void DoUpdate(Settings displaySettings) { ArrowObj arrow = new ArrowObj(xSelected.Value, ySelected.Raw, xSelected.Value, ySelected.Raw) - { Line = { Color = GraphSummary.ColorSelected } }; + { Line = { Color = GraphSummary.ColorSelected } }; zedGraphControl.GraphPane.GraphObjList.Insert(0, arrow); var verticalLine = new LineObj(xSelected.Value, ySelected.Raw, xSelected.Value, options.LogYAxis ? minY / 10 : 0) @@ -439,7 +444,7 @@ private void DoUpdate(Settings displaySettings) // If the point has a specified concentration, then use that. ArrowObj arrow = new ArrowObj(xSpecified.Value, ySelected.Raw, xSpecified.Value, ySelected.Raw) - { Line = { Color = GraphSummary.ColorSelected } }; + { Line = { Color = GraphSummary.ColorSelected } }; zedGraphControl.GraphPane.GraphObjList.Insert(0, arrow); } else @@ -726,7 +731,7 @@ ToolStripMenuItem excludeStandardMenuItem menuStrip.Items.Insert(index++, moreDisplayOptionsContextMenuItem); menuStrip.Items.Insert(index++, new ToolStripSeparator()); } - + } private bool IsEnableIsotopologResponseCurve() { diff --git a/pwiz_tools/Skyline/Model/Databinding/Entities/CalibrationCurveMetrics.cs b/pwiz_tools/Skyline/Model/Databinding/Entities/CalibrationCurveMetrics.cs index c393ec82f67..222644fc1d3 100644 --- a/pwiz_tools/Skyline/Model/Databinding/Entities/CalibrationCurveMetrics.cs +++ b/pwiz_tools/Skyline/Model/Databinding/Entities/CalibrationCurveMetrics.cs @@ -75,6 +75,21 @@ public CalibrationCurveMetrics ChangeRSquared(double? rSquared) return ChangeProp(ImClone(this), im => im.RSquared = rSquared); } + [Format(Formats.Integer, NullValue = TextUtil.EXCEL_NA)] + public int? FittedParameters { get; private set; } + public CalibrationCurveMetrics ChangeFittedParameters(int? fittedParameters) + { + return ChangeProp(ImClone(this), im => im.FittedParameters = fittedParameters); + } + + [Format(Formats.Percent, NullValue = TextUtil.EXCEL_NA)] + public double? RelativeStandardError { get; private set; } + + public CalibrationCurveMetrics ChangeRelativeStandardError(double? relStdError) + { + return ChangeProp(ImClone(this), im => im.RelativeStandardError = relStdError); + } + public string ErrorMessage { get; private set; } public CalibrationCurveMetrics ChangeErrorMessage(string errorMessage) { @@ -136,5 +151,11 @@ public static string RSquaredDisplayText(double rSquared) return QuantificationStrings.CalibrationForm_DisplayCalibrationCurve_ + rSquared.ToString(@"0.####"); } + + public static string RelativeStandardErrorDisplayText(double relStdError) + { + return QuantificationStrings.CalibrationForm_DisplayCalibrationCurve_RelativeStandardError + + relStdError.ToString(@"0.##%"); + } } } diff --git a/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnCaptions.ja.resx b/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnCaptions.ja.resx index 0105ffe9ab1..b3e6ad9a54e 100644 --- a/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnCaptions.ja.resx +++ b/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnCaptions.ja.resx @@ -507,6 +507,9 @@ 最初の位置 + + 推定パラメータ + 倍率変化 @@ -1428,6 +1431,9 @@ R平方 + + 相対標準誤差 + 試料希釈倍数 diff --git a/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnCaptions.resx b/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnCaptions.resx index 6b8c3ba2f75..b6b28ab5c92 100644 --- a/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnCaptions.resx +++ b/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnCaptions.resx @@ -507,6 +507,9 @@ First Position + + Fitted Parameters + Fold Change @@ -1431,6 +1434,9 @@ R Squared + + Relative Standard Error + Sample Dilution Factor diff --git a/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnCaptions.zh-CHS.resx b/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnCaptions.zh-CHS.resx index 130cd6f4624..123a17483df 100644 --- a/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnCaptions.zh-CHS.resx +++ b/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnCaptions.zh-CHS.resx @@ -507,6 +507,9 @@ 第一个位置 + + 拟合参数 + 倍数变化 @@ -1428,6 +1431,9 @@ R 平方 + + 相对标准误差 + 样品稀释因子 diff --git a/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnToolTips.ja.resx b/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnToolTips.ja.resx index 11a9ca8a6fa..4b925fe8063 100644 --- a/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnToolTips.ja.resx +++ b/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnToolTips.ja.resx @@ -495,6 +495,9 @@ ペプチドに含まれるタンパク質シークエンスの最初の(N末端)アミノ酸の位置です。タンパク質シークエンスがない場合には#N/Aとなります。 + + 検量線において、校正データに適合されたパラメータ(例:傾き、切片)の数。 + 倍率変化値。倍率変化とは、対照群の正規化強度に対する治療群の正規化強度の比率です。 @@ -1451,6 +1454,9 @@ 決定係数 + + 相対標準誤差 + 試料が分析される前に希釈される量です。 外部標準の希釈倍率は一般的に1で、不明の試料は、装置の定量可能範囲に収まるようにするため1を上回る倍率で希釈された可能性があります。 diff --git a/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnToolTips.resx b/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnToolTips.resx index 6ec4fefdc7f..6a0abb08490 100644 --- a/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnToolTips.resx +++ b/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnToolTips.resx @@ -514,6 +514,9 @@ to be the Analyte Concentration from the Replicate times the Concentration Multi The position of the first (N-terminal) amino acid of the peptide within its containing protein sequence, or #N/A if no protein sequence is available. + + The number of parameters fitted to calibration data in the calibration curve. + The fold change value. The fold change is the ratio of the normalized intensity of the treatment group to the normalized intensity of the control group. @@ -1547,6 +1550,9 @@ retention score calculator, if one is used (e.g. SSRCalc or iRT score) Coefficient of determination + + Relative Standard Error + The amount by which the sample was diluted before being analyzed. External standards typically have a dilution factor of 1, and unknown samples may have been diluted by a factor greater than 1 in order to bring them into the quantifiable range for the instrument. diff --git a/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnToolTips.zh-CHS.resx b/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnToolTips.zh-CHS.resx index 485185e289b..3ee508ba9d6 100644 --- a/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnToolTips.zh-CHS.resx +++ b/pwiz_tools/Skyline/Model/Databinding/Entities/ColumnToolTips.zh-CHS.resx @@ -514,6 +514,9 @@ 肽段的第一个 (N-末端) 氨基酸在其包含的蛋白质序列中的位置, 如果没有可用的蛋白质序列,则为 #N/A。 + + 校准曲线中拟合至校准数据的参数(例如斜率、截距)数量 + 倍数变化值。倍数变化是试验组的归一化强度与对照组归一化强度的比率。 @@ -1530,6 +1533,9 @@ 测定系数 + + 相对标准误差 + 在分析之前稀释样品的量。 外部标准通常具有 1 的稀释因子,并且未知样品可能已被稀释大于 1 的因子,以使它们进入仪器的可量化范围。 diff --git a/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/CalibrationCurve.cs b/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/CalibrationCurve.cs index 20176ec4f8d..d9fe4ea6a88 100644 --- a/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/CalibrationCurve.cs +++ b/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/CalibrationCurve.cs @@ -32,7 +32,7 @@ public static readonly CalibrationCurve NO_EXTERNAL_STANDARDS public double? GetY(double? x) { - return x == null ? (double?) null : GetY(x.Value); + return x == null ? (double?)null : GetY(x.Value); } public abstract double GetY(double x); @@ -61,6 +61,12 @@ public CalibrationCurveMetrics GetMetrics(IList points) { calibrationCurveRow = calibrationCurveRow.ChangeRSquared(rSquared); } + // Assuming the fields are already populated as needed + double? relStdError = CalculateRelativeStandardError(points, calibrationCurveRow.FittedParameters); + if (relStdError.HasValue) + { + calibrationCurveRow = calibrationCurveRow.ChangeRelativeStandardError(relStdError); + } } return calibrationCurveRow; } @@ -68,6 +74,41 @@ public CalibrationCurveMetrics GetMetrics(IList points) protected abstract CalibrationCurveMetrics CreateCalibrationCurveMetrics(); public abstract override string ToString(); + /// + /// Returns Relative Standard Error (formatted typically as a percent like %RSD). + /// This method uses degrees of freedom (n - p) which depends on the calibration type + /// and which parameters are allowed to be fitted (e.g., intercept forced through 0 or not). + /// + public virtual double? CalculateRelativeStandardError(IList points, int? fittedParameters) + { + if (!fittedParameters.HasValue) + { + return null; + } + List relativeErrors = new List(); + foreach (var point in points) + { + double? xFitted = GetX(point.Y); + if (xFitted.HasValue && point.X != 0 && !double.IsNaN(xFitted.Value)) + { + relativeErrors.Add((xFitted.Value - point.X) / point.X); + } + + } + if (!relativeErrors.Any()) + { + return null; + } + int degreesOfFreedom = relativeErrors.Count - fittedParameters.Value; + if (degreesOfFreedom <= 0) + { + return null; + } + double sumOfSquaresOfResiduals = relativeErrors.Sum(r => r * r); + double relStdError = Math.Sqrt(sumOfSquaresOfResiduals / degreesOfFreedom); + return relStdError; + } + public virtual double? CalculateRSquared(IEnumerable points) { List yValues = new List(); @@ -111,7 +152,11 @@ public override double GetY(double x) protected override CalibrationCurveMetrics CreateCalibrationCurveMetrics() { - return new CalibrationCurveMetrics().ChangeSlope(Slope).ChangeIntercept(Intercept); + + return new CalibrationCurveMetrics() + .ChangeSlope(Slope) + .ChangeIntercept(Intercept) + .ChangeFittedParameters(1 + (Intercept.HasValue ? 1 : 0)); } public override string ToString() @@ -164,8 +209,11 @@ public override double GetY(double x) protected override CalibrationCurveMetrics CreateCalibrationCurveMetrics() { - return new CalibrationCurveMetrics().ChangeIntercept(Intercept).ChangeSlope(Slope) - .ChangeQuadraticCoefficient(QuadraticCoefficient); + return new CalibrationCurveMetrics() + .ChangeIntercept(Intercept) + .ChangeSlope(Slope) + .ChangeQuadraticCoefficient(QuadraticCoefficient) + .ChangeFittedParameters(3); // 2 if intercept forced to 0 } public override string ToString() @@ -213,7 +261,10 @@ public override double GetY(double x) protected override CalibrationCurveMetrics CreateCalibrationCurveMetrics() { - return new CalibrationCurveMetrics().ChangeSlope(Slope).ChangeIntercept(Intercept); + return new CalibrationCurveMetrics() + .ChangeSlope(Slope) + .ChangeIntercept(Intercept) + .ChangeFittedParameters(2); // 1 if intercept forced to 0 } /// @@ -288,8 +339,11 @@ public override double GetY(double x) protected override CalibrationCurveMetrics CreateCalibrationCurveMetrics() { - return new CalibrationCurveMetrics().ChangeSlope(Slope).ChangeIntercept(Intercept) - .ChangeTurningPoint(TurningPoint); + return new CalibrationCurveMetrics() + .ChangeSlope(Slope) + .ChangeIntercept(Intercept) + .ChangeTurningPoint(TurningPoint) + .ChangeFittedParameters(3); // Bilinear turning point counts as fitted parameter } public override string ToString() @@ -323,7 +377,10 @@ public override double GetY(double x) protected override CalibrationCurveMetrics CreateCalibrationCurveMetrics() { - return new CalibrationCurveMetrics().ChangeSlope(Slope).ChangePointCount(0); + return new CalibrationCurveMetrics() + .ChangeSlope(Slope) + .ChangePointCount(0) + .ChangeFittedParameters(1); // slope only } public override string ToString() diff --git a/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/QuantificationStrings.Designer.cs b/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/QuantificationStrings.Designer.cs index fda0683179c..659dec13e73 100644 --- a/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/QuantificationStrings.Designer.cs +++ b/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/QuantificationStrings.Designer.cs @@ -269,6 +269,15 @@ public static string CalibrationForm_DisplayCalibrationCurve_ { return ResourceManager.GetString("CalibrationForm_DisplayCalibrationCurve_", resourceCulture); } } + + /// + /// Looks up a localized string similar to RSE = . + /// + public static string CalibrationForm_DisplayCalibrationCurve_RelativeStandardError { + get { + return ResourceManager.GetString("CalibrationForm_DisplayCalibrationCurve_RelativeStandardError", resourceCulture); + } + } /// /// Looks up a localized string similar to No results available. diff --git a/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/QuantificationStrings.ja.resx b/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/QuantificationStrings.ja.resx index 39dc06217c4..38de8c7957c 100644 --- a/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/QuantificationStrings.ja.resx +++ b/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/QuantificationStrings.ja.resx @@ -358,4 +358,7 @@ {0} ({1}) Example: Standard (MyMolecule) + + RSE = + \ No newline at end of file diff --git a/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/QuantificationStrings.resx b/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/QuantificationStrings.resx index a136ac1616b..6cfff00b24f 100644 --- a/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/QuantificationStrings.resx +++ b/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/QuantificationStrings.resx @@ -358,4 +358,7 @@ {0} ({1}) Example: Standard (MyMolecule) + + RSE = + \ No newline at end of file diff --git a/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/QuantificationStrings.zh-CHS.resx b/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/QuantificationStrings.zh-CHS.resx index c2ecb55f12f..c359e4c9c5e 100644 --- a/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/QuantificationStrings.zh-CHS.resx +++ b/pwiz_tools/Skyline/Model/DocSettings/AbsoluteQuantification/QuantificationStrings.zh-CHS.resx @@ -358,4 +358,7 @@ {0} ({1}) Example: Standard (MyMolecule) + + RSE = + \ No newline at end of file diff --git a/pwiz_tools/Skyline/Model/Hibernate/Formats.cs b/pwiz_tools/Skyline/Model/Hibernate/Formats.cs index cfb67cca490..b8fa520ff02 100644 --- a/pwiz_tools/Skyline/Model/Hibernate/Formats.cs +++ b/pwiz_tools/Skyline/Model/Hibernate/Formats.cs @@ -42,7 +42,7 @@ public static class Formats public const string OneOverK0 = "0.####"; public const string Percent = "0%"; public const string PEAK_SCORE = "0.####"; - + public const string Integer = "0"; public const string IonMobility = "0.###"; public const string CCS = "0.##"; public const string Skewness = "0.###"; diff --git a/pwiz_tools/Skyline/Test/Quantification/CalibrationCurveFitterTest.cs b/pwiz_tools/Skyline/Test/Quantification/CalibrationCurveFitterTest.cs index 87eaed774b9..80cd0158a1c 100644 --- a/pwiz_tools/Skyline/Test/Quantification/CalibrationCurveFitterTest.cs +++ b/pwiz_tools/Skyline/Test/Quantification/CalibrationCurveFitterTest.cs @@ -96,6 +96,9 @@ public void TestMultipointExternalCalibrationWithoutNormalization() var metrics = curveFitter.GetCalibrationCurveMetrics(); Assert.IsNotNull(metrics.Slope); Assert.IsNotNull(metrics.RSquared); + Assert.IsNotNull(metrics.FittedParameters); + Assert.AreEqual(2, metrics.FittedParameters); + Assert.IsNotNull(metrics.RelativeStandardError); double expectedConcentration = calibrationCurve.GetX(expectedY).Value; Assert.AreEqual(expectedConcentration, curveFitter.GetCalculatedXValue(calibrationCurve, iReplicate).GetValueOrDefault(double.NaN), epsilon, msg); @@ -138,6 +141,9 @@ public void TestMultipointExternalCalibrationWithoutIsConcentration() var metrics = curveFitter.GetCalibrationCurveMetrics(); Assert.IsNotNull(metrics.Slope); Assert.IsNotNull(metrics.RSquared); + Assert.IsNotNull(metrics.FittedParameters); + Assert.AreEqual(2, metrics.FittedParameters); + Assert.IsNotNull(metrics.RelativeStandardError); double expectedConcentration = calibrationCurve.GetX(expectedY).Value; Assert.AreEqual(expectedConcentration, curveFitter.GetCalculatedXValue(calibrationCurve, iReplicate).GetValueOrDefault(double.NaN), epsilon, msg); @@ -183,8 +189,11 @@ public void TestMultipointExternalCalibrationWithIsConcentration() var metrics = curveFitter.GetCalibrationCurveMetrics(); Assert.IsNotNull(metrics.Slope); Assert.IsNotNull(metrics.RSquared); - double expectedConcentration = calibrationCurve.GetX(expectedY).Value*internalStandardConcentration; - Assert.AreEqual(expectedConcentration/internalStandardConcentration, + Assert.IsNotNull(metrics.FittedParameters); + Assert.AreEqual(2, metrics.FittedParameters); + Assert.IsNotNull(metrics.RelativeStandardError); + double expectedConcentration = calibrationCurve.GetX(expectedY).Value * internalStandardConcentration; + Assert.AreEqual(expectedConcentration / internalStandardConcentration, curveFitter.GetCalculatedXValue(calibrationCurve, iReplicate).GetValueOrDefault(double.NaN), epsilon, msg); Assert.AreEqual(expectedConcentration, curveFitter.GetCalculatedConcentration(calibrationCurve, iReplicate).GetValueOrDefault(double.NaN), epsilon, msg); @@ -224,6 +233,9 @@ public void TestSinglePointExternalCalibrationWithoutNormalization() var calibrationCurve = curveFitter.GetCalibrationCurve(); var metrics = curveFitter.GetCalibrationCurveMetrics(); Assert.AreEqual(1, metrics.PointCount); + Assert.IsNotNull(metrics.FittedParameters); + Assert.AreEqual(1, metrics.FittedParameters); + Assert.IsNull(metrics.RelativeStandardError); // deg freedom becomes 0 with a single point and we return null var expectedConcentration = expectedY / metrics.Slope.Value; Assert.AreEqual(expectedConcentration, curveFitter.GetCalculatedXValue(calibrationCurve, iReplicate).GetValueOrDefault(double.NaN), epsilon, msg); @@ -269,6 +281,9 @@ public void TestSinglePointExternalCalibrationWithoutIsConcentration() Assert.AreEqual(expectedY, actualY.Value, epsilon, msg); var calibrationCurve = curveFitter.GetCalibrationCurve(); var metrics = curveFitter.GetCalibrationCurveMetrics(); + Assert.IsNotNull(metrics.FittedParameters); + Assert.AreEqual(1, metrics.FittedParameters); + Assert.IsNull(metrics.RelativeStandardError); var expectedConcentration = expectedY / metrics.Slope.Value; Assert.AreEqual(expectedConcentration, curveFitter.GetCalculatedXValue(calibrationCurve, iReplicate).GetValueOrDefault(double.NaN), epsilon, msg); @@ -302,7 +317,7 @@ public void TestSinglePointExternalCalibrationWithIsConcentration() PeptideDocNode peptide = protein.Peptides.First(); peptide = peptide.ChangeInternalStandardConcentration(internalStandardConcentration); CalibrationCurveFitter curveFitter = CalibrationCurveFitter.GetCalibrationCurveFitter(srmDocument, protein, peptide); - Assert.AreEqual(CalibrationCurveFitter.ConcentrationRatioText(IsotopeLabelType.light, IsotopeLabelType.heavy), + Assert.AreEqual(CalibrationCurveFitter.ConcentrationRatioText(IsotopeLabelType.light, IsotopeLabelType.heavy), curveFitter.GetXAxisTitle()); Assert.AreEqual(CalibrationCurveFitter.PeakAreaRatioText(IsotopeLabelType.light, IsotopeLabelType.heavy), curveFitter.GetYAxisTitle()); var chromatograms = srmDocument.Settings.MeasuredResults.Chromatograms; @@ -316,8 +331,11 @@ public void TestSinglePointExternalCalibrationWithIsConcentration() var calibrationCurve = curveFitter.GetCalibrationCurve(); var metrics = curveFitter.GetCalibrationCurveMetrics(); Assert.AreEqual(1, metrics.PointCount); - var expectedConcentration = expectedY*internalStandardConcentration/ metrics.Slope.Value; - Assert.AreEqual(expectedConcentration/internalStandardConcentration, + Assert.IsNotNull(metrics.FittedParameters); + Assert.AreEqual(1, metrics.FittedParameters); + Assert.IsNull(metrics.RelativeStandardError); + var expectedConcentration = expectedY * internalStandardConcentration / metrics.Slope.Value; + Assert.AreEqual(expectedConcentration / internalStandardConcentration, curveFitter.GetCalculatedXValue(calibrationCurve, iReplicate).GetValueOrDefault(double.NaN), epsilon, msg); Assert.AreEqual(expectedConcentration, curveFitter.GetCalculatedConcentration(calibrationCurve, iReplicate).GetValueOrDefault(double.NaN), epsilon, msg); @@ -325,7 +343,7 @@ public void TestSinglePointExternalCalibrationWithIsConcentration() if (Equals(chromatogramSet.SampleType, SampleType.STANDARD) && chromatogramSet.AnalyteConcentration.HasValue) { // Since there was only one standard, the regression line goes exactly through this sample. - Assert.AreEqual(expectedConcentration, chromatogramSet.AnalyteConcentration.Value*peptide.ConcentrationMultiplier.GetValueOrDefault(1.0), epsilon); + Assert.AreEqual(expectedConcentration, chromatogramSet.AnalyteConcentration.Value * peptide.ConcentrationMultiplier.GetValueOrDefault(1.0), epsilon); } } } @@ -345,16 +363,16 @@ public void TestDilutionFactor() .Select(c => c.AnalyteConcentration.HasValue ? c : c.ChangeAnalyteConcentration(10)).ToList())); var baseCurveFitter = CalibrationCurveFitter.GetCalibrationCurveFitter(baseDocument, baseDocument.MoleculeGroups.First(), baseDocument.Molecules.First()); - var baseCurve = (CalibrationCurve.Linear) baseCurveFitter.GetCalibrationCurve(); + var baseCurve = (CalibrationCurve.Linear)baseCurveFitter.GetCalibrationCurve(); // Set the dilution factor of each external standard to 2.0, and each unknown to 3.0 var docWithDilutionFactor = baseDocument.ChangeMeasuredResults( baseDocument.MeasuredResults.ChangeChromatograms(baseDocument.MeasuredResults.Chromatograms.Select( - chrom => Equals(chrom.SampleType, SampleType.STANDARD) ? chrom.ChangeDilutionFactor(2.0) : + chrom => Equals(chrom.SampleType, SampleType.STANDARD) ? chrom.ChangeDilutionFactor(2.0) : chrom.ChangeDilutionFactor(3.0)).ToArray())); var dilutionFactorCurveFitter = CalibrationCurveFitter.GetCalibrationCurveFitter( docWithDilutionFactor, docWithDilutionFactor.MoleculeGroups.First(), docWithDilutionFactor.Molecules.First()); - var dilutionFactorCurve = (CalibrationCurve.Linear) dilutionFactorCurveFitter.GetCalibrationCurve(); + var dilutionFactorCurve = (CalibrationCurve.Linear)dilutionFactorCurveFitter.GetCalibrationCurve(); Assert.AreEqual(2.0 * baseCurve.Slope, dilutionFactorCurve.Slope); Assert.AreEqual(baseCurve.Intercept, dilutionFactorCurve.Intercept); for (int replicateIndex = 0; replicateIndex < baseDocument.MeasuredResults.Chromatograms.Count; replicateIndex++) @@ -423,6 +441,9 @@ public void TestInternalCalibration() var metrics = curveFitter.GetCalibrationCurveMetrics(); Assert.AreEqual(1 / internalStandardConcentration, metrics.Slope); Assert.IsNull(metrics.RSquared); + Assert.IsNotNull(metrics.FittedParameters); + Assert.AreEqual(metrics.FittedParameters, 1); + Assert.IsNull(metrics.RelativeStandardError); Assert.AreEqual(expectedY * internalStandardConcentration, curveFitter.GetCalculatedXValue(calibrationCurve, iReplicate).GetValueOrDefault(double.NaN), epsilon, msg); Assert.AreEqual(expectedY * internalStandardConcentration, @@ -475,13 +496,13 @@ private SrmDocument ChangeQuantificationSettings(SrmDocument srmDocument, Quanti private SrmDocument LoadTestDocument() { using (var stream = - typeof (CalibrationCurveFitterTest).Assembly.GetManifestResourceStream( - typeof (CalibrationCurveFitterTest), + typeof(CalibrationCurveFitterTest).Assembly.GetManifestResourceStream( + typeof(CalibrationCurveFitterTest), "CalibrationCurveFitterTest.sky")) { Assert.IsNotNull(stream); - var serializer = new XmlSerializer(typeof (SrmDocument)); - return (SrmDocument) serializer.Deserialize(stream); + var serializer = new XmlSerializer(typeof(SrmDocument)); + return (SrmDocument)serializer.Deserialize(stream); } } }