;+ ;Procedure: THM_LOAD_FGM ; ;Purpose: Loads THEMIS fluxgate magnetometer data ; ;keywords: ; probe = Probe name. The default is 'all', i.e., load all available probes. ; This can be an array of strings, e.g., ['a', 'b'] or a ; single string delimited by spaces, e.g., 'a b' ; datatype = The type of data to be loaded, 'fge', 'fgh', or 'fgl'. 'all' ; can be passed in also, to get all variables. ; 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 to read, 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. ; type= 'raw' or 'calibrated'. default is calibrated. ; coord= coordinate system of output. default is 'dsl' ; suffix= suffix to add to output data quantity (not added to support data) ; 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. ; /DOWNLOADONLY: download file but don't read it. ; /no_download: use only files which are online locally. ; relpathnames_all: named variable in which to return all files that are ; required for specified timespan, probe, datatype, and level. ; If present, no files will be downloaded, and no data will be loaded. ; /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, set to 0 to or 1 to reduce output. ; /NO_TIME_CLIP: Disables time clipping, which is the default ; use_eclipse_corrections: Only applies when loading and calibrating ; Level 1 data. Defaults to 0 (no eclipse spin model corrections ; applied). use_eclipse_corrections=1 applies partial eclipse ; corrections (not recommended, used only for internal SOC processing). ; use_eclipse_corrections=2 applies all available eclipse corrections. ; ; NOTE: The following keywords are only used if level=1 is set ; cal_dac_offset = apply calibrations that remove digital analog ; converter nonlinearity by addition of offset. ; Algorithm generated by Dragos Constantine ; . This is the default ; process as of 7-Jan-2010, to disable, explicitly ; set this keyword to 0. ; cal_spin_harmonics = apply calibrations from a file that remove ; spin harmonics by applying spin-dependent ; offsets generated by David Fischer ; . This is the default ; process as of 7-Jan-2010, to disable, explicitly ; set this keyword to 0. ; cal_tone_removal = fitting algorithm removes orbit dependent ; spintone without removing scientifically salient ; features. Algorithm generated by Ferdinand Plaschke ; . This is the default ; process as of 7-Jan-2010, to disable, explicitly ; set this keyword to 0. ; cal_get_fulloffset = returns the offset used for spintone removal.(this keyword used for valididation) ; Because there may be a different offset for each combination of probe and datatype, ; This is returned as a struct of structs, with each element in the child structs being an N by 3 array. ; For example, if offset_struct is the name of a struct with the return value from the cal_get_fulloffset keyword, ; print,offset_struct.tha.fgl ; Will print the fulloffset for probe a and datatype fgl. ; cal_get_dac_dat = Returns the raw data from directly after the DAC(non-linearity offset) calibration is applied. For verification. ; cal_get_spin_dat = Returns the raw data from directly after the spin harmonic(solar array current) calibration is applied. For verification. ; ;Example: ; thg_load_fgm,probe=['a','b'] ;Notes: ; This routine is (should be) platform independent. ; ; $LastChangedBy: jwl $ ; $LastChangedDate: 2012-11-05 17:02:47 -0800 (Mon, 05 Nov 2012) $ ; $LastChangedRevision: 11187 $ ; $URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_1_00/projects/themis/spacecraft/fields/thm_load_fgm.pro $ ;- ; fgm-specific helper function ; to return relative path names to files in the data tree. ; this routine maps datatypes to file type. function thm_load_fgm_relpath, sname=probe, filetype=ft, $ level=lvl, trange=trange, $ addmaster=addmaster, _extra=_extra relpath = 'th'+probe+'/'+lvl+'/'+ ft+'/' prefix = 'th'+probe+'_'+lvl+'_'+ft+'_' dir = 'YYYY/' ; The following was a temporary cluge to get to tmserver1 data ; I am leaving it in place as an example of how to call ; file_dailynames with an alternative directory structure. if strcmp(!themis.remote_data_dir, 'http://themis-tmserver1',18) eq 1 $ then begin ; pathformat = 'L1CDF/th'+sc+'/YYYY/MM/DD/th'+sc+'_l1_fgm_YYYYMMDD_v01.cdf' relpath = 'L1CDF/th'+probe+'/' dir = 'YYYY/MM/DD/' endif ending = '_v01.cdf' return, file_dailynames(relpath, prefix, ending, dir=dir, $ trange = trange,addmaster=addmaster) end pro thm_load_fgm_post, sname=probe, datatype=dt, level=lvl, $ tplotnames=tplotnames, $ suffix=suffix, proc_type=proc_type, coord=coord, $ delete_support_data=delete_support_data,cal_spin_harmonics=cal_spin_harmonics,$ cal_dac_offset=cal_dac_offset,cal_tone_removal=cal_tone_removal,$ cal_get_fulloffset=cal_get_fulloffset,cal_get_dac_dat=cal_get_dac_dat,$ cal_get_spin_dat=cal_get_spin_dat,$ use_eclipse_corrections=use_eclipse_corrections,_extra=_extra ;; remove suffix from support data ;; and add DLIMIT tags to data quantities for l=0, n_elements(tplotnames)-1 do begin tplot_var = tplotnames[l] dtl = strmid(tplot_var, 4, 3) get_data, tplot_var, data=d_str, limit=l_str, dlimit=dl_str if size(/type,dl_str) eq 8 && dl_str.cdf.vatt.var_type eq 'data' $ then begin if strmatch(lvl, 'l1') then begin unit='ADC' data_att = { data_type:'raw', coord_sys:'fgm_sensor', $ units:unit} labels = [ 'b1', 'b2', 'b3'] colors = [ 2, 4, 6] end else if strmatch(lvl, 'l2') then begin thm_new_units, tplot_var thm_new_coords, tplot_var get_data, tplot_var, dlimits = dl_str unit = dl_str.data_att.units ;the units tag has the coordinate system included; for ysubtitle and ;for SPDF plots. Strip it from the units tag here, but not from the ;'unit' variable, since that goes to ysubtitle u1 = strsplit(unit, ' ', /extract) dl_str.data_att.units = u1[0] data_att = dl_str.data_att is_btotal = total(strmatch(strsplit(tplot_var, '_', /extract), 'btotal')) If(is_btotal Gt 0) Then Begin labels = '|B|' colors = 0 Endif Else Begin labels = [ 'bx', 'by', 'bz'] colors = [2, 4, 6] Endelse end str_element, dl_str, 'data_att', data_att, /add str_element, dl_str, 'colors', colors, /add str_element, dl_str, 'labels', labels, /add str_element, dl_str, 'labflag', 1, /add str_element, dl_str, 'ytitle', tplot_var, /add str_element, dl_str, 'ysubtitle', '['+unit+']', /add store_data, tplot_var, data=d_str, limit=l_str, dlimit=dl_str endif else begin ;; for support data, ;; rename original variable to exclude suffix if keyword_set(suffix) then begin tplot_var_root = strmid(tplot_var, 0, $ strpos(tplot_var, suffix, /reverse_search)) store_data, delete=tplot_var if tplot_var_root then begin store_data, tplot_var_root, data=d_str, limit=l_str, dlimit=dl_str endif tplot_var = tplot_var_root endif ;; save name of support tplot variable for possible deletion if tplot_var && keyword_set(delete_support_data) then begin if size(support_var_list,/type) eq 0 then $ support_var_list = [tplot_var] $ else $ support_var_list = [support_var_list,tplot_var] endif endelse endfor ;; calibrate and transform coordinates, if this is L1 if strmatch(lvl, 'l1') then begin if ~keyword_set(proc_type) || strmatch(proc_type, 'calibrated') then begin thm_cal_fgm, probe=probe, datatype=dt, coord=coord, $ in_suffix=suffix, out_suffix=suffix,$ cal_spin_harmonics=cal_spin_harmonics,$ cal_dac_offset=cal_dac_offset,$ cal_tone_removal=cal_tone_removal,$ cal_get_fulloffset=cal_get_fulloffset,$ cal_get_dac_dat=cal_get_dac_dat,$ cal_get_spin_dat=cal_get_spin_dat,$ use_eclipse_corrections=use_eclipse_corrections ;; delete support data if size(support_var_list, /type) ne 0 then $ del_data, support_var_list endif endif end pro thm_load_fgm, probe = probe, datatype = datatype, trange = trange, $ level = level, verbose = verbose, downloadonly = downloadonly, $ relpathnames_all = relpathnames_all, no_download = no_download, $ cdf_data = cdf_data, get_support_data = get_support_data, $ varnames = varnames, valid_names = valid_names, files = files, $ suffix = suffix, type = type, coord = coord, $ progobj = progobj, cal_spin_harmonics = cal_spin_harmonics, $ cal_dac_offset = cal_dac_offset, cal_tone_removal = cal_tone_removal, $ cal_get_fulloffset = cal_get_fulloffset, cal_get_dac_dat = cal_get_dac_dat, $ cal_get_spin_dat = cal_get_spin_dat, use_eclipse_corrections=use_eclipse_corrections,_extra = _extra if arg_present(relpathnames_all) then begin downloadonly=1 no_download=1 end if not keyword_set(suffix) then suffix = '' if not keyword_set(coord) then coord='dsl' if n_elements(use_eclipse_corrections) LT 1 then use_eclipse_corrections=0 vlevels = 'l1 l2' deflevel = 'l1' lvl = thm_valid_input(level,'Level',vinputs=vlevels,definput=deflevel,$ format="('l', I1)", verbose=0) if lvl eq '' then return if lvl eq 'l2' and keyword_set(type) then begin dprint, "Type keyword not valid for level 2 data." return endif if lvl eq 'l1' then begin ;; default action for loading level 1 is to calibrate if ~keyword_set(type) || strmatch(type, 'calibrated') then begin ;; we're calibrating, so make sure we get support data if not keyword_set(get_support_data) then begin get_support_data = 1 delete_support_data = 1 endif endif endif thm_load_xxx, sname = probe, datatype = datatype, trange = trange, $ level = level, verbose = verbose, downloadonly = downloadonly, $ relpathnames_all = relpathnames_all, no_download = no_download, $ cdf_data = cdf_data, get_cdf_data = arg_present(cdf_data), $ get_support_data = get_support_data, $ varnames = varnames, valid_names = valid_names, files = files, $ vsnames = 'a b c d e', $ type_sname = 'probe', $ vdatatypes = 'fgl fgh fge', $ file_vdatatypes = 'fgm', $ vlevels = vlevels, $ vL2datatypes = 'fgs fgl fgh fge fgs_btotal fgl_btotal fgh_btotal fge_btotal', $ vL2coord = 'ssl dsl gse gsm none', $ vtypes = 'raw calibrated', $ deflevel = deflevel, $ version = 'v01', $ relpath_funct = 'thm_load_fgm_relpath', $ post_process_proc = 'thm_load_fgm_post', $ delete_support_data = delete_support_data, $ proc_type = type, coord = coord, suffix = suffix, $ progobj = progobj, $ cal_spin_harmonics = cal_spin_harmonics, $ cal_dac_offset = cal_dac_offset, $ cal_tone_removal = cal_tone_removal, $ cal_get_fulloffset = cal_get_fulloffset, $ cal_get_dac_dat = cal_get_dac_dat, $ cal_get_spin_dat = cal_get_spin_dat, $ use_eclipse_corrections=use_eclipse_corrections,$ msg_out = msg_out, $ _extra = _extra ;print accumulated error messages now that loading is complete if keyword_set(msg_out) then begin for i=0, n_elements(msg_out)-1 do begin if msg_out[i] ne '' then dprint, dlevel=1, msg_out[i] endfor endif end