;+
;Procedure: THM_LOAD_PROC_ARG
;
;Purpose: Generic argument validation routine for THEMIS Data File Loading
; routines, meant to be called by
; instrument-specific thm_load procedures.
;
;keywords:
; post_process_proc: name of procedure to call after cdf2tplot is called
; will be called w/ keywords sname, dt (datatype), lvl,
; and _extra.
; relpath_funct: name of routine to call in place of file_dailynames
; may simply be a wrapper.
; will be called w/ keywords sname, dt (datatype), lvl,
; and _extra.
; cdf_to_tplot: user-supplied procedure to override cdf2tplot
; sname = site or probe name. The default is 'all',
; type_sname = string, set to 'probe' or 'site'
; vsnames = space-separated list of valid probes/sites
; datatype = Can be any datatype from the list of valid datatypes
; or 'all'
; vdatatypes = space-separated list of valid data types
; file_vdatatypes = space-separated list of file types corresponding to each
; valid data type. If there is a one-to-one correpspondence
; between filetype and datatype, vfiletypes may be left undefined.
; If all datatypes are in a single file, then vfiltypes may contain
; a single name, rather than a list.
; vL2datatypes= space-separated list of datatypes valid for L2 data
; vL2coord= space-separated list of coordinates valid for L2 data
; file_vL2datatypes=same as file_vdatatypes, but for L2 data. Defaults to
; value of file_vdatatypes.
; TRANGE= (Optional) Time range of interest (2 element array), if
; this is not set, the default is to prompt the user. Note
; that if the input time range is not a full day, a full
; day's data is loaded
; level = the level of the data, the default is 'l1', or level-1
; data. A string (e.g., 'l2') or an integer can be used. 'all'
; can be passed in also, to get all levels.
; vlevels=A space-separated list of valid levels, e.g. 'l1 l2'
; proc_type = the type of data, i.e. 'raw' or 'calibrated'. This is
; for validating the 'type' keyword to thm_load procs.
; vtypes =A space-separated list of valid types, e.g. 'raw calibrated'
; No validation on proc_type if not set.
; deftype = default for type. only applied to L1. If not supplied,
; then 'calibrated' will be uses as the default value.
; CDF_DATA: named variable in which to return cdf data structure: only works
; for a single spacecraft and datafile name.
; VARNAMES: names of variables to load from cdf: default is all.
; /GET_SUPPORT_DATA: load support_data variables as well as data variables
; into tplot variables.
; /NO_UPDATE: prevent contact to server if local file already exists.
; /valid_names, if set, then this routine will return the valid probe, datatype
; and/or level options in named variables supplied as
; arguments to the corresponding keywords.
; files named varible for output of pathnames of local files.
; /VERBOSE set to output some useful info
; msg_out: A named variable to output an array of error messages
; which can be printed to the console later when they
; will be more visible to the user. Null string is returned
; if no applicable errors are encountered.
;
;Output Keywords:
; oft distinct file types that need to be loaded. Array of strings.
; ofdt datatypes corresponding to each file type in ofts. Array of
; strings, each containing a space-separate list of datatypes .
; odt validated datatypes
; olvl validated levels.
; otyp validated type.
;Notes:
; This routine is a utility function used to implement thm_load_??? routines.
;
; $LastChangedBy: aaflores $
; $LastChangedDate: 2012-06-19 16:12:58 -0700 (Tue, 19 Jun 2012) $
; $LastChangedRevision: 10591 $
; $URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/trunk/projects/themis/common/thm_load_proc_arg.pro $
;-
pro thm_load_proc_arg,sname=sname, datatype=datatype, $
level=level, coord=coord, proc_type=type, $
verbose=verbose, $
varformat=varformat, valid_names = valid_names, $
type_sname=type_sname, $
vsnames=vsnames, vdatatypes=vdatatypes, $
file_vdatatypes=file_vdatatypes, $
vtypes=vtypes, deftype = deftype, $
vlevels=vlevels, deflevel=deflevel, $
vL2datatypes=vL2datatypes, vL2coord=vL2coord, $
file_vL2datatypes= file_vL2datatypes, $
no_download=no_download, $
progobj = progobj, $
osname=snames, odt=dts, olvl=lvls, my_themis=my_themis, $
oft = fts, ofdt = fdts, otyp = typ, $
no_update=no_update, $
load_params=load_params, $
use_eclipse_corrections=use_eclipse_corrections, $
msg_out=msg_out, $
_ref_extra = _extra
thm_init
; If verbose keyword is defined, override load_params.verbose
vb = size(verbose, /type) ne 0 ? verbose : load_params.verbose
; Valid sname names
vsnames = strsplit(vsnames, ' ', /extract)
; Valid data names
vdatatypes = strsplit(vdatatypes, ' ', /extract) ;for completeness
;valid data levels
vlevels = strsplit(vlevels, ' ', /extract)
;valid types
if keyword_set(vtypes) then vtypes = strsplit(vtypes,' ',/extract)
;return partially invalid inputs via keyword
msg_out = ''
; parse out data level
if keyword_set(deflevel) then lvl = deflevel else lvl = 'l1'
if n_elements(level) gt 0 then begin
if size(level, /type) Eq 7 then begin
If(level[0] Ne '') Then lvl = strcompress(strlowcase(level), /remove_all)
endif else lvl = 'l'+strcompress(string(fix(level)), /remove_all)
endif
lvls = thm_check_valid_name(strlowcase(lvl), vlevels)
if not keyword_set(lvls) then return
if n_elements(lvls) gt 1 then begin
dprint, 'only one value may be specified for level'
return
endif
if keyword_set(vb) && vb Ge 4 then dprint, dlevel = vb, 'Level = '+lvls
;valid coordinate systems for L2
if keyword_set(vL2coord) then $
vL2coord = strsplit(vL2coord, ' ', /extract)
if lvls[0] eq 'l2' && keyword_set(vL2datatypes) then $
vdatatypes = strsplit(vL2datatypes, ' ', /extract)
;If valid_names is set, return the options
if keyword_set(valid_names) then begin
sname = vsnames
dprint, dlevel = 4, $
string(strjoin(sname, ','), $
format = '( "Valid '+type_sname+'s:",X,A,".")')
datatype = vdatatypes
dprint, dlevel = 4, $
string(strjoin(datatype, ','), $
format = '( "Valid '+lvls[0]+' datatypes:",X,A,".")')
if lvls[0] eq 'l2' && keyword_set(vL2coord) then begin
coord = vL2coord
dprint, dlevel = 4, $
string(strjoin(coord, ','), $
format = '( "Valid '+lvls[0]+' coords:",X,A,".")')
endif
if lvls[0] eq 'l1' and keyword_set(vtypes) then begin
type=vtypes
dprint, dlevel = 4, $
string(strjoin(type,','), $
format='( "Valid '+lvls[0]+' types:",X,A,".")')
endif
level = vlevels
dprint, dlevel = 4, $
string(strjoin(level, ','), format = '( "Valid levels:",X,A,".")')
return
endif
;parse out snames
if n_elements(sname) eq 1 then if sname eq 'f' then vsnames = ['f']
if not keyword_set(sname) then begin
snames = vsnames
endif else begin
snames = thm_check_valid_name(strlowcase(sname), vsnames, /include_all, $
invalid=msg_snames, type='site or probe')
endelse
if not keyword_set(snames) then return
if keyword_set(vb) then printdat, snames, /value, varname=type_sname+'s'
;datatype
if not keyword_set(datatype) then begin
dts = vdatatypes
endif else begin
dts = thm_check_valid_name(strlowcase(datatype), vdatatypes, /include_all, $
invalid=msg_dt, type='data type')
endelse
if not keyword_set(dts) then return
if keyword_set(vb) then printdat, dts, /value, varname='Datatypes'
; type
if lvls[0] eq 'l1' then begin
if keyword_set(vtypes) then begin
if not keyword_set(deftype) then deftype = 'calibrated'
if not keyword_set(type) then typ = deftype $
else typ = thm_check_valid_name(strlowcase(type), vtypes)
if not keyword_set(typ) then return
if keyword_set(vb) then printdat, typ, /value, varname='Type'
endif else begin
dprint, dlevel = 4, 'type keyword not validated'
endelse
endif else if keyword_set(type) then begin
dprint, 'type keyword only applies to l1 data'
return
endif
; Level2 probe data : set varformat to get each possible combination of
; datatype and coord
if lvls[0] eq 'l2' && strlowcase(type_sname) eq 'probe' $
&& ~keyword_set(varformat) && keyword_set(vL2coord) then begin
if not keyword_set(coord) then begin
crds = vL2coord
endif else begin
crds = thm_check_valid_name(strlowcase(coord), vL2coord, /include_all, $
invalid=msg_coord, type='coordinates')
endelse
if not keyword_set(crds) then return
if keyword_set(vb) then printdat, crds, /value, varname='Coord'
cross_dt_coord = array_cross(dts, crds)
varformat = 'th?_' + strjoin(cross_dt_coord, '_')
; Some level 2 quantities don't have coordinate systems, this can be
; denoted by 'none' in the valid coordinates list, jmm, 15-jul-2008
none_ok=where(strlowcase(strcompress(/remove_all,vl2coord)) Eq 'none')
If(none_ok[0] Ne -1) Then varformat = [varformat, 'th?_'+dts]
endif
if vb ge 7 then printdat,load_params
nlvls = n_elements(lvls)
ndts = n_elements(dts)
nsnames = n_elements(snames)
if lvls[0] eq 'l2' && keyword_set(file_vL2datatypes) then $
file_vdatatypes = file_vL2datatypes
if keyword_set(file_vdatatypes) then begin
fts=strarr(ndts)
file_vdatatypes = strsplit(file_vdatatypes, ' ', /extract)
if n_elements(file_vdatatypes) eq 1 then begin
; fill out file_vdatatypes array to same dimension as vdatatypes
file_vdatatypes = strarr(n_elements(vdatatypes)) + file_vdatatypes[0]
endif
for j = 0, ndts-1 do begin
fts[j] = file_vdatatypes[where(vdatatypes eq dts[j])]
endfor
fts = fts[UNIQ(fts, SORT(fts))]
nfts = n_elements(fts)
;; for each filetype, get a list of requested datatypes
fdts=strarr(nfts)
for j = 0, nfts-1 do begin
file_datatypes = vdatatypes[where(file_vdatatypes eq fts[j])]
fdts[j] = strjoin(strfilter(file_datatypes,dts), ' ')
endfor
if vb ge 7 then printdat, fts ;;;;
if vb ge 7 then printdat, fdts ;;;;
endif else begin
fts = dts
nfts = n_elements(fts)
fdts = dts
endelse
;pass out invalid portion of partially invalid inputs
;any fully invalid inputs should have caused a return prior to this
if keyword_set(msg_snames) then msg_out = [msg_out,msg_snames]
if keyword_set(msg_dt) then msg_out = [msg_out,msg_dt]
if keyword_set(msg_coord) then msg_out = [msg_out,msg_coord]
;check output message array for null strings
idx = where(msg_out ne '', ni)
msg_out = ni gt 0 ? msg_out[idx] : ''
my_themis = load_params
my_themis.no_download = !themis.no_download || keyword_set(no_download)
my_themis.no_update = !themis.no_update || keyword_set(no_update)
if keyword_set(progobj) then my_themis.progobj = progobj
my_themis.verbose=vb
end