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

    lines = ar_h_lines

    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, alpha, sinbeta, gamma, delta], pix)
    spec = np.median(data[pos-3:pos+3, :], axis=0)

    [xs, sxs, sigmas] = find_peaks(ll, spec, lines)

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

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

    return (params[1], params[2], params[3], params[4],
            np.median(deltas), np.std(deltas), pixel, sigmas)
def dofit(xs, slambdas, lines, alpha, sinbeta, gamma, delta, band):
    xs = np.array(xs)
    ok = np.isfinite(slambdas)
    lsf = Fit.do_fit_wavelengths(xs[ok], lines[ok], alpha, sinbeta, 
            gamma, delta, band, error=slambdas[ok])
    (order, 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)

    pix = np.arange(2048.)
    ll = Fit.wavelength_model(lsf.params, pix)

    return [np.abs((
        Fit.wavelength_model(lsf.params, xs[ok]) - lines[ok]))*1e4, 
            lsf.params]
    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]
    def do_fits(params, pos, dy):
        (alpha, sinbeta, gamma, delta) = params[1:]
        thispos = pos - dy
        yposs.append(thispos)
        spec = np.median(data[thispos-3:thispos+3, :], axis=0)
        ll = Fit.wavelength_model(params, pix)

        [xs, sxs, sigmas] = find_peaks(ll, spec, lines)
        slambdas = d/order * np.array(sxs)

        [deltas, params] = dofit(xs, slambdas, lines, alpha, sinbeta,
                gamma, delta, band)
        results.append(np.array(params))
        resdelt.append(deltas)
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)