#!/bin/sh  
# \
exec oagwish "$0" "$@"

set auto_path [linsert $auto_path 0  /usr/local/oag/apps/lib/$env(HOST_ARCH)]
set auto_path [linsert $auto_path 0 /usr/local/oag/lib_patch/$env(HOST_ARCH)]

APSStandardSetup

set SCRFile /home/helios/oagData/SCR/snapshots/BBPMWaveform/BBPMWaveform-boosterDefault.gz 
proc RestoreTiming {args} {
    global SCRFile
    if [catch {exec sddsprocess $SCRFile -pipe=out \
                 -match=col,ControlName=B*:region*StartAO \
                 | sddscasr -pipe=in -restore } result] {
        return --code error "Error restore timing: $result"
    }
}
proc SetStatus {text} {
    global status
    set status "[clock format [clock seconds] -format %H:%M%:%S] $text"
    update
}
proc CollectData {args} {
    global outputDir rootname Region monFile average interval Region
    
    cd $outputDir
    
    SetStatus "set bpm region start ..."
    for {set region 0} {$region<10} {incr region} {
        if [catch {exec cavput -list=B -list=1,2,3,4 -list=C -list=0,2,4,6,8 -list=P1: -list=region$region \
                     -list=StartAO=$Region($region.start) } result] {
            SetStatus "Error setting region start: $result"
            return
        }
    }
    after 1000
    SetStatus "collecting data..."
    if [catch {exec sddsconvert $monFile $rootname.mon -retain=col,ControlName } result] {
        return -code error $result
    }
    exec sddsmonitor $rootname.mon $rootname.sdds -erase -steps=$average -interval=$interval
    
    
    SetStatus "processing data.."
    if [catch {ProcessData -rootname $rootname} result] {
	return -code error "Error processing data: $result"
    }
    exec sddsplot -col=BPMName,XPositionAI -topline=@Description -split=page -sep $rootname.proc.region.X &
    exec sddsplot -col=BPMName,YPositionAI -topline=@Description -split=page -sep $rootname.proc.region.Y &
    SetStatus "done."
}
proc ProcessData {args} {
    set rootname ""
    APSParseArguments {rootname}
    global Region
    if [catch {exec sddsprocess $rootname.sdds -pipe=out -process=*PositionAI,ave,%s \
                 | sddscollapse -pipe \
                 | sddscollect -pipe=in -collect=suffix=PositionAI $rootname.sdds.proc } result] {
        return -code error $result
    }
    set fileList ""
    for {set region 0} {$region<10} {incr region} {
        set regionStr region$region
        set desc "region$region startRamp\=$Region($region.start)"
        foreach plane {X Y} {
	    if [catch {exec sddsprocess $rootname.sdds.proc -match=col,Rootname=*region${region}*$plane -pipe=out \
			   | sddsconvert -pipe -rename=col,PositionAI=${plane}PositionAI \
			   | sddsprocess -pipe=in -print=par,Region,$regionStr \
			   "-print=par,Description,$desc"  "-define=par,RampStart,$Region($region.start)" \
		-edit=col,BPMName,Rootname,6f20d   $rootname.region$region.$plane } result] {
		return -code error "Error processing region data: $result"
	    }
	    lappend ${plane}FileList $rootname.region$region.$plane
	}
       # lappend fileList $rootname.region$region 
       # exec sddsplot -col=BPMName,PositionAI -topline=@Description $rootname.region$region &
    }
    foreach plane {X Y} {
	set fileList [set ${plane}FileList]
	if [catch {eval exec sddscombine $fileList $rootname.proc.region.$plane -over} result] {
	    return -code error "Error1: $result"
	}
	eval file delete -force $fileList
    }
}

proc PlotData {args} {
    global outputDir rootname
    cd $outputDir
    if {![file exist $rootname.proc.region.X] || ![file exist $rootname.proc.region.Y]} {
	if [catch {ProcessData -rootname $rootname} result] {
	    return -code error "Error processing data1: $result"
	}
    }
    exec sddsplot -col=BPMName,XPositionAI -topline=@Description -split=page -sep $rootname.proc.region.X &
    exec sddsplot -col=BPMName,YPositionAI -topline=@Description -split=page -sep $rootname.proc.region.Y &
}
set varList ""
set butList ""
for {set region 0} {$region<10} {incr region} {
    if [catch {exec sddsprocess $SCRFile -match=col,ControlName=B1C0P1:region${region}StartAO -pipe=out \
                 | sdds2stream -pipe=in -col=ValueString } result] {
        return -code error "Error get startAO for region $region: $result"
    }
    set Region($region.start) [format %.0f $result]
   # puts $Region($region.start)
    set Region($region.checked) 0
    lappend varList Region($region.checked)
    lappend butList region$region
}
set monFile /home/helios/oagData/booster/responseMeasFiles/measAll.sdds
set outputDir [APSGoToDailyDirectory -subdirectory booRegionBPM]

set rootname region
set average 1
set interval 1
APSApplication . -name collectBoosterBPMRegionData -version 1.0  \
  -overview {This interface optimizer linac L3 charge.}
set status ""
APSScrolledStatus .status -parent .userFrame -textVariable status -width 80

APSLabeledEntry .dir -parent .userFrame -label "Output directory:" -textVariable outputDir -width 85
#APSCheckButtonFrame .region -parent .userFrame -label "Region to plot"  -buttonList $butList -variableList $varList \
 \# -orientation horizontal -allNone 1 

APSFrameGrid .grid -parent .userFrame -xList {x1 x2}
set w1 .userFrame.grid.x1
set w2 .userFrame.grid.x2

for {set region 0} {$region<10} {incr region 2} {
    APSLabeledEntry .region$region -parent $w1 -label "Start Ramp for region$region:" -width 20 -textVariable Region($region.start)
    APSLabeledEntry .region$region -parent $w2 -label "Start Ramp for region[expr $region+1]:" -width 20 -textVariable Region([expr $region+1].start)
}

APSLabeledEntry .ave -parent $w1 -label "No. of average:" -textVariable average -width 20
APSLabeledEntry .inter -parent $w2 -label "Data collecting interval (seconds)" -textVariable interval -width 20
APSLabeledEntry .root -parent $w1 -label "Rootname: " -textVariable rootname -width 20

APSButton .run -parent .userFrame -text "Collect" -command "CollectData"
APSButton .restore -parent .userFrame -text "Restore" -command "RestoreTiming"
APSButton .plot -parent .userFrame -text "Plot" -command "PlotData"


