set_galaxy_cache_size(100) labels.append((len(mem), 'tractor')) mem.append(memuse()) mod = tractor.getModelImage(im) labels.append((len(mem), 'model')) mem.append(memuse()) track('mod') tractor.freezeParam('images') for x in range(10): #for x in range(2): tractor.optimize(alphas=[1e-3, 1e-2, 0.1, 1]) labels.append((len(mem), 'opt %i' % x)) mem.append(memuse()) nun = gc.collect() print nun, 'unreachable objects' track('opt') if False: for x in range(10): p0 = np.array(tractor.getParams()) ss = np.array(tractor.getStepSizes()) p0 += ss * np.random.normal(0., 1e-3, size=len(p0)) tractor.setParams(p0) mod = tractor.getModelImage(im)
resids2 = [] chis2 = [] stars.xfit = stars.xx.copy() stars.yfit = stars.yy.copy() alphas = [0.1, 0.3, 1.0] for i,tr in enumerate(tractors): print tr src = tr.catalog[0] print 'Initial position:', src.pos x,y = src.pos.x, src.pos.y tr.freezeParam('images') tr.printThawedParams() for step in range(50): dlnp,X,alpha = tr.optimize(priors=False, shared_params=False, alphas=alphas) print 'dlnp', dlnp print 'pos', src.pos.x, src.pos.y print 'Delta position:', src.pos.x - x, src.pos.y - y #if dlnp < 0.1: if dlnp == 0.: break print 'Final position:', src.pos pos = src.getPosition() stars.xfit[i] = stars.x0[i] + pos.x stars.yfit[i] = stars.y0[i] + pos.y mod = tr.getModelImage(0) mods2.append(mod) subtim = tr.images[0]
def psf_residuals(expnum, ccdname, stampsize=35, nstar=30, magrange=(13, 17), verbose=0, splinesky=False): # Set the debugging level. if verbose == 0: lvl = logging.INFO else: lvl = logging.DEBUG logging.basicConfig(level=lvl, format='%(message)s', stream=sys.stdout) pngprefix = 'qapsf-{}-{}'.format(expnum, ccdname) # Gather all the info we need about this CCD. decals = Decals() ccd = decals.find_ccds(expnum=expnum, ccdname=ccdname)[0] band = ccd.filter ps1band = dict(g=0, r=1, i=2, z=3, Y=4) print('Band {}'.format(band)) #scales = dict(g=0.0066, r=0.01, z=0.025) #vmin, vmax = np.arcsinh(-1), np.arcsinh(100) #print(scales[band]) im = decals.get_image_object(ccd) iminfo = im.get_image_info() H, W = iminfo['dims'] wcs = im.get_wcs() # Choose a uniformly selected subset of PS1 stars on this CCD. ps1 = ps1cat(ccdwcs=wcs) cat = ps1.get_stars(band=band, magrange=magrange) rand = np.random.RandomState(seed=expnum * ccd.ccdnum) these = rand.choice(len(cat) - 1, nstar, replace=False) #these = rand.random_integers(0,len(cat)-1,nstar) cat = cat[these] cat = cat[np.argsort(cat.median[:, ps1band[band]])] # sort by magnitude #print(cat.nmag_ok) get_tim_kwargs = dict(const2psf=True, splinesky=splinesky) # Make a QAplot of the positions of all the stars. tim = im.get_tractor_image(**get_tim_kwargs) img = tim.getImage() #img = tim.getImage()/scales[band] fig = plt.figure(figsize=(5, 10)) ax = fig.gca() ax.get_xaxis().get_major_formatter().set_useOffset(False) #ax.imshow(np.arcsinh(img),cmap='gray',interpolation='nearest', # origin='lower',vmin=vmax,vmax=vmax) ax.imshow(img, **tim.ima) ax.axis('off') ax.set_title('{}: {}/{} AM={:.2f} Seeing={:.3f}"'.format( band, expnum, ccdname, ccd.airmass, ccd.seeing)) for istar, ps1star in enumerate(cat): ra, dec = (ps1star.ra, ps1star.dec) ok, xpos, ypos = wcs.radec2pixelxy(ra, dec) ax.text(xpos, ypos, '{:2d}'.format(istar + 1), color='red', horizontalalignment='left') circ = plt.Circle((xpos, ypos), radius=30, color='g', fill=False, lw=1) ax.add_patch(circ) #radec = wcs.radec_bounds() #ax.scatter(cat.ra,cat.dec) #ax.set_xlim([radec[1],radec[0]])#*[1.0002,0.9998]) #ax.set_ylim([radec[2],radec[3]])#*[0.985,1.015]) #ax.set_xlabel('$RA\ (deg)$',fontsize=18) #ax.set_ylabel('$Dec\ (deg)$',fontsize=18) fig.savefig(pngprefix + '-ccd.png', bbox_inches='tight') # Initialize the many-stamp QAplot ncols = 3 nrows = np.ceil(nstar / ncols).astype('int') inchperstamp = 2.0 fig = plt.figure(figsize=(inchperstamp * 3 * ncols, inchperstamp * nrows)) irow = 0 icol = 0 for istar, ps1star in enumerate(cat): ra, dec = (ps1star.ra, ps1star.dec) mag = ps1star.median[ps1band[band]] # r-band ok, xpos, ypos = wcs.radec2pixelxy(ra, dec) ix, iy = int(xpos), int(ypos) # create a little tractor Image object around the star slc = (slice(max(iy - stampsize, 0), min(iy + stampsize + 1, H)), slice(max(ix - stampsize, 0), min(ix + stampsize + 1, W))) # The PSF model 'const2Psf' is the one used in DR1: a 2-component # Gaussian fit to PsfEx instantiated in the image center. tim = im.get_tractor_image(slc=slc, **get_tim_kwargs) stamp = tim.getImage() ivarstamp = tim.getInvvar() # Initialize a tractor PointSource from PS1 measurements flux = NanoMaggies.magToNanomaggies(mag) star = PointSource(RaDecPos(ra, dec), NanoMaggies(**{band: flux})) # Fit just the source RA,Dec,flux. tractor = Tractor([tim], [star]) tractor.freezeParam('images') print('2-component MOG:', tim.psf) tractor.printThawedParams() for step in range(50): dlnp, X, alpha = tractor.optimize() if dlnp < 0.1: break print('Fit:', star) model_mog = tractor.getModelImage(0) chi2_mog = -2.0 * tractor.getLogLikelihood() mag_mog = NanoMaggies.nanomaggiesToMag(star.brightness)[0] # Now change the PSF model to a pixelized PSF model from PsfEx instantiated # at this place in the image. psf = PixelizedPsfEx(im.psffn) tim.psf = psf.constantPsfAt(xpos, ypos) #print('PSF model:', tim.psf) #tractor.printThawedParams() for step in range(50): dlnp, X, alpha = tractor.optimize() if dlnp < 0.1: break print('Fit:', star) model_psfex = tractor.getModelImage(0) chi2_psfex = -2.0 * tractor.getLogLikelihood() mag_psfex = NanoMaggies.nanomaggiesToMag(star.brightness)[0] #mn, mx = np.percentile((stamp-model_psfex)[ivarstamp>0],[1,95]) sig = np.std((stamp - model_psfex)[ivarstamp > 0]) mn, mx = [-2.0 * sig, 5 * sig] # Generate a QAplot. if (istar > 0) and (istar % (ncols) == 0): irow = irow + 1 icol = 3 * istar - 3 * ncols * irow #print(istar, irow, icol, icol+1, icol+2) ax1 = plt.subplot2grid((nrows, 3 * ncols), (irow, icol), aspect='equal') ax1.axis('off') #ax1.imshow(stamp, **tim.ima) ax1.imshow(stamp, cmap='gray', interpolation='nearest', origin='lower', vmin=mn, vmax=mx) ax1.text(0.1, 0.9, '{:2d}'.format(istar + 1), color='white', horizontalalignment='left', verticalalignment='top', transform=ax1.transAxes) ax2 = plt.subplot2grid((nrows, 3 * ncols), (irow, icol + 1), aspect='equal') ax2.axis('off') #ax2.imshow(stamp-model_mog, **tim.ima) ax2.imshow(stamp - model_mog, cmap='gray', interpolation='nearest', origin='lower', vmin=mn, vmax=mx) ax2.text(0.1, 0.9, 'MoG', color='white', horizontalalignment='left', verticalalignment='top', transform=ax2.transAxes) ax2.text(0.08, 0.08, '{:.3f}'.format(mag_mog), color='white', horizontalalignment='left', verticalalignment='bottom', transform=ax2.transAxes) #ax2.set_title('{:.3f}, {:.2f}'.format(mag_psfex,chi2_psfex),fontsize=14) #ax2.set_title('{:.3f}, $\chi^{2}$={:.2f}'.format(mag_psfex,chi2_psfex)) ax3 = plt.subplot2grid((nrows, 3 * ncols), (irow, icol + 2), aspect='equal') ax3.axis('off') #ax3.imshow(stamp-model_psfex, **tim.ima) ax3.imshow(stamp - model_psfex, cmap='gray', interpolation='nearest', origin='lower', vmin=mn, vmax=mx) ax3.text(0.1, 0.9, 'PSFEx', color='white', horizontalalignment='left', verticalalignment='top', transform=ax3.transAxes) ax3.text(0.08, 0.08, '{:.3f}'.format(mag_psfex), color='white', horizontalalignment='left', verticalalignment='bottom', transform=ax3.transAxes) if istar == (nstar - 1): break fig.savefig(pngprefix + '-stargrid.png', bbox_inches='tight')
def psf_residuals(expnum,ccdname,stampsize=35,nstar=30, magrange=(13,17),verbose=0): # Set the debugging level. if verbose==0: lvl = logging.INFO else: lvl = logging.DEBUG logging.basicConfig(level=lvl,format='%(message)s',stream=sys.stdout) pngprefix = 'qapsf-{}-{}'.format(expnum,ccdname) # Gather all the info we need about this CCD. decals = Decals() ccd = decals.find_ccds(expnum=expnum,ccdname=ccdname)[0] band = ccd.filter ps1band = dict(g=0,r=1,i=2,z=3,Y=4) print('Band {}'.format(band)) #scales = dict(g=0.0066, r=0.01, z=0.025) #vmin, vmax = np.arcsinh(-1), np.arcsinh(100) #print(scales[band]) im = DecamImage(decals,ccd) iminfo = im.get_image_info() H,W = iminfo['dims'] wcs = im.get_wcs() # Choose a uniformly selected subset of PS1 stars on this CCD. ps1 = ps1cat(ccdwcs=wcs) cat = ps1.get_stars(band=band,magrange=magrange) rand = np.random.RandomState(seed=expnum*ccd.ccdnum) these = rand.choice(len(cat)-1,nstar,replace=False) #these = rand.random_integers(0,len(cat)-1,nstar) cat = cat[these] cat = cat[np.argsort(cat.median[:,ps1band[band]])] # sort by magnitude #print(cat.nmag_ok) # Make a QAplot of the positions of all the stars. tim = im.get_tractor_image(const2psf=True) img = tim.getImage() #img = tim.getImage()/scales[band] fig = plt.figure(figsize=(5,10)) ax = fig.gca() ax.get_xaxis().get_major_formatter().set_useOffset(False) #ax.imshow(np.arcsinh(img),cmap='gray',interpolation='nearest', # origin='lower',vmin=vmax,vmax=vmax) ax.imshow(img, **tim.ima) ax.axis('off') ax.set_title('{}: {}/{} AM={:.2f} Seeing={:.3f}"'. format(band,expnum,ccdname,ccd.airmass,ccd.seeing)) for istar, ps1star in enumerate(cat): ra, dec = (ps1star.ra, ps1star.dec) ok, xpos, ypos = wcs.radec2pixelxy(ra, dec) ax.text(xpos,ypos,'{:2d}'.format(istar+1),color='red', horizontalalignment='left') circ = plt.Circle((xpos,ypos),radius=30,color='g',fill=False,lw=1) ax.add_patch(circ) #radec = wcs.radec_bounds() #ax.scatter(cat.ra,cat.dec) #ax.set_xlim([radec[1],radec[0]])#*[1.0002,0.9998]) #ax.set_ylim([radec[2],radec[3]])#*[0.985,1.015]) #ax.set_xlabel('$RA\ (deg)$',fontsize=18) #ax.set_ylabel('$Dec\ (deg)$',fontsize=18) fig.savefig(pngprefix+'-ccd.png',bbox_inches='tight') # Initialize the many-stamp QAplot ncols = 3 nrows = np.ceil(nstar/ncols).astype('int') inchperstamp = 2.0 fig = plt.figure(figsize=(inchperstamp*3*ncols,inchperstamp*nrows)) irow = 0 icol = 0 for istar, ps1star in enumerate(cat): ra, dec = (ps1star.ra, ps1star.dec) mag = ps1star.median[ps1band[band]] # r-band ok, xpos, ypos = wcs.radec2pixelxy(ra, dec) ix,iy = int(xpos), int(ypos) # create a little tractor Image object around the star slc = (slice(max(iy-stampsize, 0), min(iy+stampsize+1, H)), slice(max(ix-stampsize, 0), min(ix+stampsize+1, W))) # The PSF model 'const2Psf' is the one used in DR1: a 2-component # Gaussian fit to PsfEx instantiated in the image center. tim = im.get_tractor_image(slc=slc, const2psf=True) stamp = tim.getImage() ivarstamp = tim.getInvvar() # Initialize a tractor PointSource from PS1 measurements flux = NanoMaggies.magToNanomaggies(mag) star = PointSource(RaDecPos(ra,dec), NanoMaggies(**{band: flux})) # Fit just the source RA,Dec,flux. tractor = Tractor([tim], [star]) tractor.freezeParam('images') print('2-component MOG:', tim.psf) tractor.printThawedParams() for step in range(50): dlnp,X,alpha = tractor.optimize() if dlnp < 0.1: break print('Fit:', star) model_mog = tractor.getModelImage(0) chi2_mog = -2.0*tractor.getLogLikelihood() mag_mog = NanoMaggies.nanomaggiesToMag(star.brightness)[0] # Now change the PSF model to a pixelized PSF model from PsfEx instantiated # at this place in the image. psf = PixelizedPsfEx(im.psffn) tim.psf = psf.constantPsfAt(xpos, ypos) #print('PSF model:', tim.psf) #tractor.printThawedParams() for step in range(50): dlnp,X,alpha = tractor.optimize() if dlnp < 0.1: break print('Fit:', star) model_psfex = tractor.getModelImage(0) chi2_psfex = -2.0*tractor.getLogLikelihood() mag_psfex = NanoMaggies.nanomaggiesToMag(star.brightness)[0] #mn, mx = np.percentile((stamp-model_psfex)[ivarstamp>0],[1,95]) sig = np.std((stamp-model_psfex)[ivarstamp>0]) mn, mx = [-2.0*sig,5*sig] # Generate a QAplot. if (istar>0) and (istar%(ncols)==0): irow = irow+1 icol = 3*istar - 3*ncols*irow #print(istar, irow, icol, icol+1, icol+2) ax1 = plt.subplot2grid((nrows,3*ncols), (irow,icol), aspect='equal') ax1.axis('off') #ax1.imshow(stamp, **tim.ima) ax1.imshow(stamp,cmap='gray',interpolation='nearest', origin='lower',vmin=mn,vmax=mx) ax1.text(0.1,0.9,'{:2d}'.format(istar+1),color='white', horizontalalignment='left',verticalalignment='top', transform=ax1.transAxes) ax2 = plt.subplot2grid((nrows,3*ncols), (irow,icol+1), aspect='equal') ax2.axis('off') #ax2.imshow(stamp-model_mog, **tim.ima) ax2.imshow(stamp-model_mog,cmap='gray',interpolation='nearest', origin='lower',vmin=mn,vmax=mx) ax2.text(0.1,0.9,'MoG',color='white', horizontalalignment='left',verticalalignment='top', transform=ax2.transAxes) ax2.text(0.08,0.08,'{:.3f}'.format(mag_mog),color='white', horizontalalignment='left',verticalalignment='bottom', transform=ax2.transAxes) #ax2.set_title('{:.3f}, {:.2f}'.format(mag_psfex,chi2_psfex),fontsize=14) #ax2.set_title('{:.3f}, $\chi^{2}$={:.2f}'.format(mag_psfex,chi2_psfex)) ax3 = plt.subplot2grid((nrows,3*ncols), (irow,icol+2), aspect='equal') ax3.axis('off') #ax3.imshow(stamp-model_psfex, **tim.ima) ax3.imshow(stamp-model_psfex,cmap='gray',interpolation='nearest', origin='lower',vmin=mn,vmax=mx) ax3.text(0.1,0.9,'PSFEx',color='white', horizontalalignment='left',verticalalignment='top', transform=ax3.transAxes) ax3.text(0.08,0.08,'{:.3f}'.format(mag_psfex),color='white', horizontalalignment='left',verticalalignment='bottom', transform=ax3.transAxes) if istar==(nstar-1): break fig.savefig(pngprefix+'-stargrid.png',bbox_inches='tight')
def main(): ''' This function generates the plots in the paper. Some files and directories are assumed to exist in the current directory: * WISE atlas tiles, from http://unwise.me/data/allsky-atlas.fits * unwise-neo1-coadds, from http://unwise.me/data/neo1/ * unwise-neo1-coadds-half, unwise-neo1-coadds-quarter: directories ''' # First, create the WCS into which we want to render # degrees width to render in galactic coords # |l| < 60 # |b| < 30 width = 120 # ~2 arcmin per pixel W = int(width * 60.) / 2 H = W/2 zoom = 360. / width wcs = anwcs_create_hammer_aitoff(0., 0., zoom, W, H, 0) # Select WISE tiles that overlap. This atlas table is available # from http://unwise.me/data/allsky-atlas.fits # Select WISE tiles that overlap. T = fits_table('allsky-atlas.fits') print(len(T), 'tiles total') T.ll,T.bb = radectolb(T.ra, T.dec) I = np.flatnonzero(np.logical_or(T.ll < width+1, T.ll > (360-width-1)) * (T.bb > -width/2-1) * (T.bb < width/2+1)) T.cut(I) print(len(I), 'tiles in L,B range') # Create a coadd for each WISE band lbpat = 'unwise-neo1-w%i-lb.fits' imgs = [] for band in [1,2]: outfn = lbpat % (band) if os.path.exists(outfn): print('Exists:', outfn) img = fitsio.read(outfn) imgs.append(img) continue coimg = np.zeros((H,W), np.float32) conimg = np.zeros((H,W), np.float32) for i,brick in enumerate(T.coadd_id): # We downsample by 2, twice, just to make repeat runs a # little faster. # unWISE fn = os.path.join('unwise-neo1-coadds', brick[:3], brick, 'unwise-%s-w%i-img-u.fits' % (brick, band)) qfn = os.path.join('unwise-neo1-coadds-quarter', 'unwise-%s-w%i.fits' % (brick, band)) hfn = os.path.join('unwise-neo1-coadds-half', 'unwise-%s-w%i.fits' % (brick, band)) if not os.path.exists(qfn): if not os.path.exists(hfn): print('Reading', fn) halfsize(fn, hfn) halfsize(hfn, qfn) fn = qfn print('Reading', fn) img = fitsio.read(fn) bwcs = Tan(fn, 0) bh,bw = img.shape # Coadd each unWISE pixel into the nearest target pixel. xx,yy = np.meshgrid(np.arange(bw), np.arange(bh)) rr,dd = bwcs.pixelxy2radec(xx, yy) ll,bb = radectolb(rr.ravel(), dd.ravel()) ll = ll.reshape(rr.shape) bb = bb.reshape(rr.shape) ok,ox,oy = wcs.radec2pixelxy(ll, bb) ox = np.round(ox - 1).astype(int) oy = np.round(oy - 1).astype(int) K = (ox >= 0) * (ox < W) * (oy >= 0) * (oy < H) * ok #print('ok:', np.unique(ok), 'x', ox.min(), ox.max(), 'y', oy.min(), oy.max()) assert(np.all(np.isfinite(img))) if np.sum(K) == 0: # no overlap print('No overlap') continue np.add.at( coimg, (oy[K], ox[K]), img[K]) np.add.at(conimg, (oy[K], ox[K]), 1) img = coimg / np.maximum(conimg, 1) # Hack -- write and then read FITS WCS header. fn = 'wiselb.wcs' wcs.writeto(fn) hdr = fitsio.read_header(fn) hdr['CTYPE1'] = 'GLON-AIT' hdr['CTYPE2'] = 'GLAT-AIT' fitsio.write(outfn, img, header=hdr, clobber=True) fitsio.write(outfn.replace('.fits', '-n.fits'), conimg, header=hdr, clobber=True) imgs.append(img) w1,w2 = imgs # Get/confirm L,B bounds... H,W = w1.shape print('Image size', W, 'x', H) ok,l1,b1 = wcs.pixelxy2radec(1, (H+1)/2.) ok,l2,b2 = wcs.pixelxy2radec(W, (H+1)/2.) ok,l3,b3 = wcs.pixelxy2radec((W+1)/2., 1) ok,l4,b4 = wcs.pixelxy2radec((W+1)/2., H) print('L,B', (l1,b1), (l2,b2), (l3,b3), (l4,b4)) llo,lhi = l2,l1+360 blo,bhi = b3,b4 # Set plot sizes plt.figure(1, figsize=(10,5)) plt.subplots_adjust(left=0.1, right=0.95, bottom=0.1, top=0.95) plt.figure(2, figsize=(5,5)) plt.subplots_adjust(left=0.11, right=0.96, bottom=0.1, top=0.95) suffix = '.pdf' rgb = wise_rgb(w1, w2) xlo,ylo = 0,0 plt.figure(1) plt.clf() plt.imshow(rgb, origin='lower', interpolation='nearest') lbticks(wcs, xlo, ylo, lticks=[60,30,0,330,300], bticks=[-30,-15,0,15,30]) plt.savefig('xbulge-00' + suffix) # Compute the median of each row as a crude way of suppressing the # Galactic plane medy1 = np.median(w1, axis=1) medy2 = np.median(w2, axis=1) rgb = wise_rgb(w1 - medy1[:,np.newaxis], w2 - medy2[:,np.newaxis]) # Zoom in a bit for Galactic plane subtracted version lhi,llo,blo,bhi = 40, 320, -20, 20 okxy = np.array([wcs.radec2pixelxy(l,b) for l,b in [ (llo, blo), (llo, bhi), (lhi, blo), (lhi, bhi)]]) xlo = int(np.floor(min(okxy[:,-2]))) xhi = int(np.ceil (max(okxy[:,-2]))) ylo = int(np.floor(min(okxy[:,-1]))) yhi = int(np.ceil (max(okxy[:,-1]))) plt.clf() plt.imshow(rgb[ylo:yhi, xlo:xhi, :],origin='lower', interpolation='nearest') #lbticks(wcs, xlo, ylo, lticks=[40,20,0,340,320], bticks=[-20,-10,0,10,20]) lbticks(wcs, xlo, ylo, lticks=[30,15,0,345,330], bticks=[-20,-10,0,10,20]) plt.savefig('xbulge-01' + suffix) # Zoom in on the core lhi,llo,blo,bhi = 15, 345, -15, 15 ok,x1,y1 = wcs.radec2pixelxy(llo, blo) ok,x2,y2 = wcs.radec2pixelxy(llo, bhi) ok,x3,y3 = wcs.radec2pixelxy(lhi, blo) ok,x4,y4 = wcs.radec2pixelxy(lhi, bhi) xlo = int(np.floor(min(x1,x2,x3,x4))) xhi = int(np.ceil (max(x1,x2,x3,x4))) ylo = int(np.floor(min(y1,y2,y3,y4))) yhi = int(np.ceil (max(y1,y2,y3,y4))) print('xlo,ylo', xlo, ylo) w1 = w1[ylo:yhi, xlo:xhi] w2 = w2[ylo:yhi, xlo:xhi] plt.figure(2) # Apply color cut w1mag = -2.5*(np.log10(w1) - 9.) w2mag = -2.5*(np.log10(w2) - 9.) cc = w1mag - w2mag goodcolor = np.isfinite(cc) mlo,mhi = np.percentile(cc[goodcolor], [5,95]) print('W1 - W2 color masks:', mlo,mhi) mask = goodcolor * (cc > mlo) * (cc < mhi) plt.clf() rgb = wise_rgb(w1, w2) plt.imshow(rgb, origin='lower', interpolation='nearest') lbticks(wcs, xlo,ylo) plt.title('Data') plt.savefig('xbulge-fit-data' + suffix) plt.clf() rgb = wise_rgb(w1 * mask, w2 * mask) plt.imshow(rgb, origin='lower', interpolation='nearest') lbticks(wcs, xlo,ylo) plt.title('Data (masked)') plt.savefig('xbulge-fit-masked' + suffix) ie = mask.astype(np.float32) from tractor import (Image, NCircularGaussianPSF, LinearPhotoCal, Tractor, PixPos, Fluxes) from tractor.galaxy import ExpGalaxy, GalaxyShape # Create Tractor images tim1 = Image(data=w1 * mask, inverr=ie, psf=NCircularGaussianPSF([1.],[1.]), photocal=LinearPhotoCal(1., 'w1')) tim2 = Image(data=w2 * mask, inverr=ie, psf=NCircularGaussianPSF([1.],[1.]), photocal=LinearPhotoCal(1., 'w2')) H,W = w1.shape gal = ExpGalaxy(PixPos(W/2, H/2), Fluxes(w1=w1.sum(), w2=w2.sum()), GalaxyShape(200, 0.4, 90.)) tractor = Tractor([tim1, tim2],[gal]) # fitsio.write('data-w1.fits', w1 * mask, clobber=True) # fitsio.write('data-w2.fits', w2 * mask, clobber=True) # fitsio.write('mask.fits', mask.astype(np.uint8), clobber=True) # Optimize galaxy model tractor.freezeParam('images') for step in range(50): dlnp,x,alpha = tractor.optimize() print('dlnp', dlnp) print('x', x) print('alpha', alpha) print('Galaxy', gal) if dlnp == 0: break # Get galaxy model images, compute residuals mod1 = tractor.getModelImage(0) resid1 = w1 - mod1 mod2 = tractor.getModelImage(1) resid2 = w2 - mod2 rgb = wise_rgb(mod1, mod2) plt.clf() plt.imshow(rgb, origin='lower', interpolation='nearest') lbticks(wcs, xlo,ylo) plt.title('Model') plt.savefig('xbulge-fit-model' + suffix) rgb = resid_rgb(resid1, resid2) plt.clf() plt.imshow(rgb, origin='lower', interpolation='nearest') lbticks(wcs, xlo,ylo) plt.title('Residuals') plt.savefig('xbulge-fit-resid' + suffix) rgb = resid_rgb(resid1*mask, resid2*mask) plt.clf() plt.imshow(rgb, origin='lower', interpolation='nearest') lbticks(wcs, xlo,ylo) plt.title('Residuals (masked)') plt.savefig('xbulge-fit-residmasked' + suffix) # fitsio.write('resid1.fits', resid1, clobber=True) # fitsio.write('resid2.fits', resid2, clobber=True) # Compute median-smoothed residuals fr1 = np.zeros_like(resid1) fr2 = np.zeros_like(resid2) median_smooth(resid1, np.logical_not(mask), 25, fr1) median_smooth(resid2, np.logical_not(mask), 25, fr2) rgb = resid_rgb(fr1, fr2) plt.clf() plt.imshow(rgb, origin='lower', interpolation='nearest') lbticks(wcs, xlo,ylo) plt.title('Residuals (smoothed)') plt.savefig('xbulge-fit-smooth2' + suffix)
continue plt.clf() plt.imshow(derivs[i].patch, interpolation='nearest', origin='lower') plt.title('MoG galaxy derivative for parameter %s' % p) plt.savefig('deriv-%02i.png' % i) # import sys # import logging # lvl = logging.DEBUG # logging.basicConfig(level=lvl, format='%(message)s', stream=sys.stdout) # Optimize the model. for step in range(50): print('Tractor params:') tractor.printThawedParams() dlnp,X,alpha = tractor.optimize(damp=1.) print('dlnp', dlnp) print('galaxy:', moggal) #print('Mog', moggal.mog.getParams()) if dlnp == 0: break # Plot the model as we're optimizing... mod = tractor.getModelImage(0) chi = (tim.getImage() - mod) * tim.getInvError() plt.clf() plt.subplot(1,2,1) plt.imshow(mod, interpolation='nearest', origin='lower') plt.title('Model') plt.subplot(1,2,2) mx = np.abs(chi).max()
# #plt.contour(pix, contours, color='k') # plt.title('%s-pixel Median filtered W1' % fsize) # # lbticks(wcs, xlo,ylo) # # ps.savefig() # # contours = np.percentile(w1, [50, 70, 85, 90, 95]) # #plt.contour(pix, contours, colors='k') # plt.contour(pix, contours, colors='r') # ps.savefig() tractor.freezeParam('images') for step in range(50): dlnp,x,alpha = tractor.optimize() print('dlnp', dlnp) print('x', x) print('alpha', alpha) print('Galaxy', gal) if dlnp == 0: break mod1 = tractor.getModelImage(0) resid1 = w1masked - mod1 mod2 = tractor.getModelImage(1) resid2 = w2masked - mod2 #plt.figure(2)