;+

;FUNCTION:	j_2d_new(dat,ENERGY=en,ERANGE=er,EBINS=ebins,ANGLE=an,ARANGE=ar,BINS=bins)

;INPUT:	

;	dat:	structure,	2d data structure filled by get_eesa_surv, get_eesa_burst, etc.

;KEYWORDS

;	ENERGY:	fltarr(2),	optional, min,max energy range for integration

;	ERANGE:	fltarr(2),	optional, min,max energy bin numbers for integration

;	EBINS:	bytarr(na),	optional, energy bins array for integration

;					0,1=exclude,include,  

;					na = dat.nenergy

;	ANGLE:	fltarr(2),	optional, min,max pitch angle range for integration

;	ARANGE:	fltarr(2),	optional, min,max angle bin numbers for integration

;	BINS:	bytarr(nb),	optional, angle bins array for integration

;					0,1=exclude,include,  

;					nb = dat.ntheta

;	BINS:	bytarr(na,nb),	optional, energy/angle bins array for integration

;					0,1=exclude,include

;PURPOSE:

;	Returns the field aligned flux, Jz, #/cm^2-sec

;NOTES:	

;	Function normally called by "get_2dt.pro" to generate 

;	time series data for "tplot.pro".

;

;CREATED BY:

;	J.McFadden

;LAST MODIFICATION:

;	03-07-17	J.McFadden  	modified from n_2d_new.pro

;	03-08-11	J.McFadden  	modified from n_2d_new.pro

;	03-08-13	J.McFadden	s/c pot calculated from e- spectra when dat.sc_pot>65. 

;	06-03-04	J.McFadden 	modified s/c pot to sc_pot*1.2 +1.

;	10-12-22	J.McFadden	this routine does not work for omni.pro generated distributions

;-



function j_2d_new,dat2,ENERGY=en,ERANGE=er,EBINS=ebins,ANGLE=an,ARANGE=ar,BINS=bins



common last_pot,pot

if not keyword_set(pot) then pot=0.



flux2dz = 0.



if dat2.valid eq 0 then begin

  print,'Invalid Data'

  return, flux2dz

endif



dat = conv_units(dat2,"df")		; Use distribution function

na = dat.nenergy

nb = dat.nbins

	

;  Correct for spacecraft potential

;  the following needs modifications to be consistent with FAST

charge=1.  ; charge of species

value=0 & str_element,dat,'charge',value

if value le 0 or value ge 0 then value=value else value=0

if value ne 0 then charge=dat.charge		

if ((value eq 0) and (dat.mass lt 0.00010438871)) then charge=-1.			; this line works for Wind which does not have dat.charge

value=0 & str_element,dat,'sc_pot',value

if value le 0 or value ge 0 then value=value else value=0

	sc_pot = value*1.2 + 1.

	if value eq 0 then sc_pot=pot

	if sc_pot gt 66.*1.2 and charge eq -1. then begin

		peak_e=cold_peak_2d(dat,energy=[66.*1.2,1000.])

		ind = where(dat.energy(*,0) eq peak_e)

		ind1 = ind

		maxcnt=max(dat.data(ind1,*),ind2)

		d0=dat.data(ind1,ind2)

		e0=dat.energy(ind1,ind2)

		dm=dat.data(ind1-1,ind2)

		em=dat.energy(ind1-1,ind2)

		dp=dat.data(ind1+1,ind2)

		ep=dat.energy(ind1+1,ind2)

		if dm ge dp then sc_pot=(dm*em+d0*e0)/(dm+d0)

		if dm lt dp then sc_pot=(dp*ep+d0*e0)/(dp+d0)

	endif

	if value ne 0 then pot=sc_pot



; The following rotates the measurement in angle to partly account 

;	for s/c potential deflection of low energy electrons

if dat.data_name ne 'HSPAD' and dat.energy(0)-dat.denergy(0) lt dat.sc_pot then begin

	tmpmin=min(abs(dat.energy(*,0)-sc_pot),ind1)

	tmpmax=max(dat.data(ind1,*),ind2)

		th=dat.theta(ind1,ind2)

		if (sc_pot gt 20. and th ne 0. and th ne 180.) then begin

			if th le 90. then begin

				rot_ind=-fix(th/15.)

				if dat.data(ind1,ind2-1) lt dat.data(ind1,ind2+1) then rot_ind=rot_ind-1

				dat3=dat

				dat3.data=shift(dat3.data,0,rot_ind)

				dat.data(ind1-2:ind1+1,*)=dat3.data(ind1-2:ind1+1,*)

			endif

			if th gt 90. then begin

				rot_ind=fix(180-th/15.)

				if dat.data(ind1,ind2-1) gt dat.data(ind1,ind2+1) then rot_ind=rot_ind+1

				dat3=dat

				dat3.data=shift(dat3.data,0,rot_ind)

				dat.data(ind1-2:ind1+1,*)=dat3.data(ind1-2:ind1+1,*)

			endif

		endif

endif

	

energy=dat.energy+(charge*(sc_pot)/abs(charge))	

emin=energy-dat.denergy/2.>0.				

emax=energy+dat.denergy/2.>0.				

dat.energy=(emin+emax)/2.

dat.denergy=(emax-emin)



;ind=where(abs(dat.denergy-dat2.denergy) gt .01 and dat.denergy gt 0.01)

	;if n_elements(ind) gt 1 then dat.data(ind)=0.

	;if n_elements(ind) gt 1 then dat.data(ind)=dat.data(ind)*dat2.denergy(ind)/dat.denergy(ind)

	;if n_elements(ind) gt 1 then bgnd=0.7*dat.data(ind-1)*(dat2.denergy(ind)-dat.denergy(ind))/dat2.denergy(ind)

;if n_elements(ind) gt 1 then bgnd=dat.data(ind-1)*(dat2.denergy(ind)-dat.denergy(ind))/dat2.denergy(ind)

;if n_elements(ind) gt 1 then dat.data(ind)=((dat.data(ind)-bgnd)>0.)*dat2.denergy(ind)/dat.denergy(ind)

	;print,dat.energy(*,0)

	;print,dat.denergy(*,0)

	

ebins2=replicate(1b,na)

if keyword_set(en) then begin

	ebins2(*)=0

	er2=[energy_to_ebin(dat,en)]

	if er2(0) gt er2(1) then er2=reverse(er2)

	ebins2(er2(0):er2(1))=1

endif

if keyword_set(er) then begin

	ebins2(*)=0

	er2=er

	if er2(0) gt er2(1) then er2=reverse(er2)

	ebins2(er2(0):er2(1))=1

endif

if keyword_set(ebins) then ebins2=ebins

;print,en,er2,ebins2



bins2=replicate(1b,nb)

if keyword_set(an) then begin

	if ndimen(an) ne 1 or dimen1(an) ne 2 then begin

		print,'Error - angle keyword must be fltarr(2)'

	endif else begin

		bins2=angle_to_bins(dat,an)

	endelse

endif

if keyword_set(ar) then begin

	bins2(*)=0

	if ar(0) gt ar(1) then begin

		bins2(ar(0):nb-1)=1

		bins2(0:ar(1))=1

	endif else begin

		bins2(ar(0):ar(1))=1

	endelse

endif

if keyword_set(bins) then bins2=bins



if ndimen(bins2) ne 2 then bins2=ebins2#bins2



data = dat.data*bins2

energy = dat.energy

denergy = dat.denergy

theta = dat.theta/!radeg

dtheta = dat.dtheta/!radeg

mass = dat.mass     

value=0 & str_element,dat,'domega',value

if n_elements(value) ne 1 then domega = dat.domega



; check to see if pitch-angles wrap around past 180 (to 360)

; (e.g. FAST data) or not. If they do, then calculate an appropriate

; domega. 



; This section for FAST

; the more complex calculation of domega*cos(theta) works better for narrow beams

; the commented out lines below are for simplified integrals over solid angle where 

;	cos(theta) in the integral is assumed to be the center values

if max(dat.theta) gt 200. then begin

  if (theta(0,0) eq theta(na-1,0)) then nna=0 else nna=na-1

  if ndimen(dtheta) eq 1 then dtheta=replicate(1.,na)#dtheta

  domega = theta

  for a=0,nna do begin

    for b=0,nb-1 do begin

	if (abs(theta(a,b)-!pi) lt dtheta(a,b)/2.) then begin 

		th1 = (!pi+theta(a,b)-dtheta(a,b)/2.)/2.

		dth1 = (!pi-th1)

		th2 = (!pi+theta(a,b)+dtheta(a,b)/2.)/2.

		dth2 = (th2-!pi)

;        	domega(a, b) = 2.*!pi*(abs(sin(th1))*sin(dth1)+abs(sin(th2))*sin(dth2)) 

		domega(a,b)=2.*!pi*(abs(sin(th1))*sin(dth1)*cos(th1)*cos(dth1) + abs(sin(th2))*sin(dth2)*cos(th1)*cos(dth2)) 

	endif else if (abs(theta(a,b)-2*!pi) lt dtheta(a,b)/2.) then begin

		th1 = (2.*!pi+theta(a,b)-dtheta(a,b)/2.)/2.

		dth1 = (2.*!pi-th1)

		th2 = (2.*!pi+theta(a,b)+dtheta(a,b)/2.)/2.

		dth2 = (th2-2.*!pi)

;        	domega(a, b) = 2.*!pi*(abs(sin(th1))*sin(dth1)+abs(sin(th2))*sin(dth2)) 

		domega(a,b)=2.*!pi*(abs(sin(th1))*sin(dth1)*cos(th1)*cos(dth1) + abs(sin(th2))*sin(dth2)*cos(th1)*cos(dth2)) 

	endif else if (abs(theta(a,b)) lt dtheta(a,b)/2.) then begin

		th1 = (theta(a,b)-dtheta(a,b)/2.)/2.

		dth1 = abs(th1)

		th2 = (theta(a,b)+dtheta(a,b)/2.)/2.

		dth2 = (th2)

;        	domega(a, b) = 2.*!pi*(abs(sin(th1))*sin(dth1)+abs(sin(th2))*sin(dth2)) 

		domega(a,b)=2.*!pi*(abs(sin(th1))*sin(dth1)*cos(th1)*cos(dth1) + abs(sin(th2))*sin(dth2)*cos(th1)*cos(dth2)) 

	endif else begin

		th1 = theta(a,b)

		dth1 = dtheta(a,b)/2.

;        	domega(a, b) = 2.*!pi*abs(sin(th1))*sin(dth1)

		domega(a,b)=2.*!pi*abs(sin(th1))*sin(dth1)*(cos(th1)*cos(dth1))

	endelse

    endfor

  endfor

  if (nna eq 0) then for a=1,na-1 do domega(a,*)=domega(0,*)

endif else domega=domega*cos(theta)



;solid_angle_corr=4.*!pi/total(domega[0,*])	; this should be correct in the structure

;if (solid_angle_corr lt .99 or solid_angle_corr gt 1.01) and max(theta) gt 1.2 then print,'Error in dat.domega.  Solid angle = ', solid_angle_corr   



;flux2dz = total(data*denergy*energy*domega*cos(theta))*(mass)^(-2.)*(2.)*(1.e5)

flux2dz = total(data*denergy*energy*domega)*(mass)^(-2.)*(2.)*(1.e5)



; units are #/cm^2-sec



return, flux2dz

end



