def __init__(self, datatype=None): self.datatype=datatype self.fn_pattern=re.compile(".*") iraf.images() iraf.proto() self.statarea=StatArea return
def ApplyBadPixelMask(images, cal_path, outbase = '_bpm'): """ ##################################################################################### # Fix a list of images with a bad pixel mask # # PARAMETERS: # images - list of images to fix # cal_path - path to calibration data # outbase - addition to the name of the image after mask has been applied # # RETURNS: # list of fixed images ##################################################################################### """ print '########################################' print '# Applying Bad Pixel Masks' print '########################################' # finds the bad pixel mask badPixelMask = [FindPixelMask(i, cal_path) for i in images] # Build the list of output image names out = [os.path.splitext(i) for i in images] # Split off the extension out = [i[0] + outbase + '.fit' for i in out] # Paste the outbase at the end of the filename # and put the extension back on # Set up to call the task iraf.set(clobber='yes') iraf.proto() iraf.fixpix.unlearn() # Forget everything iraf.fixpix.mode = 'h' # Don't ask for user input for (i,o,m) in zip(images, out, badPixelMask): # gets image data and copies it to the corresponding output file name shutil.copy(i,o) #runs fixpix on the output file (fixpix overwrites file data) if not os.path.isfile(i): print i + ": Input file does not exist." elif not os.path.isfile(m): print i + ": No pixel mask applied." else: try: #set parameters iraf.fixpix.images = o iraf.fixpix.masks = m print i + ": applying mask at " + m iraf.fixpix() except iraf.IrafError, e: print "fixpix failed" print "error #" + str(e.errno) print "Msg: " + e.errmsg print "Task: " + e.errtask raise e
def FixBadPixels(PC,images,nightdir): """ This will run iraf task proto.fixpix to interpolate badpixels """ PixelMask = os.path.join(nightdir,PC.BadPixelMaskName) if not os.path.isfile(PixelMask): print("No Bad Pixel Mask file found by the name "+ PixelMask) print("Hence skipping Bad pixel interpolation") return iraf.proto(_doprint=0) iraf.fixpix.unlearn() iraf.fixpix(images=images,masks=PixelMask)
def marksn2(img,fitstab,frame=1,fitstab2='',verbose=False): from pyraf import iraf from numpy import array #,log10 import lsc iraf.noao(_doprint=0) iraf.digiphot(_doprint=0) iraf.daophot(_doprint=0) iraf.images(_doprint=0) iraf.imcoords(_doprint=0) iraf.proto(_doprint=0) iraf.set(stdimage='imt1024') hdr=lsc.util.readhdr(fitstab) _filter=lsc.util.readkey3(hdr,'filter') column=lsc.lscabsphotdef.makecatalogue([fitstab])[_filter][fitstab] rasex=array(column['ra0'],float) decsex=array(column['dec0'],float) if fitstab2: hdr=lsc.util.readhdr(fitstab2) _filter=lsc.util.readkey3(hdr,'filter') _exptime=lsc.util.readkey3(hdr,'exptime') column=lsc.lscabsphotdef.makecatalogue([fitstab2])[_filter][fitstab2] rasex2=array(column['ra0'],float) decsex2=array(column['dec0'],float) iraf.set(stdimage='imt1024') iraf.display(img + '[0]',frame,fill=True,Stdout=1) vector=[] for i in range(0,len(rasex)): vector.append(str(rasex[i])+' '+str(decsex[i])) xy = iraf.wcsctran('STDIN',output="STDOUT",Stdin=vector,Stdout=1,image=img+'[0]',inwcs='world',units='degrees degrees',outwcs='logical',\ formats='%10.1f %10.1f',verbose='yes')[3:] iraf.tvmark(frame,'STDIN',Stdin=list(xy),mark="circle",number='yes',label='no',radii=10,nxoffse=5,nyoffse=5,color=207,txsize=2) if verbose: # print 2.5*log10(_exptime) for i in range(0,len(column['ra0'])): print xy[i],column['ra0'][i],column['dec0'][i],column['magp3'][i],column['magp4'][i],column['smagf'][i],column['magp2'][i] if fitstab2: vector2=[] for i in range(0,len(rasex2)): vector2.append(str(rasex2[i])+' '+str(decsex2[i])) xy1 = iraf.wcsctran('STDIN',output="STDOUT",Stdin=vector2,Stdout=1,image=img+'[0]',inwcs='world',units='degrees degrees',outwcs='logical',\ formats='%10.1f %10.1f',verbose='yes')[3:] iraf.tvmark(frame,'STDIN',Stdin=list(xy1),mark="cross",number='yes',label='no',radii=10,nxoffse=5,nyoffse=5,color=205,txsize=2)
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 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 mksky(inlist, outfits, inpref='', mskpref='none', 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 fits if os.access(outfits, os.R_OK): print >> sys.stderr, 'operation would overwrite exisiting image (%s)' % outfits 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 input, output, and mask files and record mask frame into header in_subset = [] if mask == 1: mask_subset = [] 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') in_subset.append(inimg_arr[i]) # sky subtraction tmp = tempfile.NamedTemporaryFile(suffix='', prefix='', dir='/tmp') tmp_prefix = tmp.name tmp.close() tmp_subset = '%s_subset_%03d.lst' % (tmp_prefix, int(i)) # make subset list f = open(tmp_subset, 'w') for j in range(len(in_subset)): f.write(in_subset[j] + '\n') f.close() # combine subset if mask == 1: ret = zcombine(tmp_subset, outfits, combine='median', reject='sigclip', masktype='!OBJMASK') else: ret = zcombine(tmp_subset, outfits, combine='median', reject='sigclip', masktype='none') if ret != 0: remove_temp_all(tmp_prefix) return 1 remove_temp_all(tmp_prefix) return 0
def efoscreduction(imglist, _interactive, _doflat, _dobias, listflat, listbias, _dobadpixel, badpixelmask, fringingmask, _archive, typefile, filenameobjects, _system, _cosmic, _verbose=False, method='iraf'): # print "LOGX:: Entering `efoscreduction` method/function in %(__file__)s" # % globals() import ntt from ntt.efoscphotredudef import searchbias from ntt.util import delete, readhdr, readkey3, display_image, searchflat, rangedata, correctcard from numpy import argmin, min, abs, sqrt import string import os import re import math import sys from pyraf import iraf # ## Call and set parameters for useful iraf tasks iraf.noao(_doprint=0) iraf.imred(_doprint=0) iraf.ccdred(_doprint=0) iraf.proto(_doprint=0) toforget = ['ccdproc', 'zerocombine', 'flatcombine', 'imreplace', 'proto.fixpix'] for t in toforget: iraf.unlearn(t) iraf.ccdproc.darkcor = 'no' iraf.ccdproc.fixpix = 'no' iraf.ccdproc.flatcor = 'no' iraf.ccdproc.zerocor = 'no' iraf.ccdproc.overscan = 'no' iraf.ccdproc.ccdtype = '' iraf.ccdproc.biassec = '' iraf.ccdred.instrument = "/dev/null" if _verbose: iraf.ccdred.verbose = 'yes' else: iraf.ccdred.verbose = 'no' import datetime import time # starttime=time.time() now = datetime.datetime.now() datenow = now.strftime('20%y%m%d%H%M') MJDtoday = 55927 + (datetime.date.today() - datetime.date(2012, 01, 01)).days outputfile = [] reduceddata = rangedata(imglist) img = re.sub('\n', '', imglist[0]) hdr = readhdr(img) _gain = readkey3(hdr, 'gain') _rdnoise = readkey3(hdr, 'ron') _instrume = readkey3(hdr, 'instrume') _trimsec = '[3:1010,1:1015]' biaslist = {} flatlist1 = {} flatlist2 = {} objectlist = {} filterlist1 = [] filterlist2 = [] for img in imglist: _type = '' img = re.sub('\n', '', img) hdr = readhdr(img) _naxis1 = readkey3(hdr, 'NAXIS1') _naxis2 = readkey3(hdr, 'NAXIS2') if _naxis1 != 1030 or _naxis2 != 1030: ntt.util.writeinthelog( 'image ' + str(img) + ' different dimension =\n', './logNTT.txt') _type = 'not good' if not _type and readkey3(hdr, 'speed') != 'fastL': _type = 'not good' if not _type and readkey3(hdr, 'instrume') != 'efosc': _type = 'not good' _imagetype = readkey3(hdr, 'tech') if not _type and _imagetype == 'SPECTRUM': _type = 'spectroscopic data' if not _type: _exptime = readkey3(hdr, 'exptime') _date = readkey3(hdr, 'date-night') _filter = readkey3(hdr, 'filter') if float(_exptime) == 0.0: if _date not in biaslist: biaslist[_date] = [] biaslist[_date].append(img) _type = 'bias' if not _type: _object = readkey3(hdr, 'object') if _filter.lower() in ['g782', 'r784', 'z623', 'u640', 'b639', 'v641', 'r642', 'i705'] and _imagetype == 'IMAGE': if 'sky,flat' in _object.lower(): _type = 'flat' elif 'dome' in _object.lower() or 'flat' in _object.lower(): _type = 'flat dome' if _type == 'flat': if _filter not in filterlist1: filterlist1.append(_filter) flatlist1[_filter] = [] flatlist1[_filter].append(img) if _type == 'flat dome': if _filter not in filterlist2: filterlist2.append(_filter) flatlist2[_filter] = [] flatlist2[_filter].append(img) if not _type: _catg = readkey3(hdr, 'catg') if 'science' in _catg.lower() or 'acquisition' in _catg.lower(): _type = 'object' if _filter not in objectlist: objectlist[_filter] = [] objectlist[_filter].append(img) if 'acquisition' in _catg.lower(): try: correctcard(img) _ra1, _dec1, _name = ntt.util.correctobject( img, 'standard_efosc_mab.txt') _ra1, _dec1, _name = ntt.util.correctobject( img, filenameobjects) except: pass elif 'focus' in _object.lower(): _type = 'not good' if not _type: print '\n### warning: object not recognized ' _object = readkey3(hdr, 'object') print img, _object, _imagetype answ = raw_input( 'what is it: bias [1], flat [3], object[4], test [5] ? [5] ') if not answ: answ = '5' if answ == '1': if _date not in biaslist: biaslist[_date] = () biaslist[_date].append(img) elif answ == '4': if _filter not in objectlist: objectlist[_filter] = [] objectlist[_filter].append(img) elif answ == '3': tt = raw_input('dome or sky [d/[s]] ? ') if tt == 's': _type = 'flat' _filter = readkey3(hdr, 'filter') if _filter not in filterlist1: filterlist1.append(_filter) flatlist1[_filter] = [] flatlist1[_filter].append(img) elif tt == 'd': _type = 'flat dome' _filter = readkey3(hdr, 'filter') if _filter not in filterlist2: filterlist2.append(_filter) flatlist2[_filter] = [] flatlist2[_filter].append(img) elif answ == '5': _type = 'not good' filterlist = list(set(filterlist1 + filterlist2)) if _verbose: print filterlist1 print filterlist2 print flatlist1 print flatlist2 flatlist = {} for _filt in filterlist: if _filt not in flatlist1.keys(): if _filt in flatlist2.keys(): if len(flatlist2[_filt]) >= 3: flatlist[_filt] = flatlist2[_filt] elif len(flatlist1[_filt]) < 3: if _filt in flatlist2.keys(): if len(flatlist2[_filt]) >= 3: flatlist[_filt] = flatlist2[_filt] elif _filt in flatlist1.keys(): if len(flatlist1[_filt]) >= 3: flatlist[_filt] = flatlist1[_filt] listaout = [] if _verbose: print '\n### flat ', str(flatlist), '\n' print '\n### bias ', str(biaslist), '\n' print '\n### object ', str(objectlist), '\n' ###### masterbias ################# if _dobias: if not _archive: if listbias: masterbiaslist = listbias else: masterbiaslist = [] if biaslist: for _date in biaslist: print '\n do bias ' + str(_date) + '\n' biaslist[_date] = rejectbias( biaslist[_date], False, 10) if len(biaslist[_date]) >= 3: masterbiasfile = 'bias_' + \ str(_date) + '_' + str(MJDtoday) + '.fits' delete(masterbiasfile) f = open('biaslist', 'w') h = open('obiaslist', 'w') for img in biaslist[_date]: f.write(img + '\n') h.write('o' + img + '\n') delete('o' + img) f.close() h.close() try: print 'processing bias .....' iraf.ccdproc('@biaslist', output='@obiaslist', overscan="no", trim="yes", zerocor='no', fixpix='no', ccdtype='', flatcor='no', darkcor='no', biassec='', trimsec=str(_trimsec), readaxi='column', Stdout=1) iraf.zerocombine('@obiaslist', output=masterbiasfile, combine='median', reject='ccdclip', ccdtype='', process='no', rdnoise=_rdnoise, gain=_gain, Stdout=1) correctcard(masterbiasfile) num = 0 for img in biaslist[_date]: num = num + 1 ntt.util.updateheader(masterbiasfile, 0, { 'PROV' + str(num): [readkey3(readhdr(img), 'ARCFILE'), 'Originating file']}) ntt.util.updateheader(masterbiasfile, 0, { 'TRACE' + str(num): [readkey3(readhdr(img), 'ARCFILE'), 'Originating file']}) delete('o' + img) ntt.util.updateheader(masterbiasfile, 0, {'M_EPOCH': [False, 'TRUE if resulting from multiple epochs']}) ntt.util.updateheader(masterbiasfile, 0, {'SINGLEXP': [False, 'TRUE if resulting from single exposure']}) ntt.util.updateheader(masterbiasfile, 0, { 'FILETYPE': [11201, 'bias']}) masterbiaslist.append(masterbiasfile) if masterbiasfile not in outputfile: outputfile.append(masterbiasfile) except: ntt.util.writeinthelog( 'Warning ' + str(biaslist[_date]) + ' problem with this list of bias \n', './logNTT.txt') if masterbiasfile and _interactive: aa, bb, cc = display_image( masterbiasfile, 1, '', '', False) answ = raw_input( 'is the masterbias ok [[y]/n] ?') if not answ: answ = 'y' if answ in ['n', 'no']: sys.exit( 'remove bad bias from input list and restart') else: masterbiaslist = [] ########## masterflat ######################### if _doflat: if not _archive: if listflat: masterflatlist = listflat else: masterflatlist = [] if flatlist: for _filter in flatlist: print '\n do flat ' + str(_filter) + '\n' flatlist[_filter] = rejectflat( flatlist[_filter], False) if len(flatlist[_filter]) >= 3: _date = readkey3( readhdr(flatlist[_filter][0]), 'date-night') masterflat = 'flat_' + \ str(_date) + '_' + str(_filter) + \ '_' + str(MJDtoday) + '.fits' listaflat = 'flatlist_' + \ str(_date) + '_' + str(_filter) _bias = '' if masterbiaslist: _bias = searchbias(flatlist[_filter][ 0], masterbiaslist)[0] if not _bias: _bias = searchbias(flatlist[_filter][0], '')[0] if _bias: if _bias[0] == '/': os.system('cp ' + _bias + ' .') _bias = string.split(_bias, '/')[-1] _zerocor = 'yes' else: _zerocor = 'yes' else: _zerocor = 'no' answ0 = 'n' while answ0 != 'y': f = open(listaflat, 'w') h = open('o' + listaflat, 'w') for img in flatlist[_filter]: f.write(img + '\n') h.write('o' + img + '\n') delete('o' + img) f.close() h.close() try: print 'processing flat .....' iraf.ccdproc('@' + listaflat, output='@o' + listaflat, overscan='no', trim='yes', darkcor='no', fixpix='no', zerocor=_zerocor, flatcor='no', trimsec=str(_trimsec), biassec='', zero=_bias, readaxi='column', ccdtype='', Stdout=1) delete(masterflat) iraf.flatcombine('@o' + listaflat, output=masterflat, combine='average', reject='avsigclip', ccdtype='', process='no', rdnoise=_rdnoise, gain=_gain, statsec='[100:800,100:800]', lsigma=3, hsigma=2, Stdout=1) masterflatlist.append(masterflat) correctcard(masterflat) num = 0 for img in flatlist[_filter]: num = num + 1 ntt.util.updateheader(masterflat, 0, { 'PROV' + str(num): [readkey3(readhdr(img), 'ARCFILE'), 'Originating file']}) ntt.util.updateheader(masterflat, 0, { 'TRACE' + str(num): [readkey3(readhdr(img), 'ARCFILE'), 'Originating file']}) delete('o' + img) ntt.util.updateheader( masterflat, 0, {'ZEROCOR': [_bias, '']}) ntt.util.updateheader(masterflat, 0, { 'M_EPOCH': [False, 'TRUE if resulting from multiple epochs']}) ntt.util.updateheader(masterflat, 0, { 'SINGLEXP': [False, 'TRUE if resulting from single exposure']}) ntt.util.updateheader( masterflat, 0, {'FILETYPE': [11202, 'flat field']}) if masterflat not in outputfile: outputfile.append(masterflat) except: ntt.util.writeinthelog( 'Warning ' + str(flatlist[ _filter]) + ' problem with this list of flat \n', './logNTT.txt') aa, bb, cc = display_image( masterflat, 1, '', '', False) if masterflat and _interactive: answ = raw_input( 'is the masterflat ok [[y]/n] ?') if not answ: answ = 'y' if answ.lower() in ['n', 'no']: answ1 = raw_input( 'try again [[y]/n] ?') if not answ1: answ1 = 'y' if answ1.lower() in ['y', 'yes']: flatlist[_filter] = ntt.efoscphotredudef.rejectflat( flatlist[_filter], True) else: sys.exit( 'error: problem with flat .... exit') else: answ0 = 'y' else: answ0 = 'y' else: masterflatlist = [] ########################################################################## if len(masterbiaslist) == 0: masterbiaslist = '' if len(masterflatlist) == 0: masterflatlist = '' ###################################### if _verbose: print '' print '#############################' print masterflatlist print masterbiaslist print '#############################' print '' if masterflatlist: listaout = listaout + masterflatlist if masterbiaslist: listaout = listaout + masterbiaslist if typefile == 'calib': objectlist = {} for _filter in objectlist: for img in objectlist[_filter]: hdr = readhdr(img) print '\n#####################################################################\n' _object = readkey3(hdr, 'object') _object = re.sub(' ', '', _object) _object = re.sub('/', '_', _object) _object = re.sub('\n', '', _object) _exptime = readkey3(hdr, 'exptime') _date = readkey3(hdr, 'date-night') nameout = ntt.util.name_duplicate(img, str(_object) + '_' + str(_date) + '_' + str(_filter) + '_' + str( MJDtoday), '') _bias = '' if _dobias: if masterbiaslist: _bias = searchbias(img, masterbiaslist)[0] if not _bias: _bias = searchbias(img, '')[0] _flat = '' if _doflat: if masterflatlist: _flat = searchflat(img, masterflatlist)[0] if not _flat: _flat = searchflat(img, '')[0] if _bias: # bias ### if _bias[0] == '/': os.system('cp ' + _bias + ' .') _bias = string.split(_bias, '/')[-1] _zerocor = 'yes' else: _zerocor = 'no' else: _zerocor = 'no' if _flat: # flat ### if _flat[0] == '/': os.system('cp ' + _flat + ' .') _flat = string.split(_flat, '/')[-1] _flatcor = 'yes' else: _flatcor = 'no' sss = str(_object) + '_' + str(_date) + '_' + str(_filter) print '### input', img, sss print '### bias ', _zerocor, _bias print '### flat ', _flatcor, _flat print '### name ', nameout delete(nameout) try: iraf.ccdproc(img, output=nameout, overscan="no", trim="yes", zerocor=_zerocor, flatcor='no', darkcor='no', trimsec=str(_trimsec), zero=_bias, biassec='', readaxi='column', Stdout=1) try: iraf.ccdproc(nameout, output='', overscan="no", trim="no", zerocor='no', flatcor=_flatcor, darkcor='no', flat=_flat, readaxi='column', ccdtype='', Stdout=1) except: iraf.imrepla(images=_flat, value=0.01, lower='INDEF', upper=0.01, radius=0) iraf.ccdproc(nameout, output='', overscan="no", trim="no", zerocor='no', flatcor=_flatcor, darkcor='no', flat=_flat, readaxi='column', ccdtype='', Stdout=1) correctcard(nameout) ntt.util.updateheader(nameout, 0, {'FILTER': [readkey3(readhdr(nameout), 'filter'), 'Filter name'], 'SINGLEXP': [True, 'TRUE if resulting from single exposure'], 'M_EPOCH': [False, 'TRUE if resulting from multiple epochs'], 'FLATCOR': [_flat, ''], 'ZEROCOR': [_bias, ''], 'FILETYPE': [12204, 'pre-reduced image'], 'PROV1': [readkey3(readhdr(nameout), 'ARCFILE'), 'Originating file'], 'NCOMBINE': [1, 'Number of raw science data'], 'TRACE1': [readkey3(readhdr(nameout), 'ARCFILE'), 'Originating file']}) ntt.util.airmass(nameout) # phase 3 definitions ntt.util.writeinthelog('\n', './logNTT.txt') ntt.util.writeinthelog( 'image= ' + str(img) + ' output= ' + str(nameout) + '\n', './logNTT.txt') ntt.util.writeinthelog( 'bias= ' + str(_bias) + ', flat= ' + str(_flat) + '\n', './logNTT.txt') ntt.util.writeinthelog('\n', './logNTT.txt') if nameout not in outputfile: outputfile.append(nameout) except: ntt.util.writeinthelog( 'image ' + str(img) + ' probably corrupted\n', './logNTT.txt') if _dobadpixel: if not badpixelmask: badpixelmask = 'bad_pixel_mask.fits' delete(badpixelmask) os.system('cp ' + ntt.__path__[0] + '/archive/' + str( _instrume) + '/badpixels/badpixel.fits ' + badpixelmask) iraf.proto.fixpix(images=nameout, masks=badpixelmask, linterp='INDEF', cinterp='INDEF', verbose='no') ntt.util.updateheader( nameout, 0, {'FIXPIX': [badpixelmask, '']}) ntt.util.writeinthelog('image ' + str(nameout) + ' bad pixel corrected with ' + badpixelmask + '\n', './logNTT.txt') print '\n### bad pixel mask correction ..... done' else: ntt.util.writeinthelog( 'image ' + str(nameout) + ' bad pixel NOT corrected\n', './logNTT.txt') if _cosmic: try: print '\n### cosmic ..... ' ntt.cosmics.lacos_im(nameout, _output='', gain=_gain, readn=_rdnoise, xorder=9, yorder=9, sigclip=4.5, sigfrac=0.5, objlim=1, skyval=0, niter=0, verbose=True, interactive=False) ntt.util.updateheader(nameout, 0, { 'LACOSMIC': [True, 'TRUE if Laplacian cosmic ray rejection has been applied to the image']}) print '\n### cosmic ..... removed ' except Exception, e: print e else: ntt.util.updateheader(nameout, 0, { 'LACOSMIC': [False, 'TRUE if Laplacian cosmic ray rejection has been applied to the image']}) try: ########################## sexvec = ntt.efoscastrodef.sextractor(nameout) for cat in ['2mass', 'usnoa2', 'usnob1']: rmsx3, rmsy3, num3, fwhmgess, ellgess, ccc, rasys3, decsys3, magsat3 = ntt.efoscastrodef.efoscastroloop( [nameout], cat, False, 40, 40, 100, 'rxyscale', 100, 30, sexvec, True, 10, method) if rmsx3 <= 2 and rmsy3 <= 2: break if rmsx3 > 2 and rmsy3 > 2: for cat in ['2mass', 'usnoa2', 'usnob1']: rmsx3, rmsy3, num3, fwhmgess, ellgess, ccc, rasys3, decsys3, magsat3 = ntt.efoscastrodef.efoscastroloop( [nameout], cat, False, 20, int(20), int(50), 'rxyscale', 100, 30, sexvec, True, 5, method) if rmsx3 <= 2 and rmsy3 <= 2: break if rmsx3 > 2 and rmsy3 > 2: for cat in ['2mass', 'usnoa2', 'usnob1']: rmsx3, rmsy3, num3, fwhmgess, ellgess, ccc, rasys3, decsys3, magsat3 = ntt.efoscastrodef.efoscastroloop( [nameout], cat, False, int(10), int(10), int(25), 'rxyscale', 100, 30, sexvec, True, int(3), method) ########################## astrostring = str(rmsx3) + ' ' + str(rmsy3) + ' ' + str(num3) ntt.util.updateheader( nameout, 0, {'ASTROMET': [astrostring, 'rmsx rmsy nstars']}) print '\n### check astrometry: fine \n### rmsx rmsy nstars: ' + astrostring except Exception, e: print e rmsx3, rmsy3, num3, fwhmgess, ellgess, ccc, rasys3, decsys3, magsat3 = '', '', '', '', '', '', '', '', '' print '\n### problem with astrometry, do you have network ? ' if fwhmgess and fwhmgess < 99: ntt.util.updateheader(nameout, 0, {'PSF_FWHM': [fwhmgess, 'Spatial resolution (arcsec)'], 'ELLIPTIC': [ellgess, 'Average ellipticity of point sources'], 'CRDER1': [(1 / sqrt(2.)) * float(rmsx3) * (1. / 3600.), 'Random error (degree)'], 'CRDER2': [(1 / sqrt(2.)) * float(rmsy3) * (1. / 3600.), 'Random error (degree)'], 'CUNIT1': ['deg', 'unit of the coord. trans.'], 'CUNIT2': ['deg', 'unit of the coord. trans.'], 'CSYER1': [rasys3, 'Systematic error (RA_m - Ra_ref)'], 'CSYER2': [decsys3, 'Systematic error (DEC_m - DEC_ref)']}) else: ntt.util.updateheader(nameout, 0, {'PSF_FWHM': [9999., 'FHWM (arcsec) - computed with sectractor'], 'ELLIPTIC': [9999., 'ellipticity of point sources (1-b/a)'], 'CRDER1': [9999., 'Random error in axis 1'], 'CRDER2': [9999., 'Random error in axis 2'], 'CUNIT1': ['deg', 'unit of the coord. trans.'], 'CUNIT2': ['deg', 'unit of the coord. trans.'], 'CSYER1': [9999., 'Systematic error (RA_m - Ra_ref)'], 'CSYER2': [9999., 'Systematic error (DEC_m - DEC_ref)']}) try: result = ntt.efoscastrodef.zeropoint( nameout, _system, method, False, False) except: result = '' if result: if os.path.isfile(re.sub('.fits', '.ph', nameout)): if re.sub('.fits', '.ph', nameout) not in outputfile: outputfile.append( re.sub('.fits', '.ph', nameout)) print '\n### zeropoint ..... done' for ll in result: valore = '%3.3s %6.6s %6.6s' % ( str(ll), str(result[ll][1]), str(result[ll][0])) print '### ', valore ntt.util.updateheader( nameout, 0, {'zp' + ll: [str(valore), '']}) if magsat3: if readkey3(readhdr(nameout), 'FLUXCAL') == 'ABSOLUTE': try: ntt.util.updateheader(nameout, 0, { 'ABMAGSAT': [float(magsat3) + float(readkey3(readhdr(nameout)), 'PHOTZP'), 'Saturation limit for point sources (AB mags)']}) except: ntt.util.updateheader(nameout, 0, { 'ABMAGSAT': [float(magsat3), 'Saturation limit for point sources (AB mags)']}) else: ntt.util.updateheader(nameout, 0, { 'ABMAGSAT': [float(magsat3), 'Saturation limit for point sources (AB mags)']}) else: ntt.util.updateheader(nameout, 0, {'ABMAGSAT': [ 9999., 'Saturation limit for point sources (AB mags)']}) maglim = ntt.util.limmag(nameout) if maglim: ntt.util.updateheader(nameout, 0, {'ABMAGLIM': [maglim, '5-sigma limiting AB magnitude for point sources']}) else: ntt.util.updateheader(nameout, 0, {'ABMAGLIM': [9999., '5-sigma limiting AB magnitude for point sources']}) if readkey3(readhdr(nameout), 'filter') in ['i705']: try: nameout, maskname = ntt.efoscphotredudef.fringing2( nameout, fringingmask, _interactive, False) if nameout not in outputfile: outputfile.append(nameout) if maskname not in outputfile: outputfile.append(maskname) except: ntt.util.writeinthelog( 'image ' + str(nameout) + ' probably corrupted\n', './logNTT.txt') print '\n### problem with fringing correction'
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 makefringingmask(listimg, _output, _interactive, _combine='average', _rejection='avsigclip'): # print "LOGX:: Entering `makefringingmask` method/function in # %(__file__)s" % globals() import ntt from ntt.util import readhdr, readkey3, delete, updateheader import glob import os import sys import re import string from pyraf import iraf iraf.noao(_doprint=0) iraf.immatch(_doprint=0) iraf.imutil(_doprint=0) iraf.nproto(_doprint=0) iraf.proto(_doprint=0) toforget = ['nproto.objmasks', 'proto.fixpix'] for t in toforget: iraf.unlearn(t) if _interactive == True: listimg2 = [] for img in listimg: _exptime = readkey3(readhdr(img), 'exptime') if float(_exptime) >= 10: answ = 'xxx' while answ.lower() not in ['y', 'n', 's', 'a']: iraf.display(img, frame=1, fill='yes') answ = raw_input( 'use this image (yes,no,stop (not more images),all) [[y]/n/s/a] ? ') if not answ: answ = 'y' if answ.lower() == 'y': listimg2.append(img) elif answ.lower() == 'a': listimg2 = listimg[:] if answ.lower() in ['a', 's']: break listimg = listimg2[:] iraf.nproto.objmasks1.fitxord = 1 iraf.nproto.objmasks1.fityord = 1 hdr0 = readhdr(listimg[0]) _date = readkey3(hdr0, 'date-obs') _filter = readkey3(hdr0, 'filter') _exptime = readkey3(hdr0, 'exptime') _instrume = readkey3(hdr0, 'instrume') _ron = readkey3(hdr0, 'ron') _gain = readkey3(hdr0, 'gain') badpixelmask = 'bad_pixel_mask.pl' if not os.path.isfile(badpixelmask): os.system('cp ' + ntt.__path__[0] + '/archive/' + _instrume + '/badpixels/badpixel_20100210.pl ' + badpixelmask) ff = open('_listmask', 'w') hh = open('_listobgz', 'w') for img in listimg: _exptime = readkey3(readhdr(img), 'exptime') hh.write('z_' + img + '\n') ff.write('mask_' + img + '\n') delete('mask_' + img) aaa = iraf.hedit(img, delete='yes', field='OBJMASK', up='yes', verify='no', Stdout=1) aaa = iraf.hedit(img, delete='yes', field='BPM', up='yes', verify='no', Stdout=1) delete('z_' + img) iraf.imutil.imexpr(expr='(a - median(a))/' + str(_exptime), a=img, output='z_' + img, verbose='no') ntt.util.updateheader('z_' + img, 0, {'EXPTIME': [1, '']}) ff.close() hh.close() if not _output: _output = 'fringing_' + str(_date) + '_' + str(_filter) + '.fits' delete(_output) print ' making mask for each frame .......' ccc = iraf.nproto.objmasks(images='@_listobgz', objmasks='@_listmask', omtype='boolean', blksize=-16, convolv='block 3 3', hsigma=5, lsigma=3, minpix=10, ngrow=2, agrow=4., Stdout=1) print 'combining all frames, masking the objects .....' iraf.imcombine('@_listobgz', output=_output, masktyp='!OBJMASK', maskval=0, combine=_combine, reject=_rejection, scale='none', statsec='[100:800,100:800]', rdnoise='', gain='', nlow=1, nhigh=1, logfile='imcombinelog') ntt.util.phase3header(_output) ntt.util.updateheader( _output, 0, {'BUNIT': ['ADU', 'pixel units(ADU,electrons)']}) ntt.util.updateheader(_output, 0, {'FILETYPE': [11231, 'fringing frame']}) return _output
MedianR=np.median(RatioHL) StdR=np.std(RatioHL) MadR=np.median(np.abs(RatioHL-MedianR)) print("Median Ratio = %f , Std = %f Mad =%f "%(MedianR,StdR,MadR)) #(XLbp,YLbp)=np.where(RatioHL < MedianR-LsigCut*StdR) #(XHbp,YHbp)=np.where(RatioHL > MedianR+HsigCut*StdR) (XLbp,YLbp)=np.where(RatioHL < MedianR-LsigCut*MadR*1.4826) (XHbp,YHbp)=np.where(RatioHL > MedianR+HsigCut*MadR*1.4826) OutFILE=open(Outfname,'w') for X,Y in zip(XLbp,YLbp): OutFILE.write(str(Y+1)+' '+str(X+1)+'\n') for X,Y in zip(XHbp,YHbp): OutFILE.write(str(Y+1)+' '+str(X+1)+'\n') OutFILE.close() print("Text file of list of Bad pixels created in "+Outfname) if Createpl : iraf.proto(_doprint=0) iraf.text2mask.unlearn() iraf.text2mask(text=Outfname,mask=Outfile,ncols=1024,nlines=1024) print("Binary .pl file of Bad pixels created in "+Outfile) print("To view mask in IRAF : display "+ImgH+" 1 overlay="+Outfile)
def makefringingmask(listimg, _output, _interactive, _combine='average', _rejection='avsigclip'): # print "LOGX:: Entering `makefringingmask` method/function in # %(__file__)s" % globals() import ntt from ntt.util import readhdr, readkey3, delete, updateheader import glob import os import sys import re import string from pyraf import iraf iraf.noao(_doprint=0) iraf.immatch(_doprint=0) iraf.imutil(_doprint=0) iraf.nproto(_doprint=0) iraf.proto(_doprint=0) toforget = ['nproto.objmasks', 'proto.fixpix'] for t in toforget: iraf.unlearn(t) if _interactive == True: listimg2 = [] for img in listimg: _exptime = readkey3(readhdr(img), 'exptime') if float(_exptime) >= 10: answ = 'xxx' while answ.lower() not in ['y', 'n', 's', 'a']: iraf.display(img, frame=1, fill='yes') answ = raw_input( 'use this image (yes,no,stop (not more images),all) [[y]/n/s/a] ? ' ) if not answ: answ = 'y' if answ.lower() == 'y': listimg2.append(img) elif answ.lower() == 'a': listimg2 = listimg[:] if answ.lower() in ['a', 's']: break listimg = listimg2[:] iraf.nproto.objmasks1.fitxord = 1 iraf.nproto.objmasks1.fityord = 1 hdr0 = readhdr(listimg[0]) _date = readkey3(hdr0, 'date-obs') _filter = readkey3(hdr0, 'filter') _exptime = readkey3(hdr0, 'exptime') _instrume = readkey3(hdr0, 'instrume') _ron = readkey3(hdr0, 'ron') _gain = readkey3(hdr0, 'gain') badpixelmask = 'bad_pixel_mask.pl' if not os.path.isfile(badpixelmask): os.system('cp ' + ntt.__path__[0] + '/archive/' + _instrume + '/badpixels/badpixel_20100210.pl ' + badpixelmask) ff = open('_listmask', 'w') hh = open('_listobgz', 'w') for img in listimg: _exptime = readkey3(readhdr(img), 'exptime') hh.write('z_' + img + '\n') ff.write('mask_' + img + '\n') delete('mask_' + img) aaa = iraf.hedit(img, delete='yes', field='OBJMASK', up='yes', verify='no', Stdout=1) aaa = iraf.hedit(img, delete='yes', field='BPM', up='yes', verify='no', Stdout=1) delete('z_' + img) iraf.imutil.imexpr(expr='(a - median(a))/' + str(_exptime), a=img, output='z_' + img, verbose='no') ntt.util.updateheader('z_' + img, 0, {'EXPTIME': [1, '']}) ff.close() hh.close() if not _output: _output = 'fringing_' + str(_date) + '_' + str(_filter) + '.fits' delete(_output) print ' making mask for each frame .......' ccc = iraf.nproto.objmasks(images='@_listobgz', objmasks='@_listmask', omtype='boolean', blksize=-16, convolv='block 3 3', hsigma=5, lsigma=3, minpix=10, ngrow=2, agrow=4., Stdout=1) print 'combining all frames, masking the objects .....' iraf.imcombine('@_listobgz', output=_output, masktyp='!OBJMASK', maskval=0, combine=_combine, reject=_rejection, scale='none', statsec='[100:800,100:800]', rdnoise='', gain='', nlow=1, nhigh=1, logfile='imcombinelog') ntt.util.phase3header(_output) ntt.util.updateheader(_output, 0, {'BUNIT': ['ADU', 'pixel units(ADU,electrons)']}) ntt.util.updateheader(_output, 0, {'FILETYPE': [11231, 'fringing frame']}) return _output
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 marksn2(img, fitstab, frame=1, fitstab2='', verbose=False): from pyraf import iraf from numpy import array #,log10 import lsc iraf.noao(_doprint=0) iraf.digiphot(_doprint=0) iraf.daophot(_doprint=0) iraf.images(_doprint=0) iraf.imcoords(_doprint=0) iraf.proto(_doprint=0) iraf.set(stdimage='imt1024') hdr = lsc.util.readhdr(fitstab) _filter = lsc.util.readkey3(hdr, 'filter') column = lsc.lscabsphotdef.makecatalogue([fitstab])[_filter][fitstab] rasex = array(column['ra0'], float) decsex = array(column['dec0'], float) if fitstab2: hdr = lsc.util.readhdr(fitstab2) _filter = lsc.util.readkey3(hdr, 'filter') _exptime = lsc.util.readkey3(hdr, 'exptime') column = lsc.lscabsphotdef.makecatalogue([fitstab2])[_filter][fitstab2] rasex2 = array(column['ra0'], float) decsex2 = array(column['dec0'], float) iraf.set(stdimage='imt1024') iraf.display(img + '[0]', frame, fill=True, Stdout=1) vector = [] for i in range(0, len(rasex)): vector.append(str(rasex[i]) + ' ' + str(decsex[i])) xy = iraf.wcsctran('STDIN',output="STDOUT",Stdin=vector,Stdout=1,image=img+'[0]',inwcs='world',units='degrees degrees',outwcs='logical',\ formats='%10.1f %10.1f',verbose='yes')[3:] iraf.tvmark(frame, 'STDIN', Stdin=list(xy), mark="circle", number='yes', label='no', radii=10, nxoffse=5, nyoffse=5, color=207, txsize=2) if verbose: # print 2.5*log10(_exptime) for i in range(0, len(column['ra0'])): print xy[i], column['ra0'][i], column['dec0'][i], column['magp3'][ i], column['magp4'][i], column['smagf'][i], column['magp2'][i] if fitstab2: vector2 = [] for i in range(0, len(rasex2)): vector2.append(str(rasex2[i]) + ' ' + str(decsex2[i])) xy1 = iraf.wcsctran('STDIN',output="STDOUT",Stdin=vector2,Stdout=1,image=img+'[0]',inwcs='world',units='degrees degrees',outwcs='logical',\ formats='%10.1f %10.1f',verbose='yes')[3:] iraf.tvmark(frame, 'STDIN', Stdin=list(xy1), mark="cross", number='yes', label='no', radii=10, nxoffse=5, nyoffse=5, color=205, txsize=2)
import numpy import time from types import * # Local packages import add_wcs import iqpkg from iqutils import * # Necessary IRAF packages iraf.imred() iraf.ccdred() iraf.images() iraf.imutil() iraf.imfit() iraf.proto() # Shortcuts yes=iraf.yes no=iraf.no INDEF=iraf.INDEF hedit=iraf.hedit imgets=iraf.imgets # Pyraf parameters: Where to find them pyrafdir="python/pyraf/" pyrafdir_key='PYRAFPARS' if os.environ.has_key(pyrafdir_key): pardir=os.environ[pyrafdir_key] else:
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 absphot(img,_field,_catalogue,_fix,_color,rejection,_interactive,_type='fit',redo=False,show=False,cutmag=-1,database='dataredulco',_calib='sloan'): from astropy.io import fits import lsc import math import sys,re,string,os from lsc.util import readkey3, readhdr from numpy import array, compress, zeros, median, std, asarray, isfinite,mean from pyraf import iraf if show: from pylab import ion,plot,draw,clf import time iraf.noao(_doprint=0) iraf.digiphot(_doprint=0) iraf.daophot(_doprint=0) iraf.images(_doprint=0) iraf.imcoords(_doprint=0) iraf.proto(_doprint=0) t = fits.open(img) tbdata = t[1].data hdr2=t[1].header hdr=lsc.util.readhdr(img) _cat=readkey3(hdr,'catalog') _telescope=lsc.util.readkey3(hdr,'telescop') _instrume=lsc.util.readkey3(hdr,'instrume') _filter=lsc.util.readkey3(hdr,'filter') _airmass=lsc.util.readkey3(hdr,'airmass') _exptime=lsc.util.readkey3(hdr,'exptime') _date=lsc.util.readkey3(hdr,'date-obs') _object=lsc.util.readkey3(hdr,'object') _ra=lsc.util.readkey3(hdr,'RA') _dec=lsc.util.readkey3(hdr,'DEC') print _filter if _telescope in ['lsc','1m0-04','1m0-05','1m0-09']: kk=lsc.sites.extintion('ctio') elif _telescope in ['elp','1m0-08']: kk=lsc.sites.extintion('mcdonald') elif _telescope in ['cpt','1m0-12','1m0-10','1m0-13']: kk=lsc.sites.extintion('southafrica') elif _telescope in ['ftn','Faulkes Telescope North']: kk=lsc.sites.extintion('mauna') elif _telescope in ['1m0-03','1m0-11','coj','fts','Faulkes Telescope South']: kk=lsc.sites.extintion('siding') if _calib not in ['sloan','sloanprime','natural','apass','']: colorefisso=lsc.sites.colfix(_instrume) else: colorefisso=lsc.sites.colfix(_instrume,_calib) print redo print _cat if _cat and not redo: print 'already calibrated' else: try: lsc.mysqldef.updatevalue(database,'zcat','X',string.split(re.sub('.sn2.fits','.fits',img),'/')[-1]) if os.path.isfile(string.split(re.sub('.diff.sn2.fits','.fits',img),'/')[-1]): lsc.mysqldef.updatevalue(database,'zcat','X',string.split(re.sub('.diff.sn2.fits','.fits',img),'/')[-1]) except: print 'module mysqldef not found' column=makecatalogue([img])[_filter][img] rasex=array(column['ra0'],float) decsex=array(column['dec0'],float) if _type=='fit': magsex=array(column['smagf'],float) magerrsex=array(column['smagerrf'],float) elif _type=='ph': magsex=array(column['magp3'],float) magerrsex=array(column['merrp3'],float) else: sys.exit(_type+' not valid (ph or fit)') print len(rasex) if not cutmag: cutmag=99 #else: cutmag= cutmag-2.5*math.log10(float(_exptime)) if len(compress( array(magsex) < float(cutmag) , magsex)) < 5 : cutmag=99 # not cut if only few object rasex = compress(array(magsex,float)<=cutmag,rasex) decsex = compress(array(magsex,float)<=cutmag,decsex) magerrsex = compress(array(magsex,float)<=cutmag,magerrsex) magsex = compress(array(magsex,float)<=cutmag,array(magsex)) print len(rasex) if _interactive: iraf.set(stdimage='imt1024') iraf.display(re.sub('.sn2','',img),1,fill=True,Stdout=1) vector=[] for i in range(0,len(rasex)): vector.append(str(rasex[i])+' '+str(decsex[i])) xy = iraf.wcsctran('STDIN',output="STDOUT",Stdin=vector,Stdout=1,image=img,inwcs='world',units='degrees degrees',outwcs='logical',\ formats='%10.1f %10.1f',verbose='yes')[3:] iraf.tvmark(1,'STDIN',Stdin=list(xy),mark="circle",number='yes',label='no',radii=10,nxoffse=5,nyoffse=5,color=207,txsize=2) # raw_input('here') if _catalogue: ######## use external catalogue if _catalogue[0]=='/': stdcooC=lsc.lscastrodef.readtxt(_catalogue) else: stdcooC=lsc.lscastrodef.readtxt(lsc.__path__[0]+'/standard/cat/'+_catalogue) rastdC,decstdL=array(stdcooC['ra'],float),array(stdcooC['dec'],float) lsc.util.delete('tmp.stdL.pix') colonne=str(stdcooC['rapos'])+' '+str(stdcooC['decpos']) if _catalogue[0]=='/': iraf.wcsctran(_catalogue,'tmp.stdL.pix',img,inwcs='world',units='degrees degrees',outwcs='logical',\ columns=colonne,formats='%10.1f %10.1f',verbose='no') else: iraf.wcsctran(lsc.__path__[0]+'/standard/cat/'+_catalogue,'tmp.stdL.pix',img,inwcs='world',units='degrees degrees',outwcs='logical',\ columns=colonne,formats='%10.1f %10.1f',verbose='no') standardpixC=lsc.lscastrodef.readtxt('tmp.stdL.pix') if _interactive: iraf.tvmark(1,'tmp.stdL.pix',mark="circle",number='yes',label='no',radii=8,nxoffse=5,nyoffse=5,color=204,txsize=2) xstdC=standardpixC['ra'] ystdC=standardpixC['dec'] idstdC=standardpixC['id'] xstdC=compress((array(xstdC,float)<readkey3(hdr,'XDIM'))&(array(xstdC,float)>0)&(array(ystdC,float)>0)&(array(ystdC,float)<readkey3(hdr,'YDIM')),xstdC) xstdL=xstdLL=xstdS=xstdC standardpixL=standardpixLL=standardpixS=standardpixC stdcooL=stdcooLL=stdcooS=stdcooC else: ######## check if it is landolt field stdcooL=lsc.lscastrodef.readtxt(lsc.__path__[0]+'/standard/cat/landolt.cat') rastdL,decstdL=array(stdcooL['ra'],float),array(stdcooL['dec'],float) lsc.util.delete('tmp.stdL.pix') iraf.wcsctran(lsc.__path__[0]+'/standard/cat/landolt.cat','tmp.stdL.pix',img,inwcs='world',units='degrees degrees',outwcs='logical',\ columns='1 2',formats='%10.1f %10.1f',verbose='no') standardpixL=lsc.lscastrodef.readtxt('tmp.stdL.pix') if _interactive: iraf.tvmark(1,'tmp.stdL.pix',mark="circle",number='yes',label='no',radii=8,nxoffse=5,nyoffse=5,color=204,txsize=2) print 'yelow circles sextractor' xstdL=standardpixL['ra'] ystdL=standardpixL['dec'] idstdL=standardpixL['id'] xstdL=compress((array(xstdL,float)<readkey3(hdr,'XDIM'))&(array(xstdL,float)>0)&(array(ystdL,float)>0)&(array(ystdL,float)<readkey3(hdr,'YDIM')),xstdL) ######## check if it is Stetson field stdcooLL=lsc.lscastrodef.readtxt(lsc.__path__[0]+'/standard/cat/StetsonCat.dat') ww=asarray([i for i in range(len(stdcooLL['ra'])) if ( abs(float(stdcooLL['ra'][i])-float(_ra))<.2 and abs(float(stdcooLL['dec'][i])-_dec)<.2 )]) if len(ww)>0: for hh in stdcooLL.keys(): if type(stdcooLL[hh])!=int: if hh not in ['id','ra','dec']: stdcooLL[hh]=array(array(stdcooLL[hh])[ww],float) else: stdcooLL[hh]=array(stdcooLL[hh])[ww] lll=[] for i in range(0,len(stdcooLL['ra'])): lll.append(stdcooLL['ra'][i]+' '+stdcooLL['dec'][i]) rastdLL,decstdLL=array(stdcooLL['ra'],float),array(stdcooLL['dec'],float) lsc.util.delete('tmp.stdLL.pix') iraf.wcsctran('STDIN','tmp.stdLL.pix',img,inwcs='world',Stdin=lll,units='degrees degrees',outwcs='logical',\ columns='1 2',formats='%10.1f %10.1f',verbose='no') if _interactive: iraf.tvmark(1,'tmp.stdLL.pix',mark="cross",number='yes',label='no',radii=8,nxoffse=5,nyoffse=5,color=204,txsize=2) print 'red crosses Stetson' standardpixLL={} for ii in stdcooLL.keys(): standardpixLL[ii]=stdcooLL[ii] standardpixLL['ra']=array(iraf.proto.fields('tmp.stdLL.pix',fields='1',Stdout=1),float) #standardpixLL['ra'] standardpixLL['dec']=array(iraf.proto.fields('tmp.stdLL.pix',fields='2',Stdout=1),float) #standardpixLL['dec'] xstdLL=array(iraf.proto.fields('tmp.stdLL.pix',fields='1',Stdout=1),float) #standardpixLL['ra'] ystdLL=array(iraf.proto.fields('tmp.stdLL.pix',fields='2',Stdout=1),float) #standardpixLL['dec'] idstdLL=standardpixLL['id'] xstdLL=compress((array(xstdLL,float)<readkey3(hdr,'XDIM'))&(array(xstdLL,float)>0)&(array(ystdLL,float)>0)&(array(ystdLL,float)<readkey3(hdr,'YDIM')),xstdLL) ######## check if it is sloan field magsel0,magsel1=12,18 _ids=lsc.lscastrodef.sloan2file(_ra,_dec,20,float(magsel0),float(magsel1),'_tmpsloan.cat') ascifile='_tmpsloan.cat' stdcooS=lsc.lscastrodef.readtxt(ascifile) rastdS,decstdS=array(stdcooS['ra'],float),array(stdcooS['dec'],float) lsc.util.delete('tmp.stdS.pix') iraf.wcsctran(ascifile,'tmp.stdS.pix',img,inwcs='world',units='degrees degrees',outwcs='logical',columns='1 2',formats='%10.1f %10.1f',verbose='no') standardpixS=lsc.lscastrodef.readtxt('tmp.stdS.pix') if _interactive: iraf.tvmark(1,'tmp.stdS.pix',mark="cross",number='yes',label='no',radii=8,nxoffse=5,nyoffse=5,color=205,txsize=2) print 'green cross sloan' xstdS=standardpixS['ra'] ystdS=standardpixS['dec'] idstdS=standardpixS['id'] xstdS=compress((array(xstdS,float)<readkey3(hdr,'XDIM'))&(array(xstdS,float)>0)&(array(ystdS,float)>0)&(array(ystdS,float)<readkey3(hdr,'YDIM')),xstdS) ##############################################3 if not _catalogue and len(xstdLL)>0: xstdL=xstdLL standardpixL=standardpixLL stdcooL=stdcooLL if _filter in ['U', 'B', 'V', 'R','I','Bessell-B','Bessell-V','Bessell-R','Bessell-I']: filters={'U':'U', 'B':'B', 'V':'V', 'R':'R', 'I':'I','Bessell-B':'B','Bessell-V':'V','Bessell-R':'R','Bessell-I':'I'} if _color: colors=lsc.myloopdef.chosecolor(_color,False) if not colors: colors={'U':['UB'],'B':['UB','BV'],'V':['BV','VR'],'R':['VR','RI'],'I':['RI']} else: colors={'U':['UB'],'B':['UB','BV'],'V':['BV','VR'],'R':['VR','RI'],'I':['RI']} if _field=='sloan': standardpix,stdcoo={'ra':[9999],'dec':[9999],'id':[1]},{'ra':[9999],'dec':[9999]} print 'filters and field selected do not match' else: _field='landolt' if len(xstdL)>=1: standardpix=standardpixL stdcoo=stdcooL if not _catalogue: if len(xstdLL)>0: _catalogue='StetsonCat.dat' else: _catalogue='landolt.dat' elif len(xstdS)>=1: if not _catalogue: _catalogue='sdss8' standardpix=standardpixS stdcoo=stdcooS stdcoo=lsc.lscastrodef.transformsloanlandolt(stdcoo) if not _catalogue: _catalogue='sdss8' print '\n### transform sloan in landolt' else: print 'landolt, but catalogue not found' standardpix,stdcoo={'ra':[9999],'dec':[9999],'id':[1]},{'ra':[9999],'dec':[9999]} elif _filter in ['up','gp','rp','ip','zs','SDSS-G','SDSS-R','SDSS-I','Pan-Starrs-Z']: filters={'up':'u','ip':'i','gp':'g','rp':'r','zs':'z','SDSS-G':'g','SDSS-R':'r','SDSS-I':'i','Pan-Starrs-Z':'z'} if _color: colors=lsc.myloopdef.chosecolor(_color,False) if not colors: colors={'i':['ri','iz'],'r':['gr','ri'],'g':['ug','gr'],'z':['iz'],'u':['ug']} else: colors={'i':['ri','iz'],'r':['gr','ri'],'g':['ug','gr'],'z':['iz'],'u':['ug']} if _field=='landolt': standardpix,stdcoo={'ra':[9999],'dec':[9999],'id':[1]},{'ra':[9999],'dec':[9999]} print 'filters and field selected do not match' else: _field='sloan' if len(xstdS)>=1: if not _catalogue: _catalogue='sdss8' standardpix=standardpixS stdcoo=stdcooS elif len(xstdL)>=1: standardpix=standardpixL stdcoo=stdcooL stdcoo=lsc.lscastrodef.transformlandoltsloan(stdcoo) if not _catalogue: _catalogue='landolt.dat' print '\n### transform landolt to sloan' else: print 'sloan, but not in the sdss footprint' standardpix,stdcoo={'ra':[9999],'dec':[9999],'id':[1]},{'ra':[9999],'dec':[9999]} xstd=standardpix['ra'] ystd=standardpix['dec'] idstd=standardpix['id'] rastd,decstd=array(stdcoo['ra'],float),array(stdcoo['dec'],float) xstd0=compress((array(xstd,float)<readkey3(hdr,'XDIM'))&(array(xstd,float)>0)&(array(ystd,float)>0)&(array(ystd,float)<readkey3(hdr,'YDIM')),xstd) if len(xstd0)>1: ######## go only if standard stars are in the field ########## magstd0={} airmass0={} result={} fileph={} print '\n### standard field: '+str(_field) ystd0=compress((array(xstd,float)<readkey3(hdr,'XDIM'))&(array(xstd,float)>0)&(array(ystd,float)>0)\ &(array(ystd,float)<readkey3(hdr,'YDIM')),ystd) rastd0=compress((array(xstd,float)<readkey3(hdr,'XDIM'))&(array(xstd,float)>0)&(array(ystd,float)>0)\ &(array(ystd,float)<readkey3(hdr,'YDIM')),rastd) decstd0=compress((array(xstd,float)<readkey3(hdr,'XDIM'))&(array(xstd,float)>0)&(array(ystd,float)>0)\ &(array(ystd,float)<readkey3(hdr,'YDIM')),decstd) idstd0=compress((array(xstd,float)<readkey3(hdr,'XDIM'))&(array(xstd,float)>0)&(array(ystd,float)>0)\ &(array(ystd,float)<readkey3(hdr,'YDIM')),idstd) stdcoo0={} for key in stdcoo.keys(): if key in 'ugrizUBVRI': stdcoo0[key]=compress((array(xstd,float)<readkey3(hdr,'XDIM'))&(array(xstd,float)>0)&(array(ystd,float)>0)\ &(array(ystd,float)<readkey3(hdr,'YDIM')),stdcoo[key]) ############################################################### # pos0 = standard pos1 = sextractor distvec,pos0,pos1=lsc.lscastrodef.crossmatch(array(rastd0),array(decstd0),array(rasex),array(decsex),10) for key in stdcoo0.keys(): stdcoo0[key]=stdcoo0[key][pos0] rastd0=rastd0[pos0] decstd0=decstd0[pos0] idstd0=idstd0[pos0] rasex=rasex[pos1] decsex=decsex[pos1] # after change in may 2013 mag in sn2.fits file are already at 1s magsex=magsex[pos1]-kk[filters[_filter]]*float(_airmass) # - K x airmass # magsex=magsex[pos1]+2.5*math.log10(float(_exptime))-kk[filters[_filter]]*float(_airmass) # mag exptime - K x airmass ################################################################################# if _field=='landolt': print '\n### landolt system' for _filtlandolt in 'UBVRI': if _filtlandolt==filters[_filter]: airmass0[_filtlandolt]= 0 #_airmass else: airmass0[_filtlandolt]= 0 magstd0[_filtlandolt]=stdcoo0[_filtlandolt] fileph['mU']=zeros(len(rastd0))+999 fileph['mB']=zeros(len(rastd0))+999 fileph['mV']=zeros(len(rastd0))+999 fileph['mR']=zeros(len(rastd0))+999 fileph['mI']=zeros(len(rastd0))+999 fileph['V']=magstd0['V'] fileph['BV']=array(array(magstd0['B'],float)-array(magstd0['V'],float),str) fileph['UB']=array(array(magstd0['U'],float)-array(magstd0['B'],float),str) fileph['VR']=array(array(magstd0['V'],float)-array(magstd0['R'],float),str) fileph['RI']=array(array(magstd0['R'],float)-array(magstd0['I'],float),str) elif _field=='sloan': for _filtsloan in 'ugriz': if _filtsloan==filters[_filter]: airmass0[_filtsloan]= 0 # _airmass else: airmass0[_filtsloan]=0 magstd0[_filtsloan]=stdcoo0[_filtsloan] fileph['mu']=zeros(len(rastd0))+999 fileph['mg']=zeros(len(rastd0))+999 fileph['mr']=zeros(len(rastd0))+999 fileph['mi']=zeros(len(rastd0))+999 fileph['mz']=zeros(len(rastd0))+999 fileph['r']=magstd0['r'] fileph['gr']=array(array(magstd0['g'],float)-array(magstd0['r'],float),str) fileph['ri']=array(array(magstd0['r'],float)-array(magstd0['i'],float),str) fileph['ug']=array(array(magstd0['u'],float)-array(magstd0['g'],float),str) fileph['iz']=array(array(magstd0['i'],float)-array(magstd0['z'],float),str) ######################################################################################## zero=[] magcor=[] fil = open(re.sub('.fits','.ph',img),'w') fil.write(str(_instrume)+' '+str(_date)+'\n') fil.write('*** '+_object+' '+str(len(magsex))+'\n') if _field=='landolt': fil.write('%6.6s\t%6.6s\t%6.6s\t%6.6s\t%6.6s\n' % (str(1),str(1),str(1),str(1),str(1))) # exptime fil.write('%6.6s\t%6.6s\t%6.6s\t%6.6s\t%6.6s\n' % (str(airmass0['U']),str(airmass0['B']),str(airmass0['V']),str(airmass0['R']),str(airmass0['I']))) elif _field=='sloan': fil.write('%6.6s\t%6.6s\t%6.6s\t%6.6s\t%6.6s\n' % (str(1),str(1),str(1),str(1),str(1))) # exptime fil.write('%6.6s\t%6.6s\t%6.6s\t%6.6s\t%6.6s\n' % (str(airmass0['u']),str(airmass0['g']),str(airmass0['r']),str(airmass0['i']),str(airmass0['z']))) for i in range(0,len(magsex)): fileph['m'+filters[_filter]][i]=magsex[i] # instrumental mangitude of std in pos0[i] if _field=='landolt': stringastandard='%12.12s\t%7.7s\t%7.7s\t%7.7s\t%7.7s\t%7.7s' % (idstd0[i],fileph['V'][i],fileph['BV'][i],fileph['UB'][i],\ fileph['VR'][i],fileph['RI'][i]) fil.write('%7.7s\t%7.7s\t%7.7s\t%7.7s\t%7.7s\t%60.60s\n' \ % (str(fileph['mU'][i]),str(fileph['mB'][i]),str(fileph['mV'][i]),str(fileph['mR'][i]),str(fileph['mI'][i]),str(stringastandard))) elif _field=='sloan': stringastandard='%12.12s\t%7.7s\t%7.7s\t%7.7s\t%7.7s\t%7.7s' % (idstd0[i],fileph['r'][i],fileph['gr'][i],fileph['ug'][i],\ fileph['ri'][i],fileph['iz'][i]) fil.write('%7.7s\t%7.7s\t%7.7s\t%7.7s\t%7.7s\t%60.60s\n' \ % (str(fileph['mu'][i]),str(fileph['mg'][i]),str(fileph['mr'][i]),str(fileph['mi'][i]),str(fileph['mz'][i]),str(stringastandard))) zero.append(float(float(magstd0[filters[_filter]][i]))-float(magsex[i])) magcor.append(magsex[i]) fil.close() if show: import time from pylab import ion,plot,draw ion() aa=mean(compress(abs(array(zero))<99,zero)) xxx=compress((abs(array(magcor))<99)&(abs(array(zero))<99),magcor) yyy=compress((abs(array(zero))<99)&(abs(array(magcor))<99),zero) plot(xxx,yyy,'or') plot([min(compress(abs(array(magcor))<99,magcor)),max(compress(abs(array(magcor))<99,magcor))],[aa,aa],'-b') draw() print std(compress(abs(array(zero))<99,zero)) time.sleep(5) colorvec=colors[filters[_filter]] for col in colorvec: col0=magstd0[col[0]] col1=magstd0[col[1]] colstd0=array(col0,float)-array(col1,float) ################## sex ###################### colore=[] for i in range(0,len(pos1)): colore.append(colstd0[i]) colore1=compress(abs(array(zero))<50,array(colore)) zero1=compress(abs(array(zero))<50,array(zero)) zero2=compress(abs(array(colore1))<2,array(zero1)) colore2=compress(abs(array(colore1))<2,array(colore1)) if _fix: fisso=colorefisso[filters[_filter]+col] else: fisso='' if len(colore2)==0: print 'no calibration, '+_filter+' '+_field b,a,sa,sb=9999,9999,0,0 else: if _interactive: a,sa,b,sb=fitcol(colore2,zero2,_filter,col,fisso) else: a,sa,b,sb=fitcol2(colore2,zero2,_filter,col,fisso,show,rejection) print a,sa,b,sb result[filters[_filter]+col]=[a,sa,b,sb] if result: print '\n### zeropoint ..... done at airmass 0' if _catalogue: lsc.util.updateheader(img,0,{'CATALOG':[str(string.split(_catalogue,'/')[-1]),'catalogue source']}) stringa='' for ll in result: for kk in range(0,len(result[ll])): if not isfinite(result[ll][kk]): result[ll][kk]=0.0 valore='%3.3s %6.6s %6.6s %6.6s %6.6s' % (str(ll),str(result[ll][0]),str(result[ll][2]),str(result[ll][1]),str(result[ll][3])) print '### ',valore lsc.util.updateheader(img,0,{'zp'+ll:[str(valore),'a b sa sb in y=a+bx']}) if ll[0]==ll[2]: num=2 elif ll[0]==ll[1]: num=1 else: sys.exit('somthing wrong with color '+ll) print ll,num try: print 'zcol'+str(num),ll[1:],string.split(re.sub('.sn2.fits','.fits',img),'/')[-1] lsc.mysqldef.updatevalue(database,'zcol'+str(num),ll[1:],string.split(re.sub('.sn2.fits','.fits',img),'/')[-1]) lsc.mysqldef.updatevalue(database,'z'+str(num),result[ll][0],string.split(re.sub('.sn2.fits','.fits',img),'/')[-1]) lsc.mysqldef.updatevalue(database,'c'+str(num),result[ll][2],string.split(re.sub('.sn2.fits','.fits',img),'/')[-1]) lsc.mysqldef.updatevalue(database,'dz'+str(num),result[ll][1],string.split(re.sub('.sn2.fits','.fits',img),'/')[-1]) lsc.mysqldef.updatevalue(database,'dc'+str(num),result[ll][3],string.split(re.sub('.sn2.fits','.fits',img),'/')[-1]) if os.path.isfile(string.split(re.sub('.diff.sn2.fits','.fits',img),'/')[-1]): lsc.mysqldef.updatevalue(database,'zcol'+str(num),ll[1:],string.split(re.sub('.diff.sn2.fits','.fits',img),'/')[-1]) lsc.mysqldef.updatevalue(database,'z'+str(num),result[ll][0],string.split(re.sub('.diff.sn2.fits','.fits',img),'/')[-1]) lsc.mysqldef.updatevalue(database,'c'+str(num),result[ll][2],string.split(re.sub('.diff.sn2.fits','.fits',img),'/')[-1]) lsc.mysqldef.updatevalue(database,'dz'+str(num),result[ll][1],string.split(re.sub('.diff.sn2.fits','.fits',img),'/')[-1]) lsc.mysqldef.updatevalue(database,'dc'+str(num),result[ll][3],string.split(re.sub('.diff.sn2.fits','.fits',img),'/')[-1]) if result[ll][0]!=9999: print _catalogue lsc.mysqldef.updatevalue(database,'zcat',string.split(_catalogue,'/')[-1],string.split(re.sub('.sn2.fits','.fits',img),'/')[-1]) if os.path.isfile(string.split(re.sub('.diff.sn2.fits','.fits',img),'/')[-1]): lsc.mysqldef.updatevalue(database,'zcat',string.split(_catalogue,'/')[-1],string.split(re.sub('.diff.sn2.fits','.fits',img),'/')[-1]) else: lsc.mysqldef.updatevalue(database,'zcat','X',string.split(re.sub('.sn2.fits','.fits',img),'/')[-1]) if os.path.isfile(string.split(re.sub('.diff.sn2.fits','.fits',img),'/')[-1]): lsc.mysqldef.updatevalue(database,'zcat','X',string.split(re.sub('.diff.sn2.fits','.fits',img),'/')[-1]) except: print 'module mysqldef not found'
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