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)
Beispiel #2
0
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
Beispiel #4
0
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