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);