Function tmp_outlier_reject, x0, alpha, beta, min_points, sigma, nkeep, x_out = x
keep0 = where(finite(x0))
If(keep0[0] Ne -1) Then x = x0[keep0] Else Begin
sigma = 0.0
Return, !values.d_nan
Endelse
y = 0
xbar = mean(x)
sigma = stddev(x)
keep = where(abs(x-xbar) le sigma*(alpha+beta*y), nkeep)
If(nkeep Le min_points) Then Begin
sigma = 0.0
Return, !values.d_nan
Endif Else If(nkeep Eq n_elements(x)) Then Return, xbar
x = x[keep]
Repeat Begin
y = y+1
xbar = mean(x)
sigma = stddev(x)
keep = where(abs(x-xbar) le sigma*(alpha+beta*y), nkeep)
nx = n_elements(x)
If(nkeep Le min_points) Then Begin
sigma = 0.0
Return, !values.d_nan
Endif Else If(nkeep Eq nx) Then Return, xbar
Endrep Until (nkeep Eq nx or nkeep le min_points)
If(nkeep Le min_points) Then Begin
sigma = 0.0
Return, !values.d_nan
Endif Else If(nkeep Eq nx) Then Return, xbar
End
pro spinavg, arr_in_t, arr_in_data, arr_in_spin_t, $
arr_out_data, arr_out_sigma, npoints, sun_data, $
min_points = min_points, alpha = alpha, beta = beta, _extra = _extra
if not keyword_set(alpha) then alpha = 1.4
if not keyword_set(beta) then beta = 0.4
if not keyword_set(min_points) then min_points = 5
size_xxx = size(arr_in_t)
monoton = 1b
non_monoton_detected = 0b
k0 = 0L
k1 = k0+1L
while monoton && ( k1 le size_xxx[1]-1 ) do begin
if (arr_in_t[ k1++ ] - arr_in_t[ k0++ ] lt 0) then begin
non_monoton_detected = 1b
monoton = 0b
endif
endwhile
if non_monoton_detected then begin
dprint, '*** WARNING: Non-monotonic time tags detected. Sorting data'
ss_sort = bsort(arr_in_t)
arr_in_t = arr_in_t[ss_sort]
arr_in_data = arr_in_data[ss_sort, *]
endif
size_xxx = size(arr_in_t)
overlap1 = where(arr_in_spin_t ge arr_in_t[0] and arr_in_spin_t le arr_in_t[size_xxx[1]-1])
sizeoverlap = size(overlap1)
ncomp = n_elements(arr_in_data[0, *])
arr_out_data = dblarr(sizeoverlap[1]-1, ncomp)+!values.d_nan
arr_out_sigma = arr_out_data
sun_data = 0.5*(arr_in_spin_t[overlap1[1:*]]+arr_in_spin_t[overlap1])
Npoints = lonarr(sizeoverlap[1]-1, ncomp)
i = 0L
j = (where(arr_in_t ge arr_in_spin_t[overlap1[i]] and arr_in_t le arr_in_spin_t[overlap1[i+1]]))[0]
for i = 0L, sizeoverlap[1]-2 do begin
overlap = j
while ( j lt size_xxx[1] ) && ( arr_in_t[j] le arr_in_spin_t[overlap1[i+1]] ) do begin
overlap = [ overlap, j ]
++j
endwhile
if n_elements( overlap ) gt 1 then overlap = temporary( overlap[1:*] )
if n_elements(overlap) ge min_points then begin
thx_xxx_keepx = arr_in_t[overlap]
for k = 0, ncomp-1 do begin
arr_out_data[i, k] = tmp_outlier_reject(arr_in_data[overlap, k], alpha, beta, min_points, sigma, npts)
arr_out_sigma[i, k] = sigma
npoints[i, k] = npts
endfor
endif
endfor
end
pro thm_spinavg, var_name_in, sigma = sigma, npoints = npoints, $
spin_frac_offset = spin_frac_offset, absv = absv, $
_extra = _extra
vn = tnames(var_name_in)
If(is_string(vn) Eq 0) Then Begin
dprint, 'No variable: '+var_name_in
Return
Endif
If(keyword_set(spin_frac_offset)) Then Begin
sp0 = spin_frac_offset
Endif Else sp0 = 0.0
nvn = n_elements(vn)
For i = 0, nvn-1 Do Begin
probe = strmid(vn[i], 2, 1)
thx = 'th'+probe[0]
get_data, vn[i], data = thx_xxx_in, dl = dl
tri = minmax(thx_xxx_in.x)
get_data, 'th'+probe[0]+'_state_spinper', data = thx_spinper
If(is_struct(thx_spinper) Eq 0) Then Begin
thm_load_state, probe = probe[0], /get_support_data, trange = tri
get_data, 'th'+probe[0]+'_state_spinper', data = thx_spinper
Endif
If(is_struct(thx_spinper) Eq 0) Then Begin
dprint, 'No Spin Period Available: '+vn[i]
Continue
Endif
ok_spin = where(finite(thx_spinper.y))
If(ok_spin[0] Eq -1) Then begin
dprint, 'No Spin Period Available: '+vn[i]
Continue
Endif
av_spinper = mean(thx_spinper.y[ok_spin])
nspins = ceil((tri[1]-tri[0])/av_spinper)
spin_times = tri[0]+av_spinper*dindgen(nspins+1)
If(keyword_set(absv)) Then Begin
spinavg, thx_xxx_in.x+sp0*av_spinper, abs(thx_xxx_in.y), spin_times, $
d, s, n, spin_midpoint, _extra = _extra
Endif Else Begin
spinavg, thx_xxx_in.x+sp0*av_spinper, thx_xxx_in.y, spin_times, $
d, s, n, spin_midpoint, _extra = _extra
Endelse
store_data, vn[i]+'_spinavg', data = {x:spin_midpoint, y:d}, dl = dl
If keyword_set(sigma) Then store_data, vn[i]+'_spinavg_sig', data = {x:spin_midpoint, y:s}, dl = dl
If keyword_set(Npoints) Then store_data, vn[i]+'_spinavg_npoints', data = {x:spin_midpoint, y:n}, dl = dl
Endfor
End