;+
; Project     : SDAC
;                   
; Name        : RUN_BATSE
;               
; Purpose     : This procedure fits an interval around the peak of a BATSE
;	flare and extracts the fit parameters and the raw rates.
;               
; Category    : BATSE
;               
; Explanation : Using the BATSE catalog, SPEX is used to read, extract, and 
;	fit the observation of CONT data.
;               
; Use         : Run_batse, flare, obs
;    
; Inputs      : Flare - BATSE archive flare number
;               
; Opt. Inputs : None
;               
; Outputs     :	OBS   - Structure with these tags
;		Flare -
;		Det_id- ID of most fitted detector.
;		Cosine- cosine of fitted detector
;		Aspect- sorting order for aspect starting with 1 for most sunward.
;		Edges - Channel edges in keV.
;		Ch_mask - 1 for channel used in fit, 0 unused.
;		Apar  - Single Power-law fit values.
;		Utbase- Basetime in seconds from 1-jan-1979.
;		Xselect- Interval times relative to Utbase.
;		Obsi- Interval count rate (/s/keV/cm2) for each channel.
;		Eobsi- Uncertainty on obsi.
;		Backi- Background for interval.
;		Ebacki
;		
;		
;
; Opt. Outputs: None
;               
; Keywords    : ASPECT_ID - If used, set det_id to this aspect value. 1 is most sunward
;		8 is least sunward.
;
; Calls	      : SPEX_PROC, SPEX_CURRENT, READ_FLARE
;
; Common      : None
;               
; Restrictions: 
;               
; Side effects: None.
;               
; Prev. Hist  : Version 1, RAS, 29-apr-1997.
;
; Modified    : 
;
;-            
;==============================================================================
pro run_batse, flare, obs, aspect_id=aspect_id, error=error, commands=commands

error=1
checkvar, commands, ['ener,25,100,100,350,350,600','scale,1,8,40','graph']

read_flare, flare, fld
file = loc_file(path='BATSE_CONT', '*.cont_'+strtrim(fld.(0),2), count=fcount)
if fcount eq 0 then return
spex_proc,input='reset_event !!data,batse,cont',/cmode
det_cosines,flare=fld.(0),cos_lad=cos_lad, lad_sort=lad,/sort
checkvar, aspect_id, 1
det_id = lad( (aspect_id -1) >0)
cosine = cos_lad( (aspect_id -1) >0)
spex_proc,/cmode,input='det, '+string(det_id)
spex_proc,/cmode,input='flare,'+string(fld.(0))

spex_proc,/cmode, input='t_hist,count !! graph'
spex_proc,/cmode,input='check_defaults,0'
edges = spex_current('edges')
wedge = edges(1,*)-edges(0,*)


ut = spex_current('ut') +getutbase()
utlim=minmax( ut )
xselect=((fld.peak_secs+[-30.,30.])>fld.start_secs)<(fld.peak_secs+fld.duration) 

wpeak = where( ut ge xselect(0) and ut le xselect(1), npeak)
if npeak eq 0 then return	;only interested in peak!

def_tb = reform([utlim(0), fld.start_secs,fld.start_secs+fld.duration,utlim(1)],2,2)
wpos=where( def_tb(1,*) - def_tb(0,*) ge 6.0, npos)
case npos of
	2:
	1: def_tb=rebin(def_tb(*,wpos),2,2)
	0: return
endcase
;if fld.duration gt 1200 then begin
;	order_end = 0
;	def_tb = rebin(def_tb(*,0),2,2)
;endif else order_end = 3
order_end = 3

tb = rebin(reform(def_tb,2,2,1),2,2,5)
test = spex_current(input=tb,'tb')
;
; Try different backgrounds and look for the lowest Chi-square
back_qual = fltarr(order_end+1)
for border = 0, order_end do begin
	spex_proc,/cmode,input='back_order,'+strtrim(border,2)
	spex_proc,/cmode,input='background'
	eback = spex_current('eback')
	back_qual(border) = avg(eback(10,*))
	
endfor
	
test = min(back_qual, back_order)

spex_proc,/cmode,input='back_order,'+strtrim(back_order)
spex_proc,/cmode,input='background'


spex_proc,/cmode,input='idl,style_sel="discrete"
xselect= xselect - getutbase()
test = spex_current('xselect',input=xselect)
spex_proc,/cmode,input='selec'
spex_proc,/cmode,input='erange,35,500'
wuse = spex_current('wuse')
spex_proc,/cmode,input='apar,0,1,.1,4,1e3,4!!force'
spex_proc,/cmode,input='fit'
apar = spex_current('apar_arr')
ebacki=spex_current('ebacki')
eobsi=spex_current('eobsi')
backi=spex_current('backi')
obsi=spex_current('obsi')
back_order = spex_current('back_order')
utbase = getutbase()
ch_mask = intarr(16)
ch_mask(wuse) = 1
obs = {run_batse, flare:fld.(0), error:0, $
	peak_rate:fld.peak_rate, duration:fld.duration,cosine:cosine, det_id:det_id,$
	aspect:lad, $
	edges: edges, ch_mask:ch_mask, $
	back_order: back_order, apar:apar, utbase:utbase, xselect:xselect, $
	obsi:obsi, eobsi:eobsi, backi:backi, ebacki:ebacki}

if keyword_set(commands) then $
	for i=0,n_elements(commands)-1 do  spex_proc,/cmode, input=commands(i)

error = 0
end
