Viewing contents of file '../idllib/astron/contrib/freudenreich/robust_bin2d.pro'
PRO ROBUST_BIN2D,NX,NY, X0,X1, Y0,Y1, X,Y,DATA, MAP,NUM,SIGGMA
;+
; NAME:
; ROBUST_BIN2D
;
; PURPOSE:
; Bins data in a 2-dimensional array suitable for surface or contour
; plots. Cells with more than 2 entries are robustly averaged to remove
; outliers.
;
; CALLING SEQUENCE:
; ROBUST_BIN2D,NX,NY,X0,X1,Y0,Y1,X,Y,DATA,Z,NUM,SIGGMA
;
; INPUTS:
; NX = Number of bins in the X direction
; NY = Number of bins in the Y direction
; X0 = Lower bound on X
; X1 = Higher bound on X
; Y0 = Lower bound on Y
; Y1 = Higher bound on Y
; X = Independent variable vector, floating-point
; Y = Dependent variable vector
; DATA = Vector of quantity to be binned. X, Y, DATA must have same
; length.
;
; OUTPUTS:
; Z = 2-dimensional array containing the average Z per bin
; NUM = 2-dimensional array containing the number of entries per bin.
; SIGGMA = (OPTIONAL) standard deviation per pixel (not OF THE MEAN).
;
; SUBROUTINES CALLED:
; RESISTANT_MEAN, MED
;
; REVISION HISTORY:
; Written by H.T. Freudenreich, ?/1990
; Modified: H.F., 3/94 to return SIGGMA
;-
ON_ERROR,2
BINMAX = 255
A = FLTARR(BINMAX)
Z = FLTARR(BINMAX,NX,NY)
NUM = INTARR(NX,NY)
MAP = FLTARR(NX,NY)
IF N_PARAMS() GT 11 THEN BEGIN
GETSIG=1
SIGGMA=FLTARR(NX,NY)
ENDIF ELSE GETSIG=0
; Bin the data:
DELX = (X1-X0)/NX
DELY = (Y1-Y0)/NY
FOR I = 0L, N_ELEMENTS(DATA)-1 DO BEGIN
IX = (X(I)-X0)/DELX
IY = (Y(I)-Y0)/DELY
IF( (IX GE 0) AND (IY GE 0) AND (IX LT NX) AND (IY LT NY) )THEN BEGIN
IF( NUM(IX,IY) LT BINMAX )THEN BEGIN
Z(NUM(IX,IY),IX,IY) = DATA(I)
NUM(IX,IY) = NUM(IX,IY)+1
ENDIF ELSE PRINT,'ROBUST_BIN2D: Exceeded maximum entries per bin'
ENDIF
ENDFOR
; Average each non-empty bin:
FOR I = 0, NX-1 DO BEGIN
FOR J = 0, NY-1 DO BEGIN
MAP(I,J) = Z(I,J,0)
IF( NUM(I,J) GT 1 )THEN BEGIN
IF( NUM(I,J) EQ 2 )THEN BEGIN
MAP(I,J) = (Z(0,I,J)+Z(1,I,J))*.5
ENDIF ELSE IF( NUM(I,J) EQ 3 )THEN BEGIN
A = Z(0:2,I,J)
A = A(SORT(A))
MAP(I,J) = A(2)
ENDIF ELSE BEGIN
A = Z(0:NUM(I,J)-1,I,J)
MEAN = BIWEIGHT_MEAN(A,SIG) ;(slow)
; RESISTANT_MEAN,A,2.,MEAN,SIG,NUMR ;(faster)
MAP(I,J) = MEAN
IF GETSIG EQ 1 THEN SIGGMA(I,J)=SIG
ENDELSE
ENDIF
ENDFOR
ENDFOR
RETURN
END