;+ ; Name: SUPERPO_HISTO ; ; Purpose: This routine calculates the minimum (maximum, etc.) function of ; several time series. The time bin (resolution) can be specified. ; An example would be the calculation of AL (AU, AE) indices. The ; results are stored in tplot variables. This routine only uses ; the actual values in the time series; no interpolation is done. ; An alternative routine exists which interpolates ('superpo_interpol'). ; ; Variable: ; ; quantities = string of tplot variable names (e.g., ground stations) ; ; Keywords: ; res = sampling interval (by default 60 sec) ; min = e.g., 'thg_pseudoAL' ; max = e.g., 'thg_pseudoAU ; dif = e.g., 'thg_pseudoAE ; avg = average values ; med = median values ; ; Example: ; superpo_histo,'thg_mag_ccnv_x thg_mag_drby_x thg_mag_fsim_x ; thg_mag_fsmi_x thg_mag_fykn_x', ; min='thg_pseudoAL',avg='thg_avg' ; res=600.0, ; ; superpo_histo,'thg_mag_????_x',min='thg_pseudoAL', res=30.0 ; ; superpo_histo,'thg_mag_????_x' ; default values for all keywords ; ; Speed: ; With an input of magnetometer data from 27 ground stations (178000 data points each) ; and a bin resolution of 60 s (res=60.0), the running time is about 3 sec (using IBM PC). ; With res=1.0, the running time is about 9 sec. ; ; Notes: ; Written by Andreas Keiling, 30 July 2007 ; ; $LastChangedBy: $ ; $LastChangedDate: $ ; $LastChangedRevision: $ ; $URL $ ;- pro superpo_histo, quantities,res=res,min=min,max=max,dif=dif,avg=avg,med=med ;####################################################### ; initialize variables ;####################################################### ; set default names for output quantities if not (keyword_set(min) OR keyword_set(max) OR $ keyword_set(avg) OR keyword_set(dif) OR $ keyword_set(med)) then begin min='minarr' max='maxarr' avg='avgarr' dif='difarr' med='medarr' endif ; set default time resolution if not keyword_set(res) then res = 60d ; 60 sec resolution res=double(res) ; create array (name_array) containing names of input tplot quantities tplot_names,quantities,names=name_array n_name_array=n_elements(name_array) ; look up beginning and end time of interval t=timerange() min_t = t[0] max_t = t[1] ; determine maximum array size (size_y) among all input quantities (which can ; vary in size) and maximum array size (size_r) for the corresponding reversed ; indices, both sizes are needed to create two arrays that can hold ; the data (see below) ; Note: The need for size_y and size_r is because it is not possible to ; have an array (NxM) where the size of M varies for different N. size_y=0.0 size_r=0.0 for s=0,n_name_array-1 do begin ; iterates through all input quantities (e.g., ground stations) get_data,name_array(s),data=temp dummy=histogram(temp.x,min=min_t,max=max_t,binsize=res,reverse_indices=r) n1 = n_elements(temp.y) n2 = n_elements(r) if (n1 gt size_y) then size_y=n1 if (n2 gt size_r) then size_r=n2 endfor ; transfer content of tplot variables onto array ('values') ; on which to operate in the main routine (below) values=fltarr(n_name_array,size_y) r_index=fltarr(n_name_array,size_r) for s=0,n_name_array-1 do begin get_data,name_array(s),data=temp dummy=histogram(temp.x,min=min_t,max=max_t,binsize=res,reverse_indices=r) l1=n_elements(temp.y) l2=n_elements(r) values(s,0:l1-1)=temp.y r_index(s,0:l2-1)=r endfor ; initialize number of bins (n_bins) n_bins = n_elements(dummy) ; declare arrays which will hold the results min_array=fltarr(n_bins) max_array=fltarr(n_bins) dif_array=fltarr(n_bins) avg_array=fltarr(n_bins) med_array=fltarr(n_bins) ; create time axis (t) - midpoint of each time bin t = min_t+res*dindgen(n_bins) + res/2D ;####################################################### ; main routine ;####################################################### for j=0.0,n_bins-1.0 do begin bin_values = [!values.f_nan] for s=0,n_name_array-1 do begin if(r_index[s,j] ne r_index[s,j+1]) then begin ss = r_index[s, r_index[s,j]:r_index[s,j+1]-1] ;subscripts in this time bin bin_values=[bin_values,reform(values(s,ss))] endif endfor if (keyword_set(min) OR keyword_set(max) OR keyword_set(dif)) then begin min_array[j]=min(bin_values,MAX=max_value,/NaN) max_array[j]=max_value dif_array[j]=max_array[j]-min_array[j] endif if keyword_set(avg) then avg_array[j]=total(bin_values,/NaN)/n_elements(bin_values) ; strangely 'median' function does not allow a /NaN keyword if keyword_set(med) then med_array[j]=median(bin_values) endfor ;####################################################### ; create tplot variables ;####################################################### if keyword_set(min) then store_data,min,data={x:t,y:min_array} if keyword_set(max) then store_data,max,data={x:t,y:max_array} if keyword_set(dif) then store_data,dif,data={x:t,y:dif_array} if keyword_set(avg) then store_data,avg,data={x:t,y:avg_array} if keyword_set(med) then store_data,med,data={x:t,y:med_array} end