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)