function cdfx_file_search, pathSpec
if !version.release ge '5.5' then $
return, file_search(pathSpec)
return, findfile(pathSpec)
end
function cdfx_valid_time_range, tr
syntax = '[0-9]{4}(/[0-9]{2}){2} [0-9]{2}(:[0-9]{2}){2}'
return, (tr[0]+tr[1] eq '') or $
(stregex(tr[0], syntax, /boolean) and stregex(tr[1], syntax, /boolean))
end
function cdfx_read_attr, cdfid, varname, attname
error_status = 0
catch, error_status
if error_status ne 0 then $
return, '' $
else $
a = read_myattribute(varname, cdf_attnum(cdfid, attname), cdfid)
return, a.(0)
end
function cdfx_time_range_of_files, fpaths, epoch_vartype=epoch_vartype
rmin = 6.0e13
rmax = 7.0e13
a_rmin=[0]
a_rmax=[0]
for i = 0, n_elements(fpaths)-1 do begin
if not stregex(fpaths[i], '.*_00000000_v[0-9]+[.]cdf$', /boolean, /fold) then begin
cdfid = cdf_open(fpaths[i])
cdf_control, cdfid, set_zmode=2
info = cdf_inquire(cdfid)
found = 0L
for varindex = 0, info.nzvars-1 do begin
varname = (cdf_varinq(cdfid, varindex, /zvar)).name
if stregex(varname, 'range_epoch', /bool, /fold) then begin
found = 1L
epoch = read_myvariable(varname, cdfid, vary, dtype, recs)
cdf_control,CDFid,VAR=varname,GET_VAR_INFO=vinfo2
if (vinfo2.maxrec ne -1) then begin
emin = epoch[0]
emax = epoch[n_elements(epoch)-1]
endif
if ((i eq 0) and (emax ge emin)) then begin
a_rmin = emin
a_rmax = emax
endif else begin
a_rmin = min([rmin, emin])
a_rmax = max([rmax, emax])
endelse
endif
endfor
if (not found) then begin
for varindex = 0, info.nzvars-1 do begin
varinfo = cdf_varinq(cdfid, varindex, /zvar)
varname = varinfo.name
vartype = varinfo.datatype
varys = varinfo.recvar
if ((stregex(vartype, 'cdf_epoch', /bool, /fold)) or $
(stregex(vartype, 'cdf_epoch16', /bool, /fold)) or $
(stregex(vartype, 'cdf_time_tt2000', /bool, /fold)) $
and (varys eq 'VARY')) then begin
epoch_vartype=vartype
epoch = read_myvariable(varname, cdfid, vary, dtype, recs)
cdf_control,CDFid,VAR=varname,GET_VAR_INFO=vinfo2
if (vinfo2.maxrec ne -1) then begin
emin = epoch[0]
emax = epoch[n_elements(epoch)-1]
endif
if ((i eq 0) and (emax ge emin)) then begin
rmin = emin
rmax = emax
a_rmin = [a_rmin,rmin]
a_rmax = [a_rmax,rmax]
endif else begin
if (!version.release ge '6.2') then begin
if (size(emin,/tname) eq 'DCOMPLEX')then begin
if (cdf_epoch_compare(rmin, emin) ge 0) then rmin = emin
if (cdf_epoch_compare(emax, rmax) ge 0) then rmax = emax
a_rmin = [a_rmin,rmin]
a_rmax = [a_rmax,rmax]
endif else begin
rmin = min([rmin, emin])
rmax = max([rmax, emax])
a_rmin = [a_rmin, rmin]
a_rmax = [a_rmax, rmax]
endelse
endif else begin
rmin = min([rmin, emin])
rmax = max([rmax, emax])
a_rmin = [a_rmin,rmin]
a_rmax = [a_rmax,rmax]
endelse
endelse
endif
endfor
endif
found = 0L
cdf_close, cdfid
endif
endfor
if n_elements(a_rmin) gt 1 then rmin=min(a_rmin[1:*]) else rmin=a_rmin
if n_elements(a_rmax) gt 1 then rmax=max(a_rmax[1:*]) else rmax=a_rmax
return, [rmin, rmax]
end
pro cdfx_separate_cdfs, fpaths, cpaths=cpaths, mpaths=mpaths
common cdfxcom, CDFxwindows, CDFxprefs
cpaths = ['']
mpaths = ['']
for i = 0, n_elements(fpaths)-1 do begin
fpath = fpaths[i]
if not stregex(fpath, '.*_00000000_v[0-9]+[.]cdf$', /boolean, /fold) then begin
cpaths = [cpaths, fpath]
if (strupcase(!version.os_family) eq 'UNIX' or $
strupcase(!version.os_family) eq 'MACOS') then $
delim = strpos(fpath, '/',/reverse_search) else $
delim = strpos(fpath, '\',/reverse_search)
dname = strmid(fpath,0,delim+1)
fname = strmid(fpath,delim+1, strlen(fpath))
split = strsplit(fname, '_', /extract)
split[n_elements(split)-2] = '00000000'
split[n_elements(split)-1] = 'v*.cdf'
mname = strjoin(split, '_', /single)
fpath = cdfx_file_search("{./," + dname + "," + $
CDFxprefs.masters_path + "/}" + mname)
if (size(fpath))[0] ne 0 then $
mpaths = [mpaths, fpath[0]]
endif
endfor
if n_elements(cpaths) gt 1 then $
cpaths = cpaths[1:*]
if n_elements(mpaths) gt 1 then $
mpaths = cdfx_uniq_sort(mpaths[1:*])
end
function cdfx_files_compatible, cpaths
n = n_elements(cpaths)
if n lt 2 then return, 1
id0 = cdf_open(cpaths[0])
cdf_control, id0, set_zmode=2
for i = 1, n-1 do begin
id = cdf_open(cpaths[i])
cdf_control, id, set_zmode=2
match = compare_mycdfs(id, id0)
cdf_close, id
if not match then begin
cdf_close, id0
return, 0
endif
endfor
cdf_close, id0
return, 1
end
pro cdfx_refine_open_event, event
widget_control, event.top, get_uvalue=info
widget_control, (*info).list, get_value=bvals
case event.id of
(*info).bSelectAll: begin
bvals[*] = 1
widget_control, (*info).list, set_value=bvals
end
(*info).bUnselectAll: begin
bvals[*] = 0
widget_control, (*info).list, set_value=bvals
end
(*info).bCancel: begin
widget_control, event.top, /destroy
end
(*info).bProceed: begin
widget_control, (*info).tstart, get_value=tstart
widget_control, (*info).tstop, get_value=tstop
trange = [tstart[0], tstop[0]]
w = where(bvals eq 1, wc)
if not cdfx_valid_time_range(trange) then $
resp = dialog_message(/error, "Invalid syntax in time fields!") $
else if wc lt 1 then $
resp = dialog_message(/error, 'No variables selected!') $
else begin
(*info).selection = bvals
(*info).trange = trange
widget_control, event.top, /destroy
endelse
end
else :
endcase
end
function cdfx_opencdfs,gleader=gleader
common cdfxcom, CDFxwindows, CDFxprefs
CATCH,error_status
if (error_status ne 0) then begin
print,'Error: ',!error_state.msg
endif
paths = dialog_pickfile(title='Choose CDF(s)',/multiple, $
path=CDFxprefs.cdf_path,get_path=thispath)
CDFxprefs.cdf_path=thispath
if paths[0] eq '' then $
return, -1
if !version.release ge '6' then $
if file_test(paths[0], /directory) then $
return, -1
cdfx_separate_cdfs, paths, cpaths=cpaths, mpaths=mpaths
if n_elements(cpaths) lt 1 then begin
resp = dialog_message(/error, 'No CDF data files selected!')
return, -1
endif
if not cdfx_files_compatible(cpaths) then begin
resp = dialog_message(/error, $
'The selected data files are not structurally compatible!')
return, -1
endif
cdfid = cdf_open(cpaths[0])
mcdfid = -1
vnames = get_allvarnames(cdfid=cdfid)
if mpaths[0] ne '' then begin
mcdfid = cdf_open(mpaths[0])
vnames = [vnames, get_allvarnames(cdfid=mcdfid)]
endif else $
resp = dialog_message(/info, 'No CDF master files found.')
vnames = cdfx_uniq_sort(vnames)
new_vnames = ['']
tmp_vlist = ['']
fname=['']
!quiet = 1
for i=0, n_elements(vnames)-1 do begin
vname = vnames[i]
if mcdfid ne -1 then vtype = cdfx_read_attr(mcdfid, vname, 'VAR_TYPE') else $
vtype = cdfx_read_attr(cdfid, vname, 'VAR_TYPE')
if vtype eq 'data' then begin
tmp_vlist = [tmp_vlist, vname]
new_vnames = [new_vnames, vname]
if mcdfid ne -1 then tmp_fname = cdfx_read_attr(mcdfid, vname, 'CATDESC') + ' (M)' else tmp_fname = cdfx_read_attr(cdfid, vname, 'CATDESC')
fname=[fname,tmp_fname]
endif
endfor
fname=fname[1:*]
tmp_vlist=tmp_vlist[1:*]
vlist=''
thisformat='(a-'+strtrim(max(strlen(fname)),2) + ',3x,a-'+strtrim(max(strlen(tmp_vlist)),2)+')'
for i=0,n_elements(tmp_vlist)-1 do begin
vlist = [vlist, string(format=thisformat, fname[i],+'('+tmp_vlist[i])+')']
endfor
vlist = vlist[1:*]
vnames = new_vnames[1:*]
!quiet = 0
total_vnames = n_elements(new_vnames)-1
cdf_close, cdfid
if mcdfid ne -1 then $
cdf_close, mcdfid
if n_elements(vlist) lt 2 then begin
resp = dialog_message(/error, $
"No data or support variables were found in the chosen CDF file(s). The files are probably not ISTP-compliant.")
return, -1
endif
nvars = n_elements(vlist)
trange = cdfx_time_range_of_files(cpaths,epoch_vartype=epoch_vartype)
tstart = cdfx_time_string_of_epoch(trange[0])
tstop = cdfx_time_string_of_epoch(trange[1])
base = widget_base(/column, title='Select Variables and Time Interval', /frame,$
group_leader=gleader,/modal)
base1 = widget_base(base, /column, /frame)
base3 = widget_base(base, /row)
base4 = widget_base(base3, /column, /frame)
base2 = widget_base(base3, /column, /frame)
w = widget_label(base4, value='Time Interval')
w = widget_label(base4, value='(Format: YYYY/MM/DD hh:mm:ss.mmm)')
bstart = widget_base(base4, /row)
lstart = widget_label(bstart, value='Start time:')
bstop = widget_base(base4, /row)
lstop = widget_label(bstop, value='Stop time: ')
info = ptr_new({$
selection:lonarr(nvars), $
trange:["",""], $
list:cw_bgroup(base1, vlist, /nonexclusive, scroll=(nvars>20), $
set_value = lonarr(nvars), $
label_top = strtrim(string(nvars), 2) + ' Variables', $
y_scroll = (20 * !d.y_ch_size), $
x_scroll = (max(strlen(vlist)) * !d.x_ch_size)>(95 * !d.x_ch_size)), $
tStart: widget_text(bstart, value=tstart, xsize=23, /editable), $
tStop: widget_text(bstop , value=tstop , xsize=23, /editable), $
bProceed: widget_button(base2, value='Proceed'), $
bSelectAll: widget_button(base2, value='Select All'), $
bUnselectAll: widget_button(base2, value='Unselect All'), $
bCancel: widget_button(base2, value='Cancel') })
widget_control, base, /realize, set_uvalue=info
xmanager, 'cdfx_refine_open', base
w = where((*info).selection eq 1, wc)
a = -1
if wc gt 0 then begin
tstart = ((*info).trange)[0]
tstop = ((*info).trange)[1]
widget_control, /hourglass
if mpaths[0] eq '' then $
allpaths = cpaths $
else $
allpaths = [mpaths, cpaths]
if tstart eq "" or tstop eq "" then begin
if (total_vnames eq n_elements(vnames[w])) then $
a = read_mycdf(' ', allpaths, /nodatastruct, ALL=2) else $
a = read_mycdf(vnames[w], allpaths, /nodatastruct)
endif else begin
split=strsplit(tstart,':',/extract)
split=strsplit(split[2],'.',/extract)
if split[1] ne '' then begin
startmsec=strmid(split[1],0,3)
startusec=strmid(split[1],3,3)
startnsec=strmid(split[1],6,3)
startpsec=strmid(split[1],9,3)
endif
split=strsplit(tstop,':',/extract)
split=strsplit(split[2],'.',/extract)
if split[1] ne '' then begin
stopmsec=strmid(split[1],0,3)+1
stopusec=strmid(split[1],3,3)
stopnsec=strmid(split[1],6,3)
stoppsec=strmid(split[1],9,3)
endif
if (total_vnames eq n_elements(vnames[w]))then $
a = read_mycdf(' ', allpaths, /nodatastruct, ALL=2, $
tstart=tstart, tstop=tstop, start_msec=startmsec,stop_msec=stopmsec, start_usec=startusec,stop_usec=stopusec,$
start_nsec=startnsec,stop_nsec=stopnsec, start_psec=startpsec,stop_psec=stoppsec) else $
a = read_mycdf(vnames[w], allpaths, /nodatastruct, $
tstart=tstart, tstop=tstop, start_msec=startmsec,stop_msec=stopmsec, start_usec=startusec,stop_usec=stopusec,$
start_nsec=startnsec,stop_nsec=stopnsec, start_psec=startpsec,stop_psec=stoppsec)
endelse
endif
ptr_free, info
return, a
end