def setUpClass(cls): np.random.seed(1111) num = 1000 level = np.array([134, 53, 261, 111]) noise = 0.01 * level # create standard noise wave = np.linspace(100, 200, num=num) flux1 = np.random.normal(level[0], noise[0], num) flux2 = np.random.normal(level[1], noise[1], num) flux3 = np.random.normal(level[2], noise[2], num) flux4 = np.random.normal(level[3], noise[3], num) # create cosmics flux1[467] *= 2.5 flux2[197] *= 2.6 flux3[816] *= 2.4 flux4[23] *= 2.8 # create spectral feature flux1[365] *= 1.40 flux2[365] *= 1.43 flux3[365] *= 1.38 flux4[365] *= 1.39 waves = np.array([wave, wave, wave, wave]) fluxes = np.array([flux1, flux2, flux3, flux4]) vrads = [555., 565., 545., 560.] wave1, flux1, accepted, rejected = tools.merge_cosmic_clipping( waves, fluxes, sigma=2.0, base='median', offset='std', window=51, runs=2, full_output=True) wave2, flux2 = tools.merge_cosmic_clipping(waves, fluxes, vrads=vrads, sigma=2.0, base='median', offset='std', window=51, runs=2) cls.wave1 = wave1 cls.flux1 = flux1 cls.wave2 = wave2 cls.flux2 = flux2 cls.accepted = accepted cls.rejected = rejected cls.waves = waves cls.fluxes = fluxes cls.vrads = vrads cls.num = num cls.avg = np.sum(level) * 1.05
def setUpClass(cls): np.random.seed(1111) num = 1000 level = np.array([134, 53, 261, 111]) noise = 0.01 * level # create standard noise wave = np.linspace(100,200, num=num) flux1 = np.random.normal(level[0], noise[0], num) flux2 = np.random.normal(level[1], noise[1], num) flux3 = np.random.normal(level[2], noise[2], num) flux4 = np.random.normal(level[3], noise[3], num) # create cosmics flux1[467] *= 2.5 flux2[197] *= 2.6 flux3[816] *= 2.4 flux4[23] *= 2.8 # create spectral feature flux1[365] *= 1.40 flux2[365] *= 1.43 flux3[365] *= 1.38 flux4[365] *= 1.39 waves = np.array([wave, wave, wave, wave]) fluxes = np.array([flux1, flux2, flux3, flux4]) vrads = [555., 565., 545., 560.] wave1, flux1, accepted, rejected = tools.merge_cosmic_clipping(waves, fluxes, sigma=2.0, base='median', offset='std', window=51, runs=2, full_output=True) wave2, flux2 = tools.merge_cosmic_clipping(waves, fluxes, vrads=vrads, sigma=2.0, base='median', offset='std', window=51, runs=2) cls.wave1 = wave1 cls.flux1 = flux1 cls.wave2 = wave2 cls.flux2 = flux2 cls.accepted = accepted cls.rejected = rejected cls.waves = waves cls.fluxes = fluxes cls.vrads = vrads cls.num = num cls.avg = np.sum(level) * 1.05
def setUpClass(cls): temp = '/STER/mercator/hermes/%s/reduced/%s_HRF_OBJ_ext_CosmicsRemoved_log_merged_c.fits' objlist = [('20090619', '237033'), ('20090701', '240226'), ('20090712', '241334'), ('20090712', '241335'), ('20100107', '00268012'), ('20100120', '00272619'), ('20100120', '00272620'), ('20100203', '00273577'), ('20100203', '00273578'), ('20100303', '00275671'), ('20100303', '00275672'), ('20100410', '00281505'), ('20100519', '00284636'), ('20110222', '00334558'), ('20110319', '00336547'), ('20110324', '00339848'), ('20110401', '00342273'), ('20110402', '00342363'), ('20110406', '00342699'), ('20110408', '00342896'), ('20120107', '00391289'), ('20120110', '00391633'), ('20120116', '00392217'), ('20120127', '00393151'), ('20120209', '00394175'), ('20120330', '00399697'), ('20120420', '00404769'), ('20120506', '00406531'), ('20130106', '00445346'), ('20130215', '00452556'), ('20130406', '00457718'), ('20130530', '00474128')] mergeList = [temp % o for o in objlist] waves, fluxes = [], [] for ifile in mergeList: w, f = fits.read_spectrum(ifile) f = f[(w > 5000) & (w < 7000)] w = w[(w > 5000) & (w < 7000)] waves.append(w) fluxes.append(f) wave, flux, accepted, rejected = tools.merge_cosmic_clipping( waves, fluxes, sigma=5.0, base='average', offset='std', window=51, runs=2, full_output=True) cls.nspek = len(objlist) cls.wave = wave cls.flux = flux cls.accepted = accepted cls.rejected = rejected
def setUpClass(cls): temp = '/STER/mercator/hermes/%s/reduced/%s_HRF_OBJ_ext_CosmicsRemoved_log_merged_c.fits' objlist = [('20090619','237033'), ('20090701','240226'), ('20090712','241334'), ('20090712','241335'), ('20100107','00268012'), ('20100120','00272619'), ('20100120','00272620'), ('20100203','00273577'), ('20100203','00273578'), ('20100303','00275671'), ('20100303','00275672'), ('20100410','00281505'), ('20100519','00284636'), ('20110222','00334558'), ('20110319','00336547'), ('20110324','00339848'), ('20110401','00342273'), ('20110402','00342363'), ('20110406','00342699'), ('20110408','00342896'), ('20120107','00391289'), ('20120110','00391633'), ('20120116','00392217'), ('20120127','00393151'), ('20120209','00394175'), ('20120330','00399697'), ('20120420','00404769'), ('20120506','00406531'), ('20130106','00445346'), ('20130215','00452556'), ('20130406','00457718'), ('20130530','00474128')] mergeList = [temp%o for o in objlist] waves, fluxes = [], [] for ifile in mergeList: w, f = fits.read_spectrum(ifile) f = f[(w>5000) & (w<7000)] w = w[(w>5000) & (w<7000)] waves.append(w) fluxes.append(f) wave, flux, accepted, rejected = tools.merge_cosmic_clipping(waves, fluxes, sigma=5.0, base='average', offset='std', window=51, runs=2, full_output=True) cls.nspek = len(objlist) cls.wave = wave cls.flux = flux cls.accepted = accepted cls.rejected = rejected
def merge_hermes_spectra(objlist, wscalelist=None, **kwargs): """ Combines HERMES spectra with sigma clipping to remove cosmics. The input spectra are given as a list of filenames for the objects and for the wavelength scales. The output is the wavelength scale of the first object, the merged and sigma clipped flux, and the adapted header of the object. In this adapted header, the exposure time is the sum of all individual exposure times, and the observing time is averaged. Uses the L{ivs.spectra.tools.merge_cosmic_clipping} method to merge the spectra. >>> data = search('KIC9540226') >>> objlist = data['filename'] >>> wave, flux, header = merge_hermes_spectra(objlist, wscalelist=None) @param objlist: list of OBJ or order merged filenames @param wscalelist: list of wavelengthscale filenames @param vrads: list of radial velocities (optional) @param vrad_units: units of the radial velocities @param sigma: value used for sigma clipping @param window: window size used in median filter @param runs: number of iterations through the spectra @return: The combined spectrum, cosmic clipped. (wave, flux, header) @rtype: [array, array, dict] """ kwargs['full_output'] = False if wscalelist == None: #-- Order Merged spectra are straight forward exptime, bjd = 0, np.zeros(len(objlist)) waves, fluxes = [],[] for i, ofile in enumerate(objlist): w, f, h = fits.read_spectrum(ofile, return_header=True) waves.append(w) fluxes.append(f) exptime += h['exptime'] #bjd[i] = h['bjd'] waves, fluxes = np.array(waves), np.array(fluxes) mwave, mflux = sptools.merge_cosmic_clipping(waves, fluxes, **kwargs) else: #-- The OBJ spectra need to be merged order per order # read all spectra exptime, bjd = 0, np.zeros(len(objlist)) waves, fluxes = np.zeros((55,4608, len(objlist))), np.zeros((55,4608, len(wscalelist))) for i, (ofile, wfile) in enumerate(zip(objlist, wscalelist)): odata = pf.getdata(ofile, 0).T # The flux has format (4608, 55) thus is transposed oheader = pf.getheader(ofile, 0) wdata = pf.getdata(wfile, 0) fluxes[:,:,i] = odata waves[:,:,i] = wdata exptime += oheader['exptime'] #bjd[i] = oheader['bjd'] # merge the spectra mwave, mflux = waves[:,:,0], np.zeros((55, 4608)) for i in range(55): wave, flux = sptools.merge_cosmic_clipping(waves[i,:,:].T, fluxes[i,:,:].T, **kwargs) mflux[i] = flux header = pf.getheader(objlist[0], 0) header['exptime'] = exptime #header['bjd'] = np.average(bjd) return mwave, mflux, header