;
Function Leefilt_smei, aIn, nIn, sigIn, $
  DOUBLE = double, $
  EXACT = EXACT, $
  nan = nan, $
  median = median

ON_ERROR, 2                     ;Return to caller if an error occurs

tnames = [SIZE(aIn, /TNAME), SIZE(nIn, /TNAME), SIZE(sigIn, /TNAME)]
double = (N_ELEMENTS(double) GT 0) ? KEYWORD_SET(double) : $
         MAX(tnames EQ 'DOUBLE')

NP = N_params(0)
IF np lt 3 THEN sigIn = 5       ;supply defaults
sig = double ? DOUBLE(sigIn) : FLOAT(sigIn)


IF np lt 2 THEN nIn = 5
dim = SIZE(aIn, /DIMENSIONS)
n = FLOOR(nIn)
IF ((n LT 1) OR (n GE MIN(dim)/2)) THEN MESSAGE, $
  'Filter width 2N+1 must be > 2 and smaller than array dimensions.'


a = double ? DOUBLE(aIn) : FLOAT(aIn)
pl = sig LE 0.          ;true if interactive mode
loop:
IF pl THEN read, 'Type in Sigma (0 to quit) :  ', sig
IF sig EQ 0 THEN goto, endp
IF keyword_set(EXACT) THEN $
  f = lee_filter_exact(a, 2*n+1, Sig, DOUBLE = double, nan = nan, $
                       median = median)  $ $
ELSE f = lee_filter_fast(a, 2*n+1, Sig, DOUBLE = double, nan = nan, $
                         median = median)
IF pl THEN BEGIN
    IF (size(f))[0] eq 1 then $
      PLOT, f, xtitle = 'Element of A', ytitle = 'Value of A', $
            title = 'Lee Filtered A, N ='+string(N, FORMAT = '(I3)')+', Sigma = '+$
            string(Sig, FORMAT = '(F5.2)') else TVSCL, f
    GOTO, loop
ENDIF
endp:   RETURN, f
END