;+
;
;PROCEDURE:       MVN_MODEL_BCRUST_RESTORE
;
;PURPOSE:         Restores tplot save file(s) associated with the
;                 Martian crustal magnetic field model(s).
;
;INPUTS:          
;
;       TRANGE:   Restores tplot save files spanning this time range.
;
;KEYWORDS:
;
;        ORBIT:   Restores tplot save files by orbit number or range
;                 of orbit numbers (trange is ignored). Orbits are numbered
;                 using the NAIF convention, where the orbit number increments
;                 at periapsis. Data are loaded from the apoapsis preceding
;                 the first orbit (periapsis) number to the apoapsis following
;                 the last orbit number.
;
; MORSCHHAUSER:   Restores Morschhauser's 2014 spherical harmonic model.
;                 (It is the default model to resotre).
;
;       ARKANI:   Restores Arkani-Hamed's spherical harmonic model.
;
;    CAIN_2003:   Restores Cain's 2003 spherical harmonic model.
;
;    CAIN_2011:   Restores Cain's 2011 spherical harmonic model.
;
;     PURUCKER:   Restores Purucker's spherical harmonic model.
;
;CREATED BY:      Takuya Hara on 2015-02-18.
;
;LAST MODIFICATION:
; $LastChangedBy: hara $
; $LastChangedDate: 2015-04-29 12:56:13 -0700 (Wed, 29 Apr 2015) $
; $LastChangedRevision: 17449 $
; $URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_2_1/projects/maven/models/mvn_model_bcrust_restore.pro $
;
;-
PRO mvn_model_bcrust_restore, var, orbit=orbit, silent=sl, verbose=vb, status=status,  $
                              cain_2003=cain_2003, cain_2011=cain_2011, arkani=arkani, $
                              purucker=purucker, morschhauser=morschhauser, path=path

  IF SIZE(var, /type) NE 0 THEN BEGIN
     trange = time_double(var)
     IF N_ELEMENTS(trange) NE 2 THEN BEGIN
        dprint, 'The time range must be two elements array like [tmin, tmax].'
        RETURN
     ENDIF 
  ENDIF ELSE BEGIN
     IF keyword_set(orbit) THEN BEGIN
        imin = MIN(orbit, max=imax)
        trange = mvn_orbit_num(orbnum=[imin-0.5, imax+0.5])
        undefine, imin, imax
     ENDIF 
     
     tplot_options, get_opt=topt
     tspan_exists = (MAX(topt.trange_full) GT time_double('2014-09-22'))
     IF (tspan_exists) THEN trange = topt.trange_full
     undefine, topt, tspan_exists
  ENDELSE 

  IF SIZE(trange, /type) EQ 0 THEN BEGIN
     dprint, 'You must set the specified time interval to load.'
     RETURN
  ENDIF
 
  IF keyword_set(sl) THEN silent = sl ELSE silent = 0
  IF keyword_set(vb) THEN verbose = vb ELSE verbose = 0
  verbose -= silent 

  IF ~keyword_set(path) THEN $
     path = 'maven/data/mod/bcrust/YYYY/MM/'
  fname = 'mvn_mod_bcrust_YYYYMMDD.tplot'
  
  file = mvn_pfp_file_retrieve(path+fname, trange=trange, /daily_names, /valid)
  
  idx = WHERE(file NE '', ndat)
  IF ndat EQ 0 THEN BEGIN
     dprint, 'No tplot save files found.'
     status = 0
     RETURN
  ENDIF
  undefine, idx

  IF SIZE(morschhauser, /type) EQ 0 THEN morschhauser = 1 $
  ELSE IF morschhauser NE 0 THEN morschhauser = 1
  nmod =  ( N_ELEMENTS(cain_2003) + N_ELEMENTS(cain_2011) + $
            N_ELEMENTS(purucker)  + N_ELEMENTS(arkani) + N_ELEMENTS(morschhauser))
  IF nmod EQ 1 THEN suffix = ''

  dotplot = INTARR(5)
  dotplot[*] = 0
  dotplot[0] = keyword_set(morschhauser)
  dotplot[1] = keyword_set(cain_2003)
  dotplot[2] = keyword_set(cain_2011)
  dotplot[3] = keyword_set(arkani)
  dotplot[4] = keyword_set(purucker)

  tname = 'mvn_model_bcrust'
  prt = 1
  status = 0
  FOR i=0L, ndat-1L DO BEGIN
     IF (FILE_INFO(file[i])).exists EQ 1 THEN BEGIN
        status = 1
        tplot_restore, filename=file[i]

        IF (prt) THEN BEGIN
           print, ptrace()
           prt = 0
        ENDIF 
        print, '  Restoring ' + FILE_BASENAME(file[i])

        IF (dotplot[0]) THEN BEGIN
           get_data, tname + '_mso_morschhauser', data=dm, dl=dlm
           append_array, tm, dm.x
           append_array, bm, dm.y
        ENDIF 
        IF (dotplot[1]) THEN BEGIN
           get_data, tname + '_mso_cain_2003', data=dc03, dl=dlc03
           append_array, tc03, dc03.x
           append_array, bc03, dc03.y
        ENDIF 
        IF (dotplot[2]) THEN BEGIN
           get_data, tname + '_mso_cain_2011', data=dc11, dl=dlc11
           append_array, tc11, dc11.x
           append_array, bc11, dc11.y
        ENDIF 
        IF (dotplot[3]) THEN BEGIN
           get_data, tname + '_mso_arkani', data=da, dl=dla
           append_array, ta, da.x
           append_array, ba, da.y
        ENDIF 
        IF (dotplot[4]) THEN BEGIN
           get_data, tname + '_mso_purucker', data=dp, dl=dlp
           append_array, tp, dp.x
           append_array, bp, dp.y
        ENDIF
     ENDIF 
     store_data, tname + '*', /delete, verbose=verbose
  ENDFOR  
  
  IF (status EQ 0) THEN BEGIN
     dprint, 'There has not been any tplot save files yet.'
     status = 0
     RETURN
  ENDIF 

  tname = 'mvn_mod_bcrust'
  modeler = [ 'Morschhauser', $
              'Cain (2003)' , $
              'Cain (2011)' , $
              'Arkani',       $
              'Purucker'      ]

  suffixes = ['_m', '_c03', '_c11', '_a', '_p']
  FOR i=0, 4 DO BEGIN
     IF (dotplot[i]) THEN BEGIN
        CASE i OF
           0: BEGIN
              time = tm
              bmso = bm
              dlim = dlm
           END 
           1: BEGIN
              time = tc03
              bmso = bc03
              dlim = dlc03
           END 
           2: BEGIN
              time = tc11
              bmso = bc11
              dlim = dlc11
           END 
           3: BEGIN
              time = ta
              bmso = ba
              dlim = dla
           END 
           4: BEGIN
              time = tp
              bmso = bp
              dlim = dlp
           END 
        ENDCASE 
           
        bmso = bmso[UNIQ(time, SORT(time)), *]
        time = time[UNIQ(time, SORT(time))]
        
        idx = WHERE(time GE trange[0] AND time LE trange[1], cnt)
        IF cnt GT 0 THEN BEGIN
           bmso = bmso[idx, *]
           time = time[idx]
           IF SIZE(suffix, /type) NE 0 THEN suf = suffix ELSE suf = suffixes[i]
           store_data, tname + '_mso' + suf, data={x: time, y: bmso}, dlimits=dlim, lim={ytitle: 'Model'}
           store_data, tname + '_amp' + suf, data={x: time, y: SQRT(TOTAL(bmso*bmso, 2))}, $
                       dlimits={ytitle: modeler[i], ysubtitle: '|B| [nT]'}, limits={ytitle: 'Model'}
                       
           IF SIZE(suffix, /type) NE 0 THEN RETURN 
        ENDIF 
        undefine, idx, cnt
        undefine, time, bmso, dlim
     ENDIF 
  ENDFOR 
  RETURN
END