def fringe_sub(inlist, inpref='', outpref='s', mskpref='none', iternum=50, nsigma=3, bpm='none', second=False, fr_x0=0.0, fr_y0=0.0, fr_step=5, surfit=False, xsorder=4, ysorder=4): # load IRAF package iraf.proto() # check input image list inimg_arr = check_input(inlist, inpref) if isinstance(inimg_arr, int): return 1 # check output outimg_arr = check_outpref(outpref, inimg_arr) if isinstance(outimg_arr, int): return 1 # check mask images if mskpref.lower() == 'none' or mskpref == '': mask = 0 else: mask = 1 mskimg_arr = check_inpref(mskpref, inimg_arr) if isinstance(mskimg_arr, int): return 1 # check bad pixel mask if bpm.lower() != 'none': bpmex = 1 if os.access(bpm, os.R_OK) == False: print >> sys.stderr, 'cannot read bad pixel mask (%s)' % bpm return 1 else: bpmex = 0 # prefix for temoprary images tmp = tempfile.NamedTemporaryFile(suffix='', prefix='', dir='/tmp') tmp_prefix = tmp.name tmp.close() # subtract sky for i in range(len(inimg_arr)): if mask == 1: iraf.unlearn('mimstat') if not second: ret = iraf.mimstat(inimg_arr[i], imasks=mskimg_arr[i]+'[pl]', format='no', fields='midpt', nclip=iternum, lsigma=nsigma, usigma=nsigma, Stdout=1) else: if bpmex == 1: tmp_mask = tmp_prefix + os.path.basename(mask_img_arr[i]) iraf.imarith(maskimg_arr[i], '+', bpm, tmp_mask, verbose='no') convert_maskfits_int(tmp_mask, tmp_mask) ret = iraf.mimstat(inimg_arr[i], imasks=tmp_mask, format='no', fields='midpt', nclip=iternum, lsigma=nsigma, usigma=nsigma, Stdout=1) else: ret = iraf.mimstat(inimg_arr[i], imasks=mskimg_arr[i], format='no', fields='midpt', nclip=iternum, lsigma=nsigma, usigma=nsigma, Stdout=1) else: iraf.unlearn('imstat') ret = iraf.imstat(inimg_arr[i], format='no', fields='midpt', nclip=iternum, lsigma=nsigma, usigma=nsigma, Stdout=1) if len(ret) == 1: objmed = float(ret[0]) else : print >> sys.stderr, 'failed to calculate median of the object background' return 1 # record input fits data into memory im = pyfits.open(inimg_arr[i]) im_hdr = im[0].header im_data = im[0].data out_data = im_data - objmed if surfit: out_data_org = np.copy(out_data) im.close() # fringe subtraction for NB imaging if mask == 1: if bpmex == 1: tmp_mask = tmp_prefix + os.path.basename(mask_img_arr[i]) mask_im = pyfits.open(tmp_mask) else: mask_im = pyfits.open(mskimg_arr[i]) if not second: mask_data = mask_im[1].data else: mask_data = mask_im[0].data mask_im.close() x = np.ones(out_data.shape[0]*out_data.shape[1]).reshape(out_data.shape[0],out_data.shape[1])* np.arange(out_data.shape[1]) + 1 y = (np.ones(out_data.shape[1]*out_data.shape[0]).reshape(out_data.shape[1],out_data.shape[0]) * np.arange(out_data.shape[0]) + 1).T r = np.sqrt((x-fr_x0)*(x-fr_x0) + (y-fr_y0)*(y-fr_y0)) rmax = np.max(r) rmin = np.min(r) r1 = rmin while r1 <= rmax: r2 = r1 + fr_step idx = np.logical_and(r>=r1, r<r2) out_subset = out_data[idx] if mask == 1: mask_subset = mask_data[idx] idx_sky = np.where(mask_subset == 0) #if len(out_subset[idx_sky]) != len(out_subset): # print "masked:",inimg_arr[i],r1,r2,fr_x0,fr_y0,len(out_subset[idx_sky]),"/",len(out_subset),meanclip(out_subset[idx_sky],median=1)[0],meanclip(out_subset, median=1)[0] med, sigma = meanclip(out_subset[idx_sky],median=1) else: med, sigma = meanclip(out_data[idx],median=1) out_data[idx] = out_data[idx] - med r1 += fr_step # save output fits file hdu = pyfits.PrimaryHDU(out_data) imgout = pyfits.HDUList([hdu]) imgout[0].header = im_hdr if surfit: tmp_fsub = tmp_prefix + "fsub" + os.path.basename(inimg_arr[i]) tmp_fsub_fit = tmp_prefix + "fsub_fit" + os.path.basename(inimg_arr[i]) imgout.writeto(tmp_fsub) imgout.close() iraf.imsurfit(tmp_fsub, tmp_fsub_fit, xsorder, ysorder) imfit = pyfits.open(tmp_fsub_fit) imfit_data = imfit[0].data out_data_fs = np.copy(out_data_org - imfit_data) r1 = rmin while r1 <= rmax: r2 = r1 + fr_step idx = np.logical_and(r>=r1, r<r2) out_subset = out_data_fs[idx] if mask == 1: mask_subset = mask_data[idx] idx_sky = np.where(mask_subset == 0) med, sigma = meanclip(out_subset[idx_sky],median=1) else: med, sigma = meanclip(out_data_fs[idx],median=1) out_data_org[idx] = out_data_org[idx] - med r1 += fr_step hdu = pyfits.PrimaryHDU(out_data_org) imgout = pyfits.HDUList([hdu]) imgout[0].header = im_hdr imgout.writeto(outimg_arr[i]) imgout.close() remove_temp_all(tmp_prefix) else: imgout.writeto(outimg_arr[i]) imgout.close() if bpmex == 1: remove_temp_all(tmp_prefix) return 0
def skysub(inlist, inpref='', outpref='s', mskpref='none', ndthpos=9, iternum=50, nsigma=3, second=False): # load IRAF package iraf.proto() # check input image list inimg_arr = check_input(inlist, inpref) if isinstance(inimg_arr, int): return 1 # check output outimg_arr = check_outpref(outpref, inimg_arr) if isinstance(outimg_arr, int): return 1 # check mask images if mskpref.lower() == 'none' or mskpref == '': mask = 0 else: mask = 1 mskimg_arr = check_inpref(mskpref, inimg_arr) if isinstance(mskimg_arr, int): return 1 # check dithering width if ndthpos != 5 and ndthpos != 9: print >> sys.stderr, 'number of dithering position should be 5 or 9' if iternum <= 0: print >> sys.stderr, 'invalid iternum value (%d)' % iternum return 1 if nsigma <= 0: print >> sys.stderr, 'invalid nsigma value (%f)' % nsigma return 1 # check input, output, and mask files and record mask frame into header pre_pos = 100 in_array = [] out_array = [] mask_array = [] iraf.unlearn('hedit') for i in range(len(inimg_arr)): if mask == 1: if mskpref[0] != ':': if not second: iraf.hedit(inimg_arr[i], 'objmask', mskimg_arr[i] + '[pl]', add='yes', verify='no') else: iraf.hedit(inimg_arr[i], 'objmask', mskimg_arr[i], add='yes', verify='no') # get dithering position from header im = pyfits.open(inimg_arr[i]) pos = int(im[0].header['I_DTHPOS']) im.close() # record each dithering set into subset if pos < pre_pos: if i != 0: in_array.append(in_subset) out_array.append(out_subset) if mask == 1: mask_array.append(mask_subset) in_subset = [] out_subset = [] in_subset.append(inimg_arr[i]) out_subset.append(outimg_arr[i]) if mask == 1: mask_subset = [] mask_subset.append(mskimg_arr[i]) pre_pos = pos else: in_subset.append(inimg_arr[i]) out_subset.append(outimg_arr[i]) if mask == 1: mask_subset.append(mskimg_arr[i]) pre_pos = pos # record rest of frames in_array.append(in_subset) out_array.append(out_subset) if mask == 1: mask_array.append(mask_subset) # number of subsets n_subset = len(in_array) # sky subtraction tmp = tempfile.NamedTemporaryFile(suffix='', prefix='', dir='/tmp') tmp_prefix = tmp.name tmp.close() for i in range(n_subset): tmp_sky = '%s_sky_%03d.fits' % (tmp_prefix, int(i)) tmp_subset = '%s_subset_%03d.lst' % (tmp_prefix, int(i)) # make subset list f = open(tmp_subset, 'w') for j in range(len(in_array[i])): f.write(in_array[i][j] + '\n') f.close() # combine subset if mask == 1: ret = zcombine(tmp_subset, tmp_sky, combine='median', reject='sigclip', masktype='!OBJMASK') else: ret = zcombine(tmp_subset, tmp_sky, combine='median', reject='sigclip', masktype='none') if ret != 0: remove_temp_all(tmp_prefix) return 1 os.remove(tmp_subset) # calculate median of combined sky background iraf.unlearn('imstat') ret = iraf.imstat(tmp_sky, format='no', fields='midpt', nclip=iternum, lsigma=nsigma, usigma=nsigma, Stdout=1) if len(ret) == 1: skymed = float(ret[0]) else: remove_temp_all(tmp_prefix) print >> sys.stderr, 'failed to calculate median of the combined sky background' return 1 # save sky data into memory sky = pyfits.open(tmp_sky) sky_data = sky[0].data sky.close() os.remove(tmp_sky) # subtract sky for j in range(len(in_array[i])): if mask == 1: iraf.unlearn('mimstat') if not second: ret = iraf.mimstat(in_array[i][j], imasks=mask_array[i][j] + '[pl]', format='no', fields='midpt', nclip=iternum, lsigma=nsigma, usigma=nsigma, Stdout=1) else: ret = iraf.mimstat(in_array[i][j], imasks=mask_array[i][j], format='no', fields='midpt', nclip=iternum, lsigma=nsigma, usigma=nsigma, Stdout=1) else: iraf.unlearn('imstat') ret = iraf.imstat(in_array[i][j], format='no', fields='midpt', nclip=iternum, lsigma=nsigma, usigma=nsigma, Stdout=1) if len(ret) == 1: objmed = float(ret[0]) else: remove_temp_all(tmp_prefix) print >> sys.stderr, 'failed to calculate median of the object background' return 1 # record input fits data into memory im = pyfits.open(in_array[i][j]) im_hdr = im[0].header im_data = im[0].data im.close() # subtract sky in memory out_data = im_data - (sky_data * objmed / skymed) # save output fits file hdu = pyfits.PrimaryHDU(out_data) imgout = pyfits.HDUList([hdu]) imgout[0].header = im_hdr imgout.writeto(out_array[i][j]) imgout.close() remove_temp_all(tmp_prefix) return 0
def imshiftcomb(inlist, outimg, fitgeom='shift', inpref='', objmask='none', combine='average', reject='none', fscale=False, fbase=100, fhead='F1', second=False, first_pref='sdfr', second_pref='sdf2r', indep=False, sigmap='none', expmap='none', whtmap='none', gain=5.6, ffpref=''): # check output image if os.access(outimg, os.R_OK): print >> sys.stderr, 'operation would overwrite existing image (%s)' % outimg return 1 # check input image list inimg_arr = check_input(inlist, inpref) if isinstance(inimg_arr, int): return 1 # check input image list if sigmap != 'none': ffimg_arr = check_input2(inlist, ffpref) if isinstance(ffimg_arr, int): return 1 # check optional output image if sigmap != 'none': if os.access(sigmap, os.R_OK): print >> sys.stderr, 'operation would overwrite existing image (%s)' % sigmap return 1 if expmap != 'none': if os.access(expmap, os.R_OK): print >> sys.stderr, 'operation would overwrite existing image (%s)' % expmap return 1 if whtmap != 'none': if os.access(whtmap, os.R_OK): print >> sys.stderr, 'operation would overwrite existing image (%s)' % whtmap return 1 # get array size im = pyfits.open(inimg_arr[0]) nx = im[0].header['NAXIS1'] ny = im[0].header['NAXIS2'] im.close() # check geomap data dx = [] dy = [] gmp_arr = [] gmp2_arr = [] dbs_arr = [] for i in range(len(inimg_arr)): fname, ext = os.path.splitext(inimg_arr[i]) gmp = fname + '.gmp' gmp2 = fname + '.gmp2' dbs = fname + '.dbs' gmp_arr.append(gmp) gmp2_arr.append(gmp2) dbs_arr.append(dbs) if not os.access(gmp, os.R_OK): print >> sys.stderr, 'geomap file (%s) does not exist' % (gmp) return 1 if os.access(dbs, os.R_OK): print >> sys.stderr, 'database file (%s) is already exist' % (dbs) return 1 if os.access(gmp2, os.R_OK): print >> sys.stderr, 'modified geomap file (%s) is already exist' % ( gmp2) return 1 fgmp = open(gmp) nl = 1 dx_ave = 0.0 dy_ave = 0.0 for line in fgmp: if not line.startswith('#'): param = line[:-1].split() if len(param) != 4: print >> sys.stderr, 'Invalid format in line %d of %s: %s' % ( nl, gmp, line[:-1]) fgmp.close() return 1 else: if isfloat(param[0]) == False or isfloat( param[1]) == False or isfloat( param[2]) == False or isfloat( param[3]) == False: print >> sys.stderr, 'failed to decode line %d of %s: %s' % ( nl, gmp, line[:-1]) fgmp.close() return 1 else: dx_ave += float(param[0]) - float(param[2]) dy_ave += float(param[1]) - float(param[3]) nl += 1 #print inimg_arr[i],nl dx.append(dx_ave / (nl - 1)) dy.append(dy_ave / (nl - 1)) if len(inimg_arr) != len(dx): print >> sys.stderr, 'number of input images does not match with that of offsets' return 1 #print 'debug' #print dx, max(dx), min(dx) #print dy, max(dy), min(dy) # check object mask if objmask.lower() == 'none': objmask = '' else: objmask_arr = check_inpref(objmask, inimg_arr) if isinstance(objmask_arr, int): return 1 # independent run flag if indep: second = True # prepare for temporary file tmp = tempfile.NamedTemporaryFile(suffix='', prefix='', dir='/tmp') tmp_prefix = tmp.name tmp.close() # calculate image median for zero shift iraf.unlearn('imstat') iraf.unlearn('mimstat') bgmed = [] for i in range(len(inimg_arr)): if objmask == '': ret = iraf.imstat(inimg_arr[i], format='no', fields='midpt', nclip=50, lsigma=3., usigma=3., Stdout=1) else: if not second: ret = iraf.mimstat(inimg_arr[i], imasks=objmask_arr[i] + '[pl]', format='no', fields='midpt', nclip=50, lsigma=3., usigma=3., Stdout=1) else: ret = iraf.mimstat(inimg_arr[i], imasks=objmask_arr[i], format='no', fields='midpt', nclip=50, lsigma=3., usigma=3., Stdout=1) if len(ret) == 1: bgmed.append(-1.0 * float(ret[0])) else: fout.close() remove_temp_all(tmp_prefix) print >> sys.stderr, 'failed to calculate median of the background in %s' % inimg_arr[ i] return 1 # get large array size and combined image size ret = get_large_region(nx, ny, dx, dy) if len(ret) != 6: print >> sys.stderr, 'failed to get large array size' return 1 x_size = ret[0] y_size = ret[1] xcmin = ret[2] xcmax = ret[3] ycmin = ret[4] ycmax = ret[5] # calculate image region in the large format xmin = int((x_size - nx) / 2) + 1 xmax = nx + int((x_size - nx) / 2) ymin = int((y_size - ny) / 2) + 1 ymax = ny + int((y_size - ny) / 2) #print 'debug' #print x_size, y_size, xcmin, xcmax, ycmin, ycmax #print xmin, xmax, ymin, ymax # copy image to larger format and shift image # iraf.unlearn('geomap') iraf.unlearn('geotran') obj_list = tmp_prefix + '_obj.lst' if os.access(obj_list, os.R_OK): os.remove(obj_list) fobj = open(obj_list, 'w') # for exposure time weight expweight = tmp_prefix + '_exp.lst' if os.access(expweight, os.R_OK): os.remove(expweight) fexp = open(expweight, 'w') # for zero offset zeroshift = tmp_prefix + '_zeroshift.dat' if os.access(zeroshift, os.R_OK): os.remove(zeroshift) fzero = open(zeroshift, 'w') # save the original fit geometry fitgeom_org = fitgeom # preparing for the sigma list and mask if sigmap == 'none': tmp_rejmask = '' else: tmp_rejmask = tmp_prefix + 'rejmask.fits' if os.access(tmp_rejmask, os.R_OK): os.remove(tmp_rejmask) inverse_var_list = tmp_prefix + '_var.lst' if os.access(inverse_var_list, os.R_OK): os.remove(inverse_var_list) finverse_var = open(inverse_var_list, 'w') for i in range(len(inimg_arr)): # restore the original fit geometry fitgeom = fitgeom_org # geometry transformation fgmp = open(gmp_arr[i]) fgmp2 = open(gmp2_arr[i], 'w') nobj = 0 for line in fgmp: if not line.startswith('#'): param = line[:-1].split() xref = float(param[0]) + xmin - 1 yref = float(param[1]) + ymin - 1 xin = float(param[2]) + xmin - 1 yin = float(param[3]) + ymin - 1 fgmp2.write('%.3f %.3f %.3f %.3f\n' % (xref, yref, xin, yin)) nobj += 1 fgmp.close() fgmp2.close() # check number of objects if i == 0 and nobj == 1 and fitgeom == 'rotate': print 'Warning: Number of reference objects is not enought to measure the rotation' print 'Warning: Only shift applied for all images' fitgeom = 'shift' fitgeom_org = 'shift' if nobj == 1 and fitgeom == 'rotate': print 'Warning: Number of objects in %s is not enought to measure the rotation' % ( inimg_arr[i]) print 'Warning: Only shift applied for %s' % (inimg_arr[i]) fitgeom = 'shift' # mapping geometry iraf.geomap(gmp2_arr[i], dbs_arr[i], 1, x_size, 1, y_size, fitgeom=fitgeom, interac='no') # mask frame msk = np.ones((y_size, x_size)) msk[ymin - 1:ymax, xmin - 1:xmax] = 0 hdu = pyfits.PrimaryHDU(msk) msk_img = pyfits.HDUList([hdu]) msk_fits = tmp_prefix + 'mask' + os.path.basename(inimg_arr[i]) msktr_fits = tmp_prefix + 'masktr' + os.path.basename(inimg_arr[i]) if os.access(msk_fits, os.R_OK): os.remove(msk_fits) if os.access(msktr_fits, os.R_OK): os.remove(msktr_fits) msk_img.writeto(msk_fits) msk_img.close() # transform mask geometry iraf.geotran(msk_fits, msktr_fits, dbs_arr[i], gmp2_arr[i], geometr='linear', boundar='constant', constant=1) os.remove(msk_fits) convert_maskfits_int(msktr_fits, msktr_fits) # load original frame img = pyfits.open(inimg_arr[i]) if sigmap != 'none': ffimg = pyfits.open(ffimg_arr[i]) # for exposure time weight try: t = float(img[0].header['EXP1TIME']) coadd = float(img[0].header['COADDS']) expt = t * coadd except KeyError: print >> sys.stderr, 'can not read exposure time from the header of %s' % inimg_arr[ i] img.close() return 1 # for flux scaling and weight if fscale: try: flux = float(img[0].header[fhead]) except KeyError: print >> sys.stderr, 'can not read flux keyword (%s) from the header of %s' % ( fhead, inimg_arr[i]) img.close() return 1 flux_scale = fbase / flux weight = expt * (1.0 / flux_scale)**2 else: flux_scale = 1.0 weight = expt fzero.write('%f\n' % (bgmed[i] * flux_scale)) fexp.write('%f\n' % weight) # object frame obj = np.zeros((y_size, x_size)) obj[ymin - 1:ymax, xmin - 1:xmax] = img[0].data * flux_scale hdu = pyfits.PrimaryHDU(obj) obj_img = pyfits.HDUList([hdu]) obj_img[0].header = img[0].header obj_img[0].header['bpm'] = msktr_fits obj_img[0].header['expmap'] = expt obj_fits = tmp_prefix + 'obj' + os.path.basename(inimg_arr[i]) objtr_fits = tmp_prefix + 'objtr' + os.path.basename(inimg_arr[i]) if os.access(obj_fits, os.R_OK): os.remove(obj_fits) obj_img.writeto(obj_fits) obj_img.close() iraf.geotran(obj_fits, objtr_fits, dbs_arr[i], gmp2_arr[i], geometr='linear', boundar='constant', constant=0) fobj.write('%s\n' % objtr_fits) img.close() if sigmap != 'none': inverse_var = np.zeros((y_size, x_size)) inverse_var[ymin - 1:ymax, xmin - 1:xmax] = (np.sqrt(ffimg[0].data / (gain * expt)) * flux_scale)**-2 hdu_var = pyfits.PrimaryHDU(inverse_var) inverse_var_img = pyfits.HDUList([hdu_var]) inverse_var_img[0].header = img[0].header inverse_var_img[0].header['bpm2'] = '%s[*,*,%d]' % (tmp_rejmask, i + 1) inverse_var_fits = tmp_prefix + 'var' + os.path.basename( inimg_arr[i]) inverse_vartr_fits = tmp_prefix + 'vartr' + os.path.basename( inimg_arr[i]) if os.access(inverse_var_fits, os.R_OK): os.remove(inverse_var_fits) if os.access(inverse_vartr_fits, os.R_OK): os.remove(inverse_vartr_fits) inverse_var_img.writeto(inverse_var_fits) inverse_var_img.close() iraf.geotran(inverse_var_fits, inverse_vartr_fits, dbs_arr[i], gmp2_arr[i], geometr='linear', boundar='constant', constant=0) finverse_var.write('%s\n' % inverse_vartr_fits) ffimg.close() # close file handlers fobj.close() fexp.close() fzero.close() if sigmap != 'none': finverse_var.close() # combine image comb_img = tmp_prefix + '_comb.fits' if os.access(comb_img, os.R_OK): os.remove(comb_img) if expmap == 'none': tmp_expmap = '' else: tmp_expmap = tmp_prefix + 'expmap.fits' if os.access(tmp_expmap, os.R_OK): os.remove(tmp_expmap) iraf.unlearn('imcombine') try: iraf.imcombine('@' + obj_list, comb_img, sigma='', rejmask=tmp_rejmask, expmasks=tmp_expmap, combine=combine, reject=reject, masktype='!BPM', maskvalue=0.0, zero='@' + zeroshift, weight='@' + expweight, expname='EXPMAP') except: if os.access(comb_img, os.R_OK): os.remove(comb_img) if expmap != 'none': if os.access(tmp_expmap, os.R_OK): os.remove(tmp_expmap) iraf.imcombine('@' + obj_list, comb_img, sigma='', rejmask='', expmasks=tmp_expmap, combine=combine, reject=reject, masktype='!BPM', maskvalue=0.0, zero='@' + zeroshift, weight='@' + expweight, expname='EXPMAP') if sigmap != 'none': tmp_inverse_var_sum = tmp_prefix + 'inverse_var.fits' if os.access(tmp_inverse_var_sum, os.R_OK): os.remove(tmp_inverse_var_sum) iraf.imcombine('@' + inverse_var_list, tmp_inverse_var_sum, combine='sum', reject='none', masktype='!BPM', maskvalue=0.0) iraf.stsdas() tmp_sigma = tmp_prefix + 'sigma.fits' if os.access(tmp_sigma, os.R_OK): os.remove(tmp_sigma) iraf.imcalc(tmp_inverse_var_sum, tmp_sigma, 'sqrt(1.0/im1)', pixtype='double') # cut image iraf.unlearn('imcopy') cut_img = '%s[%d:%d,%d:%d]' % (comb_img, xcmin, xcmax, ycmin, ycmax) iraf.imcopy(cut_img, outimg) if expmap != 'none': cut_exp = '%s[%d:%d,%d:%d]' % (tmp_expmap, xcmin, xcmax, ycmin, ycmax) iraf.imcopy(cut_exp, expmap) if sigmap != 'none': cut_sigma = '%s[%d:%d,%d:%d]' % (tmp_sigma, xcmin, xcmax, ycmin, ycmax) iraf.imcopy(cut_sigma, sigmap) if whtmap != 'none': cut_wht = '%s[%d:%d,%d:%d]' % (tmp_inverse_var_sum, xcmin, xcmax, ycmin, ycmax) iraf.imcopy(cut_wht, whtmap) # delete temporary object files remove_temp_all(tmp_prefix + 'obj') os.remove(obj_list) os.remove(comb_img) # record relative offset between input images and combined image and rotation for i in range(len(inimg_arr)): im = pyfits.open(inimg_arr[i], mode='update') if second: if indep: # calculate offset dxc = xcmin - xmin - dx[i] dyc = ycmin - ymin - dy[i] # retrieve rotation rot = 0.0 fdbs = open(dbs_arr[i]) for line in fdbs: param = line[:-1].split() if param[0] == 'xrotation': rot = float(param[1]) if rot > 180.0: rot = rot - 360.0 im[0].header['dx'] = dx[i] im[0].header['dy'] = dy[i] im[0].header['dxc'] = dxc im[0].header['dyc'] = dyc im[0].header['rotation'] = rot else: # check number of objects in the geomap file nobj = 0 fgmp = open(gmp_arr[0]) for line in fgmp: nobj += 1 im1 = pyfits.open(inimg_arr[i].replace(second_pref, first_pref), mode='update') for j in range(nobj): key = 'XC%d' % (j + 1) im[0].header[key] = float(im1[0].header[key]) key = 'YC%d' % (j + 1) im[0].header[key] = float(im1[0].header[key]) key = 'PEAK%d' % (j + 1) im[0].header[key] = float(im1[0].header[key]) key = 'FWHM%d' % (j + 1) im[0].header[key] = float(im1[0].header[key]) key = 'DX' im[0].header[key] = float(im1[0].header[key]) key = 'DY' im[0].header[key] = float(im1[0].header[key]) key = 'DXC' im[0].header[key] = float(im1[0].header[key]) key = 'DYC' im[0].header[key] = float(im1[0].header[key]) key = 'ROTATION' im[0].header[key] = float(im1[0].header[key]) im1.close() else: # calculate offset dxc = xcmin - xmin - dx[i] dyc = ycmin - ymin - dy[i] # retrieve rotation rot = 0.0 fdbs = open(dbs_arr[i]) for line in fdbs: param = line[:-1].split() if param[0] == 'xrotation': rot = float(param[1]) if rot > 180.0: rot = rot - 360.0 im[0].header['dx'] = dx[i] im[0].header['dy'] = dy[i] im[0].header['dxc'] = dxc im[0].header['dyc'] = dyc im[0].header['rotation'] = rot im.close() # remove all temporary files remove_temp_all(tmp_prefix) return 0
def skysub_mod(inlist, inpref='', outpref='s', mskpref='none', ndthpos=9, iternum=50, nsigma=3, second=False, step=0.05): # load IRAF package iraf.proto() # check step size if step >= 0.5: print >> sys.stderr, 'step size should be smaller than 0.5' return 1 # check input image list inimg_arr = check_input(inlist, inpref) if isinstance(inimg_arr, int): return 1 # check output outimg_arr = check_outpref(outpref, inimg_arr) if isinstance(outimg_arr, int): return 1 # check mask images if mskpref.lower() == 'none' or mskpref == '': mask = 0 else: mask = 1 mskimg_arr = check_inpref(mskpref, inimg_arr) if isinstance(mskimg_arr, int): return 1 # check dithering width if ndthpos != 5 and ndthpos != 9: print >> sys.stderr, 'number of dithering position should be 5 or 9' if iternum <= 0: print >> sys.stderr, 'invalid iternum value (%d)' % iternum return 1 if nsigma <= 0: print >> sys.stderr, 'invalid nsigma value (%f)' % nsigma return 1 # check input, output, and mask files and record mask frame into header pre_pos = 100 in_array = [] out_array = [] mask_array = [] iraf.unlearn('hedit') for i in range(len(inimg_arr)): if mask == 1: if mskpref[0] != ':': if not second: iraf.hedit(inimg_arr[i], 'objmask', mskimg_arr[i] + '[pl]', add='yes', verify='no') else: iraf.hedit(inimg_arr[i], 'objmask', mskimg_arr[i], add='yes', verify='no') # get dithering position from header im = pyfits.open(inimg_arr[i]) pos = int(im[0].header['I_DTHPOS']) im.close() # record each dithering set into subset if pos < pre_pos: if i != 0: in_array.append(in_subset) out_array.append(out_subset) if mask == 1: mask_array.append(mask_subset) in_subset = [] out_subset = [] in_subset.append(inimg_arr[i]) out_subset.append(outimg_arr[i]) if mask == 1: mask_subset = [] mask_subset.append(mskimg_arr[i]) pre_pos = pos else: in_subset.append(inimg_arr[i]) out_subset.append(outimg_arr[i]) if mask == 1: mask_subset.append(mskimg_arr[i]) pre_pos = pos # record rest of frames in_array.append(in_subset) out_array.append(out_subset) if mask == 1: mask_array.append(mask_subset) # number of subsets n_subset = len(in_array) # sky subtraction tmp = tempfile.NamedTemporaryFile(suffix='', prefix='', dir='/tmp') tmp_prefix = tmp.name tmp.close() for i in range(n_subset): tmp_sky = '%s_sky_%03d.fits' % (tmp_prefix, int(i)) tmp_subset = '%s_subset_%03d.lst' % (tmp_prefix, int(i)) # make subset list f = open(tmp_subset, 'w') for j in range(len(in_array[i])): f.write(in_array[i][j] + '\n') f.close() # combine subset if mask == 1: ret = zcombine(tmp_subset, tmp_sky, combine='median', reject='sigclip', masktype='!OBJMASK') else: ret = zcombine(tmp_subset, tmp_sky, combine='median', reject='sigclip', masktype='none') if ret != 0: remove_temp_all(tmp_prefix) return 1 os.remove(tmp_subset) # calculate median of combined sky background iraf.unlearn('imstat') ret = iraf.imstat(tmp_sky, format='no', fields='midpt', nclip=iternum, lsigma=nsigma, usigma=nsigma, Stdout=1) if len(ret) == 1: skymed = float(ret[0]) else: remove_temp_all(tmp_prefix) print >> sys.stderr, 'failed to calculate median of the combined sky background' return 1 # save sky data into memory sky = pyfits.open(tmp_sky) sky_data = sky[0].data sky_arr = np.reshape(np.array(sky[0].data - skymed), sky[0].data.size) sky.close() os.remove(tmp_sky) # subtract sky for j in range(len(in_array[i])): if mask == 1: iraf.unlearn('mimstat') if not second: ret = iraf.mimstat(in_array[i][j], imasks=mask_array[i][j] + '[pl]', format='no', fields='midpt', nclip=iternum, lsigma=nsigma, usigma=nsigma, Stdout=1) else: ret = iraf.mimstat(in_array[i][j], imasks=mask_array[i][j], format='no', fields='midpt', nclip=iternum, lsigma=nsigma, usigma=nsigma, Stdout=1) else: iraf.unlearn('imstat') ret = iraf.imstat(in_array[i][j], format='no', fields='midpt', nclip=iternum, lsigma=nsigma, usigma=nsigma, Stdout=1) if len(ret) == 1: objmed = float(ret[0]) else: remove_temp_all(tmp_prefix) print >> sys.stderr, 'failed to calculate median of the object background' return 1 # record input fits data into memory im = pyfits.open(in_array[i][j]) im_hdr = im[0].header im_data = im[0].data im_arr = np.reshape(np.array(im[0].data - objmed), im[0].data.size) im.close() # check if minimum sigma is obtained at scale_factor = 1.0 m1, s1 = meanclip(im_arr - sky_arr) m2, s2 = meanclip(im_arr - (1.0 + step) * sky_arr) m3, s3 = meanclip(im_arr - (1.0 - step) * sky_arr) if s1 < s2 and s1 < s3: print 'scale factor = 1.0' # subtract sky in memory out_data = (im_data - objmed) - (sky_data - skymed) else: # find minimum sigma with coarse sampling n = 1 min_i = 0 while min_i - 1 < 0 or min_i + 1 >= len(s_list): s = -1.0 * n ds = 0.5 sigma_list = [] s_list = [] while s <= 1.0 * n: sub = im_arr - (s * sky_arr) mean, sigma = meanclip(sub) sigma_list.append(sigma) s_list.append(s) s += ds min_i, min_sigma = min(enumerate(sigma_list), key=itemgetter(1)) n += 1 # find minimum sigma with fine sampling s = s_list[min_i - 1] ds = step s2_list = [] sigma2_list = [] while s <= s_list[min_i + 1]: sub = im_arr - (s * sky_arr) mean, sigma = meanclip(sub) sigma2_list.append(sigma) s2_list.append(s) s += ds min_i, min_sigma = min(enumerate(sigma2_list), key=itemgetter(1)) print 'scale factor = %f' % s2_list[min_i] # subtract sky in memory out_data = (im_data - objmed) - (sky_data - skymed) * s2_list[min_i] # save output fits file hdu = pyfits.PrimaryHDU(out_data) imgout = pyfits.HDUList([hdu]) imgout[0].header = im_hdr imgout.writeto(out_array[i][j]) imgout.close() remove_temp_all(tmp_prefix) return 0
def mkskyflat_with_mask(inlist, output, inpref='', mskpref='m', bpm='none', iternum=50, nsigma=3): # load IRAF package iraf.proto() iraf.nproto() # open input list and check if it exists inimg_arr = check_input(inlist, inpref) if len(inimg_arr) == 1 and inimg_arr[0] == 1: return 1 # check if output image is already exist if os.access(output, os.R_OK): print >> sys.stderr, 'operation would overwrite existing file (%s)' % output return 1 # check mask images if mskpref.lower() == 'none' or mskpref == '': print >> sys.stderr, 'mask frames are required for this task' return 1 else: mskimg_arr = check_inpref(mskpref, inimg_arr) if isinstance(mskimg_arr, int): return 1 # check optional parameters if bpm.lower() == 'none' or bpm == '': bpmex = 0 else: bpmex = 1 if not os.access(bpm, os.R_OK): print >> sys.stderr, 'cannot read bad pixel mask (%s)' % bpm return 1 if iternum <= 0: print >> sys.stderr, 'invalid iternum value (%d)' % iternum return 1 if nsigma <= 0: print >> sys.stderr, 'invalid nsigma value (%f)' % nsigma return 1 # prefix for temoprary images tmp = tempfile.NamedTemporaryFile(suffix='', prefix='', dir='/tmp') tmp_prefix = tmp.name tmp.close() # nomalize by object masked average tmp_list = tmp_prefix + '.lst' fout = open(tmp_list, 'w') for i in range(len(inimg_arr)): im = pyfits.open(inimg_arr[i], mode='update') try: pattern = im[0].header['PATTERN'] except KeyError: pattern = 0 im.close() if pattern == 0: tmpimg = tmp_prefix + os.path.basename(inimg_arr[i]) maskimg = mskimg_arr[i] tmpmask = tmp_prefix + maskimg fout.write('%s\n' % tmpimg) if os.access(tmpimg, os.R_OK): os.remove(tmpimg) if os.access(tmpmask, os.R_OK): os.remove(tmpmask) if bpmex == 1: iraf.unlearn('imarith') #iraf.imarith(maskimg+'[pl]','+',bpm,tmpmask,verbose='no') iraf.imarith(maskimg, '+', bpm, tmpmask, verbose='no') else: iraf.unlearn('imcopy') #iraf.imcopy(maskimg+'[pl]',tmpmask,verbose='no') iraf.imcopy(maskimg, tmpmask, verbose='no') iraf.unlearn('mimstat') res = iraf.mimstat(inimg_arr[i], imasks=tmpmask, format='no', fields='mean', nclip=iternum, lsigma=nsigma, usigma=nsigma, Stdout=1) if len(res) == 1: ave = float(res[0]) else: print >> sys.stderr, 'failed to calculate masked avarage from the frame (%s)' % inimg_arr[ i] remove_temp_all(tmp_prefix) return 1 # normalize each frame by average iraf.unlearn('imarith') iraf.imarith(inimg_arr[i], '/', ave, tmpimg, verbose='no') # add mask into header iraf.unlearn('hedit') if mskpref[0] != ':': iraf.hedit(tmpimg, 'objmask', maskimg, add='yes', verify='no') # close output file handler fout.close() # combine ret = zcombine(tmp_list, output, combine='median', reject='sigclip', masktype='!objmask') if ret != 0: print >> sys.stderr, 'failed to combine normalized frames' remove_temp_all(tmp_prefix) return 1 # remove temoprary files remove_temp_all(tmp_prefix) return 0
def mkcalflat(calonlst, calofflst, outimg, mask='none'): # load IRAF package iraf.proto() # open cal off list and check if files exist on_list = check_input(calonlst, '') if len(on_list) == 1 and on_list[0] == 1: return 1 # open cal off list and check if files exist off_list = check_input(calofflst, '') if len(off_list) == 1 and off_list[0] == 1: return 1 # check if output file exists if os.access(outimg, os.R_OK): print >> sys.stderr, 'operation would overwrite existing image (%s)' % outimg return 1 # prefix for temporary images and files tmp = tempfile.NamedTemporaryFile(suffix='', prefix='', dir='/tmp') tmp_prefix = tmp.name tmp.close() # check exptime, coadds, ndr, slwcnt for off frames tmp_off_list = tmp_prefix + '_off.lst' fout = open(tmp_off_list, 'w') err = 0 for i in range(len(off_list)): im = pyfits.open(off_list[i]) im_exptime = float(im[0].header['EXP1TIME']) im_coadds = int(im[0].header['COADDS']) im_ndr = int(im[0].header['NDR']) im_slwcnt = int(im[0].header['I_SLWCNT']) if i == 0: off_exptime = im_exptime off_coadds = im_coadds off_ndr = im_ndr off_slwcnt = im_slwcnt else: if im_exptime != off_exptime: print >> sys.stderr, 'exptime for %s is not consistent with the first frame (%s)' % ( off_list[i], off_list[0]) err += 1 if im_coadds != off_coadds: print >> sys.stderr, 'coadds for %s is not consistent with the first frame (%s)' % ( off_list[i], off_list[0]) err += 1 if im_ndr != off_ndr: print >> sys.stderr, 'ndr for %s is not consistent with the first frame (%s)' % ( off_list[i], off_list[0]) err += 1 if im_slwcnt != off_slwcnt: print >> sys.stderr, 'slwcnt for %s is not consistent with the first frame (%s)' % ( off_list[i], off_list[0]) err += 1 im.close() fout.write('%s\n' % off_list[i]) fout.close() # check error if err != 0: remove_temp_all(tmp_prefix) return 1 # check exptime, coadds, ndr, slwcnt for on frames tmp_on_list = tmp_prefix + '_on.lst' fout = open(tmp_on_list, 'w') for i in range(len(on_list)): im = pyfits.open(on_list[i]) im_exptime = float(im[0].header['EXP1TIME']) im_coadds = int(im[0].header['COADDS']) im_ndr = int(im[0].header['NDR']) im_slwcnt = int(im[0].header['I_SLWCNT']) if i == 0: on_exptime = im_exptime on_coadds = im_coadds on_ndr = im_ndr on_slwcnt = im_slwcnt else: if im_exptime != on_exptime: print >> sys.stderr, 'exptime for %s is not consistent with the first frame (%s)' % ( on_list[i], on_list[0]) err += 1 if im_coadds != on_coadds: print >> sys.stderr, 'coadds for %s is not consistent with the first frame (%s)' % ( on_list[i], on_list[0]) err += 1 if im_ndr != on_ndr: print >> sys.stderr, 'ndr for %s is not consistent with the first frame (%s)' % ( on_list[i], on_list[0]) err += 1 if im_slwcnt != on_slwcnt: print >> sys.stderr, 'slwcnt for %s is not consistent with the first frame (%s)' % ( on_list[i], on_list[0]) err += 1 im.close() fout.write('%s\n' % on_list[i]) fout.close() # check error if err != 0: remove_temp_all(tmp_prefix) return 1 # check consistency of EXPTIME, COADDS, NDR and SLWCNT between on and off frames if on_exptime != off_exptime: print >> sys.stderr, 'exptime for on and off frames are not consistent' err += 1 if on_coadds != off_coadds: print >> sys.stderr, 'coadds for on and off frames are not consistent' err += 1 if on_ndr != off_ndr: print >> sys.stderr, 'ndr for on and off frames are not consistent' err += 1 if on_slwcnt != off_slwcnt: print >> sys.stderr, 'slwcnt for on and off frames are not consistent' err += 1 # check error if err != 0: remove_temp_all(tmp_prefix) return 1 # combine off frames tmpoff = tmp_prefix + '_off.fits' iraf.unlearn('imcombine') iraf.imcombine.combine = 'median' iraf.imcombine.reject = 'sigclip' iraf.imcombine('@' + tmp_off_list, tmpoff) # combine on frames tmpon = tmp_prefix + '_on.fits' tmp.close() iraf.unlearn('imcombine') iraf.imcombine.combine = 'median' iraf.imcombine.reject = 'sigclip' iraf.imcombine('@' + tmp_on_list, tmpon) # subtract off from on iraf.unlearn('imarith') iraf.imarith(tmpon, "-", tmpoff, outimg, verbose='no') # delete temporary files remove_temp_all(tmp_prefix) # calculate average if mask == 'none': iraf.unlearn('imstat') res = iraf.imstat(outimg, format='no', fields='mean', nclip=50, Stdout=1) if len(res) == 1: ave = float(res[0]) else: print >> sys.stderr, 'failed to calculate avarage of the combined frame' os.remove(outimg) return 1 else: if os.access(mask, os.R_OK): iraf.unlearn('mimstat') res = iraf.mimstat(outimg, imasks=mask, format='no', fields='mean', nclip=50, Stdout=1) if len(res) == 1: ave = float(res[0]) else: print >> sys.stderr, 'failed to calculate masked avarage of the combined frame' os.remove(outimg) return 1 else: print >> sys.stderr, 'mask frame (%s) does not exist' % mask os.remove(outimg) return 1 # divide by average count iraf.unlearn('imarith') iraf.imarith(outimg, "/", ave, outimg, verbose='no') return 0
def mkskyflat(inlist, output, inpref='', mskpref='m', bpm='none', iternum=50, nsigma=3, minpix=250, hsigma=3, lsigma=10, conv='block 3 3'): # load IRAF package iraf.proto() iraf.nproto() # open input list and check if it exists inimg_arr = check_input(inlist, inpref) if len(inimg_arr) == 1 and inimg_arr[0] == 1: return 1 # check if output image is already exist if os.access(output, os.R_OK) : print >> sys.stderr, 'operation would overwrite existing file (%s)' % output return 1 # check optional parameters if bpm.lower() == 'none' or bpm == '': bpmex = 0 else: bpmex = 1 if not os.access(bpm, os.R_OK): print >> sys.stderr, 'cannot read bad pixel mask (%s)' % bpm return 1 if iternum <= 0: print >> sys.stderr, 'invalid iternum value (%d)' % iternum return 1 if nsigma <= 0: print >> sys.stderr, 'invalid nsigma value (%f)' % nsigma return 1 # prefix for temoprary images tmp = tempfile.NamedTemporaryFile(suffix='', prefix='', dir='/tmp') tmp_prefix = tmp.name tmp.close() # temporary normalize raw frames by average tmp_list = tmp_prefix+'.lst' fout = open(tmp_list, 'w') for i in range(len(inimg_arr)): tmpimg = tmp_prefix+os.path.basename(inimg_arr[i]) fout.write('%s\n' % tmpimg) # remove temporary files if it exists if os.access(tmpimg, os.R_OK): os.remove(tmpimg) # calculate average counts in each frame if bpmex == 0: iraf.unlearn('imstat') res = iraf.imstat(inimg_arr[i], format='no', fields='mean', nclip=iternum, lsigma=nsigma, usigma=nsigma, Stdout=1) if len(res) == 1: ave = float(res[0]) else: print >> sys.stderr, 'failed to calculate avarage from the frame (%s)' % inimg remove_temp_all(tmp_prefix) fout.close() return 1 else: iraf.unlearn('mimstat') res = iraf.mimstat(inimg_arr[i], imasks=bpm, format='no', fields='mean', nclip=iternum, lsigma=nsigma, usigma=nsigma, Stdout=1) if len(res) == 1: ave = float(res[0]) else: print >> sys.stderr, 'failed to calculate masked avarage from the frame (%s)'% inimg remove_temp_all(tmp_prefix) fout.close() return 1 # normalize each frame by average iraf.unlearn('imarith') iraf.imarith(inimg_arr[i], '/', ave, tmpimg, verbose='no') # close output file handler fout.close() # make temporary sky flat frame tmp_flat = tmp_prefix+'_sflat.fits' ret = zcombine(tmp_list, tmp_flat, combine='median', reject='sigclip') if ret != 0: remove_temp_all(tmp_prefix) return 1 # temporary flat field iraf.unlearn('imarith') tmpff_list = tmp_prefix+'_ff.lst' fout = open(tmpff_list, 'w') for i in range(len(inimg_arr)): tmpimg = tmp_prefix+'_ff_'+os.path.basename(inimg_arr[i]) fout.write('%s\n' % tmpimg) # remove temporary files if it exists if os.access(tmpimg, os.R_OK): os.remove(tmpimg) # divided by temporary flat iraf.imarith(inimg_arr[i], '/', tmp_flat, tmpimg, verbose='no') # read image fits header im = pyfits.open(inimg_arr[i]) exptime = float(im[0].header['EXP1TIME']) coadds = int(im[0].header['COADDS']) ndr = int(im[0].header['NDR']) im.close() # normalize by coadds, ndr, and exptime values iraf.imarith(tmpimg, '/', (coadds*ndr*exptime), tmpimg, verbose='no') # close output file handler fout.close() # remove temporary flat os.remove(tmp_flat) # calculate standard deviation of the temporary flat divided images try: iraf.unlearn('imstat') stddev = iraf.imstat('@'+tmpff_list, format='no', fields='stddev', nclip=50, Stdout=1) except: remove_temp_all(tmp_prefix) return 1 # calculate mean and sigma of the stddev of the image y = map(float, stddev) mean, sigma = meanclip(np.array(y, dtype=float)) #print mean, sigma # flag bad frames frame_flag = [] for i in range(len(stddev)): im = pyfits.open(inimg_arr[i], mode='update') if math.fabs(y[i] - mean) < nsigma * sigma: frame_flag.append(0) im[0].header['PATTERN'] = 0 else: frame_flag.append(1) im[0].header['PATTERN'] = 1 im.close() # make object mask ret = mkobjmask(tmpff_list, inpref='', outpref=mskpref, bpm=bpm, minpix=minpix, hsigma=hsigma, lsigma=lsigma, conv=conv) # rename mask file mskimg_arr = [] for i in range(len(inimg_arr)): base = os.path.basename(inimg_arr[i]) tmpimg = tmp_prefix+'_ff_'+base maskimg = mskpref+base tmpmask = mskpref+os.path.basename(tmpimg) move(tmpmask, maskimg) mskimg_arr.append(maskimg) # delete temporary flat fielded files remove_temp_all(tmp_prefix) # check mkobjmask result if ret != 0: return 1 # nomalize by object masked average fout = open(tmp_list, 'w') for i in range(len(inimg_arr)): if frame_flag[i] == 0: tmpimg = tmp_prefix+os.path.basename(inimg_arr[i]) maskimg = mskimg_arr[i] tmpmask = tmp_prefix+maskimg fout.write('%s\n' % tmpimg) if os.access(tmpimg, os.R_OK): os.remove(tmpimg) if os.access(tmpmask, os.R_OK): os.remove(tmpmask) if bpmex == 1: iraf.unlearn('imarith') iraf.imarith(maskimg+'[pl]','+',bpm,tmpmask,verbose='no') else : iraf.unlearn('imcopy') iraf.imcopy(maskimg+'[pl]',tmpmask,verbose='no') iraf.unlearn('mimstat') # calculate average of the raw images with mask res = iraf.mimstat(inimg_arr[i], imasks=tmpmask, format='no', fields='mean', nclip=iternum, lsigma=nsigma, usigma=nsigma, Stdout=1) if len(res) == 1: ave = float(res[0]) else: print >> sys.stderr, 'failed to calculate masked avarage from the frame (%s)' % inimg_arr[i] remove_temp_all(tmp_prefix) return 1 # normalize each frame by average iraf.unlearn('imarith') iraf.imarith(inimg_arr[i], '/', ave, tmpimg, verbose='no') # add mask into header iraf.unlearn('hedit') iraf.hedit(tmpimg, 'objmask', maskimg+'[pl]', add='yes', verify='no') # close output file handler fout.close() # combine ret = zcombine(tmp_list, output, combine='median', reject='sigclip', masktype='!objmask') if ret != 0: print >> sys.stderr, 'failed to combine normalized frames' remove_temp_all(tmp_prefix) return 1 # remove temoprary files remove_temp_all(tmp_prefix) return 0
def mkskyflat_quick(inlist, output, inpref='', bpm='none', iternum=50, nsigma=3): # load IRAF package iraf.proto() iraf.nproto() # open input list and check if it exists inimg_arr = check_input(inlist, inpref) if len(inimg_arr) == 1 and inimg_arr[0] == 1: return 1 # check if output image is already exist if os.access(output, os.R_OK): print >> sys.stderr, 'operation would overwrite existing file (%s)' % output return 1 # check optional parameters if bpm.lower() == 'none' or bpm == '': bpmex = 0 else: bpmex = 1 if not os.access(bpm, os.R_OK): print >> sys.stderr, 'cannot read bad pixel mask (%s)' % bpm return 1 if iternum <= 0: print >> sys.stderr, 'invalid iternum value (%d)' % iternum return 1 if nsigma <= 0: print >> sys.stderr, 'invalid nsigma value (%f)' % nsigma return 1 # prefix for temoprary images tmp = tempfile.NamedTemporaryFile(suffix='', prefix='', dir='/tmp') tmp_prefix = tmp.name tmp.close() # temporary normalize raw frames by average tmp_list = tmp_prefix + '.lst' fout = open(tmp_list, 'w') for i in range(len(inimg_arr)): tmpimg = tmp_prefix + os.path.basename(inimg_arr[i]) fout.write('%s\n' % tmpimg) # remove temporary files if it exists if os.access(tmpimg, os.R_OK): os.remove(tmpimg) # calculate average counts in each frame if bpmex == 0: iraf.unlearn('imstat') res = iraf.imstat(inimg_arr[i], format='no', fields='mean', nclip=iternum, lsigma=nsigma, usigma=nsigma, Stdout=1) if len(res) == 1: ave = float(res[0]) else: print >> sys.stderr, 'failed to calculate avarage from the frame (%s)' % inimg remove_temp_all(tmp_prefix) fout.close() return 1 else: iraf.unlearn('mimstat') res = iraf.mimstat(inimg_arr[i], imasks=bpm, format='no', fields='mean', nclip=iternum, lsigma=nsigma, usigma=nsigma, Stdout=1) if len(res) == 1: ave = float(res[0]) else: print >> sys.stderr, 'failed to calculate masked avarage from the frame (%s)' % inimg remove_temp_all(tmp_prefix) fout.close() return 1 # normalize each frame by average iraf.unlearn('imarith') iraf.imarith(inimg_arr[i], '/', ave, tmpimg, verbose='no') # close output file handler fout.close() # make temporary sky flat frame tmp_flat = tmp_prefix + '_sflat.fits' ret = zcombine(tmp_list, output, combine='median', reject='sigclip') if ret != 0: remove_temp_all(tmp_prefix) return 1 # remove temoprary files remove_temp_all(tmp_prefix) return 0