def fit_spec(data, pos, alpha, sinbeta, gamma, delta, band):
    global DRAW
    ar_h_lines = np.array([1.465435, 1.474317, 1.505062, 1.517684, 1.530607, 
        1.533334, 1.540685, 1.590403, 1.599386, 1.618444, 1.644107,
        1.674465, 1.744967, 1.791961])

    Ar_K_lines = np.array([1.982291, 1.997118, 2.032256, 2.057443, 
        2.062186, 2.099184, 2.133871, 2.15409, 2.204558, 2.208321,
        2.313952, 2.385154])

    Ne_J_lines = np.array([1.149125, 1.16719, 1.17227, 1.194655, 1.202994, 
        1.211564, 1.214306, 1.234677, 1.240622, 1.244273, 1.249108,
        1.27369, 1.280624, 1.296021, 1.301182, 1.321761, 1.327627,
        1.331685, 1.337077, 1.341026, 1.350788, 1.362638])

    Ne_J_lines = np.array([1.149125, 1.16719, 1.117227])

    AR_Y_lines = np.array([0.966043, 0.978718, 1.005481, 1.04809,
        1.067649, 1.07039, 1.088394, 1.110819])

    # NeAr H (1961, 1949)
    lines = np.array([1.465435, 1.474317, 1.505062, 1.517684, 1.530607, 
        1.533334, 1.540685, 1.590403, 1.599386, 1.618444, 1.644107,
        1.674465, 1.744967, 1.791961, \
        1.493386, 1.499041, 1.523487, 1.5352384, 1.5411803, 1.5608478,
        1.6027147, 1.6272797, 1.6409737, 1.6479254, 1.6793378,
        1.7166622])

    lines = np.array([ 1.540685, 1.5411803])


    lines.sort()

    bmap = {"Y": 6, "J": 5, "H": 4, "K": 3}
    order = bmap[band]
    d = 1e3/110.5
    pix = np.arange(2048.)

    ll = Fit.wavelength_model([order, pos, alpha, sinbeta, gamma, delta], pix)

    spec = np.median(data[pos-1:pos+1, :], axis=0)
    if DRAW:
        pl.figure(2)
        pl.clf()
        pl.figure(3)
        pl.clf()
        pl.figure(1)
        pl.clf()
        pl.plot(ll, spec, '-+')
        for lam in lines:
            pl.axvline(lam, color='r')


        pl.title("Pixel pos: %i"%  pos)
        pl.figure(2)
        pl.clf()

    xs = []
    sxs = []
    pks = []
    rats = []
    for lam in lines:
        f = 0.9985
        roi = (f*lam < ll) & (ll < lam/f)

        if not roi.any(): 
            xs.append(0.0)
            sxs.append(np.inf)
            continue

        #lsf = Fit.mpfitpeak(pix[roi], spec[roi], 
         #   error=np.sqrt(np.abs(spec[roi])))


        lsf = Fit.mpfitpeak(pix[roi], spec[roi],
            error=np.sqrt(np.abs(spec[roi])))

        print lsf.params[2], lsf.params[1]
        print "LSF"

        pl.figure(6)
        pl.clf()
        pl.scatter(pix[roi], spec[roi])
        pl.plot(pix[roi], Fit.gaussian(lsf.params, pix[roi]))


        lsf = Fit.mpfitpeaks(pix[roi], spec[roi], 2,
            error=np.sqrt(np.abs(spec[roi])))

        print lsf.params[2], lsf.params[6], lsf.params[8]
        print "LSF"

        pl.figure(5)
        pl.clf()
        pl.scatter(pix[roi], spec[roi])
        pl.plot(pix[roi], Fit.multi_gaussian(lsf.params, pix[roi]))
    
        if lsf.perror is None:
            xs.append(0.0)
            sxs.append(np.inf)
            continue

        if lsf.status < 0:
            xs.append(0.0)
            sxs.append(np.inf)
            continue

        mnpix = np.min(pix[roi])
        mxpix = np.max(pix[roi])

        if (mnpix + 4) > lsf.params[1] < (mxpix-4):
            xs.append(0.0)
            sxs.append(np.inf)
            continue

        if mnpix < 7:
            xs.append(0.0)
            sxs.append(np.inf)
            continue

        if mxpix > 2040:
            xs.append(0.)
            sxs.append(np.inf)
            continue

        #if DRAW:
        if DRAW:
            pl.plot(pix[roi], spec[roi])
            pl.plot(pix[roi], spec[roi], 'o')
            pl.plot(pix[roi], Fit.gaussian(lsf.params, pix[roi]), 'r--')

        xval = lsf.params[1]
        xvals = lsf.perror[1]
        xs.append(xval)
        sxs.append(xvals)

        if DRAW: 
            if np.isfinite(xvals):
                pl.axvline(xval)

    if DRAW:
        pl.draw()

    def dofit(xs, slambdas, alpha, sinbeta, gamma, delta, band, y):
        xs = np.array(xs)
        ok = np.isfinite(slambdas)
        lsf = Fit.do_fit_wavelengths(xs[ok], lines[ok], alpha, sinbeta, 
                gamma, delta, band, y, error=slambdas[ok])
        (order, pixel_y, alpha, sinbeta, gamma, delta) = lsf.params

        print "order alpha    sinbeta   gamma  delta"
        print "%1.0i %5.7f %3.5f %3.2e %5.2f" % (order, alpha, sinbeta, 
                gamma, delta)

        ll = Fit.wavelength_model(lsf.params, pix)
        if DRAW:
            pl.figure(3)
            pl.clf()
            pl.plot(ll, spec)
            pl.title("Pixel %4.4f" % pos)
            for lam in lines:
                pl.axvline(lam, color='r')

            pl.draw()
    
        return [np.abs((
            Fit.wavelength_model(lsf.params, xs[ok]) - lines[ok]))*1e4, 
                lsf.params]

    slambdas = d/order * np.array(sxs)

    [deltas, params] = dofit(xs, slambdas, alpha, sinbeta, gamma, delta,
            band)

    if 0.4 < np.median(deltas) < 0.8:
        prev = np.median(deltas)
        [deltas, params] = dofit(xs, slambdas, params[1], params[2], 
                params[3], params[4], band)
        print "Previous MAD: %f is now %f" % (prev, np.median(deltas))

    return (params[1], params[2], params[3], params[4],
            np.median(deltas), np.std(deltas), pixel)
def fit_spec(data, pos, alpha, beta):
    global DRAW
    lines = np.array([1.49339, 1.49904, 1.51442, 1.51950, 1.52349, 1.53524, 
        1.54118,  1.6027, 1.62728, 1.64097, 1.71666])

    order = 4
    d = 1e3/110.5
    pix = np.arange(2048.)

    ll = alpha * d/order * (np.sin(18./(250e3) * pix) + np.radians(beta))

    spec = np.median(data[pos-3:pos+3, :], axis=0)
    if DRAW:
        pl.figure(2)
        pl.clf()
        pl.figure(3)
        pl.clf()
        pl.figure(1)
        pl.clf()
        pl.plot(ll, spec, '-+')
        for lam in lines:
            pl.axvline(lam, color='r')


        pl.title("Pixel pos: %i"%  pos)
        pl.figure(2)
        pl.clf()

    xs = []
    sxs = []
    pks = []
    rats = []
    for lam in lines:
        roi = ((lam-.002) < ll) & (ll < (lam+0.002))

        if not roi.any(): 
            xs.append(0.0)
            sxs.append(np.inf)
            continue

        lsf = Fit.mpfitpeak(pix[roi], spec[roi], 
            error=np.sqrt(np.abs(spec[roi])))
    
        if lsf.perror is None:
            xs.append(0.0)
            sxs.append(np.inf)
            continue

        if lsf.status < 0:
            xs.append(0.0)
            sxs.append(np.inf)
            continue

        #if DRAW:
        if False:
            pl.plot(pix[roi], spec[roi])
            pl.plot(pix[roi], spec[roi], 'o')
            pl.plot(pix[roi], Fit.gaussian(lsf.params, pix[roi]), 'r--')

        xs.append(lsf.params[1])
        sxs.append(lsf.perror[1])

        if False: 
            pl.axvline(lsf.params[1])

    if DRAW:
        pl.draw()

    def dofit(xs, sxs, alpha, beta, band):
        xs = np.array(xs)
        sxs = np.array(sxs)/1000.
        lsf = Fit.do_fit_wavelengths(xs, lines, alpha, beta, band, error=sxs)
        (order, alpha, beta, gamma, delta) = lsf.params

        print "alpha    beta   gamma  delta"
        print "%5.7f %3.5f %3.2e %5.2f" % (alpha, beta, gamma, delta)

        ll = Fit.wavelength_model(lsf.params, pix)
        if False:
            pl.figure(3)
            pl.clf()
            pl.plot(ll, spec)
            pl.title("Pixel %4.4f" % pos)
            for lam in lines:
                pl.axvline(lam, color='r')

            pl.draw()
    
        return [np.abs((Fit.wavelength_model(lsf.params, xs) - lines))/lines, 
                lsf.params]

    [delta, params] = dofit(xs, sxs, alpha, beta, 'H')
    return (params[1], params[2], np.median(delta), np.std(delta), pixel)