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

# $Log: not supported by cvs2svn $
# Revision 1.21  2009/06/22 20:16:23  shang
# set the mux2_1 value to Mux1_1 for checkwaveform since the value "1" no longer represents "Mux1_1" due to ioc change.
#
# Revision 1.20  2009/06/11 20:07:48  shang
# added "turn on injection" button
#
# Revision 1.19  2009/06/11 20:05:13  shang
# added realtime display of topup count and par charge.
#
# Revision 1.18  2009/06/09 22:30:06  shang
# changed the DS345 amplitude to 2.0 for delay line and frequency scan, and made the start and end of delay line scan to be changable.
#
# Revision 1.17  2009/06/08 20:07:19  shang
# added setting the Mux2_1 to Mux1_1 before checking the waveform, and changed the mux input for tune measurement
#
# Revision 1.16  2009/04/01 14:57:14  shang
# changed to use Mt:TopUpTime2WarnInjector.VAL checking the injection time, instead of Mt:TopUpTime2Warn.VAL since the former is more accurate.
#
# Revision 1.15  2009/03/26 16:11:11  shang
# changed the delay line scan range to 10.23 to save time.
#
# Revision 1.14  2008/07/18 14:20:07  shang
# replaced APScavget by cavget, and added -printErrors to all cavget statements so that channel access error can be catched.
#
# Revision 1.13  2008/03/24 20:12:10  shang
# changed the plot scale of waveform checking.
#
# Revision 1.12  2008/03/24 19:19:23  shang
# updated due to PV names change and updated the status messsage for frequency scan
#
# Revision 1.11  2008/03/12 15:10:08  shang
# added "shiftWF 0" to let beam go through when abort button is clicked while scanning DS345 frequency and added status message for loading parameters.
#
# Revision 1.10  2008/03/11 21:22:04  shang
# removed checking the delay line readback because it does not match the setpoint right now.
#
# Revision 1.9  2008/03/11 14:05:59  shang
# added "enable PAR beam" after each topup shot.
#
# Revision 1.8  2008/03/11 13:18:00  shang
# added enable par beam before scan delay line and DS345 frequency.
#
# Revision 1.7  2008/03/10 21:33:30  shang
# now uses DS345 drive to turn on/off bunch cleaning and the bunch cleaning now also works during topup operation.
#
# Revision 1.6  2008/01/28 19:57:47  shang
# changed the tolerance of frequency scan and tested the frequencey scan with CY.
#
# Revision 1.5  2008/01/21 21:11:45  shang
# modified ScanDelayLine using new delay PVs and added "Check Waveform" button.
#
# Revision 1.4  2006/05/04 19:27:03  shang
# added 2 seconds pause after setting and reading delayline PV.
#
# Revision 1.3  2006/03/14 15:57:51  shang
# added shift the bunch clean waveform back to 0 (to have beam) after scan DS345 frequency.
#
# Revision 1.2  2006/03/10 21:27:26  shang
# rewrote scan delay line procedure and modified scan ds345 freq proc.
#
# Revision 1.1  2006/03/10 15:25:34  shang
# first version.
#
# 

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.22 $ \$Author: shang $"

APSApplication . -name ParBunchCleanSetup \
  -overview "Par bunch cleaning setup procedure."

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

proc CheckWaveform {args} {
    set tmpfile /tmp/[APSTmpString].fpga
    APSAddToTmpFileList -ID parclean -fileList $tmpfile
    
    SetStatus "Reading waveform ..."
    if [catch {exec cavput -list=P:BnchCln:Mux21mbbo=Mux1_1 } result] {
        return -code error "Unable to change Mux2_1 to Mux1_1: $result"
    }
    for {set i 1} {$i<=4} {incr i} {
        switch $i {
            1 {
                set desc TO
            }
            2 {
                set desc BO
            }
            3 {
                set desc TI
            }
            4 {
                set desc BI
            }
        }
        if [catch {exec cavput -list=P:BnchCln:Mux11mbbo=$i } result] {
            return -code error "Unable to set P:BnchCln:Mux11mbbo: $result"
        }
        after 1000
        if [catch {exec cavput -list=PAR:awg:linacPreTriggerGateEV.OUT1=1} result] {
            return -code error "Unable to enable the recording: $result"
        }
        after 1000
        if [catch {exec cavput -list=PAR:awg:rms:gtr:autoRestart=0} result] {
            return -code error "Unable to disable the auto restart: $result"
        }
        after 1000
        if [catch {exec cavput -list=PAR:awg:rms:gtr:arm=1} result] {
            return -code error "Unable to arm par scope: $result"
        }
        after 1000
        if [catch {exec sddswmonitor -pv=PAR:awg:rms:gtr:waveform0 $tmpfile -erase
            exec sddsprocess $tmpfile $tmpfile.$i "-reprint=par,Description,$desc"} result] {
            return -code error $result
        }
    }
    SetStatus "done."
    exec sddsplot -grap=line,vary -layout=2,2 -sep -title=@Description \
        -col=Index,*waveform* $tmpfile.1 $tmpfile.2 $tmpfile.3 $tmpfile.4 &
}

proc RestoreDelayLine {args} {
    set origDelay ""
    APSParseArguments {origDelay} 
    
    exec /home/helios/PAR/bin/shiftWF 0
    if [catch {exec caput P:HPDL1a:SetDelay $origDelay} result] {
        return -code error $result
    }
    if [catch {TogglePulsedMagnetEnables -location PAR } result] {
		SetStatus "Unable to enable par beam: $result"
		return
    } 
}

set stepSize 0.5
set start -5.68
#set end 15.91
set end 10.23
proc ScanDelayLine {args} {
    global Turn CenterDelay stepSize start end outputFile turns dialogBoxResponse abort
    
    set dir [APSGoToDailyDirectory -subdirectory parBunchClean]
    set outputFile $dir/[APSTmpString].delayLineScan
    set turns 1
    set timeout 60

    set dialogBoxResponse ""
    set w [APSUniqueName .]
    APSDialogBox $w -cancelCommand "set dialogBoxResponse cancel" \
        -okCommand "set dialogBoxResponse ok"  -name "ScanDelayline parameters"
    APSLabeledEntry .step -parent $w.userFrame -width 20 -label "Step size:" \
        -textVariable stepSize
    APSLabeledEntry .start -parent $w.userFrame -width 20 -label "Start:" \
	-textVariable start
    APSLabeledEntry .end -parent $w.userFrame -width 20 -label "End:" \
	-textVariable end
    APSLabeledEntry .output -parent $w.userFrame -width 50 -label "output file:" \
        -textVariable outputFile
    tkwait window $w
    if [string compare $dialogBoxResponse cancel]==0 {
        SetStatus "ScanDelay line was cancelled."
        return
    }
    #enable PAR beam
    if [catch {TogglePulsedMagnetEnables -location PAR } result] {
        SetStatus $result
        return
    }
    #start bunch cleaning
    for {set i 0} {$i<5} {incr i} {
	if [catch {exec cavput -list=P:Ds345:AmplitudeRmsC.VAL=2.0} result] {
	    return -code error $result
	}
	after 500
    }
    set delay0 [expr $start - $stepSize]
    if [catch {exec cavget -list=P:HPDL1a:GetDelay -pend=30 -printErrors} origDelay] {
        return -code error $result
    }
    after 2000
    set stop 0 
    SetStatus "Scan delay line..."
    if [catch {exec cavget -list=Mt:TopUpAutoEnableC.VAL -num -printErrors} topup] {
	return -code error "Unable to read topup state: $topup"
    }
    
    while {1} {
        if {$abort} {
            SetStatus "Scan delay line was aborted."
            RestoreDelayLine -origDelay $origDelay
            set abort 0
            return
        }
        if $topup {
            while {1} {
                if [catch {exec cavget -list=Mt:TopUpTime2WarnInjector.VAL -printErrors} injTime] {
                    return -code error "Unable to read Mt:TopUpTime2Warn.VAL: $injTime"
                }
                if {$injTime<20} {
                    RestoreDelayLine -origDelay $origDelay
                    SetStatus "The time to injection is less than to 20 seconds, waiting for next topup..."
                    set timeout [expr [clock seconds]+$injTime]
                    while {[clock seconds]<$timeout} {
                        if {$abort} {
                            SetStatus "Scan delay line was aborted."
                            RestoreDelayLine -origDelay $origDelay
                            set abort 0
                            return
                        }
                        after 500
                    }
                } else {
                    break
                }
            }
            if [catch {TogglePulsedMagnetEnables -location PAR } result] {
                SetStatus "Unable to enable par beam: $result"
                return
            }
        }
        set delay0 [expr $delay0 + $stepSize]
        if {$delay0>= $end} {
            set delay0 $end
            set stop 1
        }
        if {$delay0<0} {
            set delay [expr $delay0 + 5.68] 
            exec /home/helios/PAR/bin/shiftWF 17
        } elseif {$delay0>10.23} {
            set delay [expr $delay0 - 5.68]
            exec /home/helios/PAR/bin/shiftWF 1
        } else {
            set delay $delay0
            exec  /home/helios/PAR/bin/shiftWF 0
        }
        after 2000
        update
        if [catch {exec caput P:HPDL1a:SetDelay $delay} result] {
            return -code error $result
        }
        after 2000
        SetStatus "Wait for setting delay line to $delay..."
        set stopTime [expr [clock seconds] + $timeout]
        set succeed 1
	if {0} {
        while {[clock seconds]<$stopTime} {
            if {$abort} {
                set abort 0
                SetStatus "Scan delay line was aborted."
                exec /home/helios/PAR/bin/shiftWF 0
                if [catch {exec caput P:HPDL1a:SetDelay $origDelay} result] {
                    return -code error $result
                }
		if [catch {TogglePulsedMagnetEnables -location PAR } result] {
		    SetStatus "Unable to enable par beam: $result"
		    return
		}
                after 1000
                return
            }
            APSWaitWithUpdate -waitSeconds 1
            if [catch {exec cavget -list=P:HPDL1a:GetDelay -pend=30 -printErrors} readback] {
                return -code error $result
            }
            if {[expr abs($readback-$delay)]<0.01} {
                set succeed 1
                break
            }
        }
	}
        update
        if {!$succeed} {
	    exec /home/helios/PAR/bin/shiftWF 0
            if [catch {exec caput P:HPDL1a:SetDelay $origDelay} result] {
                return -code error $result
            }
	    if [catch {TogglePulsedMagnetEnables -location PAR } result] {
		SetStatus "Unable to enable par beam: $result"
		return
	    }
            SetStatus "Error, the delay line is $readback, did not reach the set value $delay yet."
            return
        }
        if [catch {exec cavget -list=PTB:CM:qTotalAI.VAL -pend=30 -printErrors} PTBcurrent] {
            return -code error $PTBcurrent
        }
	APSWaitWithUpdate -waitSeconds 2
        lappend delayList $delay0
        lappend delay1List $delay
        lappend currentList $PTBcurrent
        if $stop {
            break
        }
    }
    #exec /home/helios/PAR/bin/shiftWF 0
   # APSAddToTmpFileList -ID bunchcleaning -fileList "$outputFile"
    if [catch {exec sddsmakedataset -pipe=out  -col=P:HPDL1a:SetDelay,type=double \
		   -data=[join $delay1List ,] \
		   -col=delay,type=double -data=[join $delayList ,] \
		   -col=PTBcurrent,type=double  -data=[join $currentList ,] \
		   | sddssmooth -pipe -despike -col=PTBcurrent \
		   | sddsprocess -pipe=in $outputFile \
		   -process=PTBcurrent,center,Center,functionof=delay} result] {
	SetStatus "Invalid data obtained: $result"
	catch {exec sddsplot -col=delay,PTBcurrent $outputFile &}
	
	if [catch {exec caput P:HPDL1a:SetDelay $origDelay} result] {
            return -code error $result
        }
        return
    }
    catch {exec sddsplot -col=delay,PTBcurrent $outputFile &}
    SetStatus "scan done, and saved in $outputFile."
    
    set delay [exec sdds2stream -par=Center $outputFile]
    SetStatus "ScanDelayline completed, the delay line is $delay ns."
    if ![APSYesNoPopUp "Confirm, set HPDL-1A Delay Line to $delay ns?"] {
	set delay $origDelay
    }
    set delay0 $delay
    if {$delay0<0} {
        set delay [expr $delay0 + 5.68] 
        exec /home/helios/PAR/bin/shiftWF 17
    } elseif {$delay0>10.23} {
        set delay [expr $delay0 - 5.68]
        exec /home/helios/PAR/bin/shiftWF 1
    } else {
        set delay $delay0
        exec  /home/helios/PAR/bin/shiftWF 0
    }
    if [catch {exec caput P:HPDL1a:SetDelay $delay} result] {
	return -code error $result
    }
}

proc LoadParameters {args} {
    global DS345Freq PARBunchCleaning loadDS345FromTune
    if {![string length DS345Freq]  && $loadDS345FromTune} {
        return -code error "DS345 frequency is not obtained from tune measurement yet.!"
    }
    if $loadDS345FromTune {
        set ds345Freq $DS345Freq
    } else {
        set ds345Freq ""
    }
    if [catch {APSMpPARLoadBunchCleaningPVsFromSCR -ds345Freq $ds345Freq \
                   -ShortFilename $PARBunchCleaning(ShortFilename)} result] {
        return -code error "$result.\nPar bunch cleaning was not started."
    }
}

 
proc StartParBunchCleaning {args} {
    global PARBunchCleaning  loadParameters setuPVSA measureTune DS345Freq loadDS345FromTune PARBunchCleaning
    
    if $measureTune {
        if [catch {APSMpPARMeasureTune -setupVSA $setupVSA -statusCallback SetStatus } result] {
            SetStatus "$result"
            return
        }
    } else {
        #turn of the drive level if not measuring tune  
       # exec hpSocketSend hpvecboo "OUTP OFF"
    }
    if {![string length DS345Freq]  && $loadDS345FromTune} {
        return -code error "DS345 frequency is not obtained from tune measurement yet.!"
    }
    if $loadDS345FromTune {
        set ds345Freq $DS345Freq
    } else {
        set ds345Freq ""
    }
    if [catch {APSMpPARStartBunchCleaning -loadSCR $loadParameters \
                   -ShortFilename $PARBunchCleaning(ShortFilename) \
                   -ds345Freq $ds345Freq } result] {
        return -code error $result
    }
    SetStatus "PAR bunch cleaning started."
}

proc MeasureTune {args} {
    global setupVSA DS345Freq PARTune
    if [catch {APSMpPARMeasureTune -setupVSA $setupVSA -statusCallback SetStatus } result] {
        SetStatus "$result"
        return
    }
    SetStatus "DS345Freq is $DS345Freq"
}

proc RestoreFrequencyScan {args} {
    set freq ""
    set start ""
    set end ""
    APSParseArguments {freq start end}
    exec /home/helios/PAR/bin/shiftWF 0
    if [catch {SetDS345Freq -freq $freq -start $start -end $end} result] {
        return -code error $result
    }
    if [catch {TogglePulsedMagnetEnables -location PAR } result] {
                SetStatus "Unable to enable par beam: $result"
        return
    }
}

proc ScanDS345Frequency {args} {
    set tmpRoot /tmp/[APSTmpString]
    if [catch {exec cavget -list=P:Ds345:FrequencyM.VAL,P:Ds345:SweepStartFM.VAL,P:Ds345:SweepStopFM.VAL,P:Ds345:FMSpanC.VAL \
                   -pend=30 -printErrors} freqList] {
        return -code error $freqList
    }
    set freq0 [lindex $freqList 0]
    set start0 [lindex $freqList 1]
    set end0 [lindex $freqList 2]
    set span [lindex $freqList 3]
    set start0 [expr $freq0 - $span/2.0]
    set end0 [expr $freq0 + $span/2.0]
    global steps scanRange dialogResponse abort
    set steps 20
    set scanRange 200
    set dialogResponse 0
    APSDialogBox .scan -name "Scan DS345 Freq" -cancelCommand "set dialogResponse canceled"
    APSLabeledEntry .step -parent .scan.userFrame -label "Scan steps:" -width 20 \
        -textVariable steps
    APSLabeledEntry .range -parent .scan.userFrame -label "Scan range (kHz):" -width 20 \
        -textVariable scanRange -contextHelp "the changing range of scan, for example, if scan range is 200, the frequency will be scaned from currentValue -100 to currentValue to 100."
    tkwait window .scan
    if {$dialogResponse=="canceled"} {
        return
    }
    #enable PAR beam
    if [catch {TogglePulsedMagnetEnables -location PAR } result] {
        SetStatus $result
        return
    }
    #start bunch cleaning
    for {set i 0} {$i<5} {incr i} {
        if [catch {exec cavput -list=P:Ds345:AmplitudeRmsC.VAL=2.0} result] {
            return -code error $result
            }
        after 500
    }
    exec /home/helios/PAR/bin/shiftWF 3
    set delta0 [expr $scanRange * 1000]
    if [catch {exec cavget -list=Mt:TopUpAutoEnableC.VAL -num -printErrors} topup] {
        return -code error "Unable to read topup state: $topup"
    }
    for {set i 0} {$i<=$steps} {incr i} {
        if $abort {
            SetStatus "ScanDS345Freq was aborted."
            RestoreFrequencyScan -freq $freq0 -start $start0 -end $end0
            set abort 0
            return
        }
        if $topup {
            while {1} {
                if [catch {exec cavget -list=Mt:TopUpTime2Warn.VAL -printErrors} injTime] {
                    return -code error "Unable to read Mt:TopUpTime2Warn.VAL: $injTime"
                }
                if {$injTime<20} {
                    RestoreFrequencyScan -freq $freq0 -start $start0 -end $end0
                    set timeout [expr [clock seconds]+$injTime]
                    SetStatus "The time to injection is less than to 20 seconds, waiting for next topup..."
                    while {[clock seconds]<$timeout} {
                        if $abort {
                            SetStatus "ScanDS345Freq was aborted."
                            RestoreFrequencyScan -freq $freq0 -start $start0 -end $end0
                            set abort 0
                            return
                        }
                        after 500
                    }
                } else {
                    break
                }
            }
            if [catch {TogglePulsedMagnetEnables -location PAR } result] {
                SetStatus "Unable to enable PAR beam: $result"
                return
            }
        }
        if !$i {
            set delta [expr -$delta0/2.0]
            set freq [expr $freq0 + $delta]
            set start [expr $freq - $span/2.0]
            set end [expr $freq + $span/2.0]
            set offset [expr -$scanRange/2.0]
        } else {
            set delta [expr $delta0/$steps]
            set freq [expr $freq + $delta]
            set start [expr $freq - $span/2.0]
            set end [expr $freq + $span/2.0]
            set offset [expr -$scanRange/2.0 + $i * $delta/1000]
        }
        SetStatus "Set frequency to $freq..."
        if [catch {SetDS345Freq -freq $freq -start $start -end $end} result] {
            return -code error $result
        }
        
        if [catch {exec cavget -list=PTB:CM:qTotalAI.VAL -pend=30 -printErrors} PTBcurrent] {
            return -code error $PTBcurrent
        }
        lappend offsetList $offset
        lappend currentList $PTBcurrent
        lappend freq0List $freq
    }
    APSAddToTmpFileList -ID bunchclean -fileList "$tmpRoot.1 $tmpRoot.2"
    if [catch {exec sddsmakedataset -pipe=out -col=Offset,type=double -data=[join $offsetList ,] \
                   -col=PTBcurrent,type=double -data=[join $currentList ,]  -col=DS345Freq,type=double \
                   -data=[join $freq0List ,] \
                   | sddsprocess -pipe "-process=PTBcurrent,max,MaxCurrent" \
                   | sddsprocess -pipe=in $tmpRoot.1 \
                   "-define=col,Current,PTBcurrent MaxCurrent / 0.5 -" } result] {
        catch {exec sddsplot -sep -col=DS345Freq,PTBcurrent $tmpRoot.1 -col=Offset,PTBcurrent $tmpRoot.1 &} 
        SetStatus "Invalid data obtained as shown in the plot: $result"
        SetStatus "Restore orignal setttings."
        if [catch {SetDS345Freq -freq $freq0 -start $start0 -end $end0} result] {
            return -code error $result
        }
        return
    }
    catch {exec sddsplot -sep -col=DS345Freq,PTBcurrent $tmpRoot.1 -col=Offset,PTBcurrent $tmpRoot.1 &} 
    if [catch {exec sddszerofind $tmpRoot.1 -zero=Current -col=DS345Freq -pipe=out \
                   | sddsprocess -pipe=in -proc=DS345Freq,ave,AveFreq $tmpRoot.2 } result] {
        SetStatus "Invalid data obtained as shown in the plot: $result"
        SetStatus "Restore orignal setttings."
        if [catch {SetDS345Freq -freq $freq0 -start $start0 -end $end0} result] {
            return -code error $result
        }
    }
    set freq [exec sdds2stream -par=AveFreq $tmpRoot.2]
    set rows [exec sdds2stream -rows=bare $tmpRoot.2]
    if {$rows!=2} {
        SetStatus "Invalid data obtained as shown in the plot"
        SetStatus "Restore orignal setttings."
        RestoreFrequencyScan -freq $freq0 -start $start0 -end $end0
        
        return
    } 
    set start [expr $freq - $span/2.0]
    set end [expr $freq + $span/2.0]
    if ![APSYesNoPopUp "Confirm, set DS345 frequency to $freq?"] {
        set freq $freq0
        set start $start0
        set end $end0
    }
    RestoreFrequencyScan -freq $freq -start $start -end $end
    SetStatus "Freq scan done."
}

proc SetDS345Freq {args} {
    set freq ""
    set start ""
    set end ""
    set timeout 120
    APSParseArguments {freq start end wait}
    
    for {set i 0} {$i<6} {incr i} {
        if [catch {exec cavput -list=P:Ds345:FrequencyC.VAL=$freq,P:Ds345:SweepStartFC.VAL=$start,P:Ds345:SweepStopFC.VAL=$end -pend=30 } result] {
            return -code error $result
        }
        after 500
    }
    update
    set timeout [expr [clock seconds] + $timeout]
    set succeed 0
    while {[clock seconds]<$timeout} {
        after 1000
        if [catch {exec cavput -list=P:Ds345:RawReadX.PROC=1 -pend=30} result] {
            return -code error $result
        }
        update
        APSWaitWithUpdate -waitSeconds 1
        if [catch {exec cavput -list=P:Ds345:UpdateAllC.PROC=1 -pend=30} result] {
            return -code error $result
        }
        APSWaitWithUpdate -waitSeconds 1
        if [catch {exec cavget -list=P:Ds345:FrequencyM.VAL,P:Ds345:SweepStartFM.VAL,P:Ds345:SweepStopFM.VAL \
                       -pend=30  -printErrors} freqList] {
            return -code error $freqList
        }
        set freq1 [lindex $freqList 0]
        set start1 [lindex $freqList 1]
        set end1 [lindex $freqList 2]
        if {[expr abs($freq-$freq1)]<=100 && [expr abs($start-$start1)]<=100 && [expr abs($end-$end1)]<=100} {
	    set succeed 1
            break
        }                                    
        update
    }
    if {!$succeed}  {
        return -code error "The DS345 frequency readback can not reach the set value."
    }                 
}

SetStatus Ready.
APSScrolledStatus .status -parent .userFrame -width 80 \
  -textVariable status 
set PARBunchCleaning(ShortFilename) ""
set  measureTune 0
APSAddSCRDialog .scr -parent .userFrame -system LPL \
            -label "Choose SCR file for restoring proper parameters required by start bunch cleaning" \
            -arrayName PARBunchCleaning \
            -defaultFile $PARBunchCleaning(ShortFilename)
set setupVSA 0
set loadParameters 0
set loadDS345FromTune 0
set abort 0
APSRadioButtonFrame .set1 -parent .userFrame -label "Restore VSA setting for PAR tune measurement?" \
        -buttonList {Yes No} -valueList {1 0} -variable setupVSA -orientation horizontal
APSRadioButtonFrame .loadmeas -parent .userFrame -label "Load ds345 frequency from tune measurement?" \
    -buttonList {Yes No} -valueList {1 0} -variable loadDS345FromTune -orientation horizontal \
    -contextHelp "choose wheter to load ds345 frequency that obtained through tune measurement when load SCR is selected."
APSRadioButtonFrame .meas -parent .userFrame -label "Measure tune before starting bunch cleaning?" \
    -buttonList {Yes No} -valueList {1 0} -variable measureTune -orientation horizontal \
    -contextHelp "choose whether to measure tune to obtain ds345 freq at starting bunch cleaning."
APSRadioButtonFrame .load -parent .userFrame -label "Load parameters and ds345 frequency  before starting cleaing?" -buttonList {Yes No} -parent .userFrame \
    -valueList {1 0} -variable loadParameters -orientation horizontal \
    -contextHelp "If select YES, it loads all parameters except ds345 frequency from SCR file; the ds345 frequency is loaded from tune measurement if \"Load ds345 frequency from tune measurement\" is selected YES or from SCR file."
APSLabeledOutput .freq -parent .userFrame -label "DS345 frequency measured from tune measurement:" -width 40 -textVariable \
    DS345Freq -contextHelp "DS345 freq obtained from tune measurement"
APSFrameGrid .grid -parent .userFrame -xList {x1 x2}
APSLabeledOutput .count -parent .userFrame.grid.x1 -label "Topup Count:" -textVariable TopUpCount \
    -width 30
APSLabeledOutput .bts -parent .userFrame.grid.x2 -label "PAR charge (nC):" -textVariable PARCharge \
    -width 30
if [catch {pv linkw {TopUpCount PARCharge} {Mt:TopUpTime2Inject.VAL P:bpmSum:ChargeM} 30} result] {
        return -code error "Unable to link topup count and bts charge pv.s"
    }
global errorInfo errorCode
if {[pv umon TopUpCount]!=0 || [pv umon PARCharge] !=0} {
    return -code error "pv umon error: $errorInfo, $errorCode"
}

APSFrame .f1 -parent .userFrame
set w1 .userFrame.f1.frame
APSFrame .f2 -parent .userFrame
set w2 .userFrame.f2.frame
#APSButton .tune -parent $w1 -text "MeasureTune" -command "MeasureTune" \
#    -contextHelp "Measure tunes using VSA. Not used during routine operations."
APSButton .loadpar -parent $w1 -text "LoadParameters" -command "LoadParameters" \
    -contextHelp "locad required parameters except ds345 frequency from chosen SCR file; the ds345 frequency is loaded from tune measurement if \"Load ds345 frequency from tune measurement\" is selected YES or from SCR file."
APSButton .start -parent $w1 -text "Start Bunch Cleaning" -command "StartParBunchCleaning" \
  -contextHelp "Turn on bunch cleaning drive."
APSButton .stop -parent $w1 -text "Stop Bunch Cleaning" -command "APSMpPARStopBunchCleaning -statusCallback SetStatus" \
  -contextHelp "Turn off bunch cleaning drive."
APSButton .verify -parent $w1 -text "VerifyBunchCleaning" \
    -contextHelp "Perform a stop/pass test of beam through the PAR by shifting bunch cleaning waveform phases." \
    -command {
    if [catch {APSMpPARVerifyBunchCleaning -statusCallback SetStatus} result] {
	SetStatus "$result"
    }
}
 
APSButton .scan -parent $w2 -text "ScanDelayline" -command "ScanDelayLine" \
    -contextHelp "Scan bunch cleaning delayline and set the delay value."
APSButton .scan345 -parent $w2 -text "Scan DS345 Freq" -command "ScanDS345Frequency" \
    -contextHelp "Scan the DS345 arbituary function generator frequency and set to best value for bunch cleaning."
APSButton .abort -parent $w2 -text "Abort" -command "set abort 1" \
    -contextHelp "This button only works for aborting ScanDelayLine and ScanDS345Frequency."
APSButton .check -parent $w2 -text "Check Waveform" -command "CheckWaveform" \
    -contextHelp "Acquire and display sampled stripline-return drive signals."
APSButton .turn -parent $w2 -text "TurnOn Injection" -command "TogglePulsedMagnetEnables -location PAR" \
    -contextHelp "Turn on PAR beam."
