#!/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.11 $ \$Author: emery $"

APSApplication . -name "SRClosedBump" -version $CVSRevisionAuthor \
  -overview "SRClosedBump adjusts the kickers for a closed bump. The IK3 and IK4 are minizmied for a given IK1 amplitude. IK2 is not adjusted. A button is available to equalize the values of IK2 and IK3."

proc MakeActionWidget {widget args} {
    set parent ""
    APSParseArguments {parent}
    
    APSFrame $widget -parent $parent -label "" \
      -contextHelp "Control widgets"
    set w $parent$widget.frame

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

    APSLabeledEntry .logDir -parent $w -width 60 \
      -textVariable logDir \
      -label "Log directory:" \
      -contextHelp "Directory for log file of minimization."

   APSButton .daily -parent $w.logDir -packOption "-anchor e" \
      -text "daily" -size small \
      -command {set logDir [APSGoToDailyDirectory -subDirectory .]}

    APSLabeledEntry .ik1 -parent $w \
      -label "IK1 fixed setpoint:" -textVariable IK1 \
      -contextHelp "Enter a setpoint for IK1. IK1 is the reference amplitude for the other kickers to match to."

    APSLabeledEntry .bpm -parent $w \
      -label "BPM history:" -textVariable BPM \
      -contextHelp "Enter a bpm name, for which the history will be minimized."

    APSLabeledEntry .saveFile -parent $w \
      -label "Save snap file:" -textVariable saveFile \
      -contextHelp "Enter a snapshot file name for the pulsed power supply setpoints to be written in the directory above"

    APSFrame .optimize -parent $parent$widget.frame -label "" \
      -contextHelp "Optimize frame"
    set w $parent$widget.frame.optimize.frame

    APSButton .setup  -parent $w -text "Setup pulsing and BPM" \
      -command {Setup -IK1 $IK1 -BPM $BPM} \
      -contextHelp "Sets up IK1 and bpm before starting the minimizing the closed bump leakage."

    APSButton .equal  -parent $w -text "Equalize Kickers" \
      -command EqualizeIK23 \
      -contextHelp "Equalize the kickers after one minimization run."

    APSButton .save  -parent $w -text "Save PulsedPS" \
      -command {SavePulsed -logDir $logDir -saveFile $saveFile} \
      -contextHelp "Saves pulsed magnets setpoints to file above."

    APSButton .minimize  -parent $w -text "Optimize closed bump" \
      -command {runOptimize -logDir $logDir -BPM $BPM} \
      -contextHelp "Starts sddsoptimize for a closed kicker bump."

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

}

proc SavePulsed {args} {
    global scriptDir
    set logDir .
    set saveFile ""
    APSParseArguments {logDir saveFile}
    if [file exists $logDir/$saveFile] {
        return -code error "File $logDir/$saveFile already exists!"
    }
    exec burtrb -f $scriptDir/pulsedPS.req -o $logDir/$saveFile
    SetStatus "File $logDir/$saveFile written."
    return
}

proc plotProgress {args} {
    set logDir .
    APSParseArguments {logDir}
    exec sddsplot $logDir/closedBump.optLog \
      -col=EvalIndex,(S:IK3:VoltageSetSendAO,S:IK4:VoltageSetSendAO) \
      -grap=line,vary -alignzero=yfactor -leg \
      -col=EvalIndex,currentValue  \
      -grap=line,vary -alignzero=yfactor -leg \
      -yscale=id=eval -uns=y \
      -end \
      -col=S:IK3:VoltageSetSendAO,S:IK4:VoltageSetSendAO \
      -grap=sym,thick=10,vary=subtype -split=column=currentValue,width=1 \
      -order=spectral \
      &
}

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

proc Setup {args} {
    set IK1 8.5
    set BPM S5B:P5
    APSParseArguments {IK1 BPM}

    if [catch {exec cavput -list=S:IK1:VoltageSetSendAO=$IK1 \
                 -pen=5 \
             } result ] {
        return -code error $result
    }

    set bpmList $BPM
    # FIFO reset, FIFO mode "Stop on Full"
    # reset Resync received, reset lost P0, reset lost clock, all for sector
    if {[catch {exec cavput -pend=5 -list=[join $bpmList ,] \
                    "-list=:bh.FIM0=Stop on Full,:bh.FIR0=Enable"} result] || \
          [catch {exec cavput -pend=5 -list=[join $bpmList ,] \
                    "-list=:bh.BRDE=Enable,:bh.BRDM=Continuous,:bh:wfDisable_bo=Enable"} \
             result]} {
        return -code error "Setup: $result"
    }

    if {[catch {exec cavput -pend=5 -list=[join $bpmList ,] \
                  -list=:bh.FRST=1} result]} {
        return -code error "Setup: $result"
    }

    #fire kickers
    if [catch {exec cavput -pend=5 -list=Mt:Ddg3chan4.GATE=Enabled \
             } result]  {
        return -code error "Setup: $result"
    }
    
    SetStatus "Setup done."
}

proc EqualizeIK23 {} {
    if [catch {exec cavget -list=S:IK -list=2,3 \
                 -list=:VoltageSetSendAO  "-delimiter= " -pend=5 \
             } IKvals ] {
        return -code error $IKvals
    }
    set IKave [expr ([lindex $IKvals 0] + [lindex $IKvals 1] ) / 2.0 ]
    if [catch {exec cavput -list=S:IK -list=2 \
                 -list=:VoltageSetSendAO=$IKave \
                 -pen=5
        exec cavput -list=S:IK -list=3 \
                 -list=:VoltageSetSendAO=$IKave \
                 -pen=5 \
             } result ] {
        return -code error $result
    }
    SetStatus "Kickers IK2 IK3 equalized."
    return
}

proc runOptimize {args} {
    global scriptDir
    set logDir .
    set BPM S14B:P2
    APSParseArguments {logDir BPM}
    
    APSExecLog .closedBump \
      -lineLimit 2048 -width 90 \
      -name "SR closed bump optimization" \
      -unixCommand "sddsoptimize \"-measScript=/home/helios/SR/bin/findHistorySpread -average 5 -bpm $BPM \" \
            -varFile=$scriptDir/var  -tolerance=1 \
            -simplex=restarts=1,cycles=1,evaluations=50,no1dscan \
            -testValues=file=$scriptDir/tests,limit=3 \
            -target=0.0 -verbose \
            -logFile=$logDir/closedBump.optLog"
}

set scriptDir /home/helios/oagData/sr/optimizeScripts/closedBump
set IK1 8.5
set BPM S14B:P2
set logDir .
set saveFile closedBump01.snp

set status "Working."
APSScrolledStatus .status -parent .userFrame -textVariable status -width 90
MakeActionWidget .action -parent .userFrame
set status "Ready."
