print removed_points
    print removed_flux

    grid.fluxes = np.delete(values, i, axis=0)
    grid.index = np.delete(points, i, axis=0)

    print len(grid.index)

    starspectrum = Spectrum1D.from_array(dispersion=wavelengths,
                                         flux=removed_flux,
                                         dispersion_unit=u.angstrom,
                                         uncertainty=removed_flux * (1 / 100.))

    interp1 = Interpolate(starspectrum)
    norm1 = Normalize(starspectrum, 2)

    model = grid | interp1 | norm1

    setattr(model, 'teff_0', removed_points[0])
    setattr(model, 'logg_0', removed_points[1])
    setattr(model, 'mh_0', removed_points[2])
    setattr(model, 'alpha_0', removed_points[3])
    '''
    result = mtf.fit_array(starspectrum, model, R_fixed=25000.)

    print result.median

    for a in result.median.keys():
        setattr(model, a, result.median[a])
def sl_response_plot_three(starname,
                           g,
                           specdir='/group/data/nirspec/spectra/',
                           snr=30.,
                           nnorm=2):

    file1 = glob.glob(specdir + starname + '_order34*.dat')
    file2 = glob.glob(specdir + starname + '_order35*.dat')
    file3 = glob.glob(specdir + starname + '_order36*.dat')

    starspectrum34 = read_fits_file.read_nirspec_dat(
        file1, desired_wavelength_units='Angstrom', wave_range=[2.245, 2.275])
    starspectrum34.uncertainty = (
        np.zeros(len(starspectrum34.flux.value)) +
        1.0 / np.float(snr)) * starspectrum34.flux.unit

    starspectrum35 = read_fits_file.read_nirspec_dat(
        file2, desired_wavelength_units='Angstrom', wave_range=[2.181, 2.2103])
    starspectrum35.uncertainty = (
        np.zeros(len(starspectrum35.flux.value)) +
        1.0 / np.float(snr)) * starspectrum35.flux.unit

    starspectrum36 = read_fits_file.read_nirspec_dat(
        file3, desired_wavelength_units='Angstrom', wave_range=[2.1168, 2.145])
    starspectrum36.uncertainty = (
        np.zeros(len(starspectrum36.flux.value)) +
        1.0 / np.float(snr)) * starspectrum36.flux.unit

    interp1 = Interpolate(starspectrum34)
    convolve1 = InstrumentConvolveGrating.from_grid(g, R=24000)
    rot1 = RotationalBroadening.from_grid(g, vrot=np.array([10.0]))
    norm1 = Normalize(starspectrum34, nnorm)

    interp2 = Interpolate(starspectrum35)
    convolve2 = InstrumentConvolveGrating.from_grid(g, R=24000)
    #rot2 = RotationalBroadening.from_grid(g,vrot=np.array([10.0]))
    norm2 = Normalize(starspectrum35, nnorm)

    interp3 = Interpolate(starspectrum36)
    convolve3 = InstrumentConvolveGrating.from_grid(g, R=24000)
    #rot3 = RotationalBroadening.from_grid(g,vrot=np.array([10.0]))
    norm3 = Normalize(starspectrum36, nnorm)


    model = g | rot1 | Splitter3() | DopplerShift(vrad=0) & DopplerShift(vrad=0) & DopplerShift(vrad=0) | \
         convolve1 & convolve2 & convolve3 | interp1 & interp2 & interp3 | \
         norm1 & norm2 & norm3

    h5_files_us = glob.glob(
        '/u/rbentley/metallicity/spectra_fits/masked_fit_results/orders34-35-36-37/masked*.h5'
    )

    cut_lis = []

    for filename in h5_files_us:
        print filename.split('_')
        cut_lis += [(float(filename.split('_')[6]), filename)]

    cut_lis = sorted(cut_lis, key=getKey)

    h5_files = [i[1] for i in cut_lis]

    sl_val = []
    print h5_files
    for filename in h5_files:
        print filename.split('_')[6]
        gc_result = MultiNestResult.from_hdf5(filename)
        print gc_result

        for a in apogee_vals.keys():
            setattr(model, a, apogee_vals[a])

        sl_mh1, sl_mh2, sl_mh3 = mtf.s_lambda_three_order(
            model, 'mh', model.mh_0.value, 0.1)

        w1, f1, w2, f2, w3, f3 = model()
        #combine all sl_mh,w,f, lists

        sl_mh = np.concatenate((sl_mh1, sl_mh2, sl_mh3))

        w = np.concatenate((w1, w2, w3))

        f = np.concatenate((f1, f2, f3))

        starfluxall = np.concatenate(
            (starspectrum34.flux.value, starspectrum35.flux.value,
             starspectrum36.flux.value))

        starwaveall = np.concatenate(
            (starspectrum34.wavelength.value, starspectrum35.wavelength.value,
             starspectrum36.wavelength.value))

        sigma_bounds = gc_result.calculate_sigmas(1)

        sigmas = []

        for a in sigma_bounds.keys():
            print a
            sigmas += [(sigma_bounds[a][1] - sigma_bounds[a][0]) / 2.]

        print sigmas

        abs_sl_mh = []

        mask_sl_f = []
        mask_sl_w = []

        data_sl_f = []

        for i in range(len(sl_mh)):
            abs_sl_mh += [np.abs(sl_mh[i])]
            if abs(sl_mh[i]) < float(filename.split('_')[6]):
                mask_sl_f += [starfluxall[i]]
                mask_sl_w += [starwaveall[i]]
            else:
                data_sl_f += [starfluxall[i]]

        print sigmas
        sl_val += [(float(filename.split('_')[6]), len(mask_sl_f),
                    gc_result.median['vrad_3'], gc_result.median['vrad_4'],
                    gc_result.median['vrad_5'], gc_result.median['logg_0'],
                    gc_result.median['mh_0'], gc_result.median['alpha_0'],
                    gc_result.median['teff_0'], sigmas)]

    print len(starfluxall)
    return sl_val
#g = load_grid('/u/rbentley/metallicity/grids/phoenix_t2500_6000_w22350_22900_R40000_o34.h5') #for order 34

w, f = g()

testspec_w = np.linspace(w[0], w[-1], np.amax(w) - np.amin(w))
testspec_f = np.ones(len(testspec_w))
testspec_u = np.ones(len(testspec_w)) * 0.001
testspec = SKSpectrum1D.from_array(
    wavelength=testspec_w * u.angstrom,
    flux=testspec_f * u.Unit('erg/s/cm^2/angstrom'),
    uncertainty=testspec_u * u.Unit('erg/s/cm^2/angstrom'))

interp1 = Interpolate(starspectrum35)
convolve1 = InstrumentConvolveGrating.from_grid(g, R=24000)
rot1 = RotationalBroadening.from_grid(g, vrot=np.array([10.0]))
norm1 = Normalize(starspectrum35, 2)

# concatenate the spectral grid (which will have the stellar parameters) with other
# model components that you want to fit
model = g | rot1 | DopplerShift(vrad=0.0) | convolve1 | interp1 | norm1

# add likelihood parts
like1 = Chi2Likelihood(starspectrum35)
#like1_l1 = SpectralL1Likelihood(spectrum)

fit_model = model | like1

#print fit_model

#This is the fit itself. gc_result is a set of parameters from the best MultiNest fit to the data.
#This cell takes time to evaluate.
Ejemplo n.º 4
0
def assemble_model(spectral_grid=None,
                   spectrum=None,
                   normalize_parts=None,
                   normalize_npol=None,
                   filter_set=None,
                   mag_type='vega',
                   **kwargs):
    """

    Parameters
    ----------

    spectral_grid: ~specgrid.SpectralGrid
        spectral grid to be used in observation
    spectrum: ~specutils.Spectrum1D
        spectrum to be used for interpolation, if None neither interpolation nor
            will be performed [default None]

    normalize_npol: int
        degree of polynomial to be used for interpolation, only if not None and
        spectrum is not None will the normalization plugin be used [default None]

    plugin_names: ~li st of ~str
        select between the following available plugin choices:
        {stellar_operations}
        {instrument_operations}

    Returns
    -------
        : ~Model
        Model with the requested operations


    """

    parameters = kwargs.copy()

    def assemble_model_part(operations):
        observation_model = None
        for operation in operations:
            if ((filter_set is not None)
                    and (operation.__name__.startswith('CCM89'))):
                continue

            param_values = {}
            for param_name in operation.param_names:
                if param_name in parameters:
                    param_values[param_name] = parameters.pop(param_name)

            if param_values != {}:
                if getattr(operation, 'requires_observed_spectrum', False):
                    param_values['observed'] = spectrum

                if hasattr(operation, 'from_grid'):
                    current_stellar_operation = operation.from_grid(
                        spectral_grid, **param_values)

                else:
                    current_stellar_operation = operation(**param_values)
                if observation_model is None:
                    observation_model = current_stellar_operation
                else:
                    observation_model = (observation_model
                                         | current_stellar_operation)

        return observation_model

    stellar_operations = assemble_model_part(
        StellarOperationModel.__subclasses__())
    spectrograph_operations = assemble_model_part(
        SpectrographOperationModel.__subclasses__())

    if spectrum is not None:
        if spectrograph_operations is None:
            spectrograph_operations = Interpolate(spectrum)
        else:
            spectrograph_operations = (spectrograph_operations
                                       | Interpolate(spectrum))
        if normalize_npol is not None:
            if normalize_parts:
                spectrograph_operations = (
                    spectrograph_operations | NormalizeParts(
                        spectrum, normalize_parts, normalize_npol))
            else:
                spectrograph_operations = (spectrograph_operations | Normalize(
                    spectrum, normalize_npol))

    if filter_set is not None:
        if 'a_v' in kwargs:
            imager_operations = (CCM89Extinction(a_v=parameters.pop('a_v'))
                                 | Photometry.from_grid(spectral_grid,
                                                        filter_set=filter_set,
                                                        mag_type=mag_type))
        else:
            imager_operations = Photometry.from_grid(spectral_grid,
                                                     filter_set=filter_set,
                                                     mag_type=mag_type)
    else:
        imager_operations = None

    if parameters != {}:
        raise ValueError('Given parameters {0} not understood - please do not '
                         'add grid parameters as these are already given by '
                         'the grid'.format(', '.join(list(parameters.keys()))))

    if imager_operations is not None and spectrograph_operations is not None:
        if spectral_grid is not None:
            starkit_model = spectral_grid | stellar_operations
        else:
            starkit_model = stellar_operations
        starkit_model = starkit_model | DoubleSpectrum()
        starkit_model = starkit_model | (spectrograph_operations
                                         & imager_operations)
    elif imager_operations is not None:
        if spectral_grid is not None:
            starkit_model = (spectral_grid | stellar_operations
                             | imager_operations)
        else:
            starkit_model = (stellar_operations | imager_operations)

    elif spectrograph_operations is not None:
        if spectral_grid is not None:
            starkit_model = (spectral_grid | stellar_operations
                             | spectrograph_operations)
        else:
            starkit_model = (stellar_operations | spectrograph_operations)

    else:
        if spectral_grid is not None:
            starkit_model = spectral_grid | stellar_operations
        else:
            starkit_model = stellar_operations

    return starkit_model

    ObservationModel.__class__.fit_parameters = property(
        fit_parameters_property)
    ObservationModel.rename('ObservationModel')

    return ObservationModel
def sl_response_plot_four(starname,
                          g,
                          specdir='/group/data/nirspec/spectra/',
                          snr=30.,
                          nnorm=2):

    file1 = glob.glob(specdir + starname + '_order34*.dat')
    file2 = glob.glob(specdir + starname + '_order35*.dat')
    file3 = glob.glob(specdir + starname + '_order36*.dat')
    file4 = glob.glob(specdir + starname + '_order37*.dat')

    starspectrum34 = read_fits_file.read_nirspec_dat(
        file1, desired_wavelength_units='micron')
    starspectrum35 = read_fits_file.read_nirspec_dat(
        file2, desired_wavelength_units='micron')
    starspectrum36 = read_fits_file.read_nirspec_dat(
        file3, desired_wavelength_units='micron')
    starspectrum37 = read_fits_file.read_nirspec_dat(
        file4, desired_wavelength_units='micron')

    waverange34 = [
        np.amin(starspectrum34.wavelength.value[:970]),
        np.amax(starspectrum34.wavelength.value[:970])
    ]
    waverange35 = [
        np.amin(starspectrum35.wavelength.value[:970]),
        np.amax(starspectrum35.wavelength.value[:970])
    ]
    waverange36 = [
        np.amin(starspectrum36.wavelength.value[:970]),
        np.amax(starspectrum36.wavelength.value[:970])
    ]
    waverange37 = [
        np.amin(starspectrum37.wavelength.value[:970]),
        np.amax(starspectrum37.wavelength.value[:970])
    ]

    starspectrum34 = read_fits_file.read_nirspec_dat(
        file1, desired_wavelength_units='Angstrom', wave_range=waverange34)
    starspectrum34.uncertainty = (
        np.zeros(len(starspectrum34.flux.value)) +
        1.0 / np.float(snr)) * starspectrum34.flux.unit

    starspectrum35 = read_fits_file.read_nirspec_dat(
        file2, desired_wavelength_units='Angstrom', wave_range=waverange35)
    starspectrum35.uncertainty = (
        np.zeros(len(starspectrum35.flux.value)) +
        1.0 / np.float(snr)) * starspectrum35.flux.unit

    starspectrum36 = read_fits_file.read_nirspec_dat(
        file3, desired_wavelength_units='Angstrom', wave_range=waverange36)
    starspectrum36.uncertainty = (
        np.zeros(len(starspectrum36.flux.value)) +
        1.0 / np.float(snr)) * starspectrum36.flux.unit

    starspectrum37 = read_fits_file.read_nirspec_dat(
        file4, desired_wavelength_units='Angstrom', wave_range=waverange37)
    starspectrum37.uncertainty = (
        np.zeros(len(starspectrum37.flux.value)) +
        1.0 / np.float(snr)) * starspectrum37.flux.unit

    interp1 = Interpolate(starspectrum34)
    convolve1 = InstrumentConvolveGrating.from_grid(g, R=24000)
    rot1 = RotationalBroadening.from_grid(g, vrot=np.array([10.0]))
    norm1 = Normalize(starspectrum34, nnorm)

    interp2 = Interpolate(starspectrum35)
    convolve2 = InstrumentConvolveGrating.from_grid(g, R=24000)
    #rot2 = RotationalBroadening.from_grid(g,vrot=np.array([10.0]))
    norm2 = Normalize(starspectrum35, nnorm)

    interp3 = Interpolate(starspectrum36)
    convolve3 = InstrumentConvolveGrating.from_grid(g, R=24000)
    #rot3 = RotationalBroadening.from_grid(g,vrot=np.array([10.0]))
    norm3 = Normalize(starspectrum36, nnorm)

    interp4 = Interpolate(starspectrum37)
    convolve4 = InstrumentConvolveGrating.from_grid(g, R=24000)
    #rot3 = RotationalBroadening.from_grid(g,vrot=np.array([10.0]))
    norm4 = Normalize(starspectrum37, nnorm)



    model = g | rot1 | Splitter4() | DopplerShift(vrad=0) & DopplerShift(vrad=0) & DopplerShift(vrad=0) & DopplerShift(vrad=0) | \
         convolve1 & convolve2 & convolve3 & convolve4 | interp1 & interp2 & interp3 & interp4 | \
         norm1 & norm2 & norm3 & norm4

    h5_files_us = glob.glob(
        '/u/rbentley/metallicity/spectra_fits/masked_fit_results/orders34-35-36-37/masked*'
        + starname + '_order34-37.h5')

    cut_lis = []

    for filename in h5_files_us:
        print filename.split('_')
        cut_lis += [(float(filename.split('_')[6]), filename)]

    cut_lis = sorted(cut_lis, key=getKey)

    h5_files = [i[1] for i in cut_lis]

    sl_val = []

    combined_data_mask_model = {}

    for filename in h5_files:
        print filename
        print filename.split('_')[6]
        gc_result = MultiNestResult.from_hdf5(filename)
        print gc_result

        for a in apogee_vals.keys():
            setattr(model, a, apogee_vals[a])

        w1, f1, w2, f2, w3, f3, w4, f4 = model()

        sl_mh1, sl_mh2, sl_mh3, sl_mh4 = mtf.s_lambda_four_order(
            model, 'mh', model.mh_0.value, 0.1)

        #combine all sl_mh,w,f, lists

        sl_mh = np.concatenate((sl_mh1, sl_mh2, sl_mh3, sl_mh4))

        w = np.concatenate((w1 / (gc_result.median['vrad_3'] / 3e5 + 1.0),
                            w2 / (gc_result.median['vrad_4'] / 3e5 + 1.0),
                            w3 / (gc_result.median['vrad_5'] / 3e5 + 1.0),
                            w4 / (gc_result.median['vrad_6'] / 3e5 + 1.0)))

        f = np.concatenate((f1, f2, f3, f4))

        starfluxall = np.concatenate(
            (starspectrum34.flux.value, starspectrum35.flux.value,
             starspectrum36.flux.value, starspectrum37.flux.value))

        starwaveall = np.concatenate(
            (starspectrum34.wavelength.value /
             (gc_result.median['vrad_3'] / 3e5 + 1.0),
             starspectrum35.wavelength.value /
             (gc_result.median['vrad_4'] / 3e5 + 1.0),
             starspectrum36.wavelength.value /
             (gc_result.median['vrad_5'] / 3e5 + 1.0),
             starspectrum37.wavelength.value /
             (gc_result.median['vrad_6'] / 3e5 + 1.0)))

        sigma_bounds = gc_result.calculate_sigmas(1)

        sigmas = []

        for a in sigma_bounds.keys():
            #print a
            sigmas += [(sigma_bounds[a][1] - sigma_bounds[a][0]) / 2.]

        #print sigmas

        abs_sl_mh = []

        mask_sl_f = []
        mask_sl_w = []

        data_sl_f = []

        for i in range(len(sl_mh)):
            abs_sl_mh += [np.abs(sl_mh[i])]
            if abs(sl_mh[i]) < float(filename.split('_')[6]):
                mask_sl_f += [starfluxall[i]]
                mask_sl_w += [starwaveall[i]]
            else:
                data_sl_f += [starfluxall[i]]

        print sigmas
        combined_data_mask_model.update({
            filename.split('_')[6]: [(starwaveall, starfluxall), (w, f),
                                     (mask_sl_w, mask_sl_f)]
        })
        sl_val += [
            (float(filename.split('_')[6]), len(mask_sl_f),
             gc_result.median['vrad_3'], gc_result.median['vrad_4'],
             gc_result.median['vrad_5'], gc_result.median['vrad_6'],
             gc_result.median['logg_0'], gc_result.median['mh_0'],
             gc_result.median['alpha_0'], gc_result.median['teff_0'], sigmas)
        ]

    print len(starfluxall)
    return sl_val, combined_data_mask_model
Ejemplo n.º 6
0
def plot_multi_order_fit(starname,
                         g=None,
                         savefile=None,
                         specdir='/group/data/nirspec/spectra/',
                         savedir='../nirspec_fits/',
                         snr=30.0,
                         nnorm=2,
                         save_model=False,
                         plot_maximum=False):
    # plot the results of a multiple order fit on observed spectrum.

    file1 = glob.glob(specdir + starname + '_order34*.dat')
    file2 = glob.glob(specdir + starname + '_order35*.dat')
    file3 = glob.glob(specdir + starname + '_order36*.dat')

    if savefile is None:
        savefile = os.path.join(
            savedir, 'unmasked_' + starname + '_order34-36' + like_str + '.h5')
    # restore MultiNest savefile
    result = MultiNestResult.from_hdf5(savefile)

    starspectrum34 = read_fits_file.read_nirspec_dat(
        file1, desired_wavelength_units='Angstrom', wave_range=[2.245, 2.275])
    starspectrum34.uncertainty = (
        np.zeros(len(starspectrum34.flux.value)) +
        1.0 / np.float(snr)) * starspectrum34.flux.unit

    starspectrum35 = read_fits_file.read_nirspec_dat(
        file2, desired_wavelength_units='Angstrom', wave_range=[2.181, 2.2103])
    starspectrum35.uncertainty = (
        np.zeros(len(starspectrum35.flux.value)) +
        1.0 / np.float(snr)) * starspectrum35.flux.unit

    starspectrum36 = read_fits_file.read_nirspec_dat(
        file3, desired_wavelength_units='Angstrom', wave_range=[2.1168, 2.145])
    starspectrum36.uncertainty = (
        np.zeros(len(starspectrum36.flux.value)) +
        1.0 / np.float(snr)) * starspectrum36.flux.unit

    if g is not None:
        interp1 = Interpolate(starspectrum34)
        convolve1 = InstrumentConvolveGrating.from_grid(g, R=24000)
        rot1 = RotationalBroadening.from_grid(g, vrot=np.array([10.0]))
        norm1 = Normalize(starspectrum34, nnorm)

        interp2 = Interpolate(starspectrum35)
        convolve2 = InstrumentConvolveGrating.from_grid(g, R=24000)
        #rot2 = RotationalBroadening.from_grid(g,vrot=np.array([10.0]))
        norm2 = Normalize(starspectrum35, nnorm)

        interp3 = Interpolate(starspectrum36)
        convolve3 = InstrumentConvolveGrating.from_grid(g, R=24000)
        #rot3 = RotationalBroadening.from_grid(g,vrot=np.array([10.0]))
        norm3 = Normalize(starspectrum36, nnorm)


        model = g | rot1 | Splitter3() | DopplerShift(vrad=0) & DopplerShift(vrad=0) & DopplerShift(vrad=0) | \
             convolve1 & convolve2 & convolve3 | interp1 & interp2 & interp3 | \
             norm1 & norm2 & norm3

        if plot_maximum:
            model.teff_0 = result.maximum['teff_0']
            model.logg_0 = result.maximum['logg_0']
            model.mh_0 = result.maximum['mh_0']
            model.alpha_0 = result.maximum['alpha_0']
            model.vrot_1 = result.maximum['vrot_1']
            model.vrad_3 = result.maximum['vrad_3']
            model.vrad_4 = result.maximum['vrad_4']
            model.vrad_5 = result.maximum['vrad_5']
            model.R_6 = result.maximum['R_6']
            model.R_7 = result.maximum['R_7']
            model.R_8 = result.maximum['R_8']
            #model.R_9 = result.median['R_9']

        else:
            model.teff_0 = result.median['teff_0']
            model.logg_0 = result.median['logg_0']
            model.mh_0 = result.median['mh_0']
            model.alpha_0 = result.median['alpha_0']
            model.vrot_1 = result.median['vrot_1']
            model.vrad_3 = result.median['vrad_3']
            model.vrad_4 = result.median['vrad_4']
            model.vrad_5 = result.median['vrad_5']
            model.R_6 = result.median['R_6']
            model.R_7 = result.median['R_7']
            model.R_8 = result.median['R_8']
            #model.R_9 = result.median['R_9']

        w1, f1, w2, f2, w3, f3 = model()

    else:

        file1 = os.path.join(savedir, starname + '_order34_model.txt')
        file2 = os.path.join(savedir, starname + '_order35_model.txt')
        file3 = os.path.join(savedir, starname + '_order36_model.txt')

        w1, f1 = np.loadtxt(file1, usecols=(0, 1), unpack=True)
        w2, f2 = np.loadtxt(file2, usecols=(0, 1), unpack=True)
        w3, f3 = np.loadtxt(file3, usecols=(0, 1), unpack=True)

    # teff_0      3363.211996
    # logg_0         1.691725
    # mh_0           0.936003
    # alpha_0       -0.027917
    # vrot_1         1.378488
    # vrad_3      -538.550269
    # vrad_4      -239.851862
    # vrad_5      -541.044943
    # vrad_6      -540.432821
    # R_7        20000.000000
    # R_8        20000.000000
    # R_9        20000.000000
    # R_10       20000.000000

    plt.clf()
    observed_wave = (starspectrum36.wavelength, starspectrum35.wavelength,
                     starspectrum34.wavelength)
    observed_flux = (starspectrum36.flux, starspectrum35.flux,
                     starspectrum34.flux)
    model_wave = (w3, w2, w1)
    model_flux = (f3, f2, f1)
    max_result = result.maximum
    vels = (max_result['vrad_5'], max_result['vrad_4'], max_result['vrad_3'])

    print 'maximum likelihood:'
    print max_result

    print 'median:'
    print result.median

    print '1 sigma:'
    print result.calculate_sigmas(1)

    for i in xrange(len(observed_wave)):
        plt.subplot(4, 1, i + 1)
        velfac = 1.0 / (vels[i] / 3e5 + 1.0)
        xwave = observed_wave[i] * velfac
        plt.plot(xwave, observed_flux[i])
        plt.plot(model_wave[i] * velfac, model_flux[i])
        plt.ylim(0.2, 1.2)
        plt.xlabel('Wavelength (Angstrom)')
        plt.ylabel('Flux')
        plt.xlim(np.min(xwave.value), np.max(xwave.value))
        plotlines.oplotlines(angstrom=True,
                             arcturus=True,
                             alpha=0.5,
                             molecules=False,
                             size=12)

    plt.tight_layout()
    plt.show()
    if save_model:
        comment1 = 'teff %f,logg %f,mh %f,alpha %f,vrot %f,vrad %f,R %f' % \
                   (model.teff_0.value,model.logg_0.value,model.mh_0.value,model.alpha_0.value,
                   model.vrot_1.value,model.vrad_3.value,model.R_6.value)
        comment2 = 'teff %f,logg %f,mh %f,alpha %f,vrot %f,vrad %f,R %f' % \
                   (model.teff_0.value,model.logg_0.value,model.mh_0.value,model.alpha_0.value,
                   model.vrot_1.value,model.vrad_4.value,model.R_7.value)
        comment3 = 'teff %f,logg %f,mh %f,alpha %f,vrot %f,vrad %f,R %f' % \
                   (model.teff_0.value,model.logg_0.value,model.mh_0.value,model.alpha_0.value,
                   model.vrot_1.value,model.vrad_5.value,model.R_8.value)

        file1 = os.path.join(savedir, starname + '_order34_model.txt')
        file2 = os.path.join(savedir, starname + '_order35_model.txt')
        file3 = os.path.join(savedir, starname + '_order36_model.txt')

        write_spectrum.write_txt(w1, f1, file1, comments=comment1)
        write_spectrum.write_txt(w2, f2, file2, comments=comment2)
        write_spectrum.write_txt(w3, f3, file3, comments=comment3)
Ejemplo n.º 7
0
def fit_star_multi_order(starname,
                         g,
                         specdir='/group/data/nirspec/spectra/',
                         savedir='../nirspec_fits/',
                         snr=30.0,
                         nnorm=2,
                         teff_range=[2500, 6000],
                         vrad_range=[-600, 600],
                         logg_range=[0., 4.5],
                         mh_range=[-2., 1.0],
                         vrot_range=[0, 20],
                         R=40000,
                         verbose=True,
                         alpha_range=[-1., 1.],
                         r_range=[15000.0, 40000.0],
                         R_fixed=None,
                         logg_fixed=None,
                         l1norm=False):

    # fit a spectrum of a star with multiple orders that can have different velocities
    file1 = glob.glob(specdir + starname + '_order34*.dat')
    file2 = glob.glob(specdir + starname + '_order35*.dat')
    file3 = glob.glob(specdir + starname + '_order36*.dat')

    starspectrum34 = read_fits_file.read_nirspec_dat(
        file1, desired_wavelength_units='Angstrom', wave_range=[2.245, 2.275])
    starspectrum34.uncertainty = (
        np.zeros(len(starspectrum34.flux.value)) +
        1.0 / np.float(snr)) * starspectrum34.flux.unit

    starspectrum35 = read_fits_file.read_nirspec_dat(
        file2, desired_wavelength_units='Angstrom', wave_range=[2.181, 2.2103])
    starspectrum35.uncertainty = (
        np.zeros(len(starspectrum35.flux.value)) +
        1.0 / np.float(snr)) * starspectrum35.flux.unit

    starspectrum36 = read_fits_file.read_nirspec_dat(
        file3, desired_wavelength_units='Angstrom', wave_range=[2.1168, 2.145])
    starspectrum36.uncertainty = (
        np.zeros(len(starspectrum36.flux.value)) +
        1.0 / np.float(snr)) * starspectrum36.flux.unit

    interp1 = Interpolate(starspectrum34)
    convolve1 = InstrumentConvolveGrating.from_grid(g, R=24000)
    rot1 = RotationalBroadening.from_grid(g, vrot=np.array([10.0]))
    norm1 = Normalize(starspectrum34, nnorm)

    interp2 = Interpolate(starspectrum35)
    convolve2 = InstrumentConvolveGrating.from_grid(g, R=24000)
    #rot2 = RotationalBroadening.from_grid(g,vrot=np.array([10.0]))
    norm2 = Normalize(starspectrum35, nnorm)

    interp3 = Interpolate(starspectrum36)
    convolve3 = InstrumentConvolveGrating.from_grid(g, R=24000)
    #rot3 = RotationalBroadening.from_grid(g,vrot=np.array([10.0]))
    norm3 = Normalize(starspectrum36, nnorm)



    model = g | rot1 | Splitter3() | DopplerShift(vrad=0) & DopplerShift(vrad=0) & DopplerShift(vrad=0) | \
         convolve1 & convolve2 & convolve3 | interp1 & interp2 & interp3 | \
         norm1 & norm2 & norm3

    w1, f1, w2, f2, w3, f3 = model()

    plt.clf()
    plt.plot(w1, f1)
    plt.plot(starspectrum34.wavelength, starspectrum34.flux)
    plt.plot(w2, f2)
    plt.plot(starspectrum35.wavelength, starspectrum35.flux)

    plt.plot(w3, f3)
    plt.plot(starspectrum36.wavelength, starspectrum36.flux)

    # likelihoods
    if l1norm:
        like1 = L1Likelihood(starspectrum34)
        like2 = L1Likelihood(starspectrum35)
        like3 = L1Likelihood(starspectrum36)

    else:
        like1 = Chi2Likelihood(starspectrum34)
        like2 = Chi2Likelihood(starspectrum35)
        like3 = Chi2Likelihood(starspectrum36)

    fit_model = model | like1 & like2 & like3 | Combiner3()
    print fit_model.__class__
    print fit_model()

    teff_prior = priors.UniformPrior(*teff_range)
    if logg_fixed is not None:
        logg_prior = priors.FixedPrior(logg_fixed)
    else:
        logg_prior = priors.UniformPrior(*logg_range)
    mh_prior = priors.UniformPrior(*mh_range)
    alpha_prior = priors.UniformPrior(*alpha_range)
    vrot_prior = priors.UniformPrior(*vrot_range)
    vrad_prior1 = priors.UniformPrior(*vrad_range)
    vrad_prior2 = priors.UniformPrior(*vrad_range)
    vrad_prior3 = priors.UniformPrior(*vrad_range)

    # R_prior1 = priors.FixedPrior(R)
    # R_prior2 = priors.FixedPrior(R)
    # R_prior3 = priors.FixedPrior(R)
    # R_prior4 = priors.FixedPrior(R)

    if R_fixed is not None:
        R_prior1 = priors.FixedPrior(R_fixed)
        R_prior2 = priors.FixedPrior(R_fixed)
        R_prior3 = priors.FixedPrior(R_fixed)
    else:
        R_prior1 = priors.UniformPrior(*r_range)
        R_prior2 = priors.UniformPrior(*r_range)
        R_prior3 = priors.UniformPrior(*r_range)

    fitobj = MultiNest(fit_model, [teff_prior, logg_prior, mh_prior, alpha_prior, vrot_prior, \
             vrad_prior1,vrad_prior2,vrad_prior3,R_prior1,R_prior2,\
             R_prior3])

    fitobj.run(verbose=verbose,
               importance_nested_sampling=False,
               n_live_points=400)
    result = fitobj.result

    if l1norm:
        like_str = '_l1norm'
    else:
        like_str = ''
    result.to_hdf(
        os.path.join(savedir, 'unmasked_' + starname + '_order34-36' +
                     like_str + '.h5'))
    print result.calculate_sigmas(1)
    print result.median

    # save the individual model spectra with the max posterior value
    model.teff_0 = result.maximum['teff_0']
    model.logg_0 = result.maximum['logg_0']
    model.mh_0 = result.maximum['mh_0']
    model.alpha_0 = result.maximum['alpha_0']
    model.vrot_1 = result.maximum['vrot_1']
    model.vrad_3 = result.maximum['vrad_3']
    model.vrad_4 = result.maximum['vrad_4']
    model.vrad_5 = result.maximum['vrad_5']
    model.R_7 = result.maximum['R_6']
    model.R_8 = result.maximum['R_7']
    model.R_9 = result.maximum['R_8']

    w1, f1, w2, f2, w3, f3 = model()

    comment1 = 'teff %f,logg %f,mh %f,alpha %f,vrot %f,vrad %f,R %f' % \
               (model.teff_0.value,model.logg_0.value,model.mh_0.value,model.alpha_0.value,
               model.vrot_1.value,model.vrad_3.value,model.R_7.value)
    comment2 = 'teff %f,logg %f,mh %f,alpha %f,vrot %f,vrad %f,R %f' % \
               (model.teff_0.value,model.logg_0.value,model.mh_0.value,model.alpha_0.value,
               model.vrot_1.value,model.vrad_4.value,model.R_8.value)
    comment3 = 'teff %f,logg %f,mh %f,alpha %f,vrot %f,vrad %f,R %f' % \
               (model.teff_0.value,model.logg_0.value,model.mh_0.value,model.alpha_0.value,
               model.vrot_1.value,model.vrad_5.value,model.R_9.value)

    file1 = os.path.join(savedir, starname + '_order34_model.txt')
    file2 = os.path.join(savedir, starname + '_order35_model.txt')
    file3 = os.path.join(savedir, starname + '_order36_model.txt')

    write_spectrum.write_txt(w1, f1, file1, comments=comment1)
    write_spectrum.write_txt(w2, f2, file2, comments=comment2)
    write_spectrum.write_txt(w3, f3, file3, comments=comment3)
Ejemplo n.º 8
0
# load the BOSZ grid. Do this only ONCE!! It takes a long time and lots of memory
g = load_grid('/u/rbentley/metallicity/spectra_fits/phoenix_t2500_6000_w20000_24000_R40000.h5')#'/u/rbentley/metallicity/spectra_fits/test_bosz_t2500_6000_w20000_24000_R40000.h5')
print 'grid loaded'






interp1 = Interpolate(starspectrum35)
print 'interpolated'
convolve1 = InstrumentConvolveGrating.from_grid(g,R=24000)
print 'convolved'
rot1 = RotationalBroadening.from_grid(g,vrot=np.array([10.0]))
print 'rot broadend'
norm1 = Normalize(starspectrum35,2)
print 'normalized'
# concatenate the spectral grid (which will have the stellar parameters) with other
# model components that you want to fit
model = g | rot1 |DopplerShift(vrad=radv)| convolve1 | interp1 | norm1
print 'model concaten'



w,f = model()

#plt.plot(w,f)
    
model.teff_0 = teff
model.logg_0 = logg
model.mh_0 = mh
Ejemplo n.º 9
0
def fit(input_file,
        spectrum=None,
        teff_prior=[10000.0, 35000.0],
        logg_prior=[2.0, 5.0],
        mh_prior=[-1.0, 0.8],
        alpha_prior=[-0.25, 0.5],
        vrot_prior=[0, 350.0],
        vrad_prior=[-5000, 5000],
        R_prior=4000.0,
        wave_range=None,
        outdir='./',
        snr=30.0,
        norm_order=2,
        g=None,
        molecfit=False,
        wavelength_units='micron',
        debug=False,
        **kwargs):
    '''
    Given a fits file, read in and fit the spectrum using a grid
    
    Passes keyword arguements into read_fits_file using **kwargs
    '''

    if g is None:
        print('need to input grid in g keyword')
        return 0
    teff_prior1 = priors.UniformPrior(teff_prior[0], teff_prior[1])
    logg_prior1 = priors.UniformPrior(logg_prior[0], logg_prior[1])
    mh_prior1 = priors.UniformPrior(-1.0, 0.8)
    alpha_prior1 = priors.UniformPrior(-0.25, 0.5)
    vrot_prior1 = priors.UniformPrior(0, 350.0)
    vrad_prior1 = priors.UniformPrior(-5000, 5000)
    #R_prior1 = priors.UniformPrior(1500,10000)
    R_prior1 = priors.FixedPrior(R_prior)

    # wavelength range for the fit
    #wave_range = None
    file_part = os.path.splitext(os.path.split(input_file)[-1])[0]
    file_part = os.path.join(outdir, file_part)
    extension = os.path.splitext(input_file)[-1]
    spectrum_file = file_part + extension
    fit_file = file_part + '.h5'
    plot_file = file_part + '.pdf'
    corner_file = file_part + '_corner.pdf'
    model_file = file_part + '_model.txt'  # best fit model

    print('copying file from %s to %s' % (input_file, spectrum_file))
    shutil.copyfile(input_file, spectrum_file)

    # read in the spectrum and set the uncertainty as 1/SNR
    if spectrum is None:
        if molecfit:
            spectrum = read_fits_file.read_txt_file(
                spectrum_file,
                desired_wavelength_units=wavelength_units,
                wave_range=wave_range,
                molecfit=True)
        else:

            if (extension == '.csv') or (extension == '.txt'):
                if extension == '.csv':
                    delimiter = ','
                else:
                    delimiter = None
                spectrum = read_fits_file.read_txt_file(
                    spectrum_file,
                    desired_wavelength_units='angstrom',
                    delimiter=delimiter,
                    wave_range=wave_range,
                    wavelength_units=wavelength_units,
                    **kwargs)
            else:
                spectrum = read_fits_file.read_fits_file(
                    spectrum_file,
                    desired_wavelength_units='angstrom',
                    wavelength_units=wavelength_units,
                    wave_range=wave_range)
        spectrum.uncertainty = np.zeros(len(spectrum.flux)) + 1.0 / snr

    # setup the model
    interp1 = Interpolate(spectrum)
    convolve1 = InstrumentConvolveGrating.from_grid(g, R=R_prior)
    rot1 = RotationalBroadening.from_grid(g, vrot=np.array([10.0]))
    norm1 = Normalize(spectrum, norm_order)

    model = g | rot1 | DopplerShift(vrad=0) | convolve1 | interp1 | norm1

    # add likelihood parts
    like1 = Chi2Likelihood(spectrum)
    #like1_l1 = SpectralL1Likelihood(spectrum)

    fit_model = model | like1

    fitobj = MultiNest(fit_model, [
        teff_prior1, logg_prior1, mh_prior1, alpha_prior1, vrot_prior1,
        vrad_prior1, R_prior1
    ])
    fitobj.run(verbose=debug)

    result = fitobj.result
    logging.info('saving results to: ' + fit_file)
    result.to_hdf(fit_file)

    # print some of the results into the log
    m = result.maximum
    sig = result.calculate_sigmas(1)
    for k in sig.keys():
        print('%s\t %f\t %f\t %f\t %f' % (k, m[k], sig[k][0], sig[k][1],
                                          (sig[k][1] - sig[k][0]) / 2.0))
    # evaluating the model
    model.teff_0 = result.maximum.teff_0
    model.logg_0 = result.maximum.logg_0
    model.mh_0 = result.maximum.mh_0
    model.vrot_1 = result.maximum.vrot_1
    model.vrad_2 = result.maximum.vrad_2
    model.R_3 = result.maximum.R_3

    model_wave, model_flux = model()
    logging.info('saving model spectrum to: ' + model_file)
    save_spectrum(model_wave, model_flux, model_file)

    plt.figure(figsize=(12, 6))
    plt.plot(model_wave, model_flux, label='Best Fit Model')
    plt.plot(spectrum.wavelength, spectrum.flux, label='Data')
    plt.ylim(
        np.nanmin(spectrum.flux.value) - 0.2,
        np.nanmax(spectrum.flux.value) + 0.2)
    plt.xlabel('Wavelength (Angstrom)')
    plt.ylabel('Flux')
    plt.title(spectrum_file)
    plt.legend()
    plt.savefig(plot_file)

    result.plot_triangle(
        parameters=['teff_0', 'logg_0', 'mh_0', 'alpha_0', 'vrot_1', 'vrad_2'])
    logging.info('saving corner plot to: ' + corner_file)
    plt.savefig(corner_file)

    # try to free up memory
    fitobj = 0
    fit_model = 0
    return result
#g = load_grid('/u/rbentley/metallicity/grids/phoenix_t2500_6000_w22350_22900_R40000_o34.h5') #for order 34

w, f = g()

testspec_w = np.linspace(w[0], w[-1], np.amax(w) - np.amin(w))
testspec_f = np.ones(len(testspec_w))
testspec_u = np.ones(len(testspec_w)) * 0.001
testspec = SKSpectrum1D.from_array(
    wavelength=testspec_w * u.angstrom,
    flux=testspec_f * u.Unit('erg/s/cm^2/angstrom'),
    uncertainty=testspec_u * u.Unit('erg/s/cm^2/angstrom'))

interp1 = Interpolate(starspectrum35)
convolve1 = InstrumentConvolveGrating.from_grid(g, R=24000)
rot1 = RotationalBroadening.from_grid(g, vrot=np.array([10.0]))
norm1 = Normalize(starspectrum35, 2)

# concatenate the spectral grid (which will have the stellar parameters) with other
# model components that you want to fit
model = g | rot1 | DopplerShift(vrad=0.0) | convolve1 | interp1 | norm1

# add likelihood parts
like1 = Chi2Likelihood(starspectrum35)
#like1_l1 = SpectralL1Likelihood(spectrum)

fit_model = model | like1

#print fit_model

#This is the fit itself. gc_result is a set of parameters from the best MultiNest fit to the data.
#This cell takes time to evaluate.