FUNCTION lmode, data_in
   
; Naive script to determine the mode, only take the first 
; in case of double-valued result...
   
    l=where(finite(data_in) ne 0,c)
    if c eq 0 then return,0 else data=data_in(l)
   hist = histogram(data) 
   ifin = n_elements(hist)
   xvals = findgen(ifin)+min(data)+0.5
   xvals = xvals(where(hist eq max(hist)))
   return, xvals(0)
   
END 

PRO literstat, data, out, nsigrej=nsigrej,$
               maxiter=maxiter, lower=lower, upper=upper, silent=silent
   
; Program based on dimsum's iterstat:
; Created lam98jan18ucb
; 
; Converted to idl, and made output into a structure.
; 
; procedure iterstat(image)
; 
; # Script to find image statistics excluding deviant pixels
; # 4 August 1992 by John Ward
; # Minor modifications 4 August 1992 MD
; # Various subsequent variations.
; # Latest revision:  18 Aug 1993 MD
;
   
   IF n_params() LE 0 THEN BEGIN 
      print,' '
      print,'literstat, data, out, [nsigrej=], [maxiter=],'
      print,'           [lower=], [upper=], [silent]'
      print,' '
      print,'  N.b. -- The output array ''out'' is a structure:'
      print,'    out.NPIX .MEAN .MEDIAN .SIGMA .MODE .MIN .MAX'
      print,' '
      return 
   ENDIF 
   
   out =  create_struct('Npix',0.,$
                        'Mean',0.,$
                        'Median',0.,$
                        'Sigma',0.,$
                        'Mode',0.,$
                        'min',0.,$
                        'max',0.)
   
   IF keyword_set(nsigrej) EQ 0. THEN nsigrej=5. ; N * sigma for limits
   IF keyword_set(maxiter) EQ 0  THEN maxiter=10 ; Max # of iterations
   IF NOT keyword_set(lower) THEN lower=min(data)
   IF NOT keyword_set(upper) THEN upper=max(data)
   
   data = float(data)           ; Verify that data are floated
   sz = size(data)
   npx = sz(n_elements(sz)-1)   ; Number of relevant pixels
;   lind = lindgen(npx)
   lind = where(data GE lower AND data LE upper,count)
   if count eq 0 then lind=indgen(n_elements(data))
;;;   data = data(lind)
;    IF n_elements(where(finite(data) EQ 1)) NE n_elements(data) THEN BEGIN 
;       print,'There are NaNs in the array'
;       lind = where(finite(data) EQ 1)
;    ENDIF 
   mn  =  mean  (data(lind))    ; Mean
   sig =  stdev (data(lind))    ; Standard Deviation
   med =  median(data(lind))    ; Median
   mde =  lmode (data(lind))    ; Mode, cf 'lmode' below
   IF NOT keyword_set(silent) THEN print, ' '
   IF NOT keyword_set(silent) THEN print,'    Iter       Npix        Mean         Sigma        Median       Mode'

   Tpx =  0
   m = 1
   WHILE (m LE maxiter AND Tpx NE npx) DO BEGIN 
      npx = Tpx
      ll =  mn - (nsigrej*sig)
      ul =  mn + (nsigrej*sig)
      IF (ll NE min(data(lind)) AND ll LE lower) THEN ll=lower
      IF (ul NE max(data(lind)) AND ul GE upper) THEN ul=upper
      lind = where(data GE ll AND data LE ul)
      IF total(lind) EQ -1 THEN BEGIN 
         print,'Error -- all the pixels masked...'
         return
      ENDIF 
      Tpx =  n_elements(lind)   ; Number of relevant pixels
      mn  =  mean  (data(lind)) ; Mean
      sig =  stdev (data(lind)) ; Standard Deviation
      med =  median(data(lind)) ; Median
      mde =  lmode (data(lind)) ; Mode, cf 'lmode' below
      IF NOT keyword_set(silent) THEN print,m,tpx,mn,sig,med,mde
      m = m+1
   ENDWHILE 
   
   IF NOT keyword_set(silent) THEN print, ' '
   
   out.npix = npx
   out.mean = mn
   out.median = med
   out.sigma = sig
   out.mode = mde
   out.min = ll
   out.max = ul
   
   IF NOT keyword_set(silent) THEN help,/structure,out
   
END 
