function histbins2d,x,y,xval,yval,xrange=xrange,yrange=yrange,xnbins=xnbins,ynbins=ynbins, $
reverse=ri,nbins=nbins,xbinsize=xbinsize,ybinsize=ybinsize, $
xlog = xlog, ylog=ylog, $
flux=flux,stdev=flux_stdev,average=flux_average, $
retbins=retbins,shift=shift,normalize=normal
xbins = histbins(x,xval,/retbins,range=xrange,nbins=xnbins,binsize=xbinsize,log=xlog,shift=shift)
ybins = histbins(y,yval,/retbins,range=yrange,nbins=ynbins,binsize=ybinsize,log=ylog,shift=shift)
wx = where(xbins ge xnbins or xbins lt 0,cx)
wy = where(ybins ge ynbins or ybins lt 0,cy)
bins = ybins*xnbins+xbins
if cx ne 0 then bins[wx]=-1
if cy ne 0 then bins[wy]=-1
nbins = long(xnbins) * ynbins
if keyword_set(retbins) then return,bins
h = histogram(bins,min=0,max=nbins-1,reverse=ri)
h = reform(h,xnbins,ynbins,/over)
if keyword_set(flux) then begin
flux_average= replicate(fill_nan(flux[0]) ,size(/dimen,h) )
flux_stdev = flux_average
whne0 = where(h ne 0,nbins0)
for b=0L,nbins0-1 do begin
i = whne0[b]
ind = ri[ ri[i]: ri[i+1]-1 ]
flux_average[i] = average(flux[ind],stdev=stdev)
flux_stdev[i] = stdev
endfor
endif
if keyword_set(normal) then h=h/total(h)/xbinsize/ybinsize
return,h
end
if not keyword_set(n) then n = 1000
if not keyword_set(nbins) then nbins=50
dprint,/print_dtime,dlevel=dl,'Starting run ',n
xrange = [-1d,1d]
yrange = xrange
x = randomu(seed,n)*(xrange[1]-xrange[0])+xrange[0]
y = randomu(seed,n)*(yrange[1]-yrange[0])+yrange[0]
noise = .2 + .01*(x-.2)^2 +.005*(y-.5)^2
flux = exp(-((x^2+y^2))/.5)+noise*randomn(seed,n)
dprint,dlevel=dl,'Done with data generation'
h=histbins2d(x,y,xb,yb,flux=flux,xrange=xrange,yrange=yrange ,xnbins=nbins,ynbins=nbins,stdev=flux_stdev,average=flux_average)
dprint,dlevel=dl,'Done with flux binning'
!p.multi=[0,2,2] & !p.charsize=1.2
options,lim,/no_interp,title="Number of Samples per bin"
specplot,xb,yb,h,lim=lim
if n le 20000 then oplot,x,y,psym=3
if n le 1000 then oplot,x,y,psym=1
lim2=lim
options,lim2,title = "Signal"
specplot,xb,yb,flux_average,lim=lim2
lim3=lim
options,lim3,title="Noise"
zlim,lim3,0,0,0
specplot,xb,yb,(flux_stdev^2)/flux_stdev,/no_interp,lim=lim3
lim3=lim
options,lim3,title="Signal/Noise"
zlim,lim3,0,0,0
specplot,xb,yb,(flux_average)/flux_stdev,/no_interp,lim=lim3
dprint,'Done with plot',dlevel=dl
wshow
end