      subroutine linreg( x, y, sigma, N, a_fit, sig_a, yy, chisqr )
      integer*4 N
      real*8 x(N), y(N), sigma(N), a_fit(2), sig_a(2)
      real*8 yy(N), chisqr
! Function to perform linear regression (fit a line)
! Inputs
!   x       Independent variable
!   y       Dependent variable
!   sigma   Estimated error in y
!   N       Number of data points
! Outputs
!   a_fit   Fit parameters; a(1) is intercept, a(2) is slope
!   sig_a   Estimated error in the parameters a()
!   yy      Curve fit to the data
!   chisqr  Chi squared statistic

      integer*4 i
      real*8 sigmaTerm, s, sx, sy, sxy, sxx, denom, delta

      !* Evaluate various sigma sums
      s = 0.0
      sx = 0.0
      sy = 0.0
      sxy = 0.0
      sxx = 0.0
      do i=1,N
        sigmaTerm = 1.0/sigma(i)**2
        s = s + sigmaTerm
        sx = sx + x(i) * sigmaTerm
        sy = sy + y(i) * sigmaTerm
        sxy = sxy + x(i) * y(i) * sigmaTerm
        sxx = sxx + x(i) * x(i) * sigmaTerm
      enddo
      denom = s*sxx - sx*sx

      !* Compute intercept a_fit(1) and slope a_fit(2)
      a_fit(1) = (sxx*sy - sx*sxy)/denom
      a_fit(2) = (s*sxy - sx*sy)/denom

      !* Compute error bars for intercept and slope
      sig_a(1) = sqrt(sxx/denom)
      sig_a(2) = sqrt(s/denom)

      !* Evaluate curve fit at each data point and compute Chi^2
      chisqr = 0.0
      do i=1,N
        yy(i) = a_fit(1)+a_fit(2)*x(i)     ! Curve fit to the data
        delta = (y(i)-yy(i))/sigma(i)
        chisqr = chisqr + delta**2         ! Chi square
      enddo
      return
      end

