;+------------------------------------------------------------------------ ; NAME: semiMinMax ; PURPOSE: For array y, return min and max values within 3 standard ; deviations from the mean ; CALLING SEQUENCE: ; semiMinMax, y, ymin, ymax ; INPUTS: ; y = array of 4 or more elements ; KEYWORD PARAMETERS: ; MODIFIED = use modified sigma which uses kurt. & skew. ; results in a more liberal acceptance of data ; OUTPUTS: ; ymin = minimum value within 3 stdev's of mean ; ymax = maximum value within 3 stdev's of mean ; AUTHOR: ? ; MODIFICATION HISTORY: ; 10/96 R.Baldwin; replaced stdev w/ moment ; 03/99 R.Baldwin; added MODIFIED keyword ; ;Copyright 1996-2013 United States Government as represented by the ;Administrator of the National Aeronautics and Space Administration. ;All Rights Reserved. ; ;------------------------------------------------------------------ ; pro semiMinMax, y , ymin, ymax, MODIFIED=MODIFIED ;TJK modified on 12/18/2000 to put in a check so that ymin and ymax will never ;be adjusted any high/lower than what they start out as. This modification ;was requested by Bob, because of the new IMAGE data. ;TJK modified again on 1/10/2001 to check if ymin, ymax are actually defined ;since it looks like plottypes, except the image ones, do not have these set ;before entering this routine. if (n_elements(ymin) eq 0) then minmax_flag = 0 else minmax_flag = 1 if (minmax_flag) then begin orig_min = ymin orig_max = ymax endif if keyword_set(MODIFIED) then mod_flag=1L else mod_flag=0L if (n_elements(y) lt 3) then begin message, 'Not enough points in array', /info if (n_elements(y) lt 2) then begin Ymin = -1. & Ymax = -1. endif else Ymin = min(y, max=Ymax); 2 points only return endif Ymin = min(y, max=Ymax) ;TJK added check on 12/18/2000 if (minmax_flag) then begin if (ymin lt orig_min) then ymin = orig_min if (ymax gt orig_max) then ymax = orig_max endif if(Ymin eq Ymax) then return ;Avoid call to MOMENT where Std. Dev.=0 ;as = stdev(y, mean) ;RTB replaced w/ moment res=moment(y,sdev=as) if(mod_flag) then begin ; Calculate Modified sigma taking into account the skewness and kurtosis ; of the distribution as=res[1]*(1.+res[2]-0.01*(res[3]-3)) as=sqrt(abs(as)) endif mean=res[0] w = where(abs(y-mean) lt 3.*as, wc) ; use only points within 3 standard ; deviations of the mean if (wc gt 0) then begin ;print, 'time before for loop = ',systime() ; Ymin = y(w(0)) & Ymax = y(w(0)) ;initialize ; for i = 1L, wc-1 do begin ; if (y(w(i)) lt Ymin) then Ymin = y(w(i)) ; if (y(w(i)) gt Ymax) then Ymax = y(w(i)) ; endfor ;print, 'time after for loop = ',systime() Ymin = min(y[w], max=Ymax) endif ; else begin ; Ymin = min(y, max=Ymax) ;endelse ;print, Ymin, Ymax ;TJK added check on 12/18/2000 if (minmax_flag) then begin if (ymin lt orig_min) then ymin = orig_min if (ymax gt orig_max) then ymax = orig_max endif return end ; semiMinMax