pro spinfit,arr_in_t,arr_in_data,arr_in_sunpulse_t,arr_in_sunpulse_data, $
A,B,C, avg_axis, median_axis,Sigma,Npoints,sun_data, $
min_points=min_points,alpha=alpha,beta=beta, $
plane_dim=plane_dim,axis_dim=axis_dim,phase_mask_starts=phase_mask_starts, $
phase_mask_ends=phase_mask_ends,sun2sensor=sun2sensor
if not keyword_set(alpha) then alpha=1.4 else dprint, alpha
if not keyword_set(beta) then beta = 0.4
if not keyword_set(min_points) then min_points=5
if not keyword_set(phase_mask_starts) then phase_mask_starts=0
if not keyword_set(phase_mask_ends) then phase_mask_ends=-1
if not keyword_set(sun2sensor) then sun2sensor=0
if not keyword_set(plane_dim) then plane_dim=0
if not keyword_set(axis_dim) then axis_dim=0
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
w = where( (arr_in_t ge (-0.5+arr_in_t[ k0-1 ]) ) and (arr_in_t le (0.5+arr_in_t[ k0-1 ]) ), complement = complement )
if complement[0] ne -1 then begin
arr_in_t = temporary( arr_in_t[ complement ] )
arr_in_data = temporary( arr_in_data[ complement, *] )
endif
size_xxx=size(arr_in_t)
if w[0] ne -1 then begin
if w[0] ne 0 then k0=w[0]-1 else k0 = 0
endif
k1=k0+1L
monoton=1b
endif
endwhile
if non_monoton_detected then begin
dprint, '*** WARNING: Non-monotonic time tags detected. 1 s chunks of data discarded until time tags are monotonic, but consult '+ $
'THEMIS software team as to quality of time tags for these data!'
endif
arr_in_sunpulse_t=arr_in_sunpulse_t+sun2sensor*arr_in_sunpulse_data/360
size_xxx=size(arr_in_t)
overlap1=where(arr_in_sunpulse_t ge arr_in_t[0] and arr_in_sunpulse_t le arr_in_t[size_xxx[1]-1])
sizeoverlap=size(overlap1)
dprint, "using axis dimension = ", axis_dim
sigma=dblarr(sizeoverlap[1]-1)
meany=dblarr(sizeoverlap[1]-1)
result=dblarr(3)
A=dblarr(sizeoverlap[1]-1)
B=dblarr(sizeoverlap[1]-1)
C=dblarr(sizeoverlap[1]-1)
sun_data=dblarr(sizeoverlap[1]-1)
avg_axis=dblarr(sizeoverlap[1]-1)
median_axis=dblarr(sizeoverlap[1]-1)
Npoints = ulonarr( sizeoverlap[1]-1 )
i=0L
If(overlap1[0] Eq -1) Then Begin
dprint, 'No good spin model'
Return
Endif
for i=0L, sizeoverlap[1]-2 do begin
overlap = where(arr_in_t gt arr_in_sunpulse_t[overlap1[i]] and $
arr_in_t le arr_in_sunpulse_t[overlap1[i+1]], noverlap)
if noverlap ge min_points then begin
thx_xxx_keepy = arr_in_data[overlap, plane_dim]
thx_xxx_keepz = arr_in_data[overlap, axis_dim]
thx_xxx_keepx = arr_in_t[overlap]
sun_data[i] = (arr_in_sunpulse_t[overlap1[i]]+arr_in_sunpulse_t[overlap1[i+1]])/2
sizemask = size(phase_mask_start)
if max(phase_mask_ends)-min(phase_mask_starts) gt 360 then begin
phase_mask_ends[0] = -1
dprint, "Warning: Phase Mask maxend-minstart > 360. No culling will occur."
endif
if not max(phase_mask_ends)-min(phase_mask_starts) lt 0 then begin
phase = (2*!dPI/arr_in_sunpulse_data[overlap1[i]])*(thx_xxx_keepx[overlap] - arr_in_sunpulse_t[overlap1[i]])
for k = 0, sizemask[1]-1 do begin
mask = where(phase gt phase_mask_starts[k] and phase lt phase_mask_ends[k])
thx_xxx_keepy[mask] = NaN
thx_xxx_keepx[mask] = NaN
thx_xxx_keepz[mask] = NaN
endfor
endif
y = 0
meany[i] = mean(thx_xxx_keepy)
sigma[i] = stddev(thx_xxx_keepy)
nottoss = where(thx_xxx_keepy le meany[i]+sigma[i]*(alpha+beta*y) and thx_xxx_keepy ge meany[i]-sigma[i]*(alpha+beta*y))
If(nottoss[0] Ne -1) Then Begin
sizenottoss = size(nottoss)
sizelap = size(overlap)
thx_xxx_keepy = thx_xxx_keepy[nottoss]
thx_xxx_keepx = thx_xxx_keepx[nottoss]
thx_xxx_keepz = thx_xxx_keepz[nottoss]
repeat begin
overlap = where(thx_xxx_keepx ge arr_in_sunpulse_t[overlap1[i]] and thx_xxx_keepx le arr_in_sunpulse_t[overlap1[i+1]])
y = y+1
meany[i] = mean(thx_xxx_keepy)
sigma[i] = stddev(thx_xxx_keepy)
nottoss = where(thx_xxx_keepy le meany[i]+sigma[i]*(alpha+beta*y) and thx_xxx_keepy ge meany[i]-sigma[i]*(alpha+beta*y))
If(nottoss[0] Ne -1) Then Begin
thx_xxx_keepy = thx_xxx_keepy[nottoss]
thx_xxx_keepx = thx_xxx_keepx[nottoss]
thx_xxx_keepz = thx_xxx_keepz[nottoss]
sizenottoss = size(nottoss)
sizelap = size(overlap)
NPoints[i] = sizenottoss[1]
Endif Else Begin
npoints[i] = 0
sizenottoss = size(nottoss) & sizenottoss[1] = 0
Endelse
endrep until (sizenottoss[1] eq sizelap[1] or sizenottoss[1] le min_points)
avg_axis[i] = mean(thx_xxx_keepz)
median_axis[i] = median(thx_xxx_keepz)
Endif Else npoints[i] = 0
if (Npoints[i] le min_points) then begin
A[i] = 'NaN'
B[i] = 'NaN'
C[i] = 'NaN'
endif else begin
wt = (2*!dPI/arr_in_sunpulse_data[overlap1[i]])*(thx_xxx_keepx[overlap] - arr_in_sunpulse_t[overlap1[i]])
sinwt = sin(wt)
coswt = cos(wt)
totsinwt = total(sinwt)
totcoswt = total(coswt)
sincoswt = sinwt*coswt
totsincoswt = total(sincoswt)
result = la_least_squares([[sizelap[1], totcoswt, totsinwt], [totcoswt, total(coswt^2), totsincoswt], [totsinwt, totsincoswt, total(sinwt^2)]], $
transpose( [ total(thx_xxx_keepy), total(coswt*thx_xxx_keepy), total(sinwt*thx_xxx_keepy) ] ) )
A[i] = result[0]
B[i] = result[1]
C[i] = result[2]
endelse
endif else begin
A[i] = 'NaN'
B[i] = 'NaN'
C[i] = 'NaN'
sun_data[i] = (arr_in_sunpulse_t[overlap1[i]]+arr_in_sunpulse_t[overlap1[i+1]])/2
endelse
endfor
end