;+
; Name: SUPERPO_INTERPOL
;
; 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 interpolates
; at desired sampling rate. An alternative routine exists which does
; not interpolate (see 'superpo_histo').
;
; 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_interpol,'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=600n.0,
;
; superpo_interpol,'thg_mag_????_x',min='thg_pseudoAL', res=30.0
;
; superpo_interpol,'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 less than 1 sec (using IBM PC).
; With res=1.0, the running time is around 1 sec.
;
; Notes:
; Written by Andreas Keiling, 30 July 2007
;
; $LastChangedBy: $
; $LastChangedDate: $
; $LastChangedRevision: $
; $URL $
;-
pro superpo_interpol, 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)
; determine number of interpolation samples
t=timerange()
n_sample = (t[1]-t[0])/res
; declare arrays which will hold the results
min_array=fltarr(n_sample)
max_array=fltarr(n_sample)
dif_array=fltarr(n_sample)
avg_array=fltarr(n_sample)
med_array=fltarr(n_sample)
; create time axis (t) - midpoint of each sample bin
t_sample = t[0]+res*dindgen(n_sample) + res/2D
min_t = t_sample[0]
max_t = t_sample[n_sample-1]
; read and interpolate all tplot variables into array (MxN)
; where M is the number of stations and N is the number of
; interpolated samples
quant_array=fltarr(n_name_array,n_sample)
for i=0,n_name_array-1 do begin
get_data,name_array[i], data=temp
quant_array[i,*] = interpol(temp.y,temp.x,t_sample)
; set values that are out of bound to NaN
min_x=temp.x[0]
max_x=temp.x[n_elements(temp.x)-1]
if min_t lt min_x then begin
i1=where(t_sample lt min_x)
quant_array[i,i1] = !values.f_nan
endif
if max_t gt max_x then begin
i2=where(t_sample gt max_x)
quant_array[i,i2] = !values.f_nan
endif
endfor
;###################################################
; main routine
;###################################################
if (keyword_set(min) OR keyword_set(max) OR keyword_set(dif)) then begin
min_array=min(quant_array,dimension=1,max=max_value,/NAN)
max_array=max_value
dif_array=max_array-min_array
endif
; strangely 'median' function does not allow a /NAN keyword
if keyword_set(med) then med_array=median(quant_array,dimension=1)
d=1 ; strangely 'total' function does not allow dimension keyword, only 2nd argument
if keyword_set(avg) then avg_array=total(quant_array,d,/NAN)/n_name_array
;#######################################################
; create tplot variables
;#######################################################
if keyword_set(min) then store_data,min,data={x:t_sample,y:min_array}
if keyword_set(max) then store_data,max,data={x:t_sample,y:max_array}
if keyword_set(dif) then store_data,dif,data={x:t_sample,y:dif_array}
if keyword_set(avg) then store_data,avg,data={x:t_sample,y:avg_array}
if keyword_set(med) then store_data,med,data={x:t_sample,y:med_array}
end