public TOFFitResults FitTOF(TOF t) { TOFFitResults results = new TOFFitResults(); double[] coefficients = new double[4]; // guess some reasonable values coefficients[0] = t.Data[0]; coefficients[1] = ArrayOperation.GetMax(t.Data) - coefficients[0]; double lastT = t.Times[t.Times.Length - 1]; coefficients[2] = (t.Times[0] + lastT) / 2; coefficients[3] = (lastT - t.Times[0]) / 5; double mse = 0; // this is totally tedious! double[] times = new double[t.Times.Length]; for (int i = 0; i < t.Times.Length; i++) { times[i] = (double)t.Times[i]; } CurveFit.NonLinearFit(times, t.Data, new ModelFunctionCallback(gaussian), coefficients, out mse, 1000000); results.Background = coefficients[0]; results.Amplitude = coefficients[1]; results.Centre = coefficients[2]; results.Width = Math.Abs(coefficients[3]); return(results); }
public static double[] FitLorenzianToSlaveData(CavityScanData data, double limitLow, double limitHigh) { double mse = 0; double[] voltages = data.parameters.CalculateRampVoltages(); double[] coefficients = new double[] { (data.parameters.High - data.parameters.Low) / 10, voltages[ArrayOperation.GetIndexOfMax(data.SlavePhotodiodeData)], ArrayOperation.GetMax(data.SlavePhotodiodeData) - ArrayOperation.GetMin(data.SlavePhotodiodeData), 0 }; CurveFit.NonLinearFit(voltages, data.SlavePhotodiodeData, new ModelFunctionCallback(lorentzianNarrow), coefficients, out mse, 4000); fitFailSafe(coefficients, limitLow, limitHigh); return(coefficients); }