public double?GetLimitOfQuantification(CalibrationCurve calibrationCurve) { if (!QuantificationSettings.MaxLoqBias.HasValue && !QuantificationSettings.MaxLoqCv.HasValue) { return(null); } var concentrationReplicateLookup = GetStandardConcentrations().ToLookup(entry => entry.Value, entry => entry.Key); foreach (var concentrationReplicate in concentrationReplicateLookup.OrderBy(grouping => grouping.Key)) { var peakAreas = new List <double>(); foreach (var replicateIndex in concentrationReplicate) { double?peakArea = GetNormalizedPeakArea(replicateIndex); if (peakArea.HasValue) { peakAreas.Add(peakArea.Value); } } if (QuantificationSettings.MaxLoqCv.HasValue) { double cv = peakAreas.StandardDeviation() / peakAreas.Mean(); if (double.IsNaN(cv) || double.IsInfinity(cv)) { continue; } if (cv * 100 > QuantificationSettings.MaxLoqCv) { continue; } } if (QuantificationSettings.MaxLoqBias.HasValue) { if (calibrationCurve == null) { continue; } double meanPeakArea = peakAreas.Mean(); double?backCalculatedConcentration = GetConcentrationFromXValue(calibrationCurve.GetFittedX(meanPeakArea)); if (!backCalculatedConcentration.HasValue) { continue; } double bias = (concentrationReplicate.Key - backCalculatedConcentration.Value) / concentrationReplicate.Key; if (double.IsNaN(bias) || double.IsInfinity(bias)) { continue; } if (Math.Abs(bias * 10) > QuantificationSettings.MaxLoqBias.Value) { continue; } } return(concentrationReplicate.Key); } return(null); }
public static double?BlankPlusSdMultiple(CalibrationCurve calibrationCurve, CalibrationCurveFitter fitter, double sdMultiple) { List <double> blankPeakAreas = new List <double>(); var measuredResults = fitter.SrmSettings.MeasuredResults; if (measuredResults == null) { return(null); } for (int iReplicate = 0; iReplicate < measuredResults.Chromatograms.Count; iReplicate++) { var chromatogramSet = measuredResults.Chromatograms[iReplicate]; if (!SampleType.BLANK.Equals(chromatogramSet.SampleType)) { continue; } double?peakArea = fitter.GetNormalizedPeakArea(new CalibrationPoint(iReplicate, null)); if (!peakArea.HasValue) { continue; } blankPeakAreas.Add(peakArea.Value); } if (!blankPeakAreas.Any()) { return(null); } double meanPlusSd = blankPeakAreas.Mean(); if (sdMultiple != 0) { meanPlusSd = blankPeakAreas.StandardDeviation() * sdMultiple; } if (double.IsNaN(meanPlusSd) || double.IsInfinity(meanPlusSd)) { return(null); } return(calibrationCurve.GetFittedX(meanPlusSd)); }