#!/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 CVSRevisionAuthor "\$Revision: 1.0 $ \$Author: shang $"

APSApplication . -name "BTSOrbitCentering" -version $CVSRevisionAuthor \
  -overview "runs optimization to perform BTS orbit centering."

proc SelectQuad {} {
    global quad configFile logDir corrector lowerLimit upperLimit stepSize
    if ![file exist $logDir/${quad}-varInput.sdds] {
        if [catch {exec sddsprocess $configFile -match=col,QuadName=$quad $logDir/${quad}-varInput.sdds } result] {
            return -code error $result
        }
    }
    set corrector [exec sdds2stream -col=ControlName $logDir/${quad}-varInput.sdds]
    set lowerLimit [format %.2f [exec sdds2stream -col=LowerLimit $logDir/${quad}-varInput.sdds]]
    set upperLimit [format %.2f [exec sdds2stream -col=UpperLimit $logDir/${quad}-varInput.sdds]]
    set stepSize [format %.2f [exec sdds2stream -col=InitialChange $logDir/${quad}-varInput.sdds]]
}

set logDir .
set quad AQ1
set configFile /home/helios/oagData/BTS/configFiles/btsOpt.sdds
set quadList [exec sdds2stream -col=QuadName $configFile]
set commandList [APSReplicateItem -item SelectQuad -number [llength $quadList]]
SelectQuad

set tolerance 0.0001
proc MakeActionWidget {widget args} {
    set parent ""
    APSParseArguments {parent}
    
    global quad quadList corrector lowerLimit upperLimit commandList tolerance stepSize
    APSFrame $widget -parent $parent -label "" \
      -contextHelp "Action buttons"
    set w $parent$widget.frame
    
    APSLabeledEntry .logDir -parent $w -width 60 \
      -textVariable logDir \
      -label "Log directory:" \
      -contextHelp "Directory for log file of minimization."
    APSLabeledEntry .tol -parent $w -width 25 \
      -label "Tolerance: " -textVariable tolerance \
      -contextHelp "optimization tolerance."
    
    APSButton .daily -parent $w.logDir -packOption "-anchor e" \
      -text "daily" -size small \
      -command {set logDir [APSGoToDailyDirectory -subdirectory btsOrbitCentering]}
    

    APSRadioButtonFrame .quads -parent $w -buttonList $quadList -valueList $quadList -variable quad \
        -orientation horizontal -label "" -commandList $commandList

    APSFrame .setup -parent $parent$widget.frame -label "" \
      -contextHelp "Setup quantities."
    set w $parent$widget.frame.setup.frame

    set width 25
    APSLabeledEntry .ik1 -parent $w \
      -label "corrector:" -textVariable corrector -width $width \
      -contextHelp "corrector name for selected quad."

    APSLabeledEntry .init -parent $w \
      -label "Initial Value:" -textVariable lowerLimit  -width $width  \
      -contextHelp "optimization initial value of corrector."
    
    APSLabeledEntry .final -parent $w \
    -label "Final Value:" -textVariable upperLimit  -width $width \
      -contextHelp "optimization final value of corrector."
    
    APSLabeledEntry .step -parent $w \
	-label "Step Size:" -textVariable stepSize -width $width \
	-contextHelp "optimization initial step size of corrector"

    APSFrame .optimize -parent $parent$widget.frame -label "" \
      -contextHelp "Action buttons for skews"
    set w $parent$widget.frame.optimize.frame

  
    APSButton .minimize  -parent $w -text "Optimize" \
      -command {runOptimize} \
      -contextHelp "Starts sddsoptimize for centering BTS orbit."

    APSButton .plotProg  -parent $w -text "Plot Progress" \
      -command {plotProgress -logDir $logDir} \
      -contextHelp "Plots the corrector values and orbit changes.."

}

proc plotProgress {args} {
    global logDir quad
    set quantities [exec sdds2stream $logDir/${quad}-varInput.sdds -col=ControlName]
    exec sddsplot -layout=1,2\
	-grap=sym,scale=2  \
	-col=EvalIndex,currentValue $logDir/${quad}.optLog  -endp \
	-col=$quantities,currentValue  $logDir/${quad}.optLog  &
}

proc SetStatus {text} {
    global status
    set status $text
}


proc runOptimize {args} {
    global logDir corrector quad lowerLimit upperLimit configFile tolerance corrOrigValues stepSize
    
    if [catch {exec sddsprocess  $configFile -match=col,QuadName=$quad -pipe=out \
		   | sddsprocess -pipe=in \
		   $logDir/${quad}-varInput.sdds -redefine=col,LowerLimit,$lowerLimit \
		   -redefine=col,UpperLimit,$upperLimit \
		   -redefine=col,InitialChange,$stepSize \
		   -nowarnings} result] {
        return -code error $result
    }
    
    APSExecLog .minimizeCoupling \
      -lineLimit 2048 -width 90 \
      -name "BTS Orbit Centrings" \
      -unixCommand "sddsoptimize \"-measScript=/home/helios/oagData/BTS/configFiles/BTSBPMMeasureScript -quad $quad -logDir $logDir -corrector $corrector\" \
            -varFile=$logDir/${quad}-varInput.sdds -tolerance=$tolerance \
            -simplex=evaluations=500,no1dscan \
             -verbose \
            -logFile=$logDir/${quad}.optLog"
    return
}


set status "Working."
APSScrolledStatus .status -parent .userFrame -textVariable status -width 90
MakeActionWidget .action -parent .userFrame
set status "Ready."
#save corrector original values
set corrOrigValues /tmp/[APSTmpString].btscorr
#exec sddscasr -save $configFile $corrOrigValues
APSAddToTempFileList -ID btsorbit -fileList $corrOrigValues
