;+ ;Procedure: thm_cotrans ;Purpose: Transform between various THEMIS and geophysical coordinate systems ;keywords: ; probe = Probe name. The default is 'all', i.e., transform data for 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 transformed, can take any of the values ; allowed for datatype for the various thm_load routines. You ; can use wildcards like ? and [lh]. ; 'all' is not accepted. You can use '*', but you may get unexpected ; results if you are using suffixes. ; in_coord = 'spg', 'ssl', 'dsl', 'gse', 'gsm','sm', 'gei',or 'geo' ; coordinate system of input. ; This keyword is optional if the dlimits.data_att.coord_sys attribute ; is present for the tplot variable, and if present, it must match ; the value of that attribute. See cotrans_set_coord, ; cotrans_get_coord ; out_coord = 'spg', 'ssl', 'dsl', 'gse', 'gsm', 'sm', 'gei',or 'geo' ; coordinate system of output. This keyword is optional if ; out_suffix is specified and last 3 characters of suffix specify ; the output coordinate system. ; in_suffix = optional suffix needed to generate the input data quantity name: ; 'th'+probe+'_'datatype+in_suffix ; out_suffix = optional suffix to add to output data quantity name. If ; in_suffix is present, then in_suffix will be replaced by out_suffix ; in the output data quantity name. ; valid_names:return valid coordinate system names in named varibles supplied to ; in_coord and/or out_coord keywords. ; support_suffix: if support_data is loaded with a suffix you can ; specify it here ; ; out_vars: return a list of the names of any transformed variables ; ; ignore_dlimits: set this keyword to true so that an error will not ; be produced if the internal label of the coordinate system clashed ; with the user provided coordinate system. ; interpolate_state: use interpolation on 1-minute state CDF spinper/spinphase ; samples for despinning instead of spin model ; ; ;Optional Positional Parameters: ; in_name Name(s) of input tplot variable(s) (or glob patern) ; (space-separated list or array of strings.). If the in_name ; parameter is provided, the probe and datatype ; keywords will be ignored. However, if the input name ; is not of format 'th[a-e]_*', use the probe keyword to indicate ; which probe's state data should be used for each input variable. ; out_name Name(s) of output tplot variable(s). glob patterns not accepted. ; Number of output names must match number of input names (after glob ; expansion of input names). (single string, or array of strings.) ; ;Examples: ; thm_load_state, /get_support ; ; thm_cotrans, probe='a', datatype='fgl', out_suffix='_gsm' ; ; ; or equivalently ; ; thm_cotrans, 'tha_fgl', 'tha_fgl_gsm', out_coord='gsm' ; ; ; to transform all th?_fg?_dsl to th?_fg?_gsm ; ; thm_cotrans, 'th?_fg?', in_suffix='_dsl', out_suffix='_gsm' ; ; ; for arbitrary input variables, specify in_coord and probe: ; ; thm_cotrans,'mydslvar1 mydslvar2 mydslvar3', $ ; in_coord='dsl', probe='b c d', out_suff='_gse' ; ; $LastChangedBy: pcruce $ ; $LastChangedDate: 2009-01-08 17:05:07 -0800 (Thu, 08 Jan 2009) $ ; $LastChangedRevision: 4371 $ ; $URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/thmsoc/tags/tdas_5_11/idl/themis/state/cotrans/thm_cotrans.pro $ ;- ; in_coord is optional if dlimits includs a thm_att.coord element. pro thm_cotrans, probe=probe, datatype=datatype, valid_names=valid_names, $ in_coord=in_coord, out_coord=out_coord, verbose=verbose, $ in_suffix=in_suf, out_suffix=out_suf, in_name, out_name, $ support_suffix=support_suffix,ignore_dlimits=ignore_dlimits,$ interpolate_state=interpolate_state,out_vars=out_vars thm_init ; If verbose keyword is defined, override !themis.verbose vb = size(verbose, /type) ne 0 ? verbose : !themis.verbose vprobes = ['a','b','c','d','e'] vcoord = ['spg', 'ssl', 'dsl', 'gse', 'gsm','sm', 'gei','geo'] if keyword_set(valid_names) then begin in_coord = vcoord out_coord = vcoord probe=vprobes if keyword_set(vb) then begin message, /info, string(strjoin(vcoord, ','), $ format = '( "Valid coords:",X,A,".")') message, /info, string(strjoin(vprobes, ','), $ format = '( "Valid probes:",X,A,".")') message, /info, 'Valid datatypes: Anything goes!' endif return endif ; validate in_coord and out_coord if not keyword_set(out_coord) and keyword_set(out_suf) then $ out_coord=strmid(out_suf,2,3,/reverse) if not keyword_set(out_coord) then begin dprint, 'thm_cotrans: must specify out_coord or out_suffix' return endif else out_coord = thm_check_valid_name(strlowcase(out_coord), vcoord) if not keyword_set(out_coord) then return if n_elements(out_coord) gt 1 then begin dprint, 'thm_cotrans: can only specify one out_coord' return endif if ~keyword_set(in_coord) && keyword_set(in_suf) then begin in_coord=strmid(in_suf,2,3,/reverse) endif if keyword_set(in_coord) then begin in_coord = thm_check_valid_name(strlowcase(in_coord), vcoord) if not keyword_set(in_coord) then return if n_elements(in_coord) gt 1 then begin dprint, 'thm_cotrans: can only specify one in_coord' return endif endif if not keyword_set(in_suf) then in_suf = '' if not keyword_set(out_suf) then out_suf = '' ; do 'standard' THEMIS name conventions to get tplot names if n_params() eq 0 then begin if not keyword_set(probe) then probe = vprobes $ else probe = thm_check_valid_name(strlowcase(probe), vprobes, /include_all) if not keyword_set(probe) then begin message, /info, 'probe keyword required if no positional args present' return endif if not keyword_set(datatype) then begin message, /info, 'datatype keyword required if no positional args present' return endif if n_elements(datatype) eq 1 then datatype=strsplit(datatype, ' ', /extract) datatype=strlowcase(datatype) for i = 0, n_elements(probe)-1 do begin for j = 0, n_elements(datatype)-1 do begin in_name='th'+probe[i]+'_'+datatype[j] out_name='th'+probe[i]+'_'+datatype[j] if keyword_set(interpolate_state) then begin thm_cotrans, in_name, $ in_coord=in_coord, out_coord=out_coord, $ in_suf=in_suf, out_suf=out_suf, verbose=verbose,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin thm_cotrans, in_name, $ in_coord=in_coord, out_coord=out_coord, $ in_suf=in_suf, out_suf=out_suf, verbose=verbose,ignore_dlimits=ignore_dlimits endelse endfor endfor return endif else if n_params() gt 2 then begin dprint, 'usage: thm_cotrans, probe=probe, datatype=datatype, $' dprint, ' in_coord=in_c, out_coord=out_c, $' dprint, ' in_suffix=in_suf, out_suffix=out_suff' dprint, 'or: thm_cotrans, in_name[, out_name], in_coord=in_c, out_coord=out_c' return endif ; allow for globbing on the input parameters , deal with in_suf and out_suf, ; figure out probe, if necessary. in_names = tnames(in_name+in_suf, n) if n eq 0 then begin dprint, 'thm_cotrans: no match: '+in_name+in_suf return endif if n_params() eq 1 || $ n_params() eq 2 && n_elements(in_names) ne n_elements(out_name) then begin if n_params() eq 2 then dprint, 'thm_cotrans: warning: ignoring out_names' ;; generate output names based on out_suffix if in_suf ne '' then $ base_len = strpos(in_names,in_suf,/reverse_search) $ else $ base_len = strlen(in_names) ; out_names = strmid(in_names,0,transpose(base_len))+out_suf ; out_names = strmid(in_names,0,base_len)+out_suf ;the statement with the transpose bombs on scalars, the statment ;without the transpose bombs later, due to undocumented weird behavior ;of the strmid function that causes out_names to be an nXn matrix out_names = in_names for j = 0, n-1 do out_names[j] = strmid(in_names[j],0,base_len[j])+out_suf endif else out_names = out_name + out_suf if n_elements(in_names) ne n_elements(out_names) then begin message, 'thm_cotrans: number of input variables does not match number of output variables' endif if not keyword_set(probe) then begin standard = strmatch(in_names,'th?_*') if total(standard) ne n_elements(in_names) $ then begin dprint, 'thm_cotrans: input name(s) do not specify probe according to THEMIS convention:' dprint, ' ', in_names[where(~standard)] dprint, ' Must specify probe with probe keyword' return endif else probe = strmid(in_names, 2,1) endif for i = 0, n_elements(in_names)-1 do begin in_nam = in_names[i] out_nam = out_names[i] prb = probe[i < (n_elements(probe)-1)] get_data,in_nam,data=in,dl=in_dl if size(in, /type) ne 8 then begin message, /info, 'input tplot variable '+in_nam+' has no data' return endif sizein=size(in.y) if sizein[0] ne 2 then begin if sizein(2) ne 3 then begin message,/info,'input tplot variable is not a 3-vector' return endif endif data_in_coord = cotrans_get_coord(in_dl) ;handle different combinations of ;possible input coordinate system info ;producing appropriate errors if ~keyword_set(in_coord) && strmatch(data_in_coord,'unknown') then begin message,/info,'Tplot variable has unknown input coordinate system' message,/info,'Tplot variable name: ' + in_nam continue endif else if ~keyword_set(in_coord) then begin in_c = data_in_coord endif else if ~strmatch(in_coord,data_in_coord) && $ ~keyword_set(ignore_dlimits) && $ ~strmatch(data_in_coord,'unknown') then begin message,/info,'Argument input coordinate system and data coordinate system of : ' + in_nam + ' do not match' continue endif else begin in_c = in_coord endelse dprint, 'thm_cotrans: coord. system of input '+in_nam+': '+in_c ;if support data is loaded with a suffix... if keyword_set(support_suffix) then begin spinras = 'th'+prb+'_state_spinras'+support_suffix spindec = 'th'+prb+'_state_spindec'+support_suffix spinper = 'th'+prb+'_state_spinper'+support_suffix spinphase = 'th'+prb+'_state_spinphase'+support_suffix endif else begin spinras = 'th'+prb+'_state_spinras' spindec = 'th'+prb+'_state_spindec' spinper = 'th'+prb+'_state_spinper' spinphase = 'th'+prb+'_state_spinphase' endelse case in_c of 'ssl': case out_coord of 'ssl': if in_nam ne out_nam then copy_data, in_nam, out_nam 'dsl': begin if keyword_set(interpolate_state) then begin ssl2dsl, name_input=in_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=in_nam, name_output=out_nam,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse end 'gse': begin if keyword_set(interpolate_state) then begin ssl2dsl, name_input=in_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=in_nam, name_output=out_nam,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse dsl2gse, out_nam, spinras, spindec, out_nam,ignore_dlimits=ignore_dlimits end 'gsm': begin if keyword_set(interpolate_state) then begin ssl2dsl, name_input=in_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=in_nam, name_output=out_nam,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse dsl2gse, out_nam, spinras, spindec, out_nam,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gsm,ignore_dlimits=ignore_dlimits end 'sm': begin if keyword_set(interpolate_state) then begin ssl2dsl, name_input=in_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=in_nam, name_output=out_nam,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse dsl2gse, out_nam, spinras, spindec, out_nam,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gsm,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gsm2sm,ignore_dlimits=ignore_dlimits end 'gei': begin if keyword_set(interpolate_state) then begin ssl2dsl, name_input=in_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=in_nam, name_output=out_nam,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse dsl2gse, out_nam, spinras, spindec, out_nam,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gei,ignore_dlimits=ignore_dlimits end 'geo': begin if keyword_set(interpolate_state) then begin ssl2dsl, name_input=in_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=in_nam, name_output=out_nam,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse dsl2gse, out_nam, spinras, spindec, out_nam,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gei,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gei2geo,ignore_dlimits=ignore_dlimits end 'spg':spg2ssl,in_nam,out_nam,/ssl2spg endcase 'dsl': case out_coord of 'ssl': begin if keyword_set(interpolate_state) then begin ssl2dsl, name_input=in_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=in_nam, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse end 'dsl': if in_nam ne out_nam then copy_data, in_nam, out_nam 'gse': dsl2gse, in_nam, spinras, spindec, out_nam,ignore_dlimits=ignore_dlimits 'gsm': begin dsl2gse, in_nam, spinras, spindec, out_nam,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gsm,ignore_dlimits=ignore_dlimits end 'sm': begin dsl2gse, in_nam, spinras, spindec, out_nam,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gsm,ignore_dlimits=ignore_dlimits cotrans,out_nam,out_nam, /gsm2sm,ignore_dlimits=ignore_dlimits end 'gei': begin dsl2gse, in_nam, spinras, spindec, out_nam,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gei,ignore_dlimits=ignore_dlimits end 'geo': begin dsl2gse, in_nam, spinras, spindec, out_nam,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gei,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gei2geo,ignore_dlimits=ignore_dlimits end 'spg':begin if keyword_set(interpolate_state) then begin ssl2dsl,name_input=in_nam,name_thx_spinper=spinper,name_thx_spinphase=spinphase,name_output=out_nam,/dsl2ssl,/interpolate_state endif else begin ssl2dsl,name_input=in_nam,name_output=out_nam,/dsl2ssl,spinmodel_ptr=spinmodel_get_ptr(prb) endelse spg2ssl,out_nam,out_nam,/ssl2spg,ignore_dlimits=ignore_dlimits end endcase 'gse': case out_coord of 'ssl': begin dsl2gse, in_nam, spinras, spindec, out_nam, /gse2dsl,ignore_dlimits=ignore_dlimits if keyword_set(interpolate_state) then begin ssl2dsl, name_input=out_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=out_nam, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse end 'dsl': dsl2gse, in_nam, spinras, spindec, out_nam, /gse2dsl,ignore_dlimits=ignore_dlimits 'gse': if in_nam ne out_nam then copy_data, in_nam, out_nam 'gsm': cotrans, in_nam, out_nam, /gse2gsm,ignore_dlimits=ignore_dlimits 'sm': begin cotrans, in_nam, out_nam, /gse2gsm,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gsm2sm,ignore_dlimits=ignore_dlimits end 'gei': cotrans, in_nam, out_nam, /gse2gei,ignore_dlimits=ignore_dlimits 'geo': begin cotrans, in_nam, out_nam, /gse2gei,ignore_dlimits=ignore_dlimits cotrans, in_nam, out_nam, /gei2geo,ignore_dlimits=ignore_dlimits end 'spg': begin dsl2gse,in_nam,spinras,spindec,out_nam,/gse2dsl,ignore_dlimits=ignore_dlimits if keyword_set(interpolate_state) then begin ssl2dsl,name_input=out_nam,name_thx_spinper=spinper,name_thx_spinphase=spinphase,name_output=out_nam,/dsl2ssl,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl,name_input=out_nam,name_output=out_nam,/dsl2ssl,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse spg2ssl,out_nam,out_nam,/ssl2spg,ignore_dlimits=ignore_dlimits end endcase 'gsm': case out_coord of 'ssl': begin cotrans, in_nam, out_nam, /gsm2gse,ignore_dlimits=ignore_dlimits dsl2gse, out_nam, spinras, spindec, out_nam, /gse2dsl,ignore_dlimits=ignore_dlimits if keyword_set(interpolate_state) then begin ssl2dsl, name_input=out_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=out_nam, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse end 'dsl': begin cotrans, in_nam, out_nam, /gsm2gse,ignore_dlimits=ignore_dlimits dsl2gse, out_nam, spinras, spindec, out_nam, /gse2dsl,ignore_dlimits=ignore_dlimits end 'gse': cotrans, in_nam, out_nam, /gsm2gse,ignore_dlimits=ignore_dlimits 'gsm': if in_nam ne out_nam then copy_data, in_nam, out_nam 'sm': cotrans,in_nam,out_nam,/gsm2sm,ignore_dlimits=ignore_dlimits 'gei': begin cotrans, in_nam, out_nam, /gsm2gse,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gei,ignore_dlimits=ignore_dlimits end 'geo': begin cotrans, in_nam, out_nam, /gsm2gse,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gei,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gei2geo,ignore_dlimits=ignore_dlimits end 'spg': begin cotrans, in_nam, out_nam, /gsm2gse,ignore_dlimits=ignore_dlimits dsl2gse, out_nam, spinras, spindec, out_nam, /gse2dsl,ignore_dlimits=ignore_dlimits if keyword_set(interpolate_state) then begin ssl2dsl, name_input=out_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=out_nam, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse spg2ssl,out_nam,out_nam,/ssl2spg,ignore_dlimits=ignore_dlimits end endcase 'gei': case out_coord of 'ssl': begin cotrans, in_nam, out_nam, /gei2gse,ignore_dlimits=ignore_dlimits dsl2gse, out_nam, spinras, spindec, out_nam, /gse2dsl,ignore_dlimits=ignore_dlimits if keyword_set(interpolate_state) then begin ssl2dsl, name_input=out_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=out_nam, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse end 'dsl': begin cotrans, in_nam, out_nam, /gei2gse,ignore_dlimits=ignore_dlimits dsl2gse, out_nam, spinras, spindec, out_nam, /gse2dsl,ignore_dlimits=ignore_dlimits end 'gse': cotrans, in_nam, out_nam, /gei2gse,ignore_dlimits=ignore_dlimits 'gsm': begin cotrans, in_nam, out_nam, /gei2gse,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gsm,ignore_dlimits=ignore_dlimits end 'sm': begin cotrans, in_nam, out_nam, /gei2gse,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gsm,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gsm2sm,ignore_dlimits=ignore_dlimits end 'gei': if in_nam ne out_nam then copy_data, in_nam, out_nam 'geo': cotrans,in_nam,out_nam,/gei2geo,ignore_dlimits=ignore_dlimits 'spg': begin cotrans, in_nam, out_nam, /gei2gse,ignore_dlimits=ignore_dlimits dsl2gse, out_nam, spinras, spindec, out_nam, /gse2dsl,ignore_dlimits=ignore_dlimits if keyword_set(interpolate_state) then begin ssl2dsl, name_input=out_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=out_nam, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse spg2ssl,out_nam,out_nam,/ssl2spg,ignore_dlimits=ignore_dlimits end endcase 'spg': case out_coord of 'ssl': spg2ssl,in_nam,out_nam,ignore_dlimits=ignore_dlimits 'dsl': begin spg2ssl,in_nam,out_nam,ignore_dlimits=ignore_dlimits if keyword_set(interpolate_state) then begin ssl2dsl,name_input=out_nam,name_thx_spinper=spinper,name_thx_spinphase=spinphase,name_output=out_nam,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl,name_input=out_nam,name_output=out_nam,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse end 'gse': begin spg2ssl,in_nam,out_nam,ignore_dlimits=ignore_dlimits if keyword_set(interpolate_state) then begin ssl2dsl, name_input=out_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=out_nam, name_output=out_nam,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse dsl2gse, out_nam, spinras, spindec, out_nam,ignore_dlimits=ignore_dlimits end 'gsm': begin spg2ssl,in_nam,out_nam,ignore_dlimits=ignore_dlimits if keyword_set(interpolate_state) then begin ssl2dsl, name_input=out_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=out_nam, name_output=out_nam,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse dsl2gse, out_nam, spinras, spindec, out_nam,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gsm,ignore_dlimits=ignore_dlimits end 'sm': begin spg2ssl,in_nam,out_nam,ignore_dlimits=ignore_dlimits if keyword_set(interpolate_state) then begin ssl2dsl, name_input=out_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=out_nam, name_output=out_nam,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse dsl2gse, out_nam, spinras, spindec, out_nam,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gsm,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gsm2sm,ignore_dlimits=ignore_dlimits end 'gei': begin spg2ssl,in_nam,out_nam,ignore_dlimits=ignore_dlimits if keyword_set(interpolate_state) then begin ssl2dsl,name_input=out_nam,name_thx_spinper=spinper,name_thx_spinphase=spinphase,name_output=out_nam,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl,name_input=out_nam,name_output=out_nam,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse dsl2gse, out_nam, spinras, spindec, out_nam,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gei,ignore_dlimits=ignore_dlimits end 'geo': begin spg2ssl,in_nam,out_nam,ignore_dlimits=ignore_dlimits if keyword_set(interpolate_state) then begin ssl2dsl,name_input=out_nam,name_thx_spinper=spinper,name_thx_spinphase=spinphase,name_output=out_nam,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl,name_input=out_nam,name_output=out_nam,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse dsl2gse, out_nam, spinras, spindec, out_nam,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gei,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gei2geo,ignore_dlimits=ignore_dlimits end 'spg': if in_nam ne out_nam then copy_data, in_nam, out_nam endcase 'sm': case out_coord of 'ssl': begin cotrans, in_nam, out_nam, /sm2gsm,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gsm2gse,ignore_dlimits=ignore_dlimits dsl2gse, out_nam, spinras, spindec, out_nam, /gse2dsl,ignore_dlimits=ignore_dlimits if keyword_set(interpolate_state) then begin ssl2dsl, name_input=out_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=out_nam, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse end 'dsl': begin cotrans, in_nam, out_nam, /sm2gsm,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gsm2gse,ignore_dlimits=ignore_dlimits dsl2gse, out_nam, spinras, spindec, out_nam, /gse2dsl,ignore_dlimits=ignore_dlimits end 'gse': begin cotrans, in_nam, out_nam,/sm2gsm,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gsm2gse,ignore_dlimits=ignore_dlimits end 'gsm': cotrans,in_nam,out_nam,/sm2gsm,ignore_dlimits=ignore_dlimits 'sm': if in_nam ne out_nam then copy_data, in_nam, out_nam 'gei': begin cotrans, in_nam, out_nam,/sm2gsm,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gsm2gse,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gei,ignore_dlimits=ignore_dlimits end 'geo': begin cotrans, in_nam, out_nam,/sm2gsm,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gsm2gse,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gei,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gei2geo,ignore_dlimits=ignore_dlimits end 'spg': begin cotrans, in_nam,out_nam,/sm2gsm,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gsm2gse,ignore_dlimits=ignore_dlimits dsl2gse, out_nam, spinras, spindec, out_nam, /gse2dsl,ignore_dlimits=ignore_dlimits if keyword_set(interpolate_state) then begin ssl2dsl, name_input=out_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=out_nam, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse spg2ssl,out_nam,out_nam,/ssl2spg,ignore_dlimits=ignore_dlimits end endcase 'geo': case out_coord of 'ssl': begin cotrans, in_nam, out_nam, /geo2gei,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gei2gse,ignore_dlimits=ignore_dlimits dsl2gse, out_nam, spinras, spindec, out_nam, /gse2dsl,ignore_dlimits=ignore_dlimits if keyword_set(interpolate_state) then begin ssl2dsl, name_input=out_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=out_nam, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse end 'dsl': begin cotrans, in_nam, out_nam, /geo2gei,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gei2gse,ignore_dlimits=ignore_dlimits dsl2gse, out_nam, spinras, spindec, out_nam, /gse2dsl,ignore_dlimits=ignore_dlimits end 'gse': begin cotrans, in_nam, out_nam, /geo2gei,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gei2gse,ignore_dlimits=ignore_dlimits end 'gsm': begin cotrans, in_nam, out_nam, /geo2gei,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gei2gse,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gsm,ignore_dlimits=ignore_dlimits end 'sm': begin cotrans, in_nam, out_nam, /geo2gei,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gei2gse,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gse2gsm,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gsm2sm,ignore_dlimits=ignore_dlimits end 'geo': if in_nam ne out_nam then copy_data, in_nam, out_nam 'gei': cotrans,in_nam,out_nam,/geo2gei,ignore_dlimits=ignore_dlimits 'spg': begin cotrans, in_nam, out_nam, /geo2gei,ignore_dlimits=ignore_dlimits cotrans, out_nam, out_nam, /gei2gse,ignore_dlimits=ignore_dlimits dsl2gse, out_nam, spinras, spindec, out_nam, /gse2dsl,ignore_dlimits=ignore_dlimits if keyword_set(interpolate_state) then begin ssl2dsl, name_input=out_nam, name_thx_spinper=spinper, name_thx_spinphase=spinphase, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,/interpolate_state endif else begin ssl2dsl, name_input=out_nam, name_output=out_nam, /dsl2ssl,ignore_dlimits=ignore_dlimits,spinmodel_ptr=spinmodel_get_ptr(prb) endelse spg2ssl,out_nam,out_nam,/ssl2spg,ignore_dlimits=ignore_dlimits end endcase else: begin message, /info,"thm_cotrans: don't know how to transform "+in_c+" to " $ + out_coord end endcase if n_elements(name_list) eq 0 then begin name_list = [out_nam] endif else begin name_list = [name_list,out_nam] endelse ;this statement is superfluous in the presence of new logic ;validating coordinate systems ; if in_c ne out_coord then $ ; dprint, 'thm_cotrans: '+out_coord+' output placed in '+out_nam endfor if arg_present(out_vars) && n_elements(name_list) gt 0 then begin out_vars = name_list endif end