Exemple #1
0
def make_cube(filelist, outfilename, clobber=True, brgfile=None,
        stellarfile=True, h2file=True, brdfile=True, brefile=True,
        reference_image=None, reference_radec=None, reference_pix=None,
        pabfile=True, rot90=False, cd1=0.5, cd2=0.5,):
    """
    Create a data cube from a list of reduced TripleSpec spectra

    Parameters
    ----------
    filelist : list
        A list of the files to include.  Generate by, e.g.,
        filelist = glob.glob("*JHK_cal.fits")
    outfilename : string
        The output FITS file name
    clobber : bool
        Overwrite the output file if it exists?
    brgfile : string
        Create a Brackett Gamma integrated image if this is set to a FITS file
        name
    stellarfile : string
        Create a stellar continuum image from a relatively clean part of the
        spectrum if this is set to a FITS file name
    h2file : string
        Create an H2 2.12um integrated image if this is set to a FITS file name
    reference_image : string
        A FITS file to use as the pointing standard for cross-correlation based
        pointing correction.  Makes use of agpy's cross_correlation_shift tool
    reference_radec : (float,float)
        The RA/Dec (CRVAL1/CRVAL2) of the image reference position.  If not
        specified, will be extracted from one of the input spectra (likely
        incorrectly)
    reference_pix : (float,float)
        The X,Y pixel (CRPIX1/CRPIX2) reference in the image.  If not
        specified, will default to the center.
    rot90 : bool
        Should the spectra be rotated by 90 degrees before stacking?
    cd1 : float
    cd2 : float
        The CD1_1 and CD2_2 / CDELT1 & CDELT2 parameters for the FITS header
    """

    f0 = pyfits.open(filelist[0])

    cubeJHK = np.zeros([f0[0].header['NAXIS2']+20,f0[0].header['NAXIS1'],len(filelist)+20])
    print 'cubeshape (no adds): ',[f0[0].header['NAXIS2'],f0[0].header['NAXIS1'],len(filelist)]
    print 'cubeshape (with adds): ',[f0[0].header['NAXIS2']+20,f0[0].header['NAXIS1'],len(filelist)+20]


    fout = pyfits.open(filelist[0])
    print "cube shape: ",cubeJHK.shape
    fout[0].data = cubeJHK = cubeJHK.swapaxes(0,1)
    if rot90:
        fout[0].data = cubeJHK = fout[0].data.swapaxes(1,2)[:,::-1,:]
    fout[0].header.update('NAXIS3',cubeJHK.shape[0])
    fout[0].header.update('NAXIS',3)
    print "fout.data shape: ",fout[0].data.shape

    if reference_radec is not None:
        ra,dec = reference_radec
    else:
        fcen = pyfits.open(filelist[len(filelist)/2])
        ra = fcen[0].header.get('RA')
        dec = fcen[0].header.get('DEC')
        #ra,dec = coords.Position(ra+" "+dec).j2000()
        C = coordinates.ICRS(ra,dec,unit=('deg','deg'))
        ra,dec = C.ra.deg,C.dec.deg

    if reference_pix is not None:
        xpix,ypix = reference_pix
    else:
        xpix = fout[0].data.shape[2]/2.+1
        ypix = fout[0].data.shape[1]

    fout[0].header.update('CRVAL3', fout[0].header['CRVAL1'])
    fout[0].header.update('CRPIX3', fout[0].header['CRPIX1'])
    fout[0].header.update('CD3_3', fout[0].header['CDELT1'])
    fout[0].header.update('CRVAL1', ra)
    fout[0].header.update('CRVAL2', dec)
    fout[0].header.update('CRPIX1', xpix)
    fout[0].header.update('CRPIX2', ypix)
    fout[0].header.update('CD1_1', -cd1/3600.)
    fout[0].header.update('CD2_2',  cd2/3600.)
    fout[0].header.update('CTYPE1', 'RA---TAN')
    fout[0].header.update('CTYPE2', 'DEC--TAN')
    fout[0].header.update('CTYPE3', 'LINEAR')
    del fout[0].header['CDELT1']
    del fout[0].header['CDELT2']

    outhd = fout[0].header
    flathead = agpy.cubes.flatten_header(outhd)
    outwcs = pywcs.WCS(flathead)

    wtcube = cubeJHK*0

    for ii,fn in enumerate(filelist): 
        d = pyfits.getdata(fn)
        h = pyfits.getheader(fn)
        findername = h.get('FINDER')
        if findername is None or findername == '':
            raise IOError("No finder found!")
        slitcoords = get_slit_coordinates(findername,d.shape[0]) 
        pixcoords = outwcs.wcs_world2pix(np.array(zip(*slitcoords)),0)     
        print ii,fn,len(slitcoords),len(pixcoords),len(pixcoords[0])
        for x,y,di in zip(pixcoords[:,0],pixcoords[:,1],d):                  
            xrd = round(x)
            yrd = round(y)
            xrem = x-xrd
            yrem = y-yrd
            weights = ((0.5+(abs(xrem)-0.5)*np.sign(xrem)) * (0.5+(abs(yrem)-0.5)*np.sign(yrem)),
                       (0.5+(abs(xrem)-0.5)*np.sign(xrem)) * (0.5-(abs(yrem)-0.5)*np.sign(yrem)),
                       (0.5-(abs(xrem)-0.5)*np.sign(xrem)) * (0.5-(abs(yrem)-0.5)*np.sign(yrem)),
                       (0.5-(abs(xrem)-0.5)*np.sign(xrem)) * (0.5+(abs(yrem)-0.5)*np.sign(yrem)))
            if np.any(np.array(weights) < 0):
                print weights
                raise ValueError('negative weight')
            wtsum = sum(weights)
            if (wtsum - 1) > 1e-5:
                raise ValueError("wtsum = 1+%g" % (wtsum-1))
            cubeJHK[:,xrd,yrd]     += di * weights[0]
            cubeJHK[:,xrd,yrd-1]   += di * weights[1]
            cubeJHK[:,xrd-1,yrd-1] += di * weights[3]
            cubeJHK[:,xrd-1,yrd]   += di * weights[2]
            wtcube[:,xrd,yrd]     += weights[0]
            wtcube[:,xrd,yrd-1]   += weights[1]
            wtcube[:,xrd-1,yrd-1] += weights[3]
            wtcube[:,xrd-1,yrd]   += weights[2]
            #wtcube[:,x,y] += (1-xrem) * (1-yrem)

    print "wtcube shape: ",wtcube.shape,"  wtcube.sum(): ",wtcube.sum()," single plane: ",wtcube[0,:,:].sum()
    print "max wt: ",wtcube[0,:,:].max()
    print "min wt: ",wtcube[0,:,:].min()

    fout[0].data = cubeJHK/wtcube

    fout.writeto(outfilename,clobber=clobber,output_verify='fix')
    #fout[0].data = wtcube
    #fout.writeto(outfilename.replace('cube','weightcube'),clobber=clobber,output_verify='fix')

    cubeJHK = cubeJHK/wtcube

    if brgfile is not None:
        if brgfile is True:
            if 'cube.fits' in outfilename:
                brgfile = outfilename.replace("cube.fits","brg.fits")
            else:
                raise 
        brg = cubeJHK[3582:3590,:,:].sum(axis=0) #- np.median(cubeJHK[3592:3605,:,:],axis=0)*8
        fout[0].data=brg
        del fout[0].header['CTYPE3']
        del fout[0].header['CRVAL3']
        del fout[0].header['CRPIX3']
        del fout[0].header['CD3_3']
        fout.writeto(brgfile,clobber=clobber,output_verify='fix')

        if reference_image is not None:
            offsets = AG_image_tools.cross_correlation_shifts_FITS(brgfile, reference_image)
            fout[0].header['CRPIX1'] -= offsets[0][0]
            fout[0].header['CRPIX2'] -= offsets[1][0]
            fout.writeto(brgfile,clobber=clobber,output_verify='fix')

            foutcube = pyfits.open(outfilename)
            foutcube[0].header['CRPIX1'] -= offsets[0][0]
            foutcube[0].header['CRPIX2'] -= offsets[1][0]
            foutcube.writeto(outfilename,clobber=clobber,output_verify='fix')

    if stellarfile is not None:
        if stellarfile is True:
            if 'cube.fits' in outfilename:
                stellarfile = outfilename.replace("cube.fits","brg_cont.fits")
            else:
                raise 
        stellar = (np.sum(cubeJHK[3570:3575,:,:],axis=0) + np.sum(cubeJHK[3592:3594,:,:],axis=0) + np.sum(cubeJHK[3598:3601,:,:],axis=0)) * 8./10.
        fout[0].data=stellar
        fout.writeto(stellarfile,clobber=clobber,output_verify='fix')

    if h2file is not None:
        if h2file is True:
            if 'cube.fits' in outfilename:
                h2file = outfilename.replace("cube.fits","h2.fits")
            else:
                raise 
        h2 = np.sum(cubeJHK[3431:3435,:,:],axis=0)# - np.median(cubeJHK[3435:3445,:,:],axis=0)*4
        fout[0].data=h2
        fout.writeto(h2file,clobber=clobber,output_verify='fix')

        if h2file is True:
            if 'cube.fits' in outfilename:
                h2cfile = outfilename.replace("cube.fits","h2_cont.fits")
            else:
                raise 
        else:
            if 'h2' in h2file:
                h2cfile = h2file.replace("h2","h2_cont")
            else:
                raise
        h2c = (np.sum(cubeJHK[3446:3452,:,:],axis=0))*4./6.
        fout[0].data=h2c
        fout.writeto(h2cfile,clobber=clobber,output_verify='fix')

    if brdfile is not None:
        if brdfile is True:
            if 'cube.fits' in outfilename:
                brdfile = outfilename.replace("cube.fits","brd.fits")
            else:
                raise 
        brd = np.sum(cubeJHK[2819:2824,:,:],axis=0) #- np.median(cubeJHK[2825:2835,:,:],axis=0)*5
        fout[0].data=brd
        fout.writeto(brdfile,clobber=clobber,output_verify='fix')

        if brdfile is True:
            if 'cube.fits' in outfilename:
                brdcfile = outfilename.replace("cube.fits","brd_cont.fits")
            else:
                raise 
        else:
            if 'brd' in brdfile:
                brdcfile = brdfile.replace("brd","brd_cont")
            else:
                raise
        brdc = (np.sum(cubeJHK[2810:2815,:,:],axis=0) + np.sum(cubeJHK[2824:2829,:,:],axis=0))/2.
        fout[0].data=brdc
        fout.writeto(brdcfile,clobber=clobber,output_verify='fix')

    if brefile is not None:
        if brefile is True:
            if 'cube.fits' in outfilename:
                brefile = outfilename.replace("cube.fits","bre.fits")
            else:
                raise 
        bre = np.sum(cubeJHK[2377:2382,:,:],axis=0) # - np.median(cubeJHK[2347:2353,:,:],axis=0)*5
        fout[0].data=bre
        fout.writeto(brefile,clobber=clobber,output_verify='fix')

        if brefile is True:
            if 'cube.fits' in outfilename:
                brecfile = outfilename.replace("cube.fits","bre_cont.fits")
            else:
                raise 
        else:
            if 'bre' in brefile:
                brecfile = brefile.replace("bre","bre_cont")
            else:
                raise
        brec = (np.sum(cubeJHK[2370:2375,:,:],axis=0) + np.sum(cubeJHK[2382:2387,:,:],axis=0))/2.
        fout[0].data=brec
        fout.writeto(brecfile,clobber=clobber,output_verify='fix')

    if pabfile is not None:
        if pabfile is True:
            if 'cube.fits' in outfilename:
                pabfile = outfilename.replace("cube.fits","pab.fits")
            else:
                raise 
        pab = np.sum(cubeJHK[519:523,:,:],axis=0) # - np.median(cubeJHK[2347:2353,:,:],axis=0)*5
        fout[0].data=pab
        fout.writeto(pabfile,clobber=clobber,output_verify='fix')

        if pabfile is True:
            if 'cube.fits' in outfilename:
                pabcfile = outfilename.replace("cube.fits","pab_cont.fits")
            else:
                raise 
        else:
            if 'pab' in pabfile:
                pabcfile = pabfile.replace("pab","pab_cont")
            else:
                raise
        pabc = (cubeJHK[519,:,:]+cubeJHK[523,:,:])*2.
        fout[0].data=pabc
        fout.writeto(pabcfile,clobber=clobber,output_verify='fix')

    for line in line_ranges:
        make_integral(cubeJHK, filename=True, outfilename=outfilename, line=line, fout=fout, clobber=clobber)

    kcont = np.sum([cubeJHK[a:b,:,:].sum(axis=0) for (a,b) in Kcont],axis=0)
    fout[0].data=kcont
    fout.writeto(outfilename.replace('cube','kcont'),clobber=clobber,output_verify='fix')
len("blasdgasdfasdfa")
206265/400.
206265/415.
206265/18500.
400./206265.
206265/5e4.
206265/5e4
400./206265. * 33
400./206265. * 120
im1
im1 = np.zeros([10,10])
im1[4,4] = 1
im2 = np.zeros([10,10])
im2[5,5] = 1
import AG_image_tools
AG_image_tools.cross_correlation_shifts(im1,im2)
roll 
help(roll)
help(rollaxis)
roll(roll(im1,1,0),1,1)
(roll(roll(im1,1,0),1,1) - im2).sum()
im1[4,4]=0
im1[4,3] = 1
AG_image_tools.cross_correlation_shifts(im1,im2)
(roll(roll(im1,2,0),1,1) - im2).sum()
get_ipython().magic(u"history ")
yoff,xoff = AG_image_tools.cross_correlation_shifts(im1,im2)
im1_aligned_to_im2 = roll(roll(im1,yoff,0),xoff,1)
im1_aligned_to_im2 = roll(roll(im1,yoff,0),xoff,1)
yoff
reload(AG_image_tools)