public override void DoSensitivityAnalysis(GrowthCurve GD, ArrayPlot AP) { this.GD = GD; if (GD.ExpModelFitted && GD.ODValues.Max() > .08) { double current = GD.GrowthRate.GrowthRate; double MaxAllowed = 1.2 * current; double MinAllowed = .8 * current; double BaseGrowthRate = GD.ExpFit.GrowthRate; Measurements = (GD.TimeValues_As_Double.Zip(GD.ODValues, (time, od) => new Measurement() { ODValue = od, Time = time })).ToList(); TrimCurve(); double[,] Array = new double[Measurements.Count, Measurements.Count]; double value = Double.NaN; for (int i = 0; i < Measurements.Count; i++) { Array[i, i] = Double.NaN; for (int j = (i + 1); j < Measurements.Count; j++) { var Fit = from b in Enumerable.Range(i, (j - i + 1)) select Measurements[b]; double[] times = (from b in Fit select b.Time).ToArray(); double[] ods = (from b in Fit select b.ODValue).ToArray(); value = CalculateGrowthRate(times, ods); if (value <MinAllowed | value> MaxAllowed) { value = Double.NaN; } else { ods = ods.Select(x => x + BiasToAdd).ToArray(); double newFit = CalculateGrowthRate(times, ods); value = newFit - value; } Array[i, j] = value; Array[j, i] = Double.NaN; } } string[] rowNames = (from x in Measurements select x.ODValue.ToString("g2")).ToArray(); string[] colNames = Enumerable.Range(0, rowNames.Length).Select(x => x % 2 == 0 ? rowNames[x] : "").ToArray(); AP.SetMatrixForPlotting(Array, rowNames, colNames); } else { AP.SetMatrixForPlotting(new double[10, 10]); } }
public abstract void DoSensitivityAnalysis(GrowthCurve GD, ArrayPlot AP);