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)