;+
; NAME:
;   rbsp_efw_make_l2_vsvy_hires
;
; PURPOSE: Create L2 (level-2) CDF files from the Van Allen Probe EFW
;			Vsvy data product.
;
;
; CALLING SEQUENCE:
;
; ARGUMENTS:	sc -> Which probe? 'a' or 'b'
;				date -> ex, '2013-10-13'
;
; KEYWORDS:
;
;
; EXAMPLES:	rbsp_efw_make_l2_vsvy_hires,'a','2012-10-13'
;
; NOTES: This program stuffs the following quantities into the skeleton CDF file.
;		V1-V6 -> single-ended potential quantities
;		(Vx+Vy)/2 -> opposing boom averages
;
;
; HISTORY:
;   March 2020: Created by Aaron Breneman, University of Minnesota
;
;
; VERSION:
;	$LastChangedBy: aaronbreneman $
;	$LastChangedDate: 2020-04-29 07:54:32 -0700 (Wed, 29 Apr 2020) $
;	$LastChangedRevision: 28626 $
; 	$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/trunk/general/missions/rbsp/efw/l1_to_l2/rbsp_efw_make_l2_vsvy_hires.pro $
;-


;****NOTE: UPDATE THIS FOR PHASE F


pro rbsp_efw_make_l2_vsvy_hires,sc,date,$
	folder=folder,$
	version=version,$
	testing=testing


	rbsp_efw_init

	skip_plot = 1   ;set to skip restoration of cdf file and test plotting at end of program


	dprint,'BEGIN TIME IS ',systime()

	if n_elements(version) eq 0 then version = 1
	vstr = string(version, format='(I02)')
	version = 'v'+vstr

	sc=strlowcase(sc)
	if sc ne 'a' and sc ne 'b' then begin
		dprint,'Invalid spacecraft: '+sc+', returning.'
		return
	endif
	rbx = 'rbsp' + strlowcase(sc[0]) + '_'



		year = strmid(date, 0, 4)

	if ~keyword_set(folder) then folder = !rbsp_efw.local_data_dir + $
																				'rbsp' + strlowcase(sc[0]) + path_sep() + $
																				'l2' + path_sep() + $
																				'spinfit' + path_sep() + $
																				year + path_sep()

	; make sure we have the trailing slash on folder
	if strmid(folder,strlen(folder)-1,1) ne path_sep() then folder=folder+path_sep()
	if ~keyword_set(no_cdf) then file_mkdir, folder


	;Grab skeleton file
	skeleton='/Volumes/UserA/user_homes/kersten/Code/tdas_svn_daily/general/missions/rbsp/efw/l1_to_l2/'+rbx+'efw-l2_00000000_vXX.cdf'
	if ~keyword_set(testing) then begin
		skeletonfile=file_search(skeleton,count=found)
		if ~found then begin
	     dprint,'Could not find skeleton CDF, returning.'
	     return
	  endif
	endif

	if keyword_set(testing) then $
		 skeletonfile = '~/Desktop/code/Aaron/RBSP/TDAS_trunk_svn/general/missions/rbsp/efw/l1_to_l2/rbsp'+$
										sc+'_efw-l2_00000000_vXX.cdf'



	skeletonFile=skeletonFile[0]

	if keyword_set(testing) then folder = '~/Desktop/code/Aaron/RBSP/TDAS_trunk_svn/general/missions/rbsp/efw/l1_to_l2/'



	;Load some data
	timespan,date

	;Load the survey data
	rbsp_load_efw_waveform,probe=sc,type='calibrated',datatype='vsvy',/noclean
	get_data,rbx+'efw_vsvy',data=vsvy
	if ~is_struct(vsvy) then begin
  		dprint,rbx+'efw_vsvy unavailable, returning.'
  		return
	endif

	times_v = vsvy.x

;	;Not ready to release the V5, V6 values.
;	vsvy.y[*,4] = -1.0e31
;	vsvy.y[*,5] = -1.0e31


;Define keyword inheritance to pass to subroutines. This will ensure that
;subsequent routines don't reload spice kernels or rbsp_efw_init
;extra = create_struct('no_rbsp_efw_init',1)
	rbsp_efw_position_velocity_crib,probe=sc,/noplot;,_extra=extra



	get_data,rbx+'state_mlt',data=tmp
  times = tmp.x
  epoch = tplot_time_to_epoch(times,/epoch16)


  ;Load ECT's magnetic ephemeris
  rbsp_read_ect_mag_ephem,sc






	;Downsample the GSE position and velocity variables to cadence of spinfit data
	varstmp = [rbx+'state_vel_coro_mgse',rbx+'state_pos_gse',$
	rbx+'state_vel_gse',$
	rbx+'state_mlt',rbx+'state_mlat',rbx+'state_lshell',$
	rbx+'ME_orbitnumber',rbx+'spinaxis_direction_gse']

	for qq=0,n_elements(varstmp)-1 do tinterpol_mxn,varstmp[qq],times,newname=varstmp[qq]




	;get_data,'vxb',data=vxb
	get_data,rbx+'state_pos_gse',data=pos_gse
	get_data,rbx+'state_vel_gse',data=vel_gse
;     get_data,rbx+'E_coro_mgse',data=ecoro_mgse
	get_data,rbx+'state_vel_coro_mgse',data=vcoro_mgse
	get_data,rbx+'spinaxis_direction_gse',data=sa
	;get_data,'angles',data=angles
	get_data,rbx+'state_mlt',data=mlt
	get_data,rbx+'state_mlat',data=mlat
	get_data,rbx+'state_lshell',data=lshell
	get_data,rbx+'ME_orbitnumber',data=orbit_num


	if is_struct(orbit_num) then orbit_num = orbit_num.y else orbit_num = replicate(-1.e31,n_elements(times))







  ;--------------------------------------------------
  ;Get flag values (also gets density values from v12 and v34)
  ;--------------------------------------------------



   flag_str = rbsp_efw_get_flag_values(sc,times,density_min=dmin,boom_pair=bp,_extra=extra)

   flag_arr = flag_str.flag_arr
   bias_sweep_flag = flag_str.bias_sweep_flag
   ab_flag = flag_str.ab_flag
   charging_flag = flag_str.charging_flag
   ibias = flag_str.ibias





	;Create average values of opposing antennas
	v1v2 = 0.5*(vsvy.y[*,0] + vsvy.y[*,1])
	v3v4 = 0.5*(vsvy.y[*,2] + vsvy.y[*,3])
	v5v6 = 0.5*(vsvy.y[*,4] + vsvy.y[*,5])


;	;not ready to release V5 or V6 values
;	v5v6[*] = -1.0e31


;;*****TEMPORARY********
;;Set bad vavg values to ISTP compliant value of -1.0E31
;goo = where((finite(vsvy.y[*,0]) eq 0) or (finite(vsvy.y[*,1]) eq 0))
;if goo[0] ne -1 then v1v2[goo] = -1.0e31
;goo = where((finite(vsvy.y[*,2]) eq 0) or (finite(vsvy.y[*,3]) eq 0))
;if goo[0] ne -1 then v3v4[goo] = -1.0e31
;;**********************



	vsvy_vavg = [[v1v2],[v3v4],[v5v6]]

	epoch_v = tplot_time_to_epoch(times_v,/epoch16)

;;;charging, autobias, eclipse, and extreme charging flags all in one variable for convenience
;flags = [[flag_arr[*,15]],[flag_arr[*,14]],[flag_arr[*,1]],[flag_arr[*,16]]]



	;Stuff values into the cdf skeleton structure

	year = strmid(date,0,4) & mm = strmid(date,5,2) & dd = strmid(date,8,2)
  datafile = folder+rbx+'efw-l2_vsvy-hires_'+year+mm+dd+'_v'+vstr+'.cdf'
  file_copy, skeletonFile, datafile, /overwrite ; Force to replace old file.
  cdfid = cdf_open(datafile)





	;Final list of variables to NOT delete
	varsave_general = ['epoch','epoch_v','vsvy','vsvy_vavg','flags_all',$
	'mlt','mlat','lshell','position_gse','velocity_gse','orbit_num']
;	'flags_charging_bias_eclipse']


	;Now that we have renamed some of the variables to our liking,
	;get list of all the variable names in the CDF file.
	inq = cdf_inquire(cdfid)
	CDFvarnames = ''
	for varNum = 0, inq.nzvars-1 do begin $
		stmp = cdf_varinq(cdfid,varnum,/zvariable) & $
		if stmp.recvar eq 'VARY' then CDFvarnames = [CDFvarnames,stmp.name]
	endfor
	CDFvarnames = CDFvarnames[1:n_elements(CDFvarnames)-1]


	;Delete all variables we don't want to save.
	for qq=0,n_elements(CDFvarnames)-1 do begin $
		tstt = array_contains(varsave_general,CDFvarnames[qq]) & $
		if not tstt then print,'Deleting var:  ', CDFvarnames[qq] & $
		if not tstt then cdf_vardelete,cdfid,CDFvarnames[qq]
	endfor



	cdf_varput,cdfid,'epoch',epoch
	cdf_varput,cdfid,'epoch_v',epoch_v
	cdf_varput,cdfid,'vsvy',transpose(vsvy.y)
	cdf_varput,cdfid,'vsvy_vavg',transpose(vsvy_vavg)

	;*****THIS CDF VAR IS ON "EPOCH" CADENCE. BUT, FLAG_ARR IS ON "EPOCH_V" CADENCE
	cdf_varput,cdfid,'flags_all',transpose(flag_arr)

	cdf_varput,cdfid,'mlt',transpose(mlt.y)
  cdf_varput,cdfid,'mlat',transpose(mlat.y)
  cdf_varput,cdfid,'lshell',transpose(lshell.y)
  cdf_varput,cdfid,'position_gse',transpose(pos_gse.y)
  cdf_varput,cdfid,'velocity_gse',transpose(vel_gse.y)
  cdf_varput,cdfid,'orbit_num',orbit_num




	cdf_close, cdfid

	dprint,'END TIME IS: ',systime()

	store_data,tnames(),/delete

end
