FUNCTION SIG_ARRAY,ARRAY,DIMENSION,N_PAR=N_PAR,MISSING=MISSING ; ON_ERROR,2 ;Return to caller if an error occurs ; ; Check the number of parameters passed. ; IF N_PARAMS() EQ 0 THEN MESSAGE, $ 'Syntax: Result = SIG_ARRAY( ARRAY [, DIMENSION ] ) ; ; Get the number of dimensions of the array. ; S = SIZE(ARRAY) IF S(0) EQ 0 THEN MESSAGE, 'Variable ARRAY must be an array' ; ; If the DIMENSION parameter was passed, then check it for validity. ; over that dimension. ; IF N_PARAMS() EQ 2 THEN BEGIN IF ((DIMENSION LT 1) OR (DIMENSION GT S(0))) THEN MESSAGE, $ 'DIMENSION out of range' ENDIF ; ; Renormalize the data to the average value. This avoids problems with ; roundoff error. ; IF (N_PARAMS() EQ 2) AND (S(0) GT 1) THEN BEGIN STEMP = LONARR(3) IF DIMENSION EQ 1 THEN STEMP(0) = 1 ELSE $ STEMP(0) = PRODUCT(S(1:DIMENSION-1)) STEMP(1) = S(DIMENSION) IF DIMENSION EQ S(0) THEN STEMP(2) = 1 ELSE $ STEMP(2) = PRODUCT(S(DIMENSION+1:S(0))) TEMP = REFORM(ARRAY, STEMP) DT = DATATYPE(TEMP,2) IF (DT LE 2) OR (DT EQ 12) THEN TEMP = FLOAT(TEMP) IF (DT GE 13) THEN TEMP = DOUBLE(TEMP) A0 = AVERAGE(ARRAY, DIMENSION, MISSING=MISSING) FOR I = 0,S(DIMENSION)-1 DO TEMP(*,I,*) = TEMP(*,I,*) - A0 TEMP = REFORM(TEMP, S(1:S(0)), /OVERWRITE) END ELSE BEGIN A0 = AVERAGE(ARRAY, MISSING=MISSING) TEMP = ARRAY - A0 ENDELSE ; ; Change the missing value to reflect the renormalized data. ; IF N_ELEMENTS(MISSING) EQ 1 THEN BEGIN W = WHERE(ARRAY NE MISSING, COUNT) IF COUNT GT 0 THEN BEGIN TMISSING = MIN(ARRAY(W)) IF TMISSING LT 0 THEN TMISSING = 1.1*TMISSING IF TMISSING GT 0 THEN TMISSING = 0.9*TMISSING IF TMISSING EQ 0 THEN TMISSING = -1 W = WHERE(ARRAY EQ MISSING, COUNT) IF COUNT GT 0 THEN TEMP(W) = TMISSING END ELSE TMISSING = TEMP(0) ;All pixels are missing ENDIF ; ; Form the square of the array, taking into account any missing pixels. ; A_SQR = TEMP^2 IF N_ELEMENTS(TMISSING) EQ 1 THEN BEGIN W = WHERE(TEMP EQ TMISSING, COUNT) IF COUNT GT 0 THEN A_SQR(W) = TMISSING ENDIF ; ; Calculate the average of the array and of the square of the array. ; IF N_PARAMS() EQ 2 THEN BEGIN A_AVG = AVERAGE(TEMP, DIMENSION, MISSING=TMISSING) A_SQR = AVERAGE(A_SQR, DIMENSION, MISSING=TMISSING) N = S(DIMENSION) END ELSE BEGIN A_AVG = 0 A_SQR = AVERAGE(A_SQR, MISSING=TMISSING) N = N_ELEMENTS(TEMP) ENDELSE ; ; Take into account the number of free parameters. ; IF N_ELEMENTS(N_PAR) EQ 1 THEN NPAR = N_PAR ELSE NPAR = 1 SIG = SQRT(ABS(A_SQR - A_AVG^2) * (N / ((N - NPAR) > 1.))) ; ; Set any missing pixels to the missing pixel flag value. ; IF N_ELEMENTS(TMISSING) EQ 1 THEN BEGIN W = WHERE(A_AVG EQ TMISSING, COUNT) IF COUNT GT 0 THEN SIG(W) = MISSING ENDIF ; RETURN, SIG END