void
CS800FpCrdcCalc::CalculateFit()
{
  const int MA=4;
  int i, *ia, iter, itst, j, k, mfit=MA;
  double alamda, chisq, ochisq, *x, *y, *sig, *a, **covar, **alpha;
// give up if we couldn't find any good maximum pad
  if (padmax == 0) {
    x_fit = 0;
    x_chi2 = 0;
    return;
  }
  int lowpad = (int)padmax - (int)fit_width/2;
  int highpad = lowpad + (int)fit_width - 1;
  if (lowpad < 0) {
    lowpad = 0;
    highpad = (int)padmax * 2;
  }
  if (highpad >= CS800_FP_CRDC_CHANNELS) {
    highpad = CS800_FP_CRDC_CHANNELS - 1;
    lowpad = (int)padmax - (CS800_FP_CRDC_CHANNELS - 1 - (int)padmax);
  }
  int NPT = highpad - lowpad + 1;
  a = (double*)malloc((MA+1)*sizeof(double));
  x = (double*)malloc((NPT+1)*sizeof(double));
  y = (double*)malloc((NPT+1)*sizeof(double));
  sig = (double*)malloc((NPT+1)*sizeof(double));
  // fill up array of data
  i = 0;
  int bad = 0;
  for (j=lowpad; j<=highpad; j++) {
    // reject zeros
    if (m_pad->cal[j] == 0) continue;
    // reject bad pads
    bad = 0;
    for (int k=0; k<badpads; k++) {
      if (j == (int)badpad[k]) bad = 1;
    }
    if (bad == 1) continue;
    // otherwise fill in the arrays
    i++;
    x[i] = (double)j;
    y[i] = m_pad->cal[j];
    sig[i] = sqrt(y[i]);
  }
  // reset number of points
  int Npoints = i;
  // forget it if there are too few points
  if (Npoints < MA) {
		free(a);
		free(x);
		free(y);
		free(sig);
    return;
  }
  // guess for fit starting point
  a[1] = m_pad->cal[padmax];
  a[2] = x_gravity;
  a[3] = fit_width/2;
  a[4] = 0;
  if (S800CalculateGaussianFit(x, y, sig, a, mfit, Npoints, &chisq)) {
  // success!
  x_fit = a[2];
  x_chi2 = chisq;
  }
	free(a);
	free(x);
	free(y);
	free(sig);
}
