pro rd_sxtgoes,t0,t1,sxg, one_minute=one_minute, five_minute=five_minute, $
		goes6=goes6, goes8=goes8, window=window, debug=debug
;+
;   Name: rd_sxtgoes
;
;   Purpose: read SXL & corresponding GOES record and return merged (SXG) record
;
;   Input Parameters:
;      t0, t1 - start and stop time (required)
;
;   Output Parameters:
;      sxg - sxg records - merge of SXT and GOES records (time=SXL)
;
;   Keyword Parameters:
;      one_minute, five_minute - switches determine which GOES file to use
;				 (default is one_minute averages)
;      goes6,goes8 - switch to select GOES satellite (default=goes7)
;      window - GOES read window size (secondes) - if vector, will expand 
;               read window and retry until data found or all windows tried.
;
;   History:
;      11-sep-1995 (SLF) - generate SXT/GOES  input structures for SXG files
;      21-sep-1995 (SLF) - Revised SXG structure (add sxt_flux tag)
;
;   Restrictions:
;      WINDOW currently only applied during GOES read (no SXL records omitted)
;      GOES 7 only for now
;-
debug=keyword_set(debug)

if n_elements(t0) eq 0 or n_elements(t1) eq 0 then begin
   message,/info,"Must supply start and stop times...
   return
endif

goes6=keyword_set(goes6)
goes8=keyword_set(goes8)
goes7=(1-goes6) and (1-goes8)
gset=7					; default

for sat=6,8 do estat=execute("if keyword_set(goes" + strtrim(sat,2) + ") then gsat=sat")

five_minute=keyword_set(five_minute)
one_minute=keyword_set(one_minute) or (1-five_minute)	; default=1 minute

goes_status=([1,2])(five_minute)*256 or gset		; goes status byte

if not keyword_set(window) then window=[300l,3600l,86400l,2*86400l, 7*86400l]	; default delta T < 300

window=abs(window)					; must be positive

sxg=0				; define for early exit

rd_sxl, t0, t1, sxlind,  sxldat	; get sxl data
ss=-1
if data_chk(sxlind,/struct) then $
   ss=sel_timrange(sxlind,t0,t1,/between)
if ss(0) eq -1 then sxlind=0			; rd_sxl returns data even
dn=sfd_decomp(bindgen(256))

if data_chk(sxlind,/struct) then begin
   nsxl=n_elements(sxlind)
;  now get goes for SXL times, +/- WINDOW
   gxd=0
   pwin=0
   twin0=timegrid(sxlind(0),sec=-(window),/string)
   twin1=timegrid(sxlind(nsxl-1),sec=window,/string)
;  expand window as required (timeout when all elements of WINDOW tried)

   while not data_chk(gxd,/struct) and pwin lt n_elements(window)-1 do begin
      rd_gxd, twin0(pwin), twin1(pwin), gxd, $
         one_minute=one_minute, five_minute=five_minute
      if not data_chk(gxd,/struct) and pwin lt n_elements(window)-1 then $
         prstr,["No GOES data within " + strtrim(window(pwin),2) + " seconds of SXL data, ", $
		"Expanding window and retrying...."]
      pwin=pwin+1
   endwhile
   if not data_chk(gxd,/struct) then begin
         message,/info,"Giving up due to lack of GOES data within window..."
         return				    ;** unstructured exit **
   endif
;  select GOES to closest SXL record
   ss=tim2dset(gxd, sxlind, delta_sec=delta_sec)
   good=where(abs(delta_sec) le window,gcnt)		; future? weed out large differ.
   sxt_struct,sxg_sxtgoes=sxg_struct			;
   sxg=replicate(sxg_struct,nsxl)			; sxg templates
   sxg=str_copy_tags(sxg,sxlind.gen)			; SXL->  merged output structure
   sxg=str_copy_tags(sxg,sxlind.sxt)
   sxg.lo=gxd(ss).lo					; GOES-> merged output structure
   sxg.hi=gxd(ss).hi
   sxg.goes_status=goes_status				; update goes status field
   if nsxl eq 1 then delta_sec=delta_sec(0)		; force scaler 
   sxg.deltat=round(delta_sec)				; update deltaT field
   for i=0,nsxl-1 do $
      sxg(i).sxt_flux=round(total(dn*sxldat(i).hist(*,0)))
   if debug then $
      prcol, fmt_tim(sxg),fmt_tim(gxd(ss)),sxg.deltat, sxg.sxt_flux, sxg.lo, $
             header="SXL TIME,GXD TIME,DeltaT,SXT FLUX,GOESLO"
endif else begin
   message,/info,"No SXL records between: " + fmt_tim(t0) + " and " + fmt_tim(t1)
endelse

return
end
