;+
;PROCEDURE:   mvn_mag_tplot
;PURPOSE:
;  Makes fancy MAG tplot panels: amplitude on a log scale, and phi/theta
;  in a single panel.  This routine is not intended for general use, but
;  you're welcome to use it.  Much of this code was borrowed from Takuya
;  Hara.
;
;USAGE:
;  mvn_mag_tplot
;INPUTS:
;       bvec:      Tplot variable name containing the magnetic field vectors.
;                  Default = 'mvn_B_1sec_maven_mso'.
;
;KEYWORDS:
;       SANG:      Archmedian spiral angle at Mars.  Default = 54 deg (for
;                  a nominal 400-km/s solar wind velocity).  The phi/theta
;                  panel will contain horizontal lines at the angles for
;                  toward and away sectors.
;
; $LastChangedBy: jimm $
; $LastChangedDate: 2017-02-17 11:57:50 -0800 (Fri, 17 Feb 2017) $
; $LastChangedRevision: 22820 $
; $URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_3_2/projects/maven/swea/mvn_mag_tplot.pro $
;
;CREATED BY:	David L. Mitchell  2015-04-02
;-

pro mvn_mag_tplot, bvec, model=model, sang=sang

  nan = !values.f_nan
  blab = ['Bx','By','Bz']
  bcol = [2,4,6]
  names = tnames()

  if not keyword_set(bvec) then bvec = 'mvn_B_1sec_maven_mso'
  if not keyword_set(sang) then sang = 54.

  get_data, bvec, alim=alim, data=b, index=i
  if (i eq 0) then begin
    print,"MAG data not found: ", bvec
    return
  endif
  bvec = names[i-1]

  str_element, alim, 'level', lvl, success=ok
  if (not ok) then lvl = 'L?'
  
  str_element, alim, 'spice_frame', frame, success=ok
  if (not ok) then frame = '??'
  if (strmatch(frame, '*spacecraft*', /fold)) then frame = 'S/C'
  if (strmatch(frame, '*mso*', /fold)) then frame = 'MSO'
  if (strmatch(frame, '*iau*', /fold)) then frame = 'GEO'
  
  if (frame eq 'MSO') then acon = [(180.-sang), 180., (360.-sang)] $
                      else acon = [180.]

  btot = sqrt(total(b.y*b.y, 2))

  options, bvec, labels=blab, colors=bcol, labflag=1, constant=0, $
                 ytitle='MAG ' + lvl, /def

  get_data, bvec, dl=bl
  bmax = max(btot, /nan)
  if (bmax gt 100.) then blog = 1 else blog = 0     

  bp = b.y ; positive sign
  bm = b.y ; negative sign
  lbp = blab
  lbm = blab
  for il=0,2 do if (b.y[n_elements(b.x)-1, il] gt 0.) then lbm[il] = '' else lbp[il] = '' 
  undefine, il

  idx = where(bp lt 0., nidx)
  if (nidx gt 0) then bp[idx] = nan
  idx = where(bm gt 0., nidx)
  if (nidx gt 0) then bm[idx] = nan

  store_data, bvec + '_plus', data={x: b.x, y: bp}, dl=bl
  store_data, bvec + '_minus', data={x: b.x, y: abs(bm)}, dl=bl

  options, bvec + '_plus', panel_size=0.5, labels=lbp, $
           ytitle='MAG ' + lvl, ysubtitle='+B' + strlowcase(frame) + ' [nT]', /def
  options, bvec + '_minus', panel_size=0.5, labels=lbm, $
           ytitle='MAG ' + lvl, ysubtitle='-B' + strlowcase(frame) + ' [nT]', /def
  options, bvec +  ['_plus', '_minus'], labflag=1

  store_data, 'mvn_mag_' + strlowcase(lvl) + '_bamp_1sec', $
              data={x: b.x, y: btot}, $
              dlimits={ytitle: 'MAG ' + lvl, ysubtitle: '|B| [nT]'}

  if keyword_set(model) then mvn_model_bcrust_load, /nocalc
  get_data, 'mvn_mod_bcrust_amp', index=i
  if (i eq 0) then store_data, 'mvn_mod_bcrust_amp', data={x:minmax(b.x), y:[nan,nan]}
  options,'mvn_mod_bcrust_amp','linestyle',2
  
  store_data, 'mvn_mag_bamp', data=['mvn_mag_' + strlowcase(lvl) + '_bamp_1sec', 'mvn_mod_bcrust_amp'], $
              dlimits={labels: ['obs', 'model'], colors:[2,6], labflag: 1, ytitle: 'MAG ' + lvl, ysubtitle: '|B| [nT]'} 

  if (blog) then begin
    ylim, 'mvn_mag_bamp', 0.5, bmax*1.1, 1
    options, 'mvn_mag_bamp', ytickformat='mvn_ql_pfp_tplot_ytickname_plus_log'
  endif

  ylim, bvec + '_plus', 0.5, bmax*1.1, 1
  ylim, bvec + '_minus', bmax*1.1, 0.5, 1
  options, bvec + '_plus', ytickformat='mvn_ql_pfp_tplot_ytickname_plus_log'
  options, bvec + '_minus', ytickformat='mvn_ql_pfp_tplot_ytickname_minus_log'

  undefine, bmax, blog, status
     
  bphi = atan(b.y[*, 1], b.y[*, 0])
  bthe = asin(b.y[*, 2] / btot)
  idx = where(bphi lt 0., nidx)
  if (nidx gt 0) then bphi[idx] += 2.*!pi
  undefine, idx, nidx

  store_data, 'mvn_mag_bang', data={x: b.x, y: [ [bthe*!RADEG + 180.], [bphi*!RADEG]]}, $
              dlimits={psym: 3, colors: [2,6], ytitle: 'MAG ' + lvl + ' (' + frame + ')', ysubtitle: 'Angle [deg]', $
                       yticks: 4, yminor: 3, labels: ['theta!C  +180', 'phi'], labflag: 1, constant: acon}
  ylim, 'mvn_mag_bang', 0., 360., 0., /def
  undefine, bphi, bthe, b

  return

end
