コード例 #1
0
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
コード例 #2
0
ファイル: skysub.py プロジェクト: minoways/pyircs_imgred
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
コード例 #3
0
ファイル: imshiftcomb.py プロジェクト: minoways/pyircs_imgred
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
コード例 #4
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
コード例 #5
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
コード例 #6
0
ファイル: mkcalflat.py プロジェクト: minoways/pyircs_imgred
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
コード例 #7
0
ファイル: mkskyflat.py プロジェクト: minoways/pyircs_imgred
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
コード例 #8
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