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)