def plotMgb(spectrum_array, template, ax, teff, logg, feh, vsini=12, vshift=0): spec = [] for order in range(len(spectrum_array)): if max(spectrum_array[order][:, 0]) > 5100 and min( spectrum_array[order][:, 0]) < 5300: print order spec_normed = spectrum_array[order].copy() #spec_normed[:,1] = normalise(spec_normed[:,1],niter=5,sigma_low = 0.05,deg=5) spec_normed = normalise_with_template(spec_normed, template.copy(), vsini=vsini, vshift=vshift) plt.plot(spec_normed[:, 0], spec_normed[:, 1], color="b", lw=2) template_mask = template[:, 0] > 5000 template_mask *= template[:, 0] < 5400 vaxis = template[:, 0][template_mask] vaxis = c * (vaxis - median(vaxis)) / vaxis vprof = spectype.make_rot_prof(vaxis, vsini=vsini, epsilon=0.5, scale=1, vshift=vshift) vprof = spectype.vgauss(vaxis, vprof, macro=13.04 / 2.355, scale=1) vprof /= sum(vprof) template_f = convolve(template[:, 1][template_mask], vprof, mode="same") plt.plot(template[:, 0][template_mask], template_f, color="r") plt.xlim(5100, 5300) plt.ylim(0.02, 1.2) [i.set_linewidth(2.) for i in ax.spines.itervalues()] plt.xlabel("Wavelength $(\AA)$", fontsize=15, weight="black") plt.text(0.99, 0.05, "$v\sin i = " + str(round(vsini, 1)) + "$ km/s", transform=ax.transAxes, ha="right", fontsize=14) plt.text(0.99, 0.2, "$T_\mathrm{eff} = " + str(teff) + "$ K", transform=ax.transAxes, ha="right", fontsize=14) plt.text(0.99, 0.15, "$\log g = " + str(logg) + "$", transform=ax.transAxes, ha="right", fontsize=14) plt.text(0.99, 0.1, "[Fe/H]$ = " + str(feh) + "$", transform=ax.transAxes, ha="right", fontsize=14)
def measure_telluric_rv(spectrum, stellar_template, vsini, vshift): spectrum_hdulist = pyfits.open(spectrum) stellar_template = loadtxt(stellar_template) template = loadtxt("transmission.dat") template[:, 0] *= 10. epos = 0 for order in range(0, len(spectrum_hdulist[0].data)): try: wave = spectrum_hdulist[5].data[order][20:-20] flux = spectrum_hdulist[0].data[order][20:-20] except IndexError: wave = spectrum_hdulist[3].data[order][20:-20] flux = spectrum_hdulist[0].data[order][20:-20] if min(wave) < 6270 and max(wave) > 6330: mask = wave > 6270 mask *= wave < 6330 vel = arange(-300, 300, 0.01) lsd_interp = spectype.make_rot_prof(vel, vsini=vsini, scale=1., vshift=vshift) lsd_interp = spectype.vgauss(vel, lsd_interp, macro=13.04 / 2.355, scale=1.) lsd_interp = transpose(array([vel, lsd_interp])) #epos,drv,cc = cross_correlate_order(wave[mask],flux[mask],template,ap=10) #print epos flux = remove_stellar_template(stellar_template, transpose(array([wave, flux])), lsd_interp) #runlsd(transpose(array([wave,flux])),template) #sys.exit() epos, drv, cc = cross_correlate_order(wave, flux, template, ap=10) # print "telluric rv",epos # plt.plot(drv,cc) # plt.axvline(x=epos) # plt.show() break return epos
def normalise_with_template(spectrum, template, vsini=10, vshift=0): spectrum[:, 1] = normalise(spectrum[:, 1], deg=5) template_mask = template[:, 0] > min(spectrum[:, 0]) - 10 template_mask *= template[:, 0] < max(spectrum[:, 0]) + 10 template = template[template_mask] vaxis = template[:, 0] vaxis = c * (vaxis - median(vaxis)) / vaxis if vsini < 1: vsini = 1. vprof = spectype.make_rot_prof(vaxis, vsini=vsini, epsilon=0.5, scale=1, vshift=vshift) vprof = spectype.vgauss(vaxis, vprof, macro=13.04 / 2.355, scale=1) vprof /= sum(vprof) template[:, 1] = convolve(template[:, 1], vprof, mode="same") ### Now fit template continuum to spectrum fit = interpolate.splrep(template[:, 0], template[:, 1]) fit = interpolate.splev(spectrum[:, 0], fit) diff = spectrum[:, 1] / fit mask = diff - median(diff) < 1 mask *= diff - median(diff) > -1 fit = polyfit(spectrum[:, 0][mask], diff[mask], 20) fit = polyval(fit, spectrum[:, 0]) spectrum[:, 1] /= fit return spectrum
def measure_telluric_rv(spectrum,stellar_template,vsini,vshift): spectrum_hdulist = pyfits.open(spectrum) stellar_template = loadtxt(stellar_template) template = loadtxt("transmission.dat") template[:,0] *= 10. epos = 0 for order in range(1,len(spectrum_hdulist[0].data)): #s = read_spec.read_spec(spectrum,order=order)[20:-20] #wave,flux = s[:,0],s[:,1] wave = spectrum_hdulist[0].data[order,:,0][20:-20] flux = spectrum_hdulist[0].data[order,:,2][20:-20] mask = flux != flux flux[mask] = 1 if min(wave) < 6270 and max(wave) > 6320: mask = wave > 6270 mask *= wave < 6320 vel = arange(-300,300,0.01) lsd_interp = spectype.make_rot_prof(vel,vsini=vsini,scale=1.,vshift=vshift) lsd_interp = spectype.vgauss(vel,lsd_interp,macro=5.66/2.355,scale=1.) lsd_interp = transpose(array([vel,lsd_interp])) #epos,drv,cc = cross_correlate_order(wave[mask],flux[mask],template,ap=10) #print epos flux = remove_stellar_template(stellar_template,transpose(array([wave,flux])),lsd_interp) ccf = runlsd(transpose(array([wave,flux])),template) ccfmask = abs(ccf[:,0]) < 60 ccf = ccf[ccfmask] ccfmask = abs(ccf[:,0]) > 30 fit = polyfit(ccf[:,0][ccfmask],ccf[:,1][ccfmask],1) fit = polyval(fit,ccf[:,0]) ccf[:,1] -= fit # plt.plot(ccf[:,0],ccf[:,1]) # plt.show() x0 = spectype.fitlsd_mcmc(ccf,vsini_init=12.0,nrun=500) epos = x0[2] #runlsd(transpose(array([wave,flux])),template) #sys.exit() #epos,drv,cc = cross_correlate_order(wave,flux,template,ap=10) # print "telluric rv",epos # plt.plot(drv,cc) # plt.axvline(x=epos) # plt.show() break return epos