#!/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)]
APSDebugPath

set CVSRevisionAuthor "\$Revision: 1.0 $ \$Author: shang $"

set deltaFile /home/helios/oagData/BTS/configFiles/BRampDelta.sdds
set outputDir [APSGoToDailyDirectory -subdirectory BTSorbitMeas]
set average 10
set status ""
set waittime 5
set abort 0
set monFile /home/helios/oagData/BTS/configFiles/BTSall.mon
set monFile1 /home/helios/oagData/BTS/responseMeasurement/BTSall.mon
set monFile2 /home/helios/oagData/booster/responseMeasFiles/region9.mon
set monFile  /home/helios/oagData/BTS/responseMeasurement/BTS_Booster.mon

set dryRun 0
set outputFile meas1
proc SetStatus {text} {
    global status
    set status $text
    update
}

set refRampFile /home/helios/oagData/booster/ramps/correctors/lattices/default/HVCorr.ramp

SetStatus "Load reference ramp...$refRampFile"
if [catch {exec ramploadnew $refRampFile} result] {
   # return -code error "Error loading reference ramp table: $result"
}

set corrList [join [exec sddsquery -col $deltaFile]]

foreach corr $corrList {
    set ${corr} 1
}


proc StartMeasurement {args} {
    global average outputDir deltaFile refRampFile waittime abort monFile dryRun outputFile corrList
    eval global $corrList

    if ![file exist $deltaFile] {
        SetStatus "$deltaFile does not exist!"
        return
    }
    #set corrList [exec sddsquery -col $deltaFile]
    set tmpRoot /tmp/[APSTmpString]
    set i 0
    set fileList ""
    set selectedList ""
    foreach corr $corrList {
        if [set ${corr}] {
            lappend selectedList $corr             
            set delta($corr) [exec sdds2stream -col=$corr $deltaFile]
            if {$i==0} {
                set matchOpt "-match=par,CorrName=$corr,!"
            } else {
                append matchOpt ",CorrName=$corr,!,&"
            }
            if [catch {exec sddsprocess $refRampFile $tmpRoot.$corr -match=par,CorrName=$corr } result] {
                return -code error "Error1: $result"
            }
            lappend fileList $tmpRoot.$corr
        }
    }
    
    set rows [exec sdds2stream -rows=bar $deltaFile]
    
  #  set outputFile $outputDir/[clock format [clock seconds] -format %Y%m%d-%H:%M:%S].sdds
    if {!$dryRun} {
        SetStatus "Load reference ramp..."
        if [catch {exec ramploadnew $refRampFile} result] {
            return -code error "Error loading reference ramp table: $result"
        }
    }
    for {set i 0} {$i<$rows} {incr i} {
        if $abort {
            SetStatus "Aborted."
            set abort 0
            if [catch {exec ramploadnew $refRampFile} result] {
                return -code error "Error loading reference ramp table: $result"
            }
            return
        }
        foreach corr $selectedList {
            set delta0 [lindex $delta($corr) $i]
            if [catch {exec sddsprocess $tmpRoot.$corr -nowarnings \
                         "-redefine=col,RampSetpoint,RampTime 214.0 < ? RampSetpoint : RampSetpoint $delta0 + $ " } result] {
                return -code error "Error2: $result"
            }
           
        }
        if [catch {eval exec sddscombine $fileList $tmpRoot.load$i -over } result] {
            return -code error "Error3: $result"
        }
        if {!$dryRun} {
            SetStatus "loading ramp tabel with $i row delta..."
            if [catch {exec ramploadnew $tmpRoot.load$i } result] {
                return -code error "Error4: $result"
            }
        }
        SetStatus "waiting $waittime seconds after loading new ramp table..."
        APSWaitWithUpdate -waitSeconds $waittime -abortVariable abort
        SetStatus "collecting BTS orbit data..."
        if [catch {exec sddsmonitor $monFile $outputFile -steps=$average -interval=1,seconds -append } result] {
            return -code error "Error5: $result"
        }
    }
    if {!$dryRun} {
        SetStatus "Load reference ramp..."
        if [catch {exec ramploadnew $refRampFile} result] {
            return -code error "Error loading reference ramp table: $result"
        }
    }
    SetStatus "data collected in $outputFile."
}

APSApplication . -name BTSOrbitMeas -version $CVSRevisionAuthor \
    -overview {BTS orbit measurement }

APSScrolledStatus .status -parent .userFrame -width 100 -textVariable status
APSLabeledEntry .dir -parent .userFrame -label "Output Directory" -textVariable outputDir -width 80
APSLabeledEntry .delta -parent .userFrame -label "Corrector delta file" -textVariable deltaFile -width 80
APSLabeledEntry .out -parent .userFrame -label "Output file" -textVariable outputFile -width 80
APSLabeledEntry .ave -parent .userFrame -label "Average:" -textVariable average -width 40
APSLabeledEntry .wait -parent .userFrame -label "Wait times after loading ramp (seconds)" -textVariable waittime -width 40
APSRadioButtonFrame .dryrun -parent .userFrame -label "Dry run mode?" -buttonList {Yes No} -variable dryRun -valueList {1 0} \
  -orientation horizontal
APSCheckButtonFrame .corr -parent .userFrame -label "Select corrector:" -buttonList $corrList -variableList $corrList  \
  -orientation horizontal -allNone 1
APSButton .start -parent .userFrame -text "Start" -command "StartMeasurement"
APSButton .abort -parent .userFrame -text "Abort" -command "set abort 1"
