;+
;NAME:
;pro optimizedbdr,file,showparam=showparam
;KEYWORDS:	Yohkoh Operation
;PURPOSE:
;	load OP from the file generated by OP_FIRST_GUESS,
;	and show optimized bitrate sequences.
;CALLING SEQUENCE:
;	optimizedbdr,'op61021d.txt',/showparam
;INPUTS:
;	file:	op text file name
;OPTIONAL KEYWORDS:
;	showparam:	show parameters
;HISTORY:
;	Ver 1.0 96-10-25	Created by TY
;-

;Calculate Optimized High Bit Rate Time
pro cnt_highandmed,restbdr,daytime
	hr=1./2
	mr=1./16
	print,'Total Daytime              :'+string(daytime,format='(I7)')+' sec'
	ht=((restbdr-mr*daytime)/(hr-mr) > 0)< daytime
	mt=daytime-ht
	print,'Optimized High bitrate time:'+string(ht,format='(I7)')+' sec ('+string(ht/32.,format='(F6.1)')+' I)'
	print,'Requested H-br BDR size    :'+string(ht*hr,format='(F7.1)')+' SF'
	print,'Optimized Med  bitrate time:'+string(mt,format='(I7)')+' sec ('+string(mt/32.,format='(F6.1)')+' I)'
	print,'Requested M-br BDR size    :'+string(mt*mr,format='(F7.1)')+' SF'
end

;Return Total BDR Size
pro cnt_totbdr,bdr,showparam=showparam
	bdr=1272
	if keyword_set(showparam) then begin
		print,'***BDR Parameter***'
		print,'Total BDR Size     : 1280 subframes[SF]'
		print,'                     (1SF = 8kB)'
		print,'Recordable BDR Size: '+strtrim(string(bdr),2)+' SF'
		print,'Recording Rate:'
		print,'  High   Bit Rate:  2 sec/SF  16 SF/I (1I=32sec)'
		print,'  Medium Bit Rate: 16 sec/SF   2 SF/I'
		print,'  Low    Bit Rate: 64 sec/SF 1/2 SF/I'
		print,''
		return
	endif
end

;Return Night BDR Recording Rate
pro cnt_night,bdrps,showparam=showparam
	bdrps=1./64
	if keyword_set(showparam) then begin
		print,'***Night***'
		print,'[DAY-NIGHT]<- X I ->[DAY OG]'
		print,'NIGHT LOW-----------QUIET M/H'
		print,'Requested BDR: '+strtrim(string(fix(64*bdrps)),2)+'*X SF'
		print,''
		return
	endif
end

;Return Reserved BDR Size at KSC AOS Night
pro cnt_kscaosn,bdr,showparam=showparam
	bdr=0
	if keyword_set(showparam) then begin
		print,'***KSC AOS Night***'
		print,'[KSC AOS OG]'
		print,'----BDR STOP'
		print,'Reserved BDR: '+strtrim(string(bdr),2)+' SF'
		print,''
		return
	endif
end

;Return Reserved BDR Size at KSC AOS DAY
pro cnt_kscaosd,bdr,showparam=showparam
	bdr=112
	if keyword_set(showparam) then begin
		print,'***KSC AOS Day***'
		print,'[KSC AOS OG]<- 4I ->[AOS]<- 3I ->[TMX-H-REP]'
		print,'-------------------------------------BDR STOP'
		print,'Assumed Reserved BDR: '+strtrim(string(bdr),2)+' SF'
		print,''
		return
	endif
end

;Return Reserved BDR Size at KSC LOS
pro cnt_ksclos,bdr,showparam=showparam
	bdr=96
	if keyword_set(showparam) then begin
		print,'***KSC LOS***'
		print,'[BDR REC]<- 4I ->[LOS]<- 2I ->[KSC LOS OG]'
		print,'BDR START-----------------------------------'
		print,'Assumed Reserved BDR: '+strtrim(string(bdr),2)+' SF'
		print,''
		return
	endif
end

;Return Reserved BDR Size at DSN AOS
pro cnt_dsnaos,bdr,showparam=showparam
	bdr=0
	if keyword_set(showparam) then begin
		print,'***DSN AOS***'
		print,'[DSN AOS]----[DSN REP]'
		print,'--------------BDR STOP'
		print,'Reserved BDR: '+strtrim(string(bdr),2)+' SF'
		print,''
		return
	endif
end

;Return Reserved BDR Size at DSN LOS
pro cnt_dsnlos,bdr,showparam=showparam
	bdr=0
	if keyword_set(showparam) then begin
		print,'***DSN LOS***'
		print,'[REP END]<--??-->[DSN LOS]'
		print,'BDR START-----------------'
		print,'Assumed Reserved BDR: '+strtrim(string(bdr),2)+' SF'
		print,''
		return
	endif
end

pro optbdrgtogfem,ogs,og,time,outog,outtime
	ogwh=where(oror(fix(og),fix(ogs)))
	outog=og(ogwh)
	outtime=time(ogwh)
end

pro optbdrgtevt,time,og,femtime,femflg,evttime,evtflg
;GET necessary OG
	kscaosog=[8,9,10,11]	;KSC AOS
	ksclosog=[15,16]	;KSC LOS
	dsnaosog=[19]		;DSN REPRO
	dsnlosog=[22,23]	;DSN LOS
	dayog=[55]		;DAY
	optbdrgtogfem,[kscaosog,ksclosog,dsnaosog,dsnlosog,dayog], $
		og,time,outog,outtime

;GET necessary fem
	ntfemflg=[1]		;Night event
	optbdrgtogfem,[ntfemflg], $
		femflg,femtime,outfemflg,outfemtime

;Merge OG and Fem
	evtflg=[fix(outog),fix(outfemflg)+16384]
	evttime=[outtime,outfemtime]
;Sort time
	ds=sort_index(evttime,/ss)
	evtflg=evtflg(ds)
	evttime=evttime(ds)
;Extract data from the first KSC LOS to the last KSC AOS
	wh=where(oror(evtflg,ksclosog))
	wh0=wh(0)
	wh=where(oror(evtflg,kscaosog))
	wh1=wh(n_elements(wh)-1)
	if wh0 eq -1 then message,/trace,'Unexpected OP'
	if wh1 eq -1 then message,/trace,'Unexpected OP'
	if wh0 ge wh1 then message,/trace,'Unexpected OP'
	evtflg=evtflg(wh0:wh1)
	evttime=evttime(wh0:wh1)
end

pro optbdrshowseq,evttime,evtflg,day
	kscaosog=[8,9,10,11]	;KSC AOS
	ksclosog=[15,16]	;KSC LOS
	dsnaosog=[19]		;DSN REPRO
	dsnlosog=[22,23]	;DSN LOS
	dayog=[55]		;DAY
	ntfem=[16384+1]		;Night
	kscls="KSC LOS OG "
	dsnls="DSN LOS OG "
	kscas="KSC AOS OG "
	dsnas="DSN REP OG "

	et=n_elements(evttime)-1
	if oror(evtflg(0),ksclosog) then fst=kscls else fst=dsnls
	if oror(evtflg(et),kscaosog) then est=kscas else est=dsnas
	if day(0) eq 0 then fds=" NT " else fds=" DAY"
	if day(et) eq 0 then eds=" NT " else eds=" DAY"
	print,'----------------------------------------------------'
	print,fst+gt_time(evttime(0),/str)+fds+' - '+est+gt_time(evttime(et),/str)+eds
	print,'----------------------------------------------------'
	if fst eq dsnls then $
		cnt_dsnlos,losbdr $
	else	cnt_ksclos,losbdr
	if est eq dsnas then $
		cnt_dsnaos,aosbdr $
	else if day(et) eq 0 then cnt_kscaosn,aosbdr $
	else cnt_kscaosd,aosbdr

	tint=fltarr(et)
	dint=bytarr(et)
	for i=0,et-1 do begin
		tint(i)=timeinterval(evttime(i+1),evttime(i))
		dint(i)=day(i)
		if dint(i) eq 1 then begin
			dnstr='DAY ' & dnstr1='DAY OG' & dnstr2='S/C NT'
		endif else begin
			dnstr='NT  ' & dnstr1='S/C NT' & dnstr2='DAY OG'
		endelse
		if i eq 0 then if fst eq kscls then dnstr1='KSCLOS' else dnstr1='DSNLOS'
		if i eq et-1 then if est eq kscas then dnstr2='KSCAOS' else dnstr2='DSNREP'
		print,dnstr1+'['+gt_time(/str,evttime(i))+']'+' - '+dnstr2+'['+gt_time(/str,evttime(i+1))+'] '+dnstr+string(tint(i),format='(I6)')+' sec'
	endfor

	cnt_totbdr,totbdr
	cnt_night,bdrps
	wh=where(dint eq 0) & if wh(0) eq -1 then nttime=0 else nttime=total(tint(wh))
	wh=where(dint eq 1) & if wh(0) eq -1 then daytime=0 else daytime=total(tint(wh))
	ntbdr=bdrps*nttime
	restbdr=totbdr-aosbdr-losbdr-ntbdr
	print,'BDR reserved at AOS and LOS:'+string(aosbdr+losbdr,format='(F7.1)')+' SF'
	print,'BDR requested for Night-Low:'+string(ntbdr,format='(F7.1)')+' SF'
	print,'Rest of BDR                :'+string(restbdr,format='(F7.1)')+' SF'
	cnt_highandmed,restbdr,daytime
end

pro optbdrmain,time,og,femtime,femflg
	kscaosog=[8,9,10,11]	;KSC AOS
	ksclosog=[15,16]	;KSC LOS
	dsnaosog=[19]		;DSN REPRO
	dsnlosog=[22,23]	;DSN LOS
	dayog=[55]		;DAY
	ntfem=[16384+1]		;Night

	fem=0
	femstr=0
	optbdrgtevt,time,og,femtime,femflg,evttime,evtflg
	evtnm=n_elements(evtflg)
;Search Day or Night
	day=bytarr(evtnm)
	wh=where(oror(evtflg,[dayog,ntfem]))
	if oror(evtflg(wh(0)),dayog) then day(0)=0 else day(0)=1
	for i=1,evtnm-1 do $
		if oror(evtflg(i),dayog) then day(i)=1 else $
		if oror(evtflg(i),ntfem) then day(i)=0 else $
		day(i)=day(i-1)

	p=0
	while p lt evtnm-1 do begin
		pe=p+1
		while (not oror(evtflg(pe),[dsnaosog,kscaosog])) do pe=pe+1
		optbdrshowseq,evttime(p:pe),evtflg(p:pe),day(p:pe)
		p=pe+1
		if (p lt evtnm-1) then while $
			(not oror(evtflg(p),[dsnlosog,ksclosog])) $
			or (p eq evtnm-1) do p=p+1
	endwhile
end

pro optimizedbdr,file,showparam=showparam
	if keyword_set(showparam) then begin
		cnt_totbdr,/show
		cnt_kscaosd,/show
		cnt_kscaosn,/show
		cnt_ksclos,/show
		cnt_dsnaos,/show
		cnt_dsnlos,/show
		cnt_night,/show
	endif
	loadopfem,file,time,og,fem
	interpretfem,fem,femtime,femflg,femstr=femstr
	optbdrmain,time,og,femtime,femflg
end
