function spd_ui_pwrspc_check_time, time, tbegin, tend
compile_opt idl2, hidden
if keyword_set(tend) then begin
t2 = tend
endif else begin
t2 = time[n_elements(time)-1]
endelse
if keyword_set(tbegin) then begin
t1 = tbegin
endif else begin
t1 = time[0]
endelse
igood = where((time ge t1) and (time le t2), jgood)
if (jgood gt 0) then return, 1 else return, 0
end
pro spd_ui_pwrspc, options,invars, loadedData, historyWin, statusBar,guiID, $
fail=totalfail, overwrite_selections = overwrite_selections, $
replay = replay
compile_opt idl2
err = 0
catch, err
If(err Ne 0) Then Begin
catch, /cancel
Help, /Last_Message, Output=err_msg
if obj_valid(historywin) then historywin -> update, err_msg
ok = error_message(traceback = 1, /noname, title = 'Error in SPD_UI_PWRSPC: ')
totalfail = 1
return
Endif
totalfail=1
fail=0
add_names = ''
overwrite_selection = ''
overwrite_count = 0
if undefined(replay) then overwrite_selections = ''
active_v = invars
nav = n_elements(active_v)
for i=0, nav-1 do begin
varname = active_v[i]
loadedData->getvardata, name=varname, time=t, data=d, limits=l, dlimits=dl
sd = size(*d, /n_dim)
ncomp = n_elements((*d)[0, *])
if (sd gt 2) then begin
mess = varname + ': data has too many dimensions and will not be processed.'
statusBar->update, mess
historyWin->update, 'SPD_UI_PWRSPC: ' + mess
yes_data = 0b
fail = 1
endif else yes_data = 1b
if yes_data then begin
tsuccess = spd_ui_pwrspc_check_time(*t, options.tbegin[0], options.tend[0])
if options.dynamic[0] AND ~tsuccess then begin
mess = varname + ': No data in time range. Moving on to next active variable.'
statusBar->update, mess
historyWin->update, 'SPD_UI_PWRSPC: ' + mess
fail = 1
continue
endif
case ncomp of
1: dsuffix = ''
3: if keyword_set(polar) then dsuffix = ['_mag','_th','_phi'] $
else dsuffix = ['_x','_y','_z']
else: dsuffix = '_' + strtrim(lindgen(ncomp),2)
endcase
for j=0, ncomp-1 do begin
if ptr_valid(l) then limit = *l else limit = 0
if ptr_valid(dl) then dlimit = *dl else dlimit = 0
tpts = n_elements(*t)
nanidx = where(finite((*d)[*,j]),c)
if c gt 0 && c lt tpts && ~options.scrubnans then begin
message = 'NaNs found in ' + varname + ' component ' + strtrim(j, 2) + '. May cause gaps in Power Spectrum. Degap or Scrub to eliminate errors.'
statusBar -> update, message
historywin -> update, message
warnNaNs = 1
endif
if c eq 0 then begin
message = 'All NaNs found in ' + varname + ' component ' + strtrim(j,2) + '. No Power Spectrum performed for this component'
statusBar -> update, message
historywin -> update, message
warnNaNs = 1
fail = 1
continue
endif
if options.dynamic[0] then begin
nspectra = long((tpts-options.nboxpoints[0]/2l)/options.nshiftpoints[0])
if(nspectra le 0) then begin
mess = 'Window Size too small for ' + varname + dsuffix[j] + ', and it will not be processed.'
statusBar->update, mess
historyWin->update, 'SPD_UI_PWRSPC: ' + mess
fail = 1
continue
endif
if c lt tpts && options.scrubnans then begin
message = 'Scrubbing NaNs from ' + varname + ' component ' + strtrim(j,2) + '.'
statusBar->update,message
historywin->update,message
dpwrspc, (*t)[nanidx], (*d)[nanidx,j], tps, fdps, dps, nboxpoints=options.nboxpoints[0], $
nshiftpoints=options.nshiftpoints[0], bin=options.bins[0], $
tbegin=options.tbegin[0], tend=options.tend[0], noline=options.noline[0], $
nohanning=options.nohanning[0], notperhz=options.notperhz[0],fail=specfail
endif else begin
dpwrspc, *t, (*d)[*,j], tps, fdps, dps, nboxpoints=options.nboxpoints[0], $
nshiftpoints=options.nshiftpoints[0], bin=options.bins[0], $
tbegin=options.tbegin[0], tend=options.tend[0], noline=options.noline[0], $
nohanning=options.nohanning[0], notperhz=options.notperhz[0],fail=specfail
endelse
if specfail then begin
fail = 1
continue
endif
specdata = {x:temporary(tps), y:temporary(dps), v:temporary(fdps)}
isspect=1
if in_set('xlog', strlowcase(tag_names(dlimit))) then dlimit.xlog = 0 $
else str_element, dlimit, 'xlog', 0, /add
endif else begin
if c lt tpts && options.scrubnans then begin
message = 'Scrubbing NaNs from ' + varname + ' component ' + strtrim(j,2) + '.'
statusBar->update,message
historywin->update,message
pwrspc, (*t)[nanidx], (*d)[nanidx,j], freq, power, noline=options.noline[0], $
nohanning=options.nohanning[0], bin=options.bins[0], $
notperhz=options.notperhz[0], err_msg=pwrspc_err_msg
endif else begin
pwrspc, *t, (*d)[*,j], freq, power, noline=options.noline[0], $
nohanning=options.nohanning[0], bin=options.bins[0], $
notperhz=options.notperhz[0], err_msg=pwrspc_err_msg
endelse
if ~array_equal(pwrspc_err_msg,'', /no_typeconv) then begin
historyWin->update, ['SPD_UI_PWRSPC: Error with '+varname+': ', $
' '+pwrspc_err_msg]
statusBar->update, ['Error with '+varname+': '+pwrspc_err_msg]
fail=1
endif
avg_time = (dblarr(n_elements(freq)) + 1) * mean(*t, /double)
specdata = {x:avg_time, y:temporary(power)}
freqdata = {x:avg_time, y:temporary(freq)}
isspect=0
str_element, dlimit, 'xlog', 1, /add
endelse
str_element, dlimit, 'ylog', 1, /add
str_element, dlimit, 'zlog', 1, /add
str_element,dlimit,'labels',value=labels,success=s
if s && n_elements(labels) eq ncomp then begin
str_element,dlimit,'labels',[dlimit.labels[j]],/add
endif
str_element,dlimit,'colors',value=colors,success=s
if s && n_elements(colors) eq ncomp then begin
str_element,dlimit,'colors',[dlimit.colors[j]],/add
endif
if options.suffix[0] eq '' then options.suffix[0] = '_pwr'
specname = varname + dsuffix[j] + options.suffix[0]
freqname = specname + '_freq'
spd_ui_check_overwrite_data,specname,loadedData,guiId,statusBar,historyWin,overwrite_selection,overwrite_count,$
replay=replay,overwrite_selections=overwrite_selections
if strmid(overwrite_selection, 0, 2) eq 'no' then continue
if options.dynamic[0] then begin
success = loadedData->addData(specname, specdata, limit=limit, $
dlimit=dlimit, isspect=isspect)
if success then add_names=[add_names, specname]
endif else begin
success = loadedData->addData(specname, specdata, limit=limit, $
dlimit=dlimit, isspect=isspect, indepName=freqname)
if success then add_names=[add_names, specname]
spd_ui_check_overwrite_data,freqname,loadedData,guiId,statusBar,historyWin,overwrite_selection,overwrite_count,$
replay=replay,overwrite_selections=overwrite_selections
if strmid(overwrite_selection, 0, 2) eq 'no' then continue
success2 = loadedData->addData(freqname, freqdata, limit=limit, dlimit=dlimit, isspect=isspect)
if success2 then add_names=[add_names, freqname]
endelse
endfor
if ~array_equal(add_names, '') then begin
totalfail = 0
loadedData->clearAllActive
for j=1, n_elements(add_names)-1 do loadedData->setActive, add_names[j]
endif
endif
endfor
if fail then begin
mess = 'Some quantities may not have been processed. Check History window.'
statusBar->update, mess
endif else if keyword_set(warnnans) then begin
message = 'Processing Successful, but NaNs in data may cause gaps in output. Check History for more detail.'
statusBar->update, message
endif else begin
mess = 'Spectra creation successful.'
statusBar->update, mess
endelse
end