;+ ;FUNCTION: angle_to_bins(dat,an,EBIN=ebin) ;INPUT: ; dat: structure, 2d data structure filled by get_eesa_surv, get_eesa_burst, etc. ; an: fltarr(2), 2D - min,max pitch angle limits (0-360 deg) ; fltarr(2,2), 3D - array of (theta,phi) angle values ; theta min,max (0,0),(1,0) -90<theta<90, thmin<thmax ; phi min,max (0,1),(1,1) 0<phi<360 ;KEYWORD: ; EBIN int optional, energy bin corresponding to "an" ; used when angles depend upon energy bin ;PURPOSE: ; Returns the angle "bins" array defined by "an" limits ; ;CREATED BY: ; J.McFadden ;LAST MODIFICATION: ; 96-4-25 J.McFadden ; 96-8-27 J.McFadden Changed algorithm to include (mod 360.) and ; handle arbitrary order in dat.theta or dat.phi ;- function angle_to_bins,dat,an,EBIN=ebin2 if dat.valid eq 0 then begin print,'Invalid Data' return, !values.f_nan endif if keyword_set(ebin2) and dimen(ebin2) ne 1 then begin print,' Error: ebin must be an integer!' return,!values.f_nan endif if keyword_set(ebin2) then ebin=ebin2 else ebin=fix(dat.nenergy/2) if ndimen(an) le 1 then begin andim=dimen1(an) if andim ne 2 then begin print,'Error in angle_to_bins: dimen1(an) must equal 2' return,!values.f_nan endif else begin theta = reform(dat.theta(ebin,*)) theta = 360.*(theta/360.-floor(theta/360.)) th = 360.*(an/360.-floor(an/360.)) if th(0) lt th(1) then begin bins = theta ge th(0) and theta lt th(1) endif else if th(0) gt th(1) then begin bins = theta ge th(0) or theta lt th(1) endif else if an(0) ne an(1) then begin bins = bytarr(dat.nbins) bins(*)=1 endif else begin bins = bytarr(dat.nbins) tmp=min(abs(abs(abs(theta-th(0))-180.)-180.),indmin) bins(indmin)=1 endelse return,bins endelse endif else begin andim=dimen1(an) if andim ne 2 then begin print,'Error in angle_to_bins: dimen1(an) must equal 2' return,!values.f_nan endif else begin theta = reform(dat.theta(ebin,*)) th = reform(an(*,0)) if th(0) gt th(1) or th(0) lt -90. or th(1) gt 90. then begin print,'Error in angle_to_bins: -90. <= theta <= 90.' return,!values.f_nan endif phi = reform(dat.phi(ebin,*)) phi = 360.*(phi/360.-floor(phi/360.)) ph = reform(an(*,1)) ph = 360.*(ph/360.-floor(ph/360.)) if th(0) ne th(1) then begin if ph(0) lt ph(1) then begin bins = (phi ge ph(0) and phi lt ph(1)) and (theta ge th(0) and theta lt th(1)) endif else if ph(0) gt ph(1) then begin bins = (phi ge ph(0) or phi lt ph(1)) and (theta ge th(0) and theta lt th(1)) endif else if an(0,1) ne an(1,1) then begin bins = (theta ge th(0) and theta lt th(1)) endif else begin bins = bytarr(dat.nbins) tmp=min(abs(abs(abs(phi-ph(0))-180.)-180.),indmin) phmin = phi(indmin) bins = (phi eq phmin) and (theta ge th(0) and theta lt th(1)) endelse endif else begin tmp=min(abs(theta-th(0)),indmin) thmin=theta(indmin) if ph(0) lt ph(1) then begin bins = (phi ge ph(0) and phi lt ph(1)) and (theta eq thmin) endif else if ph(0) gt ph(1) then begin bins = (phi ge ph(0) or phi lt ph(1)) and (theta eq thmin) endif else if an(0,1) ne an(1,1) then begin bins = (theta eq thmin) endif else begin bins = bytarr(dat.nbins) tmp=min((abs(abs(phi-ph(0))-180.)-180.)^2+(theta-th(0))^2,indmin) bins(indmin)=1 endelse endelse return,bins endelse endelse end