Пример #1
0
 def __init__(self, **kwargs):
     self.Envi = rfm.Environment()
     self.rfm_exe = self.Envi.exe_file
     self.outname = 'rfm.tra'
Пример #2
0
    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
Пример #3
0
    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()