def createspectra(img, obsdate, minsize=5, thresh=3, skysection=[800,1000], smooth=False, maskzeros=True, clobber=True): """Create a list of spectra for each of the objects in the images""" #okay we need to identify the objects for extraction and identify the regions for sky extraction #first find the objects in the image hdu=pyfits.open(img) target=hdu[0].header['OBJECT'] propcode=hdu[0].header['PROPID'] airmass=hdu[0].header['AIRMASS'] exptime=hdu[0].header['EXPTIME'] if smooth: data=smooth_data(hdu[1].data) else: data=hdu[1].data #replace the zeros with the average from the frame if maskzeros: mean,std=iterstat(data[data>0]) rdata=np.random.normal(mean, std, size=data.shape) print mean, std data[data<=0]=rdata[data<=0] #find the sections in the images section=findobj.findObjects(data, method='median', specaxis=1, minsize=minsize, thresh=thresh, niter=5) print section #use a region near the center to create they sky skysection=findskysection(section, skysection) print skysection #sky subtract the frames shdu=skysubtract(hdu, method='normal', section=skysection) if os.path.isfile('s'+img): os.remove('s'+img) shdu.writeto('s'+img) spec_list=[] #extract the spectra #extract the comparison spectrum section=findobj.findObjects(shdu[1].data, method='median', specaxis=1, minsize=minsize, thresh=thresh, niter=5) print section for j in range(len(section)): ap_list=extract(shdu, method='normal', section=[section[j]], minsize=minsize, thresh=thresh, convert=True) ofile='%s.%s_%i_%i.txt' % (target, obsdate, extract_number(img), j) write_extract(ofile, [ap_list[0]], outformat='ascii', clobber=clobber) spec_list.append([ofile, airmass, exptime, propcode]) return spec_list
def extract(hdu, ext=1, method='normal', section=[], minsize=3.0, thresh=3.0, convert=True): """For a given image, extract a 1D spectra from the image and write the spectra to the output file """ ap_list = [] i = ext if hdu[i].name == 'SCI': # set up the data, variance, and bad pixel frames # first step is to find the region to extract data_arr = hdu[i].data try: var_arr = hdu[hdu[i].header['VAREXT']].data except: var_arr = None try: bpm_arr = hdu[hdu[i].header['BPMEXT']].data except: bpm_arr = None var_arr = None bpm_arr = None xarr = np.arange(len(data_arr[0])) # convert using the WCS information try: w0 = hdu[i].header['CRVAL1'] dw = hdu[i].header['CD1_1'] except Exception as e: msg = 'Error on Ext %i: %s' % (i, e) raise Exception(msg) warr = w0 + dw * xarr # convert from air to vacuum if convert: warr = Spectrum.air2vac(warr) # set up the sections in case of findobj if section is None: section = findobj.findObjects( data_arr, method='median', specaxis=1, minsize=minsize, thresh=thresh, niter=5) # extract all of the regions for sec in section: ap = apext.apext(warr, data_arr, ivar=var_arr) y1, y2 = sec ap.flatten(y1, y2) ap_list.append(ap) return ap_list
def extract(hdu, ext=1, method='normal', section=[], minsize=3.0, thresh=3.0, convert=True): """For a given image, extract a 1D spectra from the image and write the spectra to the output file """ ap_list = [] i = ext if hdu[i].name == 'SCI': # set up the data, variance, and bad pixel frames # first step is to find the region to extract data_arr = hdu[i].data try: var_arr = hdu[hdu[i].header['VAREXT']].data except: var_arr = None try: bpm_arr = hdu[hdu[i].header['BPMEXT']].data except: bpm_arr = None var_arr = None bpm_arr = None xarr = np.arange(len(data_arr[0])) # convert using the WCS information try: w0 = saltkey.get('CRVAL1', hdu[i]) dw = saltkey.get('CD1_1', hdu[i]) except Exception as e: msg = 'Error on Ext %i: %s' % (i, e) raise SALTSpecError(msg) warr = w0 + dw * xarr # convert from air to vacuum if convert: warr = Spectrum.air2vac(warr) # set up the sections in case of findobj if section is None: section = findobj.findObjects(data_arr, method='median', specaxis=1, minsize=minsize, thresh=thresh, niter=5) # extract all of the regions for sec in section: ap = apext.apext(warr, data_arr, ivar=var_arr) y1, y2 = sec ap.flatten(y1, y2) ap_list.append(ap) return ap_list
def extract_spectra(img, yc=None, oy=10, dy=50, minsize=5, thresh=3, findobject=False, niter=5, calfile=None, smooth=False, maskzeros=False, clobber=True): """Create a list of spectra for each of the objects in the images""" #okay we need to identify the objects for extraction and identify the regions for sky extraction #first find the objects in the image #skynormalize the data #specslitnormalize(img, 'n'+img, '', response=None, response_output=None, order=3, conv=1e-2, niter=20, # startext=0, clobber=False,logfile='salt.log',verbose=True) print 'Extract Spectra from ', img hdu=pyfits.open(img) target=hdu[0].header['OBJECT'].replace(' ', '') propcode=hdu[0].header['PROPID'] airmass=hdu[0].header['AIRMASS'] exptime=hdu[0].header['EXPTIME'] if smooth: data=smooth_data(hdu[1].data) else: data=hdu[1].data #replace the zeros with the average from the frame if maskzeros: mean,std=iterstat(data[data>0]) #rdata=mean np.random.normal(mean, std, size=data.shape) print mean, std data[data<=0]=mean #rdata[data<=0] #use manual intervention to get section if findobject: section=findobj.findObjects(data, method='median', specaxis=1, minsize=minsize, thresh=thresh, niter=niter) if yc is None and len(section)>0: yc = np.mean(section[0]) elif len(section)>0: diff = 1e6 for i in range(len(section)): y = np.mean(section[i]) if abs(y-yc) < diff: bestyc = y diff = abs(y-yc) yc = bestyc if yc is None: os.system('ds9 %s &' % img) print len(hdu) if len(hdu)==2: print 'Using basic extraction' if yc is None: y1=int(raw_input('y1:')) y2=int(raw_input('y2:')) sy1=int(raw_input('sky y1:')) sy2=int(raw_input('sky y2:')) ap_list=extract(hdu, method='normal', section=[(y1,y2)], minsize=minsize, thresh=thresh, convert=True) sk_list=extract(hdu, method='normal', section=[(sy1,sy2)], minsize=minsize, thresh=thresh, convert=True) ap_list[0].ldata=ap_list[0].ldata-float(y2-y1)/(sy2-sy1)*sk_list[0].ldata ofile='%s.%s_%i.txt' % (target, extract_date(img), extract_number(img)) write_extract(ofile, [ap_list[0]], outformat='ascii', clobber=clobber) w, f, e = np.loadtxt(ofile, usecols=(0,1,2), unpack=True) w, f, e=cleanspectra(w, f, e, neg=True) m = (w>3900)*(w<8100) write_spectra(ofile, w[m], f[m], e[m]) else: print 'Using advanced extraction' if yc is None: yc=int(raw_input('yc:')) w0=hdu[1].header['CRVAL1'] dw=hdu[1].header['CD1_1'] xarr = np.arange(len(hdu[1].data[0])) warr=w0+dw*xarr print warr.min(), warr.max() print hdu[1].data[yc, 1462], hdu[2].data[yc,1462] warr, madata, var = skysub_region(warr, hdu[1].data, hdu[2].data, hdu[3].data, yc, oy, dy) print warr.min(), warr.max() w, f, e = masked_extract(warr, madata[yc-oy:yc+oy, :], var[yc-oy:yc+oy, :]) print yc ofile='%s.%s_%i_%i.txt' % (target, extract_date(img), extract_number(img), yc) write_spectra(ofile, w, f, e) if calfile is not None: extfile=iraf.osfn("pysalt$data/site/suth_extinct.dat") speccal(ofile, ofile.replace("txt", "spec"), calfile, extfile, airmass, exptime, clobber=True, logfile='salt.log', verbose=True) spec_list=[ofile, airmass, exptime, propcode] return spec_list
def extract_spectra(img, yc=None, oy=10, dy=50, minsize=5, thresh=3, findobject=False, niter=5, calfile=None, smooth=False, maskzeros=False, clobber=True): """Create a list of spectra for each of the objects in the images""" #okay we need to identify the objects for extraction and identify the regions for sky extraction #first find the objects in the image #skynormalize the data #specslitnormalize(img, 'n'+img, '', response=None, response_output=None, order=3, conv=1e-2, niter=20, # startext=0, clobber=False,logfile='salt.log',verbose=True) print 'Extract Spectra from ', img hdu = pyfits.open(img) target = hdu[0].header['OBJECT'].replace(' ', '') propcode = hdu[0].header['PROPID'] airmass = hdu[0].header['AIRMASS'] exptime = hdu[0].header['EXPTIME'] if smooth: data = smooth_data(hdu[1].data) else: data = hdu[1].data #replace the zeros with the average from the frame if maskzeros: mean, std = iterstat(data[data > 0]) #rdata=mean np.random.normal(mean, std, size=data.shape) print mean, std data[data <= 0] = mean #rdata[data<=0] #use manual intervention to get section if findobject: section = findobj.findObjects(data, method='median', specaxis=1, minsize=minsize, thresh=thresh, niter=niter) if yc is None and len(section) > 0: yc = np.mean(section[0]) elif len(section) > 0: diff = 1e6 for i in range(len(section)): y = np.mean(section[i]) if abs(y - yc) < diff: bestyc = y diff = abs(y - yc) yc = bestyc if yc is None: os.system('ds9 %s &' % img) print len(hdu) if len(hdu) == 2: print 'Using basic extraction' if yc is None: y1 = int(raw_input('y1:')) y2 = int(raw_input('y2:')) sy1 = int(raw_input('sky y1:')) sy2 = int(raw_input('sky y2:')) ap_list = extract(hdu, method='normal', section=[(y1, y2)], minsize=minsize, thresh=thresh, convert=True) sk_list = extract(hdu, method='normal', section=[(sy1, sy2)], minsize=minsize, thresh=thresh, convert=True) ap_list[0].ldata = ap_list[0].ldata - float(y2 - y1) / ( sy2 - sy1) * sk_list[0].ldata ofile = '%s.%s_%i.txt' % (target, extract_date(img), extract_number(img)) write_extract(ofile, [ap_list[0]], outformat='ascii', clobber=clobber) w, f, e = np.loadtxt(ofile, usecols=(0, 1, 2), unpack=True) w, f, e = cleanspectra(w, f, e, neg=True) m = (w > 3900) * (w < 8100) write_spectra(ofile, w[m], f[m], e[m]) else: print 'Using advanced extraction' if yc is None: yc = int(raw_input('yc:')) w0 = hdu[1].header['CRVAL1'] dw = hdu[1].header['CD1_1'] xarr = np.arange(len(hdu[1].data[0])) warr = w0 + dw * xarr print warr.min(), warr.max() print hdu[1].data[yc, 1462], hdu[2].data[yc, 1462] warr, madata, var = skysub_region(warr, hdu[1].data, hdu[2].data, hdu[3].data, yc, oy, dy) print warr.min(), warr.max() w, f, e = masked_extract(warr, madata[yc - oy:yc + oy, :], var[yc - oy:yc + oy, :]) print yc ofile = '%s.%s_%i_%i.txt' % (target, extract_date(img), extract_number(img), yc) write_spectra(ofile, w, f, e) if calfile is not None: extfile = iraf.osfn("pysalt$data/site/suth_extinct.dat") speccal(ofile, ofile.replace("txt", "spec"), calfile, extfile, airmass, exptime, clobber=True, logfile='salt.log', verbose=True) spec_list = [ofile, airmass, exptime, propcode] return spec_list