def __init__(self, **kwargs): self.Envi = rfm.Environment() self.rfm_exe = self.Envi.exe_file self.outname = 'rfm.tra'
def __init__(self, ObsFilename=None, ModelFilename=None, wave_min=None, wave_max=None, cull=50, am=1.0, H2O_scale=1.0, CO_scale=1.0, CH4_scale=1.0, CO2_scale=1.0, vrad=0.0, vbary=0.0): ## SETUP MODEL ATMOSPHERE ## Envi = rfm.Environment() A = rfm.Atmosphere(filename=Envi.atm_file) A.scaleProf('H2O', H2O_scale) A.scaleProf('CO', CO_scale) A.scaleProf('CH4', CH4_scale) A.scaleProf('CO2', CO2_scale) A.writeAll('tmp.atm') self.A = A M = Model() M.RFM(atm_files=['tmp.atm'], wmin=1e4 / wave_max, wmax=1e4 / wave_min, am=am) M.blur(rpower=25000.) self.M = M ## GET MODEL SKY SPECTRUM ## ModInfo = M.getSpec() self.WaveMod = ModInfo['wavelength'] self.SkyRadMod = ModInfo['Radiance'] / np.amax(ModInfo['Radiance']) self.SkyRadMod = 1 - self.SkyRadMod scale = np.amax(self.SkyRadMod) ## GET MODEL STELLAR SPECTRUM ## a = np.loadtxt(ModelFilename, skiprows=1) StellWL, StellFlux = 1e4 / a[:, 0], a[:, 1] plt.plot(StellWL, StellFlux) if np.all(np.diff(StellWL) > 0) != True: StellWL = np.flip(StellWL, 0) StellFlux = np.flip(StellFlux, 0) ## BROADEN STELLAR SPECTRUM ## StellFlux_Broad = self.blur_function(StellWL, StellFlux, 25000.) print StellFlux_Broad plt.plot(StellWL, StellFlux_Broad) plt.show() ## SHIFT STELLAR SPECTRUM ## StellWave_Shift = self.shift_wavelength(StellWL, vrad - vbary) print StellWL print StellWave_Shift ## INTERPOLATE STELLAR SPECTRUM ONTO COMMON WAVELENGTH GRID ## self.StellFlux_Interp = np.interp(self.WaveMod, StellWave_Shift, StellFlux_Broad) ## COMBINE STELLAR AND TELLURIC SPECTRA ## assert (np.shape(self.StellFlux_Interp) == np.shape(self.SkyRadMod)) self.StellFlux_Interp = self.StellFlux_Interp / np.median( self.StellFlux_Interp) self.SkyRadMod = self.SkyRadMod / np.median(self.SkyRadMod) self.ModSpec = 1.0 * self.StellFlux_Interp + 0.8 * self.SkyRadMod ####change these to change ratios - SkyRadMod = telluric self.ModSpec = self.ModSpec / np.median(self.ModSpec) ## colors combined model to show tell vs stell contributions self.color = self.colorinmodel(self.StellFlux_Interp, self.SkyRadMod) plt.figure() plt.plot(self.WaveMod, self.StellFlux_Interp, label='stell') plt.plot(self.WaveMod, self.SkyRadMod, label='tell') #plt.plot(self.WaveMod, self.ModSpec, label='stell+tell') self.plot_multicolored_lines(self.WaveMod, self.ModSpec, self.color, label='stell(c)+tell(k)') plt.legend(loc=0) ## GET OBSERVED SKY ## ObsInfo = nt.WaveOrder(ObsFilename).getData() WaveObsPos = np.array(ObsInfo['wl_pos']) # SkyObsPos = np.array(ObsInfo['sky_pos']) / np.median(ObsInfo['sky_pos']) # L BAND SkyObsPos = np.array(ObsInfo['flux_pos']) / np.median( ObsInfo['flux_pos']) # K BAND WaveObsNeg = np.array(ObsInfo['wl_neg']) # SkyObsNeg = np.array(ObsInfo['sky_neg']) / np.median(ObsInfo['sky_neg']) # L BAND SkyObsNeg = np.array(ObsInfo['flux_neg']) / np.median( ObsInfo['flux_neg']) # K BAND ## FIT OUT CONTINUUM ## (DP 21 JAN 16) wn_data_all = [WaveObsPos, WaveObsNeg] flux_data_all = [SkyObsPos, SkyObsNeg] merp = 16 #64 ##32 #16 factor = 64 #16 #32# 64 posneg = 0 baseline_pos, baseline_neg = np.ones(np.size(WaveObsPos)), np.ones( np.size(WaveObsNeg)) # SkyObsPos_contrmv, SkyObsNeg_contrmv = np.array(np.size(SkyObsPos)), np.array(np.size(SkyObsNeg)) for wn_data, flux_data in zip(wn_data_all, flux_data_all): points_flux, points_wn, points_count = np.zeros(merp), np.zeros( merp), np.arange(merp) for count in points_count: startpoint = count * factor endpoint = (count + 1) * factor if count == 0: startpoint = 14 if count == 15: endpoint = 1024 - 30 # if count==63 : endpoint = 1024-14 points_flux[count] = np.max(flux_data[startpoint:endpoint]) loc = np.argmax(flux_data[startpoint:endpoint]) # points_wn[count]=wn_data[loc+startpoint] points_wn[count] = loc + startpoint coeff = np.polyfit(points_wn, points_flux, 2) # coeff = np.polyfit(points_wn, points_flux, 4) print coeff # if posneg == 0 : baseline_pos = coeff[1] + coeff[0]*wn_data# + coeff[1]*wn_data**2 + coeff[0]*wn_data**3 # if posneg == 1 : baseline_neg = coeff[1] + coeff[0]*wn_data# + coeff[1]*wn_data**2 + coeff[0]*wn_data**3 if posneg == 0: baseline_pos = coeff[2] + coeff[1] * np.arange(1024) + coeff[ 0] * np.arange(1024)**2 # + coeff[0]*np.arange(1024)**3 if posneg == 1: baseline_neg = coeff[2] + coeff[1] * np.arange(1024) + coeff[ 0] * np.arange(1024)**2 # + coeff[0]*np.arange(1024)**3 # if posneg == 0 : baseline_pos = coeff[4] + coeff[3]*np.arange(1024) + coeff[2]*np.arange(1024)**2 + coeff[1]*np.arange(1024)**3 + coeff[0]*np.arange(1024)**4# + coeff[0]*np.arange(1024)**3 # if posneg == 1 : baseline_neg = coeff[4] + coeff[3]*np.arange(1024) + coeff[2]*np.arange(1024)**2 + coeff[1]*np.arange(1024)**3 + coeff[0]*np.arange(1024)**4# + coeff[0]*np.arange(1024)**3 posneg += 1 SkyObsPos_contrmv, SkyObsNeg_contrmv = SkyObsPos / baseline_pos, SkyObsNeg / baseline_neg self.ModSpec = 1 - self.ModSpec plt.figure() plt.plot(SkyObsPos, hold=True) plt.plot(baseline_pos, hold=True) plt.show() plt.figure() plt.plot(SkyObsNeg, hold=True) plt.plot(baseline_neg, hold=True) plt.show() self.ObsLabelPN = ['pos', 'neg'] ### break spec into 4 pieces #fourth = int(len(WaveObsPos)/4) #Wavepos = [] #Waveneg = [] #for val in range(fourth): # Wavepos.append(WaveObsPos[val]) # Waveneg.append(WaveObsNeg[val]) self.WaveObsPN = [WaveObsPos, WaveObsNeg] SkyObsPos_contrmv_scaled = (1 - SkyObsPos_contrmv) SkyObsNeg_contrmv_scaled = (1 - SkyObsNeg_contrmv) self.Pixels = [np.arange(len(WaveObsPos)), np.arange(len(WaveObsNeg))] self.SkyObsPN_orig = [SkyObsPos, SkyObsNeg] self.SkyObsPN = [SkyObsPos_contrmv_scaled, SkyObsNeg_contrmv_scaled] self.GoodFit = [False, False] self.Coefs, self.WaveObsPN = self.FitInitDS(self.WaveObsPN, self.ObsLabelPN) secs = ['one', 'two', 'three', 'four'] for sec in secs: sec = 'full' print "======================" print "======================" print 'QUARTER', sec print "======================" print "======================" while (True): RawInput = raw_input('>> ').replace(" ", "").lower() if (RawInput == 'quit'): break if (RawInput == 'pos'): RawInput2 = raw_input("Pos. Coefficients?: ").split(",") self.Coefs[0] = np.array(RawInput2, dtype=np.float) self.WaveObsPN[0] = self.DSFunc(self.Pixels[0], self.Coefs[0]) modflux, newfl_obs = self.comparemodelanddata( self.WaveMod, self.ModSpec, self.WaveObsPN[0], self.SkyObsPN[0]) if sec == 'full': self.PlotModObs(self.WaveMod, modflux, self.WaveObsPN[0], newfl_obs, self.ObsLabelPN[0]) else: wvm, fm, wvo, fo = self.Breakintofour( self.WaveMod, modflux, self.WaveObsPN[0], newfl_obs, section=sec) self.PlotModObs(wvm, fm, wvo, fo, self.ObsLabelPN[0]) if (RawInput == 'neg'): RawInput2 = raw_input("Neg. Coefficients?: ").split(",") self.Coefs[1] = np.array(RawInput2, dtype=np.float) self.WaveObsPN[1] = self.DSFunc(self.Pixels[1], self.Coefs[1]) modflux, newfl_obs = self.comparemodelanddata( self.WaveMod, self.ModSpec, self.WaveObsPN[1], self.SkyObsPN[1]) if sec == 'full': self.PlotModObs(self.WaveMod, modflux, self.WaveObsPN[1], newfl_obs, self.ObsLabelPN[1]) else: wvm, fm, wvo, fo = self.Breakintofour( self.WaveMod, modflux, self.WaveObsPN[1], newfl_obs, section=sec) self.PlotModObs(wvm, fm, wvo, fo, self.ObsLabelPN[1]) if (RawInput == 'fit'): for i in range(0, len(self.Coefs)): if (self.GoodFit[i] != True): #self.Coefs[i], self.WaveObsPN[i] = self.FitDS(self.WaveMod, self.ModSpec, self.SkyObsPN[i], self.Coefs[i]) modflux, newfl_obs = self.comparemodelanddata( self.WaveMod, self.ModSpec, self.WaveObsPN[i], self.SkyObsPN[i]) if sec == 'full': self.Coefs[i], self.WaveObsPN[i] = self.FitDS( self.WaveMod, modflux, newfl_obs, self.Coefs[i]) self.PlotModObs(self.WaveMod, modflux, self.WaveObsPN[i], newfl_obs, self.ObsLabelPN[i]) else: wvm, fm, wvo, fo = self.Breakintofour( self.WaveMod, modflux, self.WaveObsPN[i], newfl_obs, section=sec) self.Coefs[i], self.WaveObsPN[i] = self.FitDS( wvm, fm, fo, self.Coefs[i]) self.PlotModObs(wvm, fm, self.WaveObsPN[i], fo, self.ObsLabelPN[i]) RawInput2 = raw_input( "Good Fit? (yes/no): ").replace(" ", "").lower() while (True): if (RawInput2 == 'yes'): self.GoodFit[i] = True break if (RawInput2 == 'no'): break else: print "Please type yes or no." break else: print '' print '## Dispersion Solution for ' + self.ObsLabelPN[ i] + ' position is good.' if (RawInput == 'pf'): self.PrintCoefs() if sec == 'full': break
def __init__(self, ObsFilename=None, wave_min=None, wave_max=None, cull=50, am=1.0, H2O_scale=0.5, CO_scale=1.0): ## SETUP MODEL ATMOSPHERE ## Envi = rfm.Environment() A = rfm.Atmosphere(filename=Envi.atm_file) A.scaleProf('H2O', H2O_scale) A.scaleProf('CO', CO_scale) # A.scaleProf('CH4', 1.0) # A.scaleProf('CO2', 1.0) A.writeAll('tmp.atm') self.A = A M = Model() M.RFM(atm_files=['tmp.atm'],wmin=1e4/wave_max,wmax=1e4/wave_min, am=am) M.blur(rpower=25000.) self.M = M # plt.figure() # plt.plot(self.M.spectrum['wavelength'], self.M.spectrum['Transmission']/np.mean(self.M.spectrum['Transmission'])) # print self.M.spectrum['Transmission'] # assert(0==1) ## GET MODEL SKY SPECTRA ## ModInfo = M.getSpec() self.WaveMod = ModInfo['wavelength'] # self.SkyRadMod = ModInfo['Radiance'] / np.median(ModInfo['Radiance']) self.SkyRadMod = ModInfo['Radiance'] / np.amax(ModInfo['Radiance']) scale = np.amax(self.SkyRadMod) ## GET OBSERVED SKY ## ObsInfo = nt.WaveOrder(ObsFilename).getData() WaveObsPos = np.array(ObsInfo['wl_pos']) SkyObsPos = np.array(ObsInfo['sky_pos']) #/ np.median(ObsInfo['sky_pos']) # L BAND # SkyObsPos = np.array(ObsInfo['flux_pos']) / np.median(ObsInfo['flux_pos']) # K BAND WaveObsNeg = np.array(ObsInfo['wl_neg']) SkyObsNeg = np.array(ObsInfo['sky_neg']) / np.median(ObsInfo['sky_neg']) # L BAND # SkyObsNeg = np.array(ObsInfo['flux_neg']) / np.median(ObsInfo['flux_neg']) # K BAND #plt.plot(WaveObsPos, SkyObsPos) #plt.show() ## FIT OUT CONTINUUM ## (DP 21 JAN 16) wn_data_all = [WaveObsPos, WaveObsNeg] flux_data_all = [SkyObsPos, SkyObsNeg] merp = 16 factor = 64 posneg = 0 baseline_pos, baseline_neg = np.ones(np.size(WaveObsPos)), np.ones(np.size(WaveObsNeg)) # SkyObsPos_contrmv, SkyObsNeg_contrmv = np.array(np.size(SkyObsPos)), np.array(np.size(SkyObsNeg)) for wn_data, flux_data in zip(wn_data_all, flux_data_all) : points_flux, points_wn, points_count =np.zeros(merp), np.zeros(merp), np.arange(merp) for count in points_count : startpoint = count*factor endpoint = (count+1)*factor if count == 0 : startpoint = 10 if count == 15 : endpoint = 1024-10 points_flux[count]=np.min(flux_data[startpoint:endpoint]) loc=np.argmax(flux_data[startpoint:endpoint]) # points_wn[count]=wn_data[loc+startpoint] points_wn[count]=loc+startpoint coeff = np.polyfit(points_wn, points_flux, 1) print coeff # if posneg == 0 : baseline_pos = coeff[1] + coeff[0]*wn_data# + coeff[1]*wn_data**2 + coeff[0]*wn_data**3 # if posneg == 1 : baseline_neg = coeff[1] + coeff[0]*wn_data# + coeff[1]*wn_data**2 + coeff[0]*wn_data**3 if posneg == 0 : baseline_pos = coeff[1] + coeff[0]*np.arange(1024)# + coeff[1]*np.arange(1024)**2 + coeff[0]*np.arange(1024)**3 if posneg == 1 : baseline_neg = coeff[1] + coeff[0]*np.arange(1024)# + coeff[1]*np.arange(1024)**2 + coeff[0]*np.arange(1024)**3 posneg += 1 # SkyObsPos_contrmv, SkyObsNeg_contrmv = SkyObsPos / baseline_pos, SkyObsNeg / baseline_neg SkyObsPos_contrmv, SkyObsNeg_contrmv = SkyObsPos, SkyObsNeg # plt.figure() # plt.plot(SkyObsPos, hold=True) # plt.plot(baseline_pos, hold=True) # plt.show() # plt.figure() # plt.plot(SkyObsNeg, hold=True) # plt.plot(baseline_neg, hold=True) # plt.show() self.ObsLabelPN = ['pos', 'neg'] self.WaveObsPN = [WaveObsPos, WaveObsNeg] SkyObsPos_contrmv_scaled = SkyObsPos_contrmv / np.amax(SkyObsPos_contrmv) #scale * SkyObsPos_contrmv SkyObsNeg_contrmv_scaled = SkyObsNeg_contrmv / np.amax(SkyObsNeg_contrmv) #scale * SkyObsNeg_contrmv self.Pixels = [np.arange(len(WaveObsPos)), np.arange(len(WaveObsNeg))] self.SkyObsPN_orig = [SkyObsPos, SkyObsNeg] self.SkyObsPN = [SkyObsPos_contrmv_scaled, SkyObsNeg_contrmv_scaled] # print np.shape(self.SkyObsPN_orig) # print np.shape(SkyObsPos), np.shape(SkyObsNeg) # print np.shape(SkyObsPos_contrmv_scaled), np.shape(SkyObsNeg_contrmv_scaled) # print np.shape(self.SkyObsPN) # plt.figure() # plt.plot(SkyObsPos_contrmv_scaled) # plt.plot(self.SkyRadMod) # plt.show() self.GoodFit = [False, False] self.Coefs, self.WaveObsPN = self.FitInitDS(self.WaveObsPN, self.ObsLabelPN) while(True): RawInput = raw_input('>> ').replace(" ", "").lower() if (RawInput == 'quit'): break if (RawInput == 'pos'): RawInput2 = raw_input("Pos. Coefficients?: ").split(",") self.Coefs[0] = np.array(RawInput2, dtype=np.float) self.WaveObsPN[0] = self.DSFunc(self.Pixels[0], self.Coefs[0]) self.PlotModObs(self.WaveMod, self.SkyRadMod, self.WaveObsPN[0], self.SkyObsPN[0], self.ObsLabelPN[0]) if (RawInput == 'neg'): RawInput2 = raw_input("Neg. Coefficients?: ").split(",") self.Coefs[1] = np.array(RawInput2, dtype=np.float) self.WaveObsPN[1] = self.DSFunc(self.Pixels[1], self.Coefs[1]) self.PlotModObs(self.WaveMod, self.SkyRadMod, self.WaveObsPN[1], self.SkyObsPN[1], self.ObsLabelPN[1]) if (RawInput == 'fit'): for i in range(0,len(self.Coefs)): if (self.GoodFit[i] != True): self.Coefs[i], self.WaveObsPN[i] = self.FitDS(self.WaveMod, self.SkyRadMod, self.SkyObsPN[i], self.Coefs[i]) self.PlotModObs(self.WaveMod, self.SkyRadMod, self.WaveObsPN[i], self.SkyObsPN[i], self.ObsLabelPN[i]) RawInput2 = raw_input("Good Fit? (yes/no): ").replace(" ", "").lower() while (True): if (RawInput2 == 'yes'): self.GoodFit[i] = True break if (RawInput2 == 'no'): break else: print "Please type yes or no." break else: print '' print '## Dispersion Solution for ' + self.ObsLabelPN[i] + ' position is good.' if (RawInput == 'pf'): self.PrintCoefs()