def plot_spectrum(rms_data,input_spectrum): print "Plotting ",input_spectrum rms_data = functions.read_ascii(rms_data) rms_data = functions.read_table(rms_data) rms_data = transpose(rms_data) ### Find min for i in range(len(rms_data[0])): if rms_data[3][i] == min(rms_data[3]): teff_min = rms_data[0][i] logg_min = rms_data[1][i] feh_min = rms_data[2][i] break print teff_min,logg_min,feh_min,min(rms_data[3]) teff_list = [] logg_list = [] rms_list = [] for i in range(len(rms_data[0])): if rms_data[2][i] == feh_min: teff_list.append(rms_data[0][i]) logg_list.append(rms_data[1][i]) rms_list.append(rms_data[3][i]) ### Create 2D space teff_space = arange(min(teff_list),max(teff_list)+250,250) logg_space = arange(min(logg_list),max(logg_list)+0.5,0.5) rms_space = zeros([len(teff_space),len(logg_space)]) for i in range(len(rms_list)): x_index = int((teff_list[i] - min(teff_list)) / 250.) y_index = int((logg_list[i] - min(logg_list)) / 0.5) rms_space[x_index,y_index] = rms_list[i] ### Crop 2D space to perform gaussian fit for min teff_space_cropped,logg_space_cropped,rms_space_cropped=spectype_functions.chop_array(teff_space,logg_space,transpose(rms_space),teff_min,logg_min,250,0.5) rms_space_cropped = -1*(rms_space_cropped - rms_space_cropped.max()) print rms_space_cropped try: gauss_fit = spectype_functions.fitgaussian(rms_space_cropped) teff_min_fit = min(teff_space_cropped) + gauss_fit[2] * 250 logg_min_fit = min(logg_space_cropped) + gauss_fit[1] * 0.5 except TypeError: print "Bad gaussian fit, using abs min" teff_min_fit = teff_min logg_min_fit = logg_min if teff_min_fit < 3500: teff_min_fit = 3500 if teff_min_fit > 9000: teff_min_fit = 9000 if logg_min_fit < 0.0: logg_min_fit = 0.0 if logg_min_fit > 5.0: logg_min_fit = 5.0 teff_min = int(spectype_functions.round_value(teff_min_fit,250.)) logg_min = spectype_functions.round_value(logg_min_fit,0.5) print teff_min,logg_min ### Plot teff_logg space plt.figure(figsize=(7,5)) plt.subplot(211) plt.title(object_name+" "+file_name+" "+str(int(round(teff_min_fit,0)))+" "+str(round(logg_min_fit,1))+" "+str(feh_min)+" \n RMS="+str(round(min(rms_data[3]),4))) v_min = min(rms_list) v_max = min(rms_list)+((max(rms_list)-min(rms_list))/3.) #v_max = max(rms_list) rms_space = clip(rms_space,v_min,v_max) cm = matplotlib.cm.get_cmap('jet') sc = plt.contourf(teff_space,logg_space,transpose(rms_space),100,cmap=cm) #sc = plt.scatter(teff_list, logg_list, c=rms_list, vmin=min(rms_list), vmax=(max(rms_list)-min(rms_list))/3+min(rms_list), s=150, cmap=cm,edgecolor="w") cbar = plt.colorbar(sc) cbar.ax.set_ylabel("RMS") plt.scatter(teff_min_fit,logg_min_fit,color="r",s=70,marker="+") spectype_functions.plot_isochrones(program_dir,"r-",1) plt.xlim(max(teff_list),min(teff_list)) plt.ylim(max(logg_list),min(logg_list)) #plt.xlim(max(teff_list)+250,min(teff_list)-250) #plt.ylim(max(logg_list)+.25,min(logg_list)-0.25) plt.xlabel("Teff (K)") plt.ylabel("Logg") ### Plot spectrum plt.subplot(212) data_spectrum = functions.read_ascii(input_spectrum) data_spectrum = functions.read_table(data_spectrum) data_spectrum = transpose(array(data_spectrum)) data_spectrum = spectype_functions.normalise(data_spectrum,flux_normalise_w1,flux_normalise_w2) template_spectrum = "template_" + str(int(teff_min)) + "_" + str(logg_min) + "_" + str(feh_min)+".dat" template_spectrum = functions.read_ascii(model_path_flux+template_spectrum) template_spectrum = functions.read_table(template_spectrum) template_spectrum = transpose(array(template_spectrum)) template_spectrum = spectype_functions.normalise(template_spectrum,flux_normalise_w1,flux_normalise_w2) data_wave = data_spectrum[0] data_flux = data_spectrum[1] template_wave = template_spectrum[0] template_flux = template_spectrum[1] c = 3.0 * 10**5 data_wave = data_wave / ((vel_shift / c) + 1) data_interp = interpolate.splrep(data_wave,data_flux,s=0) data_flux = interpolate.splev(master_flux_wave,data_interp,der=0) template_interp = interpolate.splrep(template_wave,template_flux,s=0) template_flux = interpolate.splev(master_flux_wave,template_interp,der=0) plt.plot(master_flux_wave,data_flux,"b-",label="data") plt.plot(master_flux_wave,template_flux,"g-",label="template") plt.xlim(3600,5800) ylim_range = max(template_flux)-min(template_flux) plt.ylim(min(template_flux)-ylim_range*0.2,max(template_flux)+ylim_range*0.2) plt.legend(loc="lower right",ncol=2) plt.xlabel("Wavelength (A)") plt.ylabel("Normalised flux") os.system("rm "+file_path_reduced+"spectype_plots/"+object_name+"_"+file_name+".pdf") plt.savefig(file_path_reduced+"spectype_plots/"+object_name+"_"+file_name+".pdf") #plt.show() return teff_min_fit,logg_min_fit,feh_min
### Also find best reddening reddening_chisq_min_list = [] for chisq_space in reddening_chisq_list: reddening_chisq_min_list.append(chisq_space[logg_min_array_index,teff_min_array_index]) #spectype_functions.plot_contour(object_name,teff_space,logg_space,chisq_space,teff_min,0,logg_min,0,program_dir) ### Calculate best reddening for i in range(len(reddening_values)): if reddening_chisq_min_list[i] == max(reddening_chisq_min_list): best_reddening = reddening_values[i] break print "The best reddening estimate is E(B-V) = " + str(best_reddening) round_teff_min = int(spectype_functions.round_value(teff_min,250)) if round_teff_min < 3500: round_teff_min = 3500 if round_teff_min > 9000: round_teff_min = 9000 round_logg_min = spectype_functions.round_value(logg_min,0.5) if round_logg_min < 0.0: round_logg_min = 0.0 if round_logg_min > 5.0: round_logg_min = 5.0 ############################# ### Plotting logg vs teff ### ############################# os.chdir(file_path_reduced) #probability_array = log10(master_logg_teff)
print object_name,teff_min,logg_min,feh_min os.system("rm ./*_rms_table") os.chdir(file_path_reduced) return teff_min,logg_min,feh_min previous_results = [[teff_ini,logg_ini,feh_ini]] run_again = True nround = 1 while run_again and nround <= 10: print "################### Running round "+str(nround)+" #######################" teff_min,logg_min,feh_min = calculate_spectral_params(teff_ini,logg_ini,feh_ini) teff_new_ini = int(spectype_functions.round_value(teff_min,250)) logg_new_ini = spectype_functions.round_value(logg_min,0.5) feh_new_ini = spectype_functions.round_value(feh_min,0.5) #if teff_new_ini == teff_ini and logg_new_ini == logg_ini and feh_new_ini == feh_ini: #run_again = False for entry in previous_results: if teff_new_ini == entry[0] and logg_new_ini == entry[1] and feh_new_ini == entry[2]: run_again = False break if run_again: previous_results.append([teff_new_ini,logg_new_ini,feh_new_ini]) teff_ini = teff_new_ini logg_ini = logg_new_ini