def fitspec(): s=read_fits.read_fits_spectrum1d('E5_1_004.fits',dispersion_unit='Angstrom') wave_range = [21000,24000] good = np.where((s.wavelength.value > wave_range[0]) & (s.wavelength.value < wave_range[1]))[0] s = Spectrum1D.from_array(s.wavelength[good],s.flux[good]/np.median(s.flux[good]), dispersion_unit = s.wavelength.unit) snr = 40 s.uncertainty = (np.zeros(len(s.flux.value))+1.0/snr)*s.flux.unit #g=load_grid('phoenix_20000_k.h5') g = load_grid('phoenix_r20000_1.9-2.5_k.h5') my_model = assemble_model(g, vrad=0, vrot=0,R=20000,spectrum=s,normalize_npol=4) wave,flux = my_model() plt.clf() plt.plot(s.wavelength,s.flux) plt.plot(wave,flux) teff_prior = priors.UniformPrior(3000,8000) logg_prior = priors.UniformPrior(0.0,4.4) mh_prior = priors.UniformPrior(-1.5,1.0) alpha_prior = priors.UniformPrior(-0.2,1.2) vrot_prior = priors.UniformPrior(0,20) vrad_prior = priors.UniformPrior(-300,300) R_prior = priors.GaussianPrior(5400,600) ll = Chi2Likelihood(s) my_model = my_model | ll fitobj = MultiNest(my_model, [teff_prior, logg_prior, mh_prior, alpha_prior, vrot_prior, vrad_prior, R_prior]) result = fitobj.run() return result
def get_grid( gridfile='/u/tdo/research/metallicity/grids/bosz_grid_high_temp.h5'): ''' Return a grid object so that the grid only needs to be loaded once. ''' return load_grid(gridfile)
def fitwrapper_sens_masking_three_order_phoe(starname): # cal_star = 'NGC6819_J19413439+4017482' spec_path = '/u/ghezgroup/data/metallicity/nirspec/spectra/' save_path = '/u/rbentley/metallicity/spectra_fits/masked_fit_results/orders34-35-36/' # mod = load_grid('/u/rbentley/metallicity/grids/apogee_bosz_t3500_7000_w20000_24000_R25000.h5') mod = load_grid( '/u/rbentley/metallicity/grids/phoenix_t2500_6000_w20000_24000_R40000.h5' ) # for sl_cut in np.concatenate((np.arange(0.1,0.5,0.1),np.linspace(0.5,10.,20),np.arange(15.,60.,5))): for sl_cut in [ 0. ]: # np.concatenate((np.arange(60.,120.,15),np.arange(120.,390,45),np.arange(0.1,0.5,0.1),np.linspace(0.5,10.,20),np.arange(15.,60.,5))): print "Starting fit with cut at ", sl_cut mtf.fit_star_three_orders_sens_masked(starname, 'mh', mod, 'phoenix', sl_cut, specdir=spec_path, savedir=save_path, R_fixed=24000., nirspec_upgrade=True)
def fitwrapper_sens_masking_one_order(starname): #cal_star = 'NGC6819_J19413439+4017482' spec_path = '/u/ghezgroup/data/metallicity/nirspec/spectra/' save_path = '/u/rbentley/metallicity/spectra_fits/masked_fit_results/order36/' mod = load_grid( '/u/rbentley/metallicity/grids/apogee_bosz_t3600_7000_w21000_23000_R25000.h5' ) #for sl_cut in np.concatenate((np.arange(0.1,0.5,0.1),np.linspace(0.5,10.,20),np.arange(15.,60.,5))): for sl_cut in [ 0. ]: #np.concatenate((np.arange(60.,120.,15),np.arange(120.,390,45),np.arange(0.1,0.5,0.1),np.linspace(0.5,10.,20),np.arange(15.,60.,5))): print "Starting fit with cut at ", sl_cut mtf.fit_star_one_order_sens_masked(starname, 'mh', mod, sl_cut, specdir=spec_path, savedir=save_path, teff_range=[3600, 6000], logg_range=[0., 4.5], mh_range=[-1., 0.5], R_fixed=24000., vrot_fixed=0.0)
def test_load_grid(): #h5grid = load_grid('phoenix_20000_hk.h5') h5grid = load_grid('phoenix_r20000_1.9-2.5_k.h5') h5grid.teff = 5770 h5grid.logg = 4.44 h5grid.mh = 0.0 h5grid.alpha = 0.0
def fitwrapper_fe_lines_masking_three_order(starname): # cal_star = 'NGC6819_J19413439+4017482' spec_path = '/u/ghezgroup/data/metallicity/nirspec/spectra/' save_path = '/u/rbentley/metallicity/spectra_fits/masked_fit_results/orders34-35-36/' mod = load_grid( '/u/rbentley/metallicity/grids/bosz_t3500_7000_w20000_24000_R25000.h5') mtf.fit_star_three_orders_fe_lines(starname, mod, 'bosz', specdir=spec_path, savedir=save_path, R_fixed=24000., adderr=True, nirspec_upgrade=False)
def fitwrapper_res_masking_three_order(starname): spec_path = '/u/ghezgroup/data/metallicity/nirspec/spectra/' save_path = '/u/rbentley/metallicity/spectra_fits/masked_fit_results/orders34-35-36/' # mod = load_grid('/u/rbentley/metallicity/grids/phoenix_t2500_6000_w20000_24000_R40000.h5') mod = load_grid( '/u/rbentley/metallicity/grids/bosz_t3500_7000_w20000_24000_R25000.h5') # for sl_cut in np.concatenate((np.arange(0.1,0.5,0.1),np.linspace(0.5,10.,20),np.arange(15.,60.,5))): for res_cut in np.arange( 0.025, 0.2, 0.025 ): # np.concatenate((np.arange(60.,120.,15),np.arange(120.,390,45),np.arange(0.1,0.5,0.1),np.linspace(0.5,10.,20),np.arange(15.,60.,5))): print "Starting fit with cut at ", res_cut mtf.fit_star_three_orders_residual_masked(starname, mod, 'bosz', res_cut, specdir=spec_path, savedir=save_path, R_fixed=24000.)
def fitwrapper_sens_masking_four_order_non_mh_params(starname): #cal_star = 'NGC6819_J19413439+4017482' spec_path = '/u/ghezgroup/data/metallicity/nirspec/spectra/' save_path = '/u/rbentley/metallicity/spectra_fits/masked_fit_results/orders34-35-36-37/' mod = load_grid( '/u/rbentley/metallicity/grids/apogee_bosz_t3500_7000_w20000_24000_R25000.h5' ) #for sl_cut in np.concatenate((np.arange(0.1,0.5,0.1),np.linspace(0.5,10.,20),np.arange(15.,60.,5))): for sl_cut in [ 6.0 ]: #np.concatenate((np.arange(60.,120.,15),np.arange(120.,390,45),np.arange(0.1,0.5,0.1),np.linspace(0.5,10.,20),np.arange(15.,60.,5))): print "Starting fit with cut at ", sl_cut, ' teff ' + starname mtf.fit_star_four_orders_sens_masked(starname, 'teff', mod, sl_cut, specdir=spec_path, savedir=save_path, R_fixed=24000.) print "Starting fit with cut at ", sl_cut, ' logg ' + starname mtf.fit_star_four_orders_sens_masked(starname, 'logg', mod, sl_cut, specdir=spec_path, savedir=save_path, R_fixed=24000.) print "Starting fit with cut at ", sl_cut, ' alpha ' + starname mtf.fit_star_four_orders_sens_masked(starname, 'alpha', mod, sl_cut, specdir=spec_path, savedir=save_path, R_fixed=24000.)
def fitwrapper_masking_four_order_nirspec_upgrade(starname): spec_path = '/u/ghezgroup/data/metallicity/nirspec/spectra/' save_path = '/u/rbentley/metallicity/spectra_fits/masked_fit_results/orders34-35-36-37/' mod = load_grid( '/u/rbentley/metallicity/grids/phoenix_t2500_6000_w20000_24000_R40000.h5' ) #for sl_cut in np.concatenate((np.arange(0.1,0.5,0.1),np.linspace(0.5,10.,20),np.arange(15.,60.,5))): for sl_cut in [ 0 ]: #np.concatenate((np.arange(60.,120.,15),np.arange(120.,390,45),np.arange(0.1,0.5,0.1),np.linspace(0.5,10.,20),np.arange(15.,60.,5))): print "Starting fit with cut at ", sl_cut mtf.fit_star_four_orders_sens_masked(starname, 'mh', mod, sl_cut, specdir=spec_path, savedir=save_path, R_fixed=24000., nirspec_upgrade=True, nsdrp_snr=True)
snr = mt.get_snr(starname, order) print snr starspectrumall = read_fits_file.read_nirspec_dat(testspec_path,desired_wavelength_units='micron') #waverange = [np.amin(starspectrumall.wavelength.value[:970]), np.amax(starspectrumall.wavelength.value[:970])] waverange = [np.amin(starspectrumall.wavelength.value[:970]), np.amax(starspectrumall.wavelength.value[:970])] starspectrum35 = read_fits_file.read_nirspec_dat(testspec_path,desired_wavelength_units='Angstrom', wave_range=waverange) starspectrum35.uncertainty = (np.zeros(len(starspectrum35.flux.value))+1.0/np.float(snr))*starspectrum35.flux.unit print testspec_path #g = load_grid('/u/rbentley/metallicity/grids/phoenix_t2000_6000_w21500_22220_R40000_o35.h5') #for order 35 g = load_grid('/u/rbentley/metallicity/grids/phoenix_t2500_6000_w22350_22900_R40000_o34.h5') #for order 34 w,f = g() 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
def load_full_grid(): g = load_grid( '/u/rbentley/metallicity/grids/phoenix_t2500_6000_w20000_24000_R40000.h5' ) return g
#waverange = [np.amin(starspectrumall.wavelength.value[:970]), np.amax(starspectrumall.wavelength.value[:970])] waverange = [ np.amin(starspectrumall.wavelength.value[:970]), np.amax(starspectrumall.wavelength.value[:970]) ] starspectrum35 = read_fits_file.read_nirspec_dat( testspec_path, desired_wavelength_units='Angstrom', wave_range=waverange) starspectrum35.uncertainty = (np.zeros(len(starspectrum35.flux.value)) + 1.0 / np.float(snr)) * starspectrum35.flux.unit print testspec_path #g = load_grid('/u/rbentley/metallicity/grids/phoenix_t2000_6000_w21500_22220_R40000_o35.h5') #for order 35 #g = load_grid('/u/rbentley/metallicity/grids/phoenix_t2500_6000_w22350_22900_R40000_o34.h5') #for order 34 g = load_grid( '/u/rbentley/metallicity/grids/phoenix_t2500_6000_w21000_21600_R40000_o36.h5' ) 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]))
ngc6819_517 = 'NGC6819_J19411+4010517' m5_0208 = 'M5 J15190+0208' ngc6791_202 = 'NGC6791_J19213390+3750202' ngc6819_482 = 'NGC6819_J19413439+4017482' m71_021 = 'M71_J19534827+1848021' tyc_3544 = 'TYC 3544' m18113 = '2MJ18113-30441' phoenix = load_grid( '/u/rbentley/metallicity/grids/phoenix_t2500_6000_w20000_24000_R40000.h5') bosz = load_grid( '/u/ghezgroup/data/metallicity/nirspec/grids/bosz_t3500_7000_w20000_24000_R50000.h5' ) gc_stars = [ 'NE_1_001', 'NE_1_002', 'NE_1_003', 'E7_1_001', 'E7_2_001', 'E7_1_002', 'E7_1_003', 'N2_1_001', 'E5_1_001', 'N2_1_002', 'N2_1_003', 'S1-23' ] cal_stars = [ 'NGC6791_J19205+3748282', 'NGC6819_J19411+4010517', 'M5 J15190+0208', 'NGC6791_J19213390+3750202', 'NGC6819_J19413439+4017482', 'M71_J19534827+1848021', 'TYC 3544' ] fire_stars = ['HD176704', 'HD191584', 'HD221148', 'N6583_46']
snr = float(53.663) starspectrumall = read_fits_file.read_nirspec_dat(file2,desired_wavelength_units='micron') waverange = [np.amin(starspectrumall.wavelength.value[:970]), np.amax(starspectrumall.wavelength.value[:970])] starspectrum35 = read_fits_file.read_nirspec_dat(file2,desired_wavelength_units='Angstrom', wave_range=waverange) starspectrum35.uncertainty = (np.zeros(len(starspectrum35.flux.value))+1.0/np.float(snr))*starspectrum35.flux.unit savefile = os.path.join(savedir,starname+'order'+order+'_phoenixr40000.h5') print 'here 1 in file' # 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'
starspectrum_flux = np.concatenate( (starspectrum_flux, single_order_spec.flux.value[::-1])) starspectrum_wavelength = np.concatenate( (starspectrum_wavelength, single_order_spec.wavelength.value[::-1])) #print allorders_path #starspectrum = read_fits_file.read_nirspec_dat(allorders_path,desired_wavelength_units='Angstrom', # wave_range=waveranges) starspectrum = Spectrum1D.from_array(dispersion=starspectrum_wavelength, flux=starspectrum_flux, dispersion_unit=u.angstrom, uncertainty=starspectrum_uncert) g = load_grid( '/u/rbentley/metallicity/grids/phoenix_t2500_6000_w20000_24000_R40000.h5') w, f = g() print len(starspectrum.flux.value) interp1 = Interpolate(starspectrum) convolve1 = InstrumentConvolveGrating.from_grid(g, R=24000) rot1 = RotationalBroadening.from_grid(g, vrot=np.array([10.0])) norm1 = Normalize(starspectrum, 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(starspectrum) #like1_l1 = SpectralL1Likelihood(spectrum)
testspec_path, desired_wavelength_units='micron') #waverange = [np.amin(starspectrumall.wavelength.value[:970]), np.amax(starspectrumall.wavelength.value[:970])] waverange = [ np.amin(starspectrumall.wavelength.value[:970]), np.amax(starspectrumall.wavelength.value[:970]) ] starspectrum35 = read_fits_file.read_nirspec_dat( testspec_path, desired_wavelength_units='Angstrom', wave_range=waverange) starspectrum35.uncertainty = (np.zeros(len(starspectrum35.flux.value)) + 1.0 / np.float(snr)) * starspectrum35.flux.unit print testspec_path g = load_grid( '/u/rbentley/metallicity/grids/phoenix_t2000_6000_w21500_22220_R40000_o35.h5' ) #for order 35 #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)
import numpy as np from matplotlib import pyplot as plt from specutils import Spectrum1D, rvmeasure import astropy.units as u from astropy.modeling import models, fitting from astropy.modeling import Model import matplotlib.pyplot as plt from specutils import read_fits_file, plotlines, write_spectrum import multi_order_fitting_functions as mtf def closest(lst, K): return lst[min(range(len(lst)), key=lambda i: abs(lst[i] - K))] grid = load_grid( '/u/rbentley/metallicity/grids/bosz_t3500_7000_w20000_24000_R25000.h5') points, values, wavelengths = grid.index.copy(), grid.fluxes.value.copy( ), grid.wavelength.value.copy() idx = np.where(np.all(points == np.array([3500., 0.0, -1.25, 0.0]), axis=1))[0] idx2 = np.where(np.all(points == np.array([3500., 0.0, -0.75, 0.0]), axis=1))[0] k = open( '/u/rbentley/starkit_interpol_residuals/bosz_eq_widths_wider_range.dat', 'w') k.write( 'teff\tlogg\t[M/H]\t[alpha/Fe]\tSi22078 EW\tSi22078 cont\tSi21378 EW\tSi21378 cont\tS22574 EW\tSi22574 cont\tFe22469 EW\tFe22469 cont\tFe22479 EW\tFe22479 cont\tFe22500 EW\tFe22500 cont\n' )
starspectrum35 = read_fits_file.read_nirspec_dat(testspec_path,desired_wavelength_units='Angstrom', wave_range=waverange) starspectrum35.uncertainty = (np.zeros(len(starspectrum35.flux.value))+1.0/np.float(snr))*starspectrum35.flux.unit h5_files_us = glob.glob('/u/rbentley/metallicity/spectra_fits/masked_fit_results/order36/*.h5') sl_val = [] mask_len = [] vrad = [] if float(order) == 36.: g = load_grid('/u/rbentley/metallicity/grids/phoenix_t2500_6000_w21000_21600_R40000_o36.h5') #for order 36 elif float(order) == 35.: g = load_grid('/u/rbentley/metallicity/grids/phoenix_t2000_6000_w21500_22220_R40000_o35.h5') #for order 35 elif float(order) == 34.: g = load_grid('/u/rbentley/metallicity/grids/phoenix_t2500_6000_w22350_22900_R40000_o34.h5') #for order 34 else: print "Need to code in that order" exit() interp1 = Interpolate(starspectrum35) convolve1 = InstrumentConvolveGrating.from_grid(g,R=24000) rot1 = RotationalBroadening.from_grid(g,vrot=np.array([10.0]))