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

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

foreach sect "L1 L2 L3 L4 L5 L6" {
    set numberToAverage($sect) 3
    set includeStandardDeviation($sect) 0
    set indexLimit($sect) 11
    set postCommandPause($sect) 1
    set postChangePause($sect) 10
    set intermeasurementPause($sect) 2
    set rolloverPause($sect) 10
}

set indexLimit2(L1) 12
set initialValue(L1) 20
set finalValue(L1) 31
set minimumDrive(L1) 80
set maximumDrive(L1) 200
set controlName(L1) L1:MO:PFNvAO

set indexLimit2(L2) 16
set initialValue(L2) 20
set finalValue(L2) 34
set minimumDrive(L2) 60
set maximumDrive(L2) 200
set controlName(L2) L2:MO:PFNvAO

set indexLimit2(L3) 14
set initialValue(L3) 16
set finalValue(L3) 33
set minimumDrive(L3) 50
set maximumDrive(L3) 200
set controlName(L3) L3:MO:PFNvAO

set indexLimit2(L4) 11
set initialValue(L4) 20
set finalValue(L4) 32.5
set minimumDrive(L4) 200
set maximumDrive(L4) 325
set controlName(L4) L4:MO:PFNvAO

set indexLimit2(L5) 15
set initialValue(L5) 20
set finalValue(L5) 32
set minimumDrive(L5) 40
set maximumDrive(L5) 100
set controlName(L5) L5:MO:PFNvAO

set indexLimit2(L6) 17
set initialValue(L6) 16
set finalValue(L6) 32
set minimumDrive(L6) 70
set maximumDrive(L6) 300
set controlName(L6) L6:MO:PFNVoltageAO

proc SetActiveValues {args} {
    set sector L1
    APSStrictParseArguments {sector}
    global numberToAverage includeStandardDeviation indexLimit indexLimit2 initialValue finalValue minimumDrive maximumDrive postCommandPause postChangePause intermeasurementPause rolloverPause controlName

    set numberToAverage(active) $numberToAverage($sector)
    set includeStandardDeviation(active) $includeStandardDeviation($sector)
    set indexLimit(active) $indexLimit($sector)
    set indexLimit2(active) $indexLimit2($sector)
    set initialValue(active) $initialValue($sector)
    set finalValue(active) $finalValue($sector)
    set minimumDrive(active) $minimumDrive($sector)
    set maximumDrive(active) $maximumDrive($sector)
    set postCommandPause(active) $postCommandPause($sector)
    set postChangePause(active) $postChangePause($sector)
    set intermeasurementPause(active) $intermeasurementPause($sector)
    set rolloverPause(active) $rolloverPause($sector)
    set controlName(active) $controlName($sector)
}

proc RunExperiment {args} {
    APSSetVarAndUpdate status "Running Experiment"
    set sector L1
    APSStrictParseArguments {sector}
    global numberToAverage includeStandardDeviation indexLimit indexLimit2 initialValue finalValue minimumDrive maximumDrive postCommandPause postChangePause intermeasurementPause rolloverPause controlName
    
#    if {[catch {exec cavget -list=L:${sector}StabilizerRC.RUN} result]} {
#	APSSetVarAndUpdate status "error: $result"
#	bell
#	return
#    }
    if {[catch {exec cavget -list=L:${sector}Stabilizer:SDDS.RUN} result]} {
	APSSetVarAndUpdate status "error: $result"
	bell
	return
    }
    if {$result != 0} {
	APSSetVarAndUpdate status "Turn off the power control law first"
	bell
	return
    }
    if {$sector == "L1"} {
	if {[catch {exec cavget -list=L1:RFG:RF:SW1:positionMI} result]} {
	    APSSetVarAndUpdate status "error: $result"
	    bell
	    return
	}
	if {$result != "Waster Load"} {
	    APSSetVarAndUpdate status "Switch to Waster load first"
	    bell
	    return
	}
    }
    set dir [file join / home helios oagData linac linacSectorGain]
    set dateStamp [clock format [clock seconds] -format "%m%d%y"]
    set workingDir [file join $dir $dateStamp ${sector}Gain]
    set finalDir [file join $dir ${sector}Gain]
    file mkdir $workingDir
    file delete -force [file join $workingDir ${sector}Gain.sdds]
    file copy -force \
	[file join $finalDir setLinacKlyDrive] \
	[file join $workingDir setLinacKlyDrive]
    if {[catch {exec replaceText \
		    [file join $dir KlyGainTemplate.exp] \
		    [file join $workingDir ${sector}KlyGain.exp] \
		    "-original=<numberToAverage>,<includeStandardDeviation>,<indexLimit>,<indexLimit2>,<indexLimit-1>,<initialValue>,<finalValue>,<minimumDrive>,<maximumDrive>,<postCommandPause>,<postChangePause>,<intermeasurementPause>,<rolloverPause>,<controlName>,<sector>" \
		    -replacement=$numberToAverage(active),$includeStandardDeviation(active),$indexLimit(active),$indexLimit2(active),[expr $indexLimit(active) - 1],$initialValue(active),$finalValue(active),$minimumDrive(active),$maximumDrive(active),$postCommandPause(active),$postChangePause(active),$intermeasurementPause(active),$rolloverPause(active),$controlName(active),$sector} results]} {
	APSSetVarAndUpdate status "error: $results"
	return
    }
    APSSetVarAndUpdate status "Installing data into $workingDir"
    cd $workingDir
    
    if {$sector == "L2"} {
        set presentDrivePower [exec cavget -list=L-K2:LLRF:KlyDrive_PwrRemoteM.HIHI -pendIoTime=20]
    } elseif {$sector == "L5"} {
        set presentDrivePower [exec cavget -list=L-K5:LLRF:KlyDrive_PwrRemoteM.HIHI -pendIoTime=20]
    } else {
        set presentDrivePower [exec cavget -list=${sector}:KY:DC1RF.HIHI -pendIoTime=20]
    }
    set max110 [expr $maximumDrive(active) * 1.1]
    if {$presentDrivePower < $max110} {
#	exec cavput -list=${sector}:KY:DC1RF.HIHI=$max110 -pendIoTime=20
    }

    APSExecLog .execlog$sector \
	-name "Linac Gain Measurement" \
	-unixCommand "sddsexperiment [file join $workingDir ${sector}KlyGain.exp]" \
	-callback "ProcessExperiment -sector $sector -dateStamp $dateStamp -presentDrivePower $presentDrivePower -max110 $max110" \
	-abortCallback "ResetKlystronDrive -sector $sector -presentDrivePower $presentDrivePower -max110 $max110" \
	-cancelCallback "ResetKlystronDrive -sector $sector -presentDrivePower $presentDrivePower -max110 $max110"

}

proc ResetKlystronDrive {args} {
    set sector L1
    set presentDrivePower ""
    set max110 ""
    APSStrictParseArguments {sector presentDrivePower max110}
    
    if {([llength $presentDrivePower]) && ([llength $max110])} {
	if {$presentDrivePower < $max110} {
#	    exec cavput -list=${sector}:KY:DC1RF.HIHI=$presentDrivePower -pendIoTime=20
	}
    }
}

proc ProcessExperiment {args} {
    APSSetVarAndUpdate status "Processing Experiment"
    set sector L1
    set dateStamp ""
    set presentDrivePower ""
    set max110 ""
    APSStrictParseArguments {sector dateStamp presentDrivePower max110}

    ResetKlystronDrive -sector $sector -presentDrivePower $presentDrivePower -max110 $max110

    set dir [file join / home helios oagData linac linacSectorGain]
    if {![llength $dateStamp]} {
	set dateStamp [clock format [clock seconds] -format "%m%d%y"]
    }
    set workingDir [file join $dir $dateStamp ${sector}Gain]
    set finalDir [file join $dir ${sector}Gain]
    if {![file exists $workingDir]} {
	APSSetVarAndUpdate status "error: $workingDir does not exist. Please run the experiment first"
	return	
    }
    file delete -force [file join $workingDir ${sector}KlyGain.exp] [file join $workingDir ${sector}KlyGain.exp~]
    file delete -force [file join $workingDir setLinacKlyDrive]
    file copy -force \
	[file join $finalDir processGainData] \
	[file join $workingDir processGainData]

    if {[catch {exec [file join $workingDir processGainData] -root ${sector}Gain -sector ${sector} -plotOnly 0} results]} {
	APSSetVarAndUpdate status "error: $results"
	file delete -force [file join $workingDir processGainData]
	return
    }
    file delete -force [file join $workingDir processGainData]
    APSSetVarAndUpdate status "Done"
}

proc InstallExperiment {args} {
    APSSetVarAndUpdate status "Installing Experiment"
    set sector L1
    set dateStamp ""
    APSStrictParseArguments {sector dateStamp}

    set dir [file join / home helios oagData linac linacSectorGain]
    if {![llength $dateStamp]} {
	set dateStamp [clock format [clock seconds] -format "%m%d%y"]
    }
    set workingDir [file join $dir $dateStamp ${sector}Gain]
    set finalDir [file join $dir ${sector}Gain]
    if {![file exists $workingDir]} {
	APSSetVarAndUpdate status "error: $workingDir does not exist. Please run the experiment first"
	return	
    }
    file delete -force [file join $finalDir ${sector}Gain.sdds] [file join $finalDir ${sector}Gain_Proc.sdds]
    exec ln -s [file join $workingDir ${sector}Gain.sdds] [file join $finalDir ${sector}Gain.sdds]
    exec ln -s [file join $workingDir ${sector}Gain_Proc.sdds] [file join $finalDir ${sector}Gain_Proc.sdds]

    APSSetVarAndUpdate status "Done"
}


APSApplication . -name "Linac Gain Meaurement" -version $CVSRevisionAuthor 

set status Ready...
APSScrolledStatus . \
    -parent .userFrame \
    -textVariable status \
    -width 60

#if {$env(USER) != "oag"} {
#    puts stderr "error: you must be logged in as oag to run the application"
#    exit
#}

set sector L1
SetActiveValues -sector $sector
APSRadioButtonFrame .chooseSector \
    -parent .userFrame \
    -label "Choose Linac Sector" \
    -variable sector \
    -buttonList "L1 L2 L3 L4 L5 L6" \
    -valueList "L1 L2 L3 L4 L5 L6" \
    -orientation horizontal \
    -commandList {"SetActiveValues -sector L1" \
		      "SetActiveValues -sector L2" \
		      "SetActiveValues -sector L3" \
		      "SetActiveValues -sector L4" \
		      "SetActiveValues -sector L5" \
		      "SetActiveValues -sector L6"}

APSLabeledEntry .initialValue \
    -parent .userFrame \
    -label "Initial PFN Value" \
    -textVariable initialValue(active)

APSLabeledEntry .finalValue \
    -parent .userFrame \
    -label "Final PFN Value" \
    -textVariable finalValue(active)

APSLabeledEntry .minimumDrive \
    -parent .userFrame \
    -label "Minimum Drive" \
    -textVariable minimumDrive(active)

APSLabeledEntry .maximumDrive \
    -parent .userFrame \
    -label "Maximum Drive" \
    -textVariable maximumDrive(active)

APSLabeledEntry .indexLimit2 \
    -parent .userFrame \
    -label "PFN Voltage Index Limit" \
    -textVariable indexLimit2(active)

APSLabeledEntry .indexLimit \
    -parent .userFrame \
    -label "Kly Drive Power Index Limit" \
    -textVariable indexLimit(active)

APSLabeledEntry .numberToAverage \
    -parent .userFrame \
    -label "Number to Average" \
    -textVariable numberToAverage(active)

APSLabeledEntry .postCommandPause \
    -parent .userFrame \
    -label "Post Command Pause" \
    -textVariable postCommandPause(active)

APSLabeledEntry .postChangePause \
    -parent .userFrame \
    -label "Post Change Pause" \
    -textVariable postChangePause(active)

APSLabeledEntry .intermeasurementPause \
    -parent .userFrame \
    -label "Intermeasurement Pause" \
    -textVariable intermeasurementPause(active)

APSLabeledEntry .rolloverPause \
    -parent .userFrame \
    -label "Rollover Pause" \
    -textVariable rolloverPause(active)


APSButton .runExperiment \
    -parent .userFrame \
    -text "Run Experiment" \
    -command {RunExperiment -sector $sector}

APSButton .processExperiment \
    -parent .userFrame \
    -text "Process Experiment" \
    -command {ProcessExperiment -sector $sector}

APSButton .installExperiment \
    -parent .userFrame \
    -text "Install Experiment" \
    -command {InstallExperiment -sector $sector}

