;+
; NAME:
; THM_GSM2LMN_WRAP
;
; PURPOSE:
; Wrapper transforms THEMIS-generated vector field from GSM to LMN (boundary-normal)
; coordinate system for magnetopause with help of routine gsm2lmn.pro.
; It gets the necessary solar wind data with help of routine
; get_sw_data.pro and passes all necessary keywords to it.
; In distinction of GSM2LMN_WRAP, it finds space-time coordinates using
; reference to a THEMIS probe.
;
; CATEGORY:
; Coordinate Transformation
;
; CALLING SEQUENCE:
; thm_gsm2lmn_wrap,data_in,data_out,probe,SWkeywords
;
; INPUTS:
; data_in: structure {x:time, y:data}
; probe: string specify which spacecraft caught data_in.
;
; KEYWORDS: Solarwind_load.pro keywords (Any combination of keywords defining
; output of solarwind_load.pro)
;
; PARAMETERS: none
;
; OUTPUTS:
; data_out: structure {x:time, y:transformed_data}
;
; DEPENDENCIES: gsm2lmn.pro, solarwind_load.pro. Intermediate-level part of LMN
; transform package.
;
; MODIFICATION HISTORY:
; Written by: Liu Jiang 09/21/2007
; Modified for new background routines by: Vladimir Kondratovich 2007/12/28
; Modified for error handling and changed () to [] for arrays
; by: Lynn B. Wilson III 2012/10/26
;-
;
; THE CODE BEGINS:
pro thm_gsm2lmn_wrap,data_in,data_out,probe,_Extra=ex
;; Check input
IF (N_PARAMS() EQ 2) THEN BEGIN
probe = 'all'
ENDIF ELSE probe = STRLOWCASE(probe[0]) ;; make sure it's lowercase
; preparation of data
time = data_in.X
btgsm = data_in.Y
timer = [time[0],time[N_ELEMENTS(time) - 1L]]
solarwind_load,swdata,dst,timer,_Extra=ex
; get the position of THEMIS
thm_load_state, probe=probe, trange = timer, /GET_SUPP
statname = 'th'+probe+'_state_pos'
get_data, statname, timep, ptgei
IF (SIZE(timep,/TYPE) NE 5 AND N_ELEMENTS(timep) EQ 1) THEN BEGIN
badmssg = 'No state positions were found...'
MESSAGE,badmssg,/CONTINUE,/INFORMATIONAL
RETURN
ENDIF
;; Rotate positions: GEI -> GSE
cotrans, ptgei, ptgse, timep, /GEI2GSE
;; Rotate positions: GSE -> GSM
cotrans, ptgse, ptgsm, timep, /GSE2GSM
nout = N_ELEMENTS(time)
ptgsmout = FLTARR(nout,3)
FOR ii=0L, 2L DO BEGIN
pti = REFORM(ptgsm[*,ii])
ptouti = INTERPOL(pti,timep,time)
ptgsmout[*,ii] = ptouti
ENDFOR
txyz = [[time],[ptgsmout]]
bxyz = btgsm
;; Rotate input: GSM -> LMN
gsm2lmn,txyz,bxyz,blmn,swdata
data_out = {X:time,Y:blmn}
RETURN
END