def lris_standard(standards, xcorr=yes): '''Extract standard stars and calculate sensitivity functions.''' for ofile, nstd in standards: shutil.copy(ofile, "%s.fits" % nstd) # Extract standard if get_head("%s.fits" % nstd, "SKYSUB"): iraf.apall(nstd, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="none") else: iraf.apall(nstd, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="fit") if xcorr: # Cross correlate to tweak wavelength iraf.xcsao("%s.ms" % nstd, templates=XCTEMPLATE, correlate="wavelength", logfiles="%s.xcsao" % ofile) # If a solution was found, apply shift try: xcsaof = open("%s.xcsao" % ofile) shift = float(xcsaof.readlines()[6].split()[14]) except: shift = 0.0 iraf.specshift("%s.ms" % nstd, -shift) # Create telluric iraf.splot("%s.ms" % nstd) # Remove telluric and absorption, save as a%s.ms iraf.sarith("%s.ms" % nstd, "/", "a%s.ms" % nstd, "telluric.%s.fits" % nstd) iraf.imreplace("telluric.%s.fits" % nstd, 1.0, lower=0.0, upper=0.0) iraf.splot("telluric.%s.fits" % nstd) # Remove stellar features and resave # Create smoothed standard iraf.gauss("a%s.ms[*,1,1]" % nstd, "s%s.ms" % nstd, 5.0) iraf.sarith("%s.ms" % nstd, "/", "s%s.ms" % nstd, "ds%s.ms" % nstd) # Apply telluric correction iraf.telluric("ds%s.ms" % nstd, "tds%s.ms" % nstd, "telluric.%s.fits" % nstd, xcorr=no, tweakrms=no, interactive=no, sample='4000:4010,6850:6975,7150:7350,7575:7725,8050:8400,8900:9725') # Define bandpasses for standard star calculation obj=get_head("%s.fits" % nstd, "OBJECT") iraf.standard("tds%s.ms" % nstd, "%s.std" % nstd, extinction='home$extinct/maunakeaextinct.dat', caldir='home$standards/', observatory='Keck', interac=yes, star_name=obj, airmass='', exptime='') # Determine sensitivity function iraf.sensfunc('%s.std' % nstd, '%s.sens' % nstd, extinction='home$extinct/maunakeaextinct.dat', newextinction='extinct.dat', observatory='Keck', function='legendre', order=4, interactive=yes) return
def red_science(image, flats, spath, object=None, arc='Arc-Red.fits', smooth='BD284211.smooth.fits', telluric='telluric.fits', sens='BD284211.sens', biassec=REDBIAS, trimsec=REDTRIM, outflat='Flat-Red.fits', gain=REDGAIN, rdnoise=REDRDNOISE): '''Full reduction of KAST science spectra on red CCD''' # Bias subtract everything first redbias(image, biassec=biassec, trimsec=trimsec) redbias(flats, biassec=biassec, trimsec=trimsec) # Create and apply flat-field make_flat(flats, outflat, gain=gain, rdnoise=rdnoise) iraf.ccdproc(image[0], ccdtype='', noproc=no, fixpix=no, overscan=no, trim=no, zerocor=no, darkcor=no, flatcor=yes, illumcor=no, fringecor=no, readcor=no, scancor=no, flat=outflat) # Cosmic ray rejection #iraf.lacos_spec(image[0], 'c%s' % image[0], 'cm%s' % image[0], # gain=gain, readn=rdnoise, xorder=9, yorder=3, # sigclip=4.5, sigfrac=0.5, objlim=1.0, niter=3) # Extract spectrum if object==None: object=get_head(image, 'OBJECT') iraf.apall('%s' % image[0], output=object, references='', interactive=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background='fit', weights='variance', pfit='fit1d', readnoise=rdnoise, gain=gain) # Apply wavelength solution to standard shutil.copy('%s/%s' % (spath, arc), '.') shutil.copy('%s/database/id%s' % (spath, arc.rstrip('.fits')), 'database') iraf.refspec(object, references=arc, sort="", group="", override=yes, confirm=no, assign=yes) iraf.dispcor(object, '%s.w' % object, confirm=no, listonly=no) # Smooth shutil.copy('%s/%s' % (spath, smooth), '.') iraf.sarith('%s.w' % object, '/', smooth, '%s.s' % object) # Create and apply telluric correction shutil.copy('%s/%s' % (spath, telluric), '.') iraf.telluric('%s.s' % object, '%s.t' % object, telluric, xcorr=yes, tweakrms=yes, interactive=yes, sample='6850:6950,7575:7700') # Flux calibration shutil.copy('%s/%s.0001.fits' % (spath, sens), '.') iraf.calibrate('%s.t' % object, '%s.f' % object, extinct=yes, flux=yes, extinction='onedstds$kpnoextinct.dat', observatory='Lick', sensitivity=sens, airmass='', exptime='') return
def SarithTask(self, Input1, Input2, operation, OutputFile, FitsFolder, Suffix = 'tell'): if OutputFile == None: OutputFile = self.outputNameGenerator(Input1, Suffix) self.deleteIrafFiles(FitsFolder + OutputFile) sarith_conf = self.SarithAttributes(InputFile1 = Input1, InputFile2 = Input2, OuputFile = OutputFile, Fits_Folder = FitsFolder, operation = operation) iraf.sarith(**sarith_conf) return OutputFile
def blue_science(image, spath, object=None, flat='Flat-Blue.fits', arc='Arc-Blue.fits', smooth='BD284211.smooth.fits', sens='BD284211.sens', biassec1=BLUEBIAS1, trimsec1=BLUETRIM1, biassec2=BLUEBIAS2, trimsec2=BLUETRIM2, gain=BLUEGAIN, rdnoise=BLUERDNOISE): '''Full reduction of KAST science spectra on blue CCD''' # Bias subtract everything first bluebias(image, biassec1=biassec1, trimsec1=trimsec1, biassec2=biassec2, trimsec2=trimsec2) # Apply flat-field shutil.copy('%s/%s' % (spath, flat), '.') iraf.ccdproc('j%s' % image[0], ccdtype='', noproc=no, fixpix=no, overscan=no, trim=no, zerocor=no, darkcor=no, flatcor=yes, illumcor=no, fringecor=no, readcor=no, scancor=no, flat=flat) # Cosmic ray rejection #iraf.lacos_spec('j%s' % image[0], 'cj%s' % image[0], 'cmj%s' % image[0], # gain=gain, readn=rdnoise, xorder=9, yorder=3, # sigclip=4.5, sigfrac=0.5, objlim=1.0, niter=3) # Extract spectrum if object==None: object=get_head(image, 'OBJECT') iraf.apall('j%s' % image[0], output=object, references='', interactive=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background='fit', weights='variance', pfit='fit1d', readnoise=rdnoise, gain=gain) # Apply wavelength solution to standard shutil.copy('%s/%s' % (spath, arc), '.') shutil.copy('%s/database/id%s' % (spath, arc.rstrip('.fits')), 'database') iraf.refspec(object, references=arc, sort="", group="", override=yes, confirm=no, assign=yes) iraf.dispcor(object, '%s.w' % object, confirm=no, listonly=no) # Smooth shutil.copy('%s/%s' % (spath, smooth), '.') iraf.sarith('%s.w' % object, '/', smooth, '%s.s' % object) # Flux calibration shutil.copy('%s/%s.0001.fits' % (spath, sens), '.') iraf.calibrate('%s.s' % object, '%s.f' % object, extinct=yes, flux=yes, extinction='onedstds$kpnoextinct.dat', observatory='Lick', sensitivity=sens, airmass='', exptime='') return
def divide_smooth(input_file): os.system("rm smoothdiv*_"+input_file) print wave_w1,wave_w2 iraf.sarith( input1 = "spec_" + input_file,\ op = "/",\ input2 = "master_smooth.fits",\ output = "smoothdivtemp_"+input_file,\ w1 = wave_w1,\ w2 = wave_w2,\ apertures = "*",\ bands = "",\ beams = "",\ apmodulus = 0,\ reverse = 0,\ ignoreaps = 1,\ format = "multispec",\ renumber = 1,\ offset = 0,\ clobber = 1,\ merge = 0,\ rebin = 1,\ errval = 0.0,\ verbose = 1) ### Apply continuum to remove artifacts from the division iraf.continuum( input = "smoothdivtemp_" + input_file,\ output = "smoothdiv_" + input_file,\ ask = "no",\ lines = "*",\ bands = "1",\ type = "data",\ replace = 1,\ wavescale = 1,\ logscale = 0,\ override = 1,\ listonly = 0,\ logfiles = "logfile",\ interactive = 0,\ sample = "*",\ naverage = 1,\ function = "spline3",\ order = 10,\ low_reject = 30.0,\ high_reject = 30.0,\ niterate = 1,\ grow = 5.0)
def trim(fs=None): iraf.cd('work') if fs is None: fs=glob('flx/sci*c?.fits') if not os.path.exists('trm'): os.mkdir('trm') for i,f in enumerate(fs): outfile=f.replace('flx','trm') w=WCS(f) hdu= pyfits.open(f) npix=hdu[0].data.shape[2] W1=int(w.wcs_pix2world(2,0,0,0)[0]) W2=int(w.wcs_pix2world(npix-2,0,0,0)[0]) iraf.sarith(input1=f,op='copy',output=outfile,w1=W1,w2=W2 ,clobber='yes') iraf.cd('..')
def combine_normalize_images(WORK_DIR, combine=False): if combine: print '\n + Combine images\n' try: os.remove('combined_sum.fits') except: pass iraf.scombine(input=','.join([obj+'.ec.vh' for obj in observations[WORK_DIR]['objects']]), output='combined_sum', group='apertures', combine='sum', reject='none', Stdout="/dev/null") # normalize spectra # This step will require you to manually normalize all the spectra. print '\n + Normalize spectra\n' if combine: try: os.remove('combined_sum_cone_rv_echellet.fits') except: pass iraf.continuum(input='combined_sum', output='combined_sum_cont', type='fit', replace='no', listonly='no', functio='cheb', order=13, low_rej=2, high_rej=3, naverag=-3, niter=9, interac='no', markrej='no') else: for obj in observations[WORK_DIR]['objects']: try: os.remove(obj+'_cont.fits') os.remove(obj+'_vh_norm.fits') except: pass iraf.continuum(input=obj+'.ec.vh', output=obj+'_cont', type='fit', replace='no', listonly='no', functio='cheb', order=13, low_rej=2, high_rej=3, naverag=-3, niter=9, interac='no', markrej='no', ask='yes') iraf.sarith(input1=obj+'.ec.vh', op='/', input2=obj+'_cont', output=obj+'_vh_norm', format='multispec', Stdout="/dev/null") #combine apertures print '\n + Combine apertures\n' if combine: try: os.remove('combined_sum_data.fits') os.remove('combined_sum_norm.fits') os.remove('combined_final.0001.fits') except: pass iraf.scombine(input='combined_sum', output='combined_sum_data', group='all', combine='sum', reject='none', Stdout="/dev/null") iraf.scombine(input='combined_sum_cont', output='combined_sum_norm', group='all', combine='sum', reject='none', Stdout="/dev/null") iraf.sarith(input1='combined_sum_data', op='/', input2='combined_sum_norm', output='combined_final', format='onedspec', Stdout="/dev/null") else: for obj in observations[WORK_DIR]['objects']: try: os.remove(obj+'_data1D.fits') os.remove(obj+'_cont1D.fits') os.remove(obj+'_1D_vh_norm.0001.fits') os.remove(obj+'_1D_vh_norm.fits') except: pass iraf.scombine(input=obj+'.ec.vh', output=obj+'_data1D', group='all', combine='sum', reject='none', Stdout="/dev/null") iraf.scombine(input=obj+'_cont', output=obj+'_cont1D', group='all', combine='sum', reject='none', Stdout="/dev/null") iraf.sarith(input1=obj+'_data1D', op='/', input2=obj+'_cont1D', output=obj+'_1D_vh_norm', format='onedspec', Stdout="/dev/null")
def normalize_and_merge(reduced_science_files): current_directory = os.getcwd() for k in range(len(reduced_science_files)): remove_file(current_directory, "norm.dummyI.fits") remove_file(current_directory, "norm.dummyIa.fits") remove_file(current_directory, "norm.dummyII.fits") remove_file(current_directory, "norm.dummyIIa.fits") remove_file(current_directory, "norm.dummyIII.fits") remove_file(current_directory, "norm.dummyIV.fits") remove_file(current_directory, "norm.dummyV.fits") remove_file(current_directory, "norm.dummy1.fits") remove_file(current_directory, "norm.dummy2.fits") remove_file(current_directory, "norm.dummy3.fits") remove_file(current_directory, "norm.dummy4.fits") remove_file(current_directory, "norm.dummy5.fits") remove_file(current_directory, "norm.dummy6.fits") remove_file(current_directory, "norm.dummy7.fits") remove_file(current_directory, "norm.dummy8.fits") ranges = np.loadtxt("ranges.lis", delimiter=",") aperturlist = open("test.norm.apertures.lis", "w") merge = reduced_science_files[k].replace(".extracted.fits", ".norm.fits") iraf.scopy(reduced_science_files[k], place_here("norm.dummyI.fits"), apertures="5:14", format="multispec") iraf.scopy(reduced_science_files[k], place_here("norm.dummyII.fits"), apertures="35:42", format="multispec") iraf.fit1d(place_here("norm.dummyI.fits"), place_here("norm.dummyIa.fits"), naverage=1, axis=2, type="fit", low_rej=1.0, high_rej=2.0, order=2, niterate=2, func="spline3", sample="*") iraf.fit1d(place_here("norm.dummyII.fits"), place_here("norm.dummyIIa.fits"), naverage=1, axis=2, type="fit", low_rej=1.0, high_rej=2.0, order=2, niterate=2, func="spline3", sample="*") iraf.scopy(reduced_science_files[k], place_here("norm.dummy1.fits"), apertures="1", format="multispec", w1="4544") iraf.scopy(reduced_science_files[k], place_here("norm.dummy2.fits"), apertures="2", format="multispec", w1="4569") iraf.scopy(reduced_science_files[k], place_here("norm.dummy3.fits"), apertures="3:7", format="multispec") iraf.scopy(place_here("norm.dummyIa.fits"), place_here("norm.dummy4.fits"), apertures="8:10", format="multispec") iraf.scopy(reduced_science_files[k], place_here("norm.dummy5.fits"), apertures="11:37", format="multispec") iraf.scopy(place_here("norm.dummyIIa.fits"), place_here("norm.dummy6.fits"), apertures="38:40", format="multispec") iraf.scopy(reduced_science_files[k], place_here("norm.dummy7.fits"), apertures="41:50", format="multispec") iraf.scopy(reduced_science_files[k], place_here("norm.dummy8.fits"), apertures="51", format="multispec", w2="7591") iraf.scombine("@normalization.list.lis", place_here("norm.dummyIII.fits"), group='apertures') iraf.fit1d(place_here("norm.dummyIII.fits"), place_here("norm.dummyIV.fits"), naverage=1, axis=1, type="fit", low_rej=0.8, high_rej=2.0, order=7, niterate=4, func="spline3", sample="*") iraf.sarith(reduced_science_files[k], "/", place_here("norm.dummyIV.fits"), place_here("norm.dummyV.fits")) iraf.fit1d(place_here("norm.dummyV.fits"), merge, naverage=1, axis=1, type="ratio", low_rej=0.2, high_rej=2.0, order=1, niterate=4, func="chebyshev", sample="*") iraf.hedit(merge, "INSTRUME", 'TLS-echelle') for i in range(len(ranges)): apertures = int(ranges[i][0]) new_name = merge.replace(".fits", "." + str(apertures) + ".fits") input1 = os.path.join(current_directory, merge) output = os.path.join(current_directory, new_name) iraf.scopy(input1, output, w1=ranges[i][1], w2=ranges[i][2], apertur=apertures, format="multispec") aperturlist.write(new_name + "\n") aperturlist.close() new_name_merged = reduced_science_files[k].replace( ".extracted.fits", ".merged.fits") iraf.scombine("@test.norm.apertures.lis", new_name_merged, group='all') cut_for_ston = new_name_merged.replace("merged", "cut") iraf.scopy(new_name_merged, cut_for_ston, w1=5603, w2=5612, format="multispec", apertures="") stddev = iraf.imstat(cut_for_ston, Stdout=1, fields="stddev", format="no") ston = 1 / float(stddev[0]) iraf.hedit(new_name, "STON", ston) for i in range(len(ranges)): apertures = int(ranges[i][0]) os.remove( os.path.join( merge.replace(".fits", "." + str(apertures) + ".fits"))) os.remove(os.path.join(current_directory, "test.norm.apertures.lis")) remove_file(current_directory, "norm.dummyI.fits") remove_file(current_directory, "norm.dummyIa.fits") remove_file(current_directory, "norm.dummyII.fits") remove_file(current_directory, "norm.dummyIIa.fits") remove_file(current_directory, "norm.dummyIII.fits") remove_file(current_directory, "norm.dummyIV.fits") remove_file(current_directory, "norm.dummyV.fits") remove_file(current_directory, "norm.dummy1.fits") remove_file(current_directory, "norm.dummy2.fits") remove_file(current_directory, "norm.dummy3.fits") remove_file(current_directory, "norm.dummy4.fits") remove_file(current_directory, "norm.dummy5.fits") remove_file(current_directory, "norm.dummy6.fits") remove_file(current_directory, "norm.dummy7.fits") remove_file(current_directory, "norm.dummy8.fits") print("Success! Produced files *merged.fits, *norm.fits")
def deimos_standard(standard): '''Extract standard star and calculate sensitivit function.''' bstd = "%s_01_B" % standard; rstd = "%s_01_R" % standard # Extract standard if get_head("%s.fits" % bstd, "SKYSUB"): iraf.apall(bstd, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="none") iraf.apall(rstd, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="none") else: iraf.apall(bstd, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="fit") iraf.apall(rstd, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="fit") # Fit the continuum #iraf.continuum("%s.ms" % bstd, output="s%s.ms" % bstd, lines=1, bands=1, # type="fit", sample="*", naverage=1, function="chebyshev", # order=15, low_reject=3.0, high_reject=5.0, niterate=10, grow=1.0, # interac=yes) #iraf.continuum("%s.ms" % rstd, output="s%s.ms" % rstd, lines=1, bands=1, # type="fit", sample="*", naverage=1, function="chebyshev", # order=15, low_reject=3.0, high_reject=5.0, niterate=10, grow=1.0, # interac=yes) # Create telluric iraf.splot("%s.ms" % bstd) # Remove telluric and absorption, save as a%s.ms iraf.sarith("%s.ms" % bstd, "/", "a%s.ms" % bstd, "telluric.B.%s.fits" % bstd) iraf.imreplace("telluric.B.%s.fits" % bstd, 1.0, lower=0.0, upper=0.0) iraf.splot("telluric.B.%s.fits" % bstd) # Remove stellar features and resave iraf.splot("%s.ms" % rstd) # Remove telluric and absorption, save as a%s.ms iraf.sarith("%s.ms" % rstd, "/", "a%s.ms" % rstd, "telluric.R.%s.fits" % rstd) iraf.imreplace("telluric.R.%s.fits" % rstd, 1.0, lower=0.0, upper=0.0) iraf.splot("telluric.R.%s.fits" % rstd) # Remove stellar features and resave # Create smoothed standard iraf.gauss("a%s.ms[*,1,1]" % bstd, "s%s.ms" % bstd, 5.0) iraf.sarith("%s.ms" % bstd, "/", "s%s.ms" % bstd, "ds%s.ms" % bstd) iraf.gauss("a%s.ms[*,1,1]" % rstd, "s%s.ms" % rstd, 5.0) iraf.sarith("%s.ms" % rstd, "/", "s%s.ms" % rstd, "ds%s.ms" % rstd) # Divide through by smoothed standard #iraf.sarith("%s.ms" % bstd, "/", "s%s.ms" % bstd, "ds%s.ms" % bstd) #iraf.sarith("%s.ms" % rstd, "/", "s%s.ms" % rstd, "ds%s.ms" % rstd) # Create and apply telluric correction #iraf.splot("%s.ms" % bstd) # Remove telluric, save as a%s.ms #iraf.splot("%s.ms" % rstd) # Remove telluric, save as a%s.ms #iraf.sarith("%s.ms" % bstd, "/", "a%s.ms" % bstd, "telluric.B.fits") #iraf.sarith("%s.ms" % rstd, "/", "a%s.ms" % rstd, "telluric.R.fits") #iraf.imreplace("telluric.B.fits", 1.0, lower=0.0, upper=0.0) #iraf.imreplace("telluric.R.fits", 1.0, lower=0.0, upper=0.0) iraf.telluric("ds%s.ms" % bstd, "tds%s.ms" % bstd, "telluric.B.%s.fits" % bstd, xcorr=no, tweakrms=no, interactive=no, sample='6850:6950,7575:7700') iraf.telluric("ds%s.ms" % rstd, "tds%s.ms" % rstd, "telluric.R.%s.fits" % rstd, xcorr=no, tweakrms=no, interactive=no, sample='6850:6950,7575:7700') # Define bandpasses for standard star calculation iraf.standard("tds%s.ms" % bstd, "%s.B.std" % standard, extinction='home$extinct/maunakeaextinct.dat', caldir='home$standards/', observatory='Keck', interac=yes, star_name=standard, airmass='', exptime='') iraf.standard("tds%s.ms" % rstd, "%s.R.std" % standard, extinction='home$extinct/maunakeaextinct.dat', caldir='home$standards/', observatory='Keck', interac=yes, star_name=standard, airmass='', exptime='') # Determine sensitivity function iraf.sensfunc('%s.B.std' % standard, '%s.B.sens' % standard, extinction='home$extinct/maunakeaextinct.dat', newextinction='extinct.dat', observatory='Keck', function='legendre', order=4, interactive=yes) iraf.sensfunc('%s.R.std' % standard, '%s.R.sens' % standard, extinction='home$extinct/maunakeaextinct.dat', newextinction='extinct.dat', observatory='Keck', function='legendre', order=4, interactive=yes) return
def deimos_extract(science, standard, dostandard=yes): '''Extract and flux calibrate DEIMOS spectra (assuming they have been processed into 2D images using deimos_pipe above).''' if dostandard: deimos_standard(standard) for source in science: images = iraffiles("%s_??_B.fits" % source) joinstr = "" for image in images: bimage = image.split(".")[0]; rimage = bimage[:-1] + "R" update_head(bimage, "FLUX_OBJ", standard) update_head(rimage, "FLUX_OBJ", standard) # Extract 1D spectra if get_head("%s.fits" % bimage, "SKYSUB"): iraf.apall(bimage, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="none", reference="%s_01_B" % standard) iraf.apall(rimage, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="none", reference="%s_01_R" % standard) else: iraf.apall(bimage, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="fit", reference="%s_01_B" % standard) iraf.apall(rimage, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="fit", reference="%s_01_R" % standard) # Normalize by the standard continuua iraf.sarith("%s.ms" % bimage, "/", "s%s_01_B.ms.fits" % standard, "s%s.ms" % bimage) iraf.sarith("%s.ms" % rimage, "/", "s%s_01_R.ms.fits" % standard, "s%s.ms" % rimage) # Telluric correct bstd = "%s_01_B" % standard; rstd = "%s_01_R" % standard iraf.telluric("s%s.ms" % bimage, "ts%s.ms" % bimage, "telluric.B.%s.fits" % bstd, tweakrms=yes, interactive=yes, sample='6850:6950,7575:7700') iraf.telluric("s%s.ms" % rimage, "ts%s.ms" % rimage, "telluric.R.%s.fits" % rstd, tweakrms=yes, interactive=yes, sample='6850:6950,7575:7700') # Flux calibration iraf.calibrate("ts%s.ms" % bimage, "fts%s.ms" % bimage, extinct=yes, flux=yes, extinction="home$extinct/maunakeaextinct.dat", observatory="Keck", sensitivity="%s.B.sens" % standard, airmass='', exptime='') iraf.calibrate("ts%s.ms" % rimage, "fts%s.ms" % rimage, extinct=yes, flux=yes, extinction="home$extinct/maunakeaextinct.dat", observatory="Keck", sensitivity="%s.R.sens" % standard, airmass='', exptime='') joinstr += "fts%s.ms,fts%s.ms," % (bimage, rimage) # Combine iraf.scombine(joinstr[:-1], "%s.ms.fits" % source, combine="average", reject="avsigclip", w1=INDEF, w2=INDEF, dw=INDEF, nw=INDEF, scale="none", zero="none", weight="none", lsigma=3.0, hsigma=3.0, gain=CCDGAIN, rdnoise=CCDRNOISE) # Plot to enable final tweaks iraf.splot("%s.ms.fits" % source) return
def lris_standard(standards, xcorr=yes): '''Extract standard stars and calculate sensitivity functions.''' for ofile, nstd in standards: shutil.copy(ofile, "%s.fits" % nstd) # Extract standard if get_head("%s.fits" % nstd, "SKYSUB"): iraf.apall(nstd, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="none") else: iraf.apall(nstd, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="fit") if xcorr: # Cross correlate to tweak wavelength iraf.xcsao("%s.ms" % nstd, templates=XCTEMPLATE, correlate="wavelength", logfiles="%s.xcsao" % ofile) # If a solution was found, apply shift try: xcsaof = open("%s.xcsao" % ofile) shift = float(xcsaof.readlines()[6].split()[14]) except: shift = 0.0 iraf.specshift("%s.ms" % nstd, -shift) # Create telluric iraf.splot("%s.ms" % nstd) # Remove telluric and absorption, save as a%s.ms iraf.sarith("%s.ms" % nstd, "/", "a%s.ms" % nstd, "telluric.%s.fits" % nstd) iraf.imreplace("telluric.%s.fits" % nstd, 1.0, lower=0.0, upper=0.0) iraf.splot("telluric.%s.fits" % nstd) # Remove stellar features and resave # Create smoothed standard iraf.gauss("a%s.ms[*,1,1]" % nstd, "s%s.ms" % nstd, 5.0) iraf.sarith("%s.ms" % nstd, "/", "s%s.ms" % nstd, "ds%s.ms" % nstd) # Apply telluric correction iraf.telluric( "ds%s.ms" % nstd, "tds%s.ms" % nstd, "telluric.%s.fits" % nstd, xcorr=no, tweakrms=no, interactive=no, sample='4000:4010,6850:6975,7150:7350,7575:7725,8050:8400,8900:9725' ) # Define bandpasses for standard star calculation obj = get_head("%s.fits" % nstd, "OBJECT") iraf.standard("tds%s.ms" % nstd, "%s.std" % nstd, extinction='home$extinct/maunakeaextinct.dat', caldir='home$standards/', observatory='Keck', interac=yes, star_name=obj, airmass='', exptime='') # Determine sensitivity function iraf.sensfunc('%s.std' % nstd, '%s.sens' % nstd, extinction='home$extinct/maunakeaextinct.dat', newextinction='extinct.dat', observatory='Keck', function='legendre', order=4, interactive=yes) return
def lris_extract(science, standards, dostandard=yes): '''Extract and flux calibrate LRIS spectra (assuming they have been processed into 2D images using LRIS_pipe above).''' if dostandard: lris_standard(standards) for src in science: bimages = iraffiles("%s_??_B.fits" % src) rimages = iraffiles("%s_??_R.fits" % src) joinstr = "" for bimage in bimages: bimage = bimage.split(".")[0] # Find appropriate standard for this image bstd = get_head("%s.fits" % bimage, "STDNAME") # Extract 1D spectra if get_head("%s.fits" % bimage, "SKYSUB"): iraf.apall(bimage, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="none", reference=bstd) else: iraf.apall(bimage, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="fit", reference=bstd) # Normalize by the standard continuua iraf.sarith("%s.ms" % bimage, "/", "../standards/s%s.ms.fits" % bstd, "s%s.ms" % bimage, w1=INDEF, w2=INDEF) # Telluric correct iraf.telluric("s%s.ms" % bimage, "ts%s.ms" % bimage, "../standards/telluric.%s.fits" % bstd, tweakrms=yes, interactive=yes, sample='6850:6950,7575:7700,8750:9925') # Flux calibration iraf.calibrate("ts%s.ms" % bimage, "fts%s.ms" % bimage, extinct=yes, flux=yes, extinction="home$extinct/maunakeaextinct.dat", observatory="Keck", sens="../standards/%s.sens" % bstd, airmass='', exptime='') joinstr += "fts%s.ms," % bimage for rimage in rimages: rimage = rimage.split(".")[0] # Find appropriate standard for this image rstd = get_head("%s.fits" % rimage, "STDNAME") # Extract 1D spectra if get_head("%s.fits" % rimage, "SKYSUB"): iraf.apall(rimage, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="none", reference=rstd) else: iraf.apall(rimage, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="fit", reference=rstd) # Normalize by the standard continuua iraf.sarith("%s.ms" % rimage, "/", "../standards/s%s.ms.fits" % rstd, "s%s.ms" % rimage, w1=5500, w2=INDEF) # Telluric correct iraf.telluric("s%s.ms" % rimage, "ts%s.ms" % rimage, "../standards/telluric.%s.fits" % rstd, tweakrms=yes, interactive=yes, sample='6850:6950,7575:7700') # Flux calibration iraf.calibrate("ts%s.ms" % rimage, "fts%s.ms" % rimage, extinct=yes, flux=yes, extinction="home$extinct/maunakeaextinct.dat", observatory="Keck", sens="../standards/%s.sens" % rstd, airmass='', exptime='') joinstr += "fts%s.ms," % rimage # Combine iraf.scombine(joinstr[:-1], "%s.ms.fits" % src, combine="average", reject="avsigclip", w1=INDEF, w2=INDEF, dw=INDEF, nw=INDEF, scale="median", zero="none", weight="none", sample="5450:5600", lsigma=3.0, hsigma=3.0, gain=RCCDGAIN, rdnoise=RCCDRNOISE) # Plot to enable final tweaks iraf.splot("%s.ms.fits" % src) return
iraf.imdelete('flat_fid_mag.ec.fits', verify=no) # The extraction of the flat ends up with some negative values, which # skews the fit in the following steps, so I added a small bias level # equal to the minimum value in the minval = iraf.imstat('nonorm_flat_fid_mag.ec.fits', fields='min', Stdout=1)[-1] minval = float(minval) if minval < 0: iraf.imcopy('nonorm_flat_fid_mag.ec.fits', 'nonorm_flat_fid_mag_bias.ec.fits') iraf.imdelete('nonorm_flat_fid_mag.ec.fits', verify=no) print 'adding an offset to avoid negative' iraf.sarith('nonorm_flat_fid_mag_bias.ec.fits', '-', minval - .02, 'nonorm_flat_fid_mag.ec.fits', verbose=yes) iraf.sfit(input='nonorm_flat_fid_mag.ec.fits', output='flat_fid_mag.ec.fits', type='ratio', replace=no, wavesca=no, logscal=no, override=yes, listonly=no, interac=no, sample='*', naverage=-5, function='spline3',
def red_science(image, flats, spath, object=None, arc='Arc-Red.fits', smooth='BD284211.smooth.fits', telluric='telluric.fits', sens='BD284211.sens', biassec=REDBIAS, trimsec=REDTRIM, outflat='Flat-Red.fits', gain=REDGAIN, rdnoise=REDRDNOISE): '''Full reduction of KAST science spectra on red CCD''' # Bias subtract everything first redbias(image, biassec=biassec, trimsec=trimsec) redbias(flats, biassec=biassec, trimsec=trimsec) # Create and apply flat-field make_flat(flats, outflat, gain=gain, rdnoise=rdnoise) iraf.ccdproc(image[0], ccdtype='', noproc=no, fixpix=no, overscan=no, trim=no, zerocor=no, darkcor=no, flatcor=yes, illumcor=no, fringecor=no, readcor=no, scancor=no, flat=outflat) # Cosmic ray rejection #iraf.lacos_spec(image[0], 'c%s' % image[0], 'cm%s' % image[0], # gain=gain, readn=rdnoise, xorder=9, yorder=3, # sigclip=4.5, sigfrac=0.5, objlim=1.0, niter=3) # Extract spectrum if object == None: object = get_head(image, 'OBJECT') iraf.apall('%s' % image[0], output=object, references='', interactive=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background='fit', weights='variance', pfit='fit1d', readnoise=rdnoise, gain=gain) # Apply wavelength solution to standard shutil.copy('%s/%s' % (spath, arc), '.') shutil.copy('%s/database/id%s' % (spath, arc.rstrip('.fits')), 'database') iraf.refspec(object, references=arc, sort="", group="", override=yes, confirm=no, assign=yes) iraf.dispcor(object, '%s.w' % object, confirm=no, listonly=no) # Smooth shutil.copy('%s/%s' % (spath, smooth), '.') iraf.sarith('%s.w' % object, '/', smooth, '%s.s' % object) # Create and apply telluric correction shutil.copy('%s/%s' % (spath, telluric), '.') iraf.telluric('%s.s' % object, '%s.t' % object, telluric, xcorr=yes, tweakrms=yes, interactive=yes, sample='6850:6950,7575:7700') # Flux calibration shutil.copy('%s/%s.0001.fits' % (spath, sens), '.') iraf.calibrate('%s.t' % object, '%s.f' % object, extinct=yes, flux=yes, extinction='onedstds$kpnoextinct.dat', observatory='Lick', sensitivity=sens, airmass='', exptime='') return
def red_standard(image, arcs, flats, object=None, biassec=REDBIAS, trimsec=REDTRIM, outflat='Flat-Red.fits', gain=REDGAIN, rdnoise=REDRDNOISE, arc='Arc-Red.fits', caldir='home$standards/'): '''Reduce and calibrate standard star observation with red CCD''' # Bias subtract everything first redbias(image, biassec=biassec, trimsec=trimsec) redbias(arcs, biassec=biassec, trimsec=trimsec) redbias(flats, biassec=biassec, trimsec=trimsec) # Create and apply flat-field make_flat(flats, outflat, gain=gain, rdnoise=rdnoise) iraf.ccdproc(image[0], ccdtype='', noproc=no, fixpix=no, overscan=no, trim=no, zerocor=no, darkcor=no, flatcor=yes, illumcor=no, fringecor=no, readcor=no, scancor=no, flat=outflat) arcimages = ','.join(arcs) iraf.ccdproc(arcs, ccdtype='', noproc=no, fixpix=no, overscan=no, trim=no, zerocor=no, darkcor=no, flatcor=yes, illumcor=no, fringecor=no, readcor=no, scancor=no, flat=outflat) # Extract spectrum of standard if object == None: object = get_head(image, 'OBJECT') iraf.apall(image[0], output=object, references='', interactive=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background='fit', weights='variance', pfit='fit1d', readnoise=rdnoise, gain=gain) # Extract arc and fit wavelength solution iraf.imarith(arcs[0], '+', arcs[1], 'Arc-Sum.fits') reference_arc('Arc-Sum.fits', arc, image[0]) # Apply wavelength solution to standard iraf.refspec(object, references=arc, sort="", group="", override=yes, confirm=no, assign=yes) iraf.dispcor(object, '%s.w' % object, confirm=no, listonly=no) # Remove absorption features and smooth iraf.splot('%s.w' % object, 1, 1) iraf.gauss('temp1[*,1,1]', '%s.smooth' % object, 3.0) iraf.sarith('%s.w' % object, '/', '%s.smooth' % object, '%s.s' % object) # Create and apply telluric correction iraf.sarith('%s.w' % object, '/', 'temp1', 'telluric') iraf.splot('telluric', 1, 1) iraf.telluric('%s.s' % object, '%s.t' % object, 'telluric', xcorr=no, tweakrms=no, interactive=no, sample='6850:6950,7575:7700') # Define bandpasses for standard star calculation iraf.standard('%s.t' % object, '%s.std' % object, extinction='onedstds$kpnoextinct.dat', caldir=caldir, observatory='Lick', interact=yes, star_name=object, airmass='', exptime='') # Determine sensitivity function iraf.sensfunc('%s.std' % object, '%s.sens' % object, extinction='onedstds$kpnoextinct.dat', newextinction='extinct.dat', observatory='Lick', function='legendre', order=3, interactive=yes) return
def blue_standard(image, arcs, flats, object=None, biassec1=BLUEBIAS1, trimsec1=BLUETRIM1, biassec2=BLUEBIAS2, trimsec2=BLUETRIM2, outflat='Flat-Blue.fits', gain=BLUEGAIN, rdnoise=BLUERDNOISE, arc='Arc-Blue.fits', caldir='home$standards/'): '''Reduce and calibrate standard star observation with blue CCD''' # Bias subtract everything first bluebias(image, biassec1=biassec1, trimsec1=trimsec1, biassec2=biassec2, trimsec2=trimsec2) bluebias(arcs, biassec1=biassec1, trimsec1=trimsec1, biassec2=biassec2, trimsec2=trimsec2) bluebias(flats, biassec1=biassec1, trimsec1=trimsec1, biassec2=biassec2, trimsec2=trimsec2) # Create and apply flat-field for i in range(len(flats)): flats[i] = 'j%s' % flats[i] make_flat(flats, outflat, gain=gain, rdnoise=rdnoise) iraf.ccdproc('j%s' % image[0], ccdtype='', noproc=no, fixpix=no, overscan=no, trim=no, zerocor=no, darkcor=no, flatcor=yes, illumcor=no, fringecor=no, readcor=no, scancor=no, flat=outflat) iraf.ccdproc('j%s' % arcs[0], ccdtype='', noproc=no, fixpix=no, overscan=no, trim=no, zerocor=no, darkcor=no, flatcor=yes, illumcor=no, fringecor=no, readcor=no, scancor=no, flat=outflat) # Extract spectrum of standard if object == None: object = get_head(image, 'OBJECT') iraf.apall('j%s' % image[0], output=object, references='', interactive=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background='fit', weights='variance', pfit='fit1d', readnoise=rdnoise, gain=gain) # Extract arc and fit wavelength solution reference_arc('j%s' % arcs[0], arc, 'j%s' % image[0]) # Apply wavelength solution to standard iraf.refspec(object, references=arc, sort="", group="", override=yes, confirm=no, assign=yes) iraf.dispcor(object, '%s.w' % object, confirm=no, listonly=no) # Remove absorption features and smooth iraf.splot('%s.w' % object, 1, 1) iraf.gauss('temp1[*,1,1]', '%s.smooth' % object, 3.0) iraf.sarith('%s.w' % object, '/', '%s.smooth' % object, '%s.s' % object) # Define bandpasses for standard star calculation iraf.standard('%s.s' % object, '%s.std' % object, extinction='onedstds$kpnoextinct.dat', caldir=caldir, observatory='Lick', interact=yes, star_name=object, airmass='', exptime='') # Determine sensitivity function iraf.sensfunc('%s.std' % object, '%s.sens' % object, extinction='onedstds$kpnoextinct.dat', newextinction='extinct.dat', observatory='Lick', function='legendre', order=3, interactive=yes) return
def blue_standard(image, arcs, flats, object=None, biassec1=BLUEBIAS1, trimsec1=BLUETRIM1, biassec2=BLUEBIAS2, trimsec2=BLUETRIM2, outflat='Flat-Blue.fits', gain=BLUEGAIN, rdnoise=BLUERDNOISE, arc='Arc-Blue.fits', caldir='home$standards/'): '''Reduce and calibrate standard star observation with blue CCD''' # Bias subtract everything first bluebias(image, biassec1=biassec1, trimsec1=trimsec1, biassec2=biassec2, trimsec2=trimsec2) bluebias(arcs, biassec1=biassec1, trimsec1=trimsec1, biassec2=biassec2, trimsec2=trimsec2) bluebias(flats, biassec1=biassec1, trimsec1=trimsec1, biassec2=biassec2, trimsec2=trimsec2) # Create and apply flat-field for i in range(len(flats)): flats[i]='j%s' % flats[i] make_flat(flats, outflat, gain=gain, rdnoise=rdnoise) iraf.ccdproc('j%s' % image[0], ccdtype='', noproc=no, fixpix=no, overscan=no, trim=no, zerocor=no, darkcor=no, flatcor=yes, illumcor=no, fringecor=no, readcor=no, scancor=no, flat=outflat) iraf.ccdproc('j%s' % arcs[0], ccdtype='', noproc=no, fixpix=no, overscan=no, trim=no, zerocor=no, darkcor=no, flatcor=yes, illumcor=no, fringecor=no, readcor=no, scancor=no, flat=outflat) # Extract spectrum of standard if object==None: object=get_head(image, 'OBJECT') iraf.apall('j%s' % image[0], output=object, references='', interactive=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background='fit', weights='variance', pfit='fit1d', readnoise=rdnoise, gain=gain) # Extract arc and fit wavelength solution reference_arc('j%s' % arcs[0], arc, 'j%s' % image[0]) # Apply wavelength solution to standard iraf.refspec(object, references=arc, sort="", group="", override=yes, confirm=no, assign=yes) iraf.dispcor(object, '%s.w' % object, confirm=no, listonly=no) # Remove absorption features and smooth iraf.splot('%s.w' % object, 1, 1) iraf.gauss('temp1[*,1,1]', '%s.smooth' % object, 3.0) iraf.sarith('%s.w' % object, '/', '%s.smooth' % object, '%s.s' % object) # Define bandpasses for standard star calculation iraf.standard('%s.s' % object, '%s.std' % object, extinction='onedstds$kpnoextinct.dat', caldir=caldir, observatory='Lick', interact=yes, star_name=object, airmass='', exptime='') # Determine sensitivity function iraf.sensfunc('%s.std' % object, '%s.sens' % object, extinction='onedstds$kpnoextinct.dat', newextinction='extinct.dat', observatory='Lick', function='legendre', order=3, interactive=yes) return
def red_standard(image, arcs, flats, object=None, biassec=REDBIAS, trimsec=REDTRIM, outflat='Flat-Red.fits', gain=REDGAIN, rdnoise=REDRDNOISE, arc='Arc-Red.fits', caldir='home$standards/'): '''Reduce and calibrate standard star observation with red CCD''' # Bias subtract everything first redbias(image, biassec=biassec, trimsec=trimsec) redbias(arcs, biassec=biassec, trimsec=trimsec) redbias(flats, biassec=biassec, trimsec=trimsec) # Create and apply flat-field make_flat(flats, outflat, gain=gain, rdnoise=rdnoise) iraf.ccdproc(image[0], ccdtype='', noproc=no, fixpix=no, overscan=no, trim=no, zerocor=no, darkcor=no, flatcor=yes, illumcor=no, fringecor=no, readcor=no, scancor=no, flat=outflat) arcimages=','.join(arcs) iraf.ccdproc(arcs, ccdtype='', noproc=no, fixpix=no, overscan=no, trim=no, zerocor=no, darkcor=no, flatcor=yes, illumcor=no, fringecor=no, readcor=no, scancor=no, flat=outflat) # Extract spectrum of standard if object==None: object=get_head(image, 'OBJECT') iraf.apall(image[0], output=object, references='', interactive=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background='fit', weights='variance', pfit='fit1d', readnoise=rdnoise, gain=gain) # Extract arc and fit wavelength solution iraf.imarith(arcs[0], '+', arcs[1], 'Arc-Sum.fits') reference_arc('Arc-Sum.fits', arc, image[0]) # Apply wavelength solution to standard iraf.refspec(object, references=arc, sort="", group="", override=yes, confirm=no, assign=yes) iraf.dispcor(object, '%s.w' % object, confirm=no, listonly=no) # Remove absorption features and smooth iraf.splot('%s.w' % object, 1, 1) iraf.gauss('temp1[*,1,1]', '%s.smooth' % object, 3.0) iraf.sarith('%s.w' % object, '/', '%s.smooth' % object, '%s.s' % object) # Create and apply telluric correction iraf.sarith('%s.w' % object, '/', 'temp1', 'telluric') iraf.splot('telluric', 1, 1) iraf.telluric('%s.s' % object, '%s.t' % object, 'telluric', xcorr=no, tweakrms=no, interactive=no, sample='6850:6950,7575:7700') # Define bandpasses for standard star calculation iraf.standard('%s.t' % object, '%s.std' % object, extinction='onedstds$kpnoextinct.dat', caldir=caldir, observatory='Lick', interact=yes, star_name=object, airmass='', exptime='') # Determine sensitivity function iraf.sensfunc('%s.std' % object, '%s.sens' % object, extinction='onedstds$kpnoextinct.dat', newextinction='extinct.dat', observatory='Lick', function='legendre', order=3, interactive=yes) return
def deimos_standard(standard): '''Extract standard star and calculate sensitivit function.''' bstd = "%s_01_B" % standard rstd = "%s_01_R" % standard # Extract standard if get_head("%s.fits" % bstd, "SKYSUB"): iraf.apall(bstd, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="none") iraf.apall(rstd, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="none") else: iraf.apall(bstd, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="fit") iraf.apall(rstd, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="fit") # Fit the continuum #iraf.continuum("%s.ms" % bstd, output="s%s.ms" % bstd, lines=1, bands=1, # type="fit", sample="*", naverage=1, function="chebyshev", # order=15, low_reject=3.0, high_reject=5.0, niterate=10, grow=1.0, # interac=yes) #iraf.continuum("%s.ms" % rstd, output="s%s.ms" % rstd, lines=1, bands=1, # type="fit", sample="*", naverage=1, function="chebyshev", # order=15, low_reject=3.0, high_reject=5.0, niterate=10, grow=1.0, # interac=yes) # Create telluric iraf.splot("%s.ms" % bstd) # Remove telluric and absorption, save as a%s.ms iraf.sarith("%s.ms" % bstd, "/", "a%s.ms" % bstd, "telluric.B.%s.fits" % bstd) iraf.imreplace("telluric.B.%s.fits" % bstd, 1.0, lower=0.0, upper=0.0) iraf.splot("telluric.B.%s.fits" % bstd) # Remove stellar features and resave iraf.splot("%s.ms" % rstd) # Remove telluric and absorption, save as a%s.ms iraf.sarith("%s.ms" % rstd, "/", "a%s.ms" % rstd, "telluric.R.%s.fits" % rstd) iraf.imreplace("telluric.R.%s.fits" % rstd, 1.0, lower=0.0, upper=0.0) iraf.splot("telluric.R.%s.fits" % rstd) # Remove stellar features and resave # Create smoothed standard iraf.gauss("a%s.ms[*,1,1]" % bstd, "s%s.ms" % bstd, 5.0) iraf.sarith("%s.ms" % bstd, "/", "s%s.ms" % bstd, "ds%s.ms" % bstd) iraf.gauss("a%s.ms[*,1,1]" % rstd, "s%s.ms" % rstd, 5.0) iraf.sarith("%s.ms" % rstd, "/", "s%s.ms" % rstd, "ds%s.ms" % rstd) # Divide through by smoothed standard #iraf.sarith("%s.ms" % bstd, "/", "s%s.ms" % bstd, "ds%s.ms" % bstd) #iraf.sarith("%s.ms" % rstd, "/", "s%s.ms" % rstd, "ds%s.ms" % rstd) # Create and apply telluric correction #iraf.splot("%s.ms" % bstd) # Remove telluric, save as a%s.ms #iraf.splot("%s.ms" % rstd) # Remove telluric, save as a%s.ms #iraf.sarith("%s.ms" % bstd, "/", "a%s.ms" % bstd, "telluric.B.fits") #iraf.sarith("%s.ms" % rstd, "/", "a%s.ms" % rstd, "telluric.R.fits") #iraf.imreplace("telluric.B.fits", 1.0, lower=0.0, upper=0.0) #iraf.imreplace("telluric.R.fits", 1.0, lower=0.0, upper=0.0) iraf.telluric("ds%s.ms" % bstd, "tds%s.ms" % bstd, "telluric.B.%s.fits" % bstd, xcorr=no, tweakrms=no, interactive=no, sample='6850:6950,7575:7700') iraf.telluric("ds%s.ms" % rstd, "tds%s.ms" % rstd, "telluric.R.%s.fits" % rstd, xcorr=no, tweakrms=no, interactive=no, sample='6850:6950,7575:7700') # Define bandpasses for standard star calculation iraf.standard("tds%s.ms" % bstd, "%s.B.std" % standard, extinction='home$extinct/maunakeaextinct.dat', caldir='home$standards/', observatory='Keck', interac=yes, star_name=standard, airmass='', exptime='') iraf.standard("tds%s.ms" % rstd, "%s.R.std" % standard, extinction='home$extinct/maunakeaextinct.dat', caldir='home$standards/', observatory='Keck', interac=yes, star_name=standard, airmass='', exptime='') # Determine sensitivity function iraf.sensfunc('%s.B.std' % standard, '%s.B.sens' % standard, extinction='home$extinct/maunakeaextinct.dat', newextinction='extinct.dat', observatory='Keck', function='legendre', order=4, interactive=yes) iraf.sensfunc('%s.R.std' % standard, '%s.R.sens' % standard, extinction='home$extinct/maunakeaextinct.dat', newextinction='extinct.dat', observatory='Keck', function='legendre', order=4, interactive=yes) return
def blue_science(image, spath, object=None, flat='Flat-Blue.fits', arc='Arc-Blue.fits', smooth='BD284211.smooth.fits', sens='BD284211.sens', biassec1=BLUEBIAS1, trimsec1=BLUETRIM1, biassec2=BLUEBIAS2, trimsec2=BLUETRIM2, gain=BLUEGAIN, rdnoise=BLUERDNOISE): '''Full reduction of KAST science spectra on blue CCD''' # Bias subtract everything first bluebias(image, biassec1=biassec1, trimsec1=trimsec1, biassec2=biassec2, trimsec2=trimsec2) # Apply flat-field shutil.copy('%s/%s' % (spath, flat), '.') iraf.ccdproc('j%s' % image[0], ccdtype='', noproc=no, fixpix=no, overscan=no, trim=no, zerocor=no, darkcor=no, flatcor=yes, illumcor=no, fringecor=no, readcor=no, scancor=no, flat=flat) # Cosmic ray rejection #iraf.lacos_spec('j%s' % image[0], 'cj%s' % image[0], 'cmj%s' % image[0], # gain=gain, readn=rdnoise, xorder=9, yorder=3, # sigclip=4.5, sigfrac=0.5, objlim=1.0, niter=3) # Extract spectrum if object == None: object = get_head(image, 'OBJECT') iraf.apall('j%s' % image[0], output=object, references='', interactive=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background='fit', weights='variance', pfit='fit1d', readnoise=rdnoise, gain=gain) # Apply wavelength solution to standard shutil.copy('%s/%s' % (spath, arc), '.') shutil.copy('%s/database/id%s' % (spath, arc.rstrip('.fits')), 'database') iraf.refspec(object, references=arc, sort="", group="", override=yes, confirm=no, assign=yes) iraf.dispcor(object, '%s.w' % object, confirm=no, listonly=no) # Smooth shutil.copy('%s/%s' % (spath, smooth), '.') iraf.sarith('%s.w' % object, '/', smooth, '%s.s' % object) # Flux calibration shutil.copy('%s/%s.0001.fits' % (spath, sens), '.') iraf.calibrate('%s.s' % object, '%s.f' % object, extinct=yes, flux=yes, extinction='onedstds$kpnoextinct.dat', observatory='Lick', sensitivity=sens, airmass='', exptime='') return
def deimos_extract(science, standard, dostandard=yes): '''Extract and flux calibrate DEIMOS spectra (assuming they have been processed into 2D images using deimos_pipe above).''' if dostandard: deimos_standard(standard) for source in science: images = iraffiles("%s_??_B.fits" % source) joinstr = "" for image in images: bimage = image.split(".")[0] rimage = bimage[:-1] + "R" update_head(bimage, "FLUX_OBJ", standard) update_head(rimage, "FLUX_OBJ", standard) # Extract 1D spectra if get_head("%s.fits" % bimage, "SKYSUB"): iraf.apall(bimage, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="none", reference="%s_01_B" % standard) iraf.apall(rimage, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="none", reference="%s_01_R" % standard) else: iraf.apall(bimage, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="fit", reference="%s_01_B" % standard) iraf.apall(rimage, output="", inter=yes, find=yes, recenter=yes, resize=yes, edit=yes, trace=yes, fittrace=yes, extract=yes, extras=yes, review=no, background="fit", reference="%s_01_R" % standard) # Normalize by the standard continuua iraf.sarith("%s.ms" % bimage, "/", "s%s_01_B.ms.fits" % standard, "s%s.ms" % bimage) iraf.sarith("%s.ms" % rimage, "/", "s%s_01_R.ms.fits" % standard, "s%s.ms" % rimage) # Telluric correct bstd = "%s_01_B" % standard rstd = "%s_01_R" % standard iraf.telluric("s%s.ms" % bimage, "ts%s.ms" % bimage, "telluric.B.%s.fits" % bstd, tweakrms=yes, interactive=yes, sample='6850:6950,7575:7700') iraf.telluric("s%s.ms" % rimage, "ts%s.ms" % rimage, "telluric.R.%s.fits" % rstd, tweakrms=yes, interactive=yes, sample='6850:6950,7575:7700') # Flux calibration iraf.calibrate("ts%s.ms" % bimage, "fts%s.ms" % bimage, extinct=yes, flux=yes, extinction="home$extinct/maunakeaextinct.dat", observatory="Keck", sensitivity="%s.B.sens" % standard, airmass='', exptime='') iraf.calibrate("ts%s.ms" % rimage, "fts%s.ms" % rimage, extinct=yes, flux=yes, extinction="home$extinct/maunakeaextinct.dat", observatory="Keck", sensitivity="%s.R.sens" % standard, airmass='', exptime='') joinstr += "fts%s.ms,fts%s.ms," % (bimage, rimage) # Combine iraf.scombine(joinstr[:-1], "%s.ms.fits" % source, combine="average", reject="avsigclip", w1=INDEF, w2=INDEF, dw=INDEF, nw=INDEF, scale="none", zero="none", weight="none", lsigma=3.0, hsigma=3.0, gain=CCDGAIN, rdnoise=CCDRNOISE) # Plot to enable final tweaks iraf.splot("%s.ms.fits" % source) return
def iterate(): os.system("rm temp_norm.dat") iraf.wspectext( input = "temp_norm.fits",\ output = "temp_norm.dat",\ header = 0) data_spec = transpose(loadtxt("temp_norm.dat")) wave = arange(min(data_spec[0]),max(data_spec[0]),1) data_flux = interpolate.splrep(data_spec[0],data_spec[1]) data_flux = interpolate.splev(wave,data_flux) telluric_spec = transpose(loadtxt("telluric.dat")) telluric_flux = interpolate.splrep(telluric_spec[0],telluric_spec[1]) telluric_flux = interpolate.splev(wave,telluric_flux) ### Loop through telluric scaling telluric_scaling = [] rms_list = [] maxscale = 1.08 for scale in arange(0.0,maxscale,0.01): scatter_list = [] for region in telluric_region_list: temp_flux = [] temp_tel = [] for i in range(len(wave)): if wave[i] > region[0] and wave[i] < region[1]: temp_flux.append(data_flux[i]) temp_tel.append(telluric_flux[i]) if wave[i] > region[1]: break temp_flux = array(temp_flux) temp_tel = array(temp_tel) scatter = temp_flux / (temp_tel * scale + (1-scale)) # plt.plot(scatter) # plt.show() scatter_list.append(std(scatter)) telluric_scaling.append(scale) rms_list.append(average(scatter_list)) telluric_scaling,rms_list = array(telluric_scaling),array(rms_list) best_scale = find_min(telluric_scaling,rms_list) if best_scale > maxscale: best_scale = maxscale if best_scale < 0: best_scale = 0 print "scaling telluric by",best_scale # plt.plot(telluric_scaling,rms_list) # plt.show() os.system("cp telluric.fits telluric_temp.fits") iraf.sarith( input1 = "telluric_temp.fits",\ op = "*",\ input2 = best_scale,\ output = "telluric_temp.fits",\ w1 = "INDEF",\ w2 = "INDEF",\ apertures = "",\ bands = "",\ beams = "",\ apmodulus = 0,\ reverse = 0,\ ignoreaps = 1,\ format = "multispec",\ renumber = 0,\ offset = 0,\ clobber = 1,\ merge = 0,\ rebin = 0,\ verbose = 0) iraf.sarith( input1 = "telluric_temp.fits",\ op = "+",\ input2 = 1-best_scale,\ output = "telluric_temp.fits",\ w1 = "INDEF",\ w2 = "INDEF",\ apertures = "",\ bands = "",\ beams = "",\ apmodulus = 0,\ reverse = 0,\ ignoreaps = 1,\ format = "multispec",\ renumber = 0,\ offset = 0,\ clobber = 1,\ merge = 0,\ rebin = 0,\ verbose = 0) iraf.sarith( input1 = "temp_spec.fits",\ op = "/",\ input2 = "telluric_temp.fits",\ output = "temp_spec",\ w1 = "INDEF",\ w2 = "INDEF",\ apertures = "",\ bands = "",\ beams = "",\ apmodulus = 0,\ reverse = 0,\ ignoreaps = 1,\ format = "multispec",\ renumber = 0,\ offset = 0,\ clobber = 1,\ merge = 0,\ rebin = 0,\ verbose = 0) iraf.sarith( input1 = "temp_norm.fits",\ op = "/",\ input2 = "telluric_temp.fits",\ output = "temp_norm",\ w1 = "INDEF",\ w2 = "INDEF",\ apertures = "",\ bands = "",\ beams = "",\ apmodulus = 0,\ reverse = 0,\ ignoreaps = 1,\ format = "multispec",\ renumber = 0,\ offset = 0,\ clobber = 1,\ merge = 0,\ rebin = 0,\ verbose = 0) return best_scale