;+ ; Name: edge_products ; ; Purpose: From a vector of contiguous channel boundaries return the ; commonly used quantities for plotting and scaling. ; ; Category: ; GEN, SPECTRA ; ; Input: Edges -if 1d, contiguous channel boundaries, n+1 values for n channels ; if 2d, 2xn, [lo(i),hi(i)], etc., assumed contiguous for ; calculating edges_1 ; ; Output: ; Mean - arithmetic mean of boundaries ; Gmean - geometric mean ; width - absolute difference between upper and lower edges ; edges_2 - 2xn array of edges [lo(i), hi(i)], etc. ; edges_1 - array of n+1 edges of n contiguous channels ; ; Keyword Input ; EPSILON - If the absolute relative difference is less than epsilon ; then two numbers are considered to be equal and a new bin is not required under ; the contiguous requirement. If epsilon isn't passed but CONTIGOUS is set it ; attempts to construct an epsilon based on the average relative difference between ; adjacent bins, it takes that value and multiplies it by 1e-5 and limits that to ; 1e-6 ; CONTIGUOUS - force all edges to be contiguous, including edges_1 ; ; Mod. History: ; ras, 21-oct-93 ; 8-dec-2001, richard.schwartz@gsfc.nasa.gov, added CONTIGUOUS ; added protection against degenerate entry of single value for edges, ; clearly edges_2 and width have no meaning, but are set to edges and 0.0 respectively ; 25-aug-2006, ras, added epsilon and default epsilon as test ; to differentiate real numbers. If the absolute relative difference is less than epsilon ; then two numbers are considered to be equal and a new bin is not required under ; the contiguous requirement ;- pro edge_products, edges, mean=mean, gmean=gmean, width=width, $ edges_2=edges_2, edges_1=edges_1, contiguous=contiguous, epsilon=epsilon ;Set up defaults for degenerate case of single value width = 0.0 mean = edges gmean = edges edges_2 = edges edges_1 = edges if n_elements( edges ) eq 1 then return dims = size( edges ) if dims(0) eq 2 and dims(1) eq 2 then begin n = dims(2) edges_2 = edges edges_1 = [(edges_2(0,*))(*), edges_2(1,n-1)] endif else begin n = n_elements(edges)-1 edges_2 = reform( transpose( [ [edges(0:n-1)],[edges(1:*)]]),2,n) edges_1 = edges endelse if keyword_set( contiguous ) then begin diff = (f_div(edges[1:*]-edges,edges)) resistant_mean, diff, 2.0, av_diff default, epsilon, av_diff gt 0 ? (av_diff*1e-5 > 1e-6) : 1e-5 edges_1 =get_uniq(edges, epsilon=epsilon) ;edges(uniq( edges, sort(edges))) n = n_elements( edges_1 ) -1 edges_2 = transpose( [ [edges_1(0:n-1)],[edges_1(1:*)]]) endif mean = total( edges_2,1 )/2. gmean = ( ((edges_2(0,*)*edges_2(1,*))>0.0)^0.5 )(*) width = abs(( edges_2(1,*)-edges_2(0,*) )(*)) end