#!/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 debug 0
set controlList ""
set startLinacRfPower ""
set includeL3PowerControl 1
set args $argv
APSParseArguments {debug controlList startLinacRfPower includeL3PowerControl}

if {![string length $controlList]} {
    set controlList {linacRfPower}
}

APSApplication . -name "APS ControlLaw: [join $controlList +]" \
        -overview "ControlLaw provides convenience controls for various sddscontrollaw scripts."

set mainStatus "Initializing ..."
APSStatusLine .status -parent .userFrame -variable mainStatus -width 60

# to add more controllaw instances, insert appropriate entries
# for the arrays directory, rcDesc, and title.
# The new member name must be added to the groupDef list a few lines down.
# The list items of groupDef must be a member of the arrays mentioned above.
# If a new group of scripts is required, then a new array element
# for groupDef should be added.

set HomeDir /home/helios/oagData/controllaw
cd $HomeDir
set directory(xLTP) LTP
set directory(yLTP) LTP
set directory(xPTB) PTB
set directory(yPTB) PTB
set directory(xPAR) PARorbit
set directory(yPAR) PARorbit
set directory(xyBTS)  BTS
set directory(xyBTSFull) BTS
set directory(xBTX) BTX
set directory(yBTX) BTX
# controls gap voltages through AGC setpoints
set directory(rf3637Err) SRgapVoltage
set directory(rf3840Err) SRgapVoltage
set directory(rfFreq)    SRorbit
set directory(rfFreqFast) SRorbit
set directory(xL2) L2
set directory(yL2) L2
set directory(xL4) L4
set directory(yL4) L4
set directory(xL5) L5
set directory(yL5) L5
#set directory(xRG1) LEUTL/RG1only
#set directory(yRG1) LEUTL/RG1only
#set directory(xRG2) LEUTL/RG2only
#set directory(yRG2) LEUTL/RG2only
set directory(xRG2PlusLinac) LINAC
set directory(yRG2PlusLinac) LINAC
set directory(xRG1PlusLinac) LINAC
set directory(yRG1PlusLinac) LINAC
set directory(xMinMagLinac) LINAC
set directory(yMinMagLinac) LINAC
set directory(xLinac) LINAC
set directory(yLinac) LINAC
set directory(xLinacPCG) LINAC_PCG
set directory(yLinacPCG) LINAC_PCG
set directory(linacBeamRfPhase-RFGUN1) linacBeamRfPhase/RFGUN1_L1P1
set directory(linacBeamRfPhase-RFGUN2) linacBeamRfPhase/RFGUN2_L1P1
set directory(linacBeamRfPhase-RFGUN2-K1Dn) linacBeamRfPhase/K1Dn-RFGUN2_L1P1
set directory(linacBeamRfPhase-RFGUN2-K2Dn) linacBeamRfPhase/K2Dn-RFGUN2_L1P1
set directory(linacBeamRfPhase-L4AS1-L3P3) linacBeamRfPhase/L4AS1_L3P3
set directory(linacBeamRfPhase-L5AS1-L4P1) linacBeamRfPhase/L5AS1_L4P1
set directory(linacBeamRfPhase-L1RFGun1-L2-L4-L5) linacBeamRfPhase/L1RFGun1_L2_L4_L5
set directory(linacBeamRfPhase-L1RFGun2-L2-L4-L5) linacBeamRfPhase/L1RFGun2_L2_L4_L5
set directory(linacBeamRfPhase-K2Dn-RFGUN2_L1P1) linacBeamRfPhase/K2Dn-RFGUN2_L1P1
set directory(linacBeamRfPhase-PCGun-Laser) linacBeamRfPhase/PCGun-Laser
set directory(linacBeamRfPhase-PCGun-L1_L2_L4_L5) linacBeamRfPhase/PCGun-L1_L2_L4_L5
set directory(xLeutl-157nm) LEUTL
set directory(yLeutl-157nm) LEUTL
set directory(xLeutl-265nm) LEUTL
set directory(yLeutl-265nm) LEUTL
set directory(xBypass) Bypass/Horizontal
set directory(yBypass) Bypass/Vertical
set directory(rfPhaseL1) linacRf
set directory(rfPhaseL2) linacRf
set directory(rfPhaseL3) linacRf
set directory(rfPhaseL4) linacRf
set directory(rfPhaseL5) linacRf
set directory(rfPowerL1) linacRf
set directory(rfPowerL2) linacRf
set directory(rfPowerL3) linacRf
set directory(rfPowerL4) linacRf
set directory(rfPowerL5) linacRf
set directory(rfPowerL6) linacRf
set directory(srYEmittance) srYEmittance
set directory(srEmittanceRatio) srEmittanceRatio
set directory(longBooster) BOOSTER/longBooster
set directory(xBooster) BOOSTER/transBooster/Horizontal
set directory(yBooster) BOOSTER/transBooster/Vertical
set directory(xBoosterDirInj) BOOSTER/directInj/Horizontal
set directory(yBoosterDirInj) BOOSTER/directInj/Vertical
set directory(injTune) BOOSTER/injTune
set directory(bcontrolBM) bcontrollaw/bcontrolBM
set directory(bcontrolQF) bcontrollaw/bcontrolQF
set directory(bcontrolQD) bcontrollaw/bcontrolQD
set directory(bcontrolSF) bcontrollaw/bcontrolSF
set directory(bcontrolSD) bcontrollaw/bcontrolSD

# The list items for arguments are generated in procedure MakeControlLawWidget.
# These list items are actually arrays globalized and created in MakeControlLawWidget,
# and used elsewhere. Though C. Saunders warned me against the practice
# of possibly changing the state external to this procedure, I have no other choice
# in making this controllaw tcl script more functional. The array names
# are necessarily unknown before running this script.
set arguments {}

# if you want the energy to be set by the BRho variable
# rather than the default specified in the configuration scripts, fill
# in an entry here
#set BrhoPV(xLTP) LTP:BRhoCALC
#set BrhoPV(yLTP) LTP:BRhoCALC
#set BrhoPV(xPTB) LTP:BRhoCALC
#set BrhoPV(yPTB) LTP:BRhoCALC
#set BrhoPV(BTS) S:BRhoCALC


set rcDesc(xLTP) {LTPcontrolLawX}
set rcDesc(yLTP) {LTPcontrolLawY}
set rcDesc(xPTB) {PTBcontrolLawX}
set rcDesc(yPTB) {PTBcontrolLawY}
set rcDesc(xPAR) {PAROrbitControlLawX}
set rcDesc(yPAR) {PAROrbitControlLawY}
set rcDesc(xyBTS)  {BTScontrolLawX}
set rcDesc(xyBTSFull) {BTScontrolLawX}
set rcDesc(xBTX) {BTXcontrolLawX}
set rcDesc(yBTX) {BTXcontrolLawY}
set rcDesc(rf3637Err) {rf3637controlLaw}
set rcDesc(rf3840Err) {rf3840controlLaw}
set rcDesc(rfFreq) {rfFreqControlLaw}
set rcDesc(rfFreqFast) {CircumferenceChange}
set rcDesc(xL2)  {L2controlLawX}
set rcDesc(yL2)  {L2controlLawY}
set rcDesc(xL4)  {L4controlLawX}
set rcDesc(yL4)  {L4controlLawY}
set rcDesc(xL5)  {L5controlLawX}
set rcDesc(yL5)  {L5controlLawY}
#set rcDesc(xRG1) {RG1controlLawX}
#set rcDesc(yRG1) {RG1controlLawY}
#set rcDesc(xRG2) {RG2controlLawX}
#set rcDesc(yRG2) {RG2controlLawY}
set rcDesc(xLinac)  {LinacControlLawX}
set rcDesc(yLinac)  {LinacControlLawY}
set rcDesc(xRG2PlusLinac)  {LinacControlLawX}
set rcDesc(yRG2PlusLinac)  {LinacControlLawY}
set rcDesc(xRG1PlusLinac)  {LinacControlLawX}
set rcDesc(yRG1PlusLinac)  {LinacControlLawY}
set rcDesc(xMinMagLinac)  {LinacControlLawX}
set rcDesc(yMinMagLinac)  {LinacControlLawY}
set rcDesc(xLinacPCG)  {LinacControlLawX}
set rcDesc(yLinacPCG)  {LinacControlLawY}
set rcDesc(linacBeamRfPhase-RFGUN1) {RFGUN1-L1P1-PhsCtl}
set rcDesc(linacBeamRfPhase-RFGUN2) {RFGUN2-L1P1-PhsCtl}
set rcDesc(linacBeamRfPhase-RFGUN2-K1Dn) {RFGUN2-L1P1-K1Dn-PhsCtl}
set rcDesc(linacBeamRfPhase-RFGUN2-K2Dn) {RFGUN2-L1P1-K2Dn-PhsCtl}
set rcDesc(linacBeamRfPhase-L4AS1-L3P3) {L4AS1-L3P3-PhsCtl}
set rcDesc(linacBeamRfPhase-L5AS1-L4P1) {L5AS1-L4P1-PhsCtl}
set rcDesc(linacBeamRfPhase-L1RFGun1-L2-L4-L5) {L1RFGun1-L2-L4-L5-PhsCtl}
set rcDesc(linacBeamRfPhase-L1RFGun2-L2-L4-L5) {L1RFGun2-L2-L4-L5-PhsCtl}
set rcDesc(linacBeamRfPhase-K2Dn-RFGUN2_L1P1) {K2Dn-RFGUN2_L1P1-PhsCtl}
set rcDesc(linacBeamRfPhase-PCGun-Laser) {PCGun-Laser-PhsCtl}
set rcDesc(linacBeamRfPhase-PCGun-L1_L2_L4_L5) {PCGun-L1_L2_L4_L5-PhsCtl}
set rcDesc(xLeutl-157nm)  {LeutlControlLawX-157nm}
set rcDesc(yLeutl-157nm)  {LeutlControlLawY-157nm}
set rcDesc(xLeutl-265nm)  {LeutlControlLawX-265nm}
set rcDesc(yLeutl-265nm)  {LeutlControlLawY-265nm}
set rcDesc(xBypass)  {BypassLineControlLawX}
set rcDesc(yBypass)  {BypassLineControlLawY}
set rcDesc(rfPhaseL1) {L1PhaseControllaw}
set rcDesc(rfPhaseL2) {L2PhaseControllaw}
set rcDesc(rfPhaseL3) {L3PhaseControllaw}
set rcDesc(rfPhaseL4) {L4PhaseControllaw}
set rcDesc(rfPhaseL5) {L5PhaseControllaw}
set rcDesc(rfPowerL1) {L1PowerControllaw}
set rcDesc(rfPowerL2) {L2PowerControllaw}
set rcDesc(rfPowerL3) {L3PowerControllaw}
set rcDesc(rfPowerL4) {L4PowerControllaw}
set rcDesc(rfPowerL5) {L5PowerControllaw}
set rcDesc(rfPowerL6) {L6PowerControllaw}
set rcDesc(srYEmittance) {srYEmittanceControllaw}
set rcDesc(srEmittanceRatio) {srEmittanceRatioControllaw}
set rcDesc(longBooster) {BOOSTERcontrolLawLong}
set rcDesc(bcontrolBM) {bcontrollawBM}
set rcDesc(bcontrolQF) {bcontrollawQF}
set rcDesc(bcontrolQD) {bcontrollawQD}
set rcDesc(bcontrolSF) {bcontrollawSF}
set rcDesc(bcontrolSD) {bcontrollawSD}
set rcDesc(xBooster) {BOOSTERcontrollawX}
set rcDesc(yBooster) {BOOSTERcontrollawY}
set rcDesc(xBoosterDirInj) {BoosterDirInjControlLawX}
set rcDesc(yBoosterDirInj) {BoosterDirInjControlLawY}
set rcDesc(injTune) {BoosterInjTuneControllaw}
set rcPV(xLTP) {LTP:ControlLawXRC}
set rcPV(yLTP) {LTP:ControlLawYRC}
set rcPV(xPTB) {PTB:ControlLawXRC}
set rcPV(yPTB) {PTB:ControlLawYRC}
set rcPV(xyBTS)    {BTS:ControlLawXRC}
set rcPV(xyBTSFull) {BTS:ControlLawXRC}
set rcPV(xBTX) {BTX:ControlLawXRC}
set rcPV(yBTX) {BTX:ControlLawYRC}
set rcPV(xPAR) {PAR:OrbitControlLawXSDDS}
set rcPV(yPAR) {PAR:OrbitControlLawYSDDS}
set rcPV(rf3637Err) {S:RF2:3637GVControlLawRC}
set rcPV(rf3840Err) {S:RF1:3840GVControlLawRC}
set rcPV(rfFreq) {S:rfFreqControlLawRC}
set rcPV(rfFreqFast) {S:circumferenceChangeRC}
set rcPV(xL2)  {L2:ControlLawXRC}
set rcPV(yL2)  {L2:ControlLawYRC}
set rcPV(xL4)  {L4:ControlLawXRC}
set rcPV(yL4)  {L4:ControlLawYRC}
set rcPV(xL5)  {L5:ControlLawXRC}
set rcPV(yL5)  {L5:ControlLawYRC}
#set rcPV(xRG1) {L1:RG1:ControlLawXRC}
#set rcPV(yRG1) {L1:RG1:ControlLawYRC}
#set rcPV(xRG2) {L1:RG2:ControlLawXRC}
#set rcPV(yRG2) {L1:RG2:ControlLawYRC}
set rcPV(xLinac)  {Linac:ControlLawXRC}
set rcPV(yLinac)  {Linac:ControlLawYRC}
set rcPV(xRG2PlusLinac)  {Linac:ControlLawXRC}
set rcPV(yRG2PlusLinac)  {Linac:ControlLawYRC}
set rcPV(xRG1PlusLinac)  {Linac:ControlLawXRC}
set rcPV(yRG1PlusLinac)  {Linac:ControlLawYRC}
set rcPV(xMinMagLinac)  {Linac:ControlLawXRC}
set rcPV(yMinMagLinac)  {Linac:ControlLawYRC}
set rcPV(xLinacPCG)  {OAG109RC}
set rcPV(yLinacPCG)  {OAG110RC}
set rcPV(linacBeamRfPhase-RFGUN1) {L:BPD:RFGUN1RC}
set rcPV(linacBeamRfPhase-RFGUN2) {L:BPD:RFGUN2RC}
set rcPV(linacBeamRfPhase-RFGUN2-K1Dn) {L:BPD:RFGUN2K1DnRC}
set rcPV(linacBeamRfPhase-RFGUN2-K2Dn) {L:BPD:RFGUN2K2DnRC}
set rcPV(linacBeamRfPhase-L4AS1-L3P3) {L:BPD:L3P3:L4AS1RC}
set rcPV(linacBeamRfPhase-L5AS1-L4P1) {L:BPD:L4P1:L5AS1RC}
set rcPV(linacBeamRfPhase-L1RFGun1-L2-L4-L5) {L:BPD:RFGUN1:L1L2L4L5RC}
set rcPV(linacBeamRfPhase-L1RFGun2-L2-L4-L5) {L:BPD:RFGUN2:L1L2L4L5RC}
#set rcPV(linacBeamRfPhase-K2Dn-RFGUN2_L1P1) {L:BPD:RFGUN2:L1L2L4L5RC}
set rcPV(linacBeamRfPhase-K2Dn-RFGUN2_L1P1) {OAG198RC}
set rcPV(linacBeamRfPhase-PCGun-Laser) {OAG107RC}
set rcPV(linacBeamRfPhase-PCGun-L1_L2_L4_L5) {OAG108RC}
set rcPV(xLeutl-157nm)  {Leutl-157:ControlLawXRC}
set rcPV(yLeutl-157nm)  {Leutl-157:ControlLawYRC}
set rcPV(xLeutl-265nm)  {Leutl-265:ControlLawXRC}
set rcPV(yLeutl-265nm)  {Leutl-265:ControlLawYRC}
set rcPV(xBypass)  {BoosterBypass:ControlLawXRC} 
set rcPV(yBypass)  {BoosterBypass:ControlLawYRC} 
set rcPV(xBoosterDirInj) {BoosterDirInj:ControlLawXRC}
set rcPV(yBoosterDirInj) {BoosterDirInj:ControlLawYRC}
set rcPV(injTune) {B:InjTune:ControllawRC}
set rcPV(rfPhaseL1) {L1:PhaseControlRC}
set rcPV(rfPhaseL2) {L2:PhaseControlRC}
set rcPV(rfPhaseL3) {L3:PhaseControlRC}
set rcPV(rfPhaseL4) {L4:PhaseControlRC}
set rcPV(rfPhaseL5) {L5:PhaseControlRC}
set rcPV(rfPowerL1) {L:L1StabilizerRC}
set rcPV(rfPowerL2) {L:L2StabilizerRC}
set rcPV(rfPowerL3) {L:L3StabilizerRC}
set rcPV(rfPowerL4) {L:L4StabilizerRC}
set rcPV(rfPowerL5) {L:L5StabilizerRC}
set rcPV(rfPowerL6) {L:L6StabilizerRC}
set rcPV(srYEmittance) {S:YEmitControlLawRC}
set rcPV(srEmittanceRatio) {S:YEmitControlLawRC}
set rcPV(longBooster) {Booster:ControlLawLongRC}
set rcPV(bcontrolBM) {B:BMbcontrollawRC}
set rcPV(bcontrolQF) {B:QFbcontrollawRC}
set rcPV(bcontrolQD) {B:QDbcontrollawRC}
set rcPV(bcontrolSF) {B:SFbcontrollawRC}
set rcPV(bcontrolSD) {B:SDbcontrollawRC}
set rcPV(xBooster) {Booster:ControlLawXRC}
set rcPV(yBooster) {Booster:ControlLawYRC}
set rcPV(xBoosterDirInj) {BoosterDirInj:ControlLawXRC}
set rcPV(yBoosterDirInj) {BoosterDirInj:ControlLawYRC}

set title(xLTP) {X control}
set title(yLTP) {Y control}
set title(xPTB) {X control}
set title(yPTB) {Y control}
set title(xPAR) {X control}
set title(yPAR) {Y control}
set title(xyBTS) {X/Y control}
set title(xyBTSFull) {X/Y Full control}
set title(xBTX) {X BTX control}
set title(yBTX) {Y BTX control}
set title(rf3637Err) "rf3637\ncontrol of\ngap voltage error"
set title(rf3840Err) "rf3840\ncontrol of\ngap voltage error"
set title(rfFreq) "RF frequency\ncontrol of\ndispersion orbit"
set title(rfFreqFast) "Circumference\nchange derived\nfrom dispersion bpms"
set title(xL2)  {X control}
set title(yL2)  {Y control}
set title(xL4)  {X control}
set title(yL4)  {Y control}
set title(xL5)  {X control}
set title(yL5)  {Y control}
#set title(xRG1)    {RG1->L1:PM1 X control}
#set title(yRG1)    {RG1->L1:PM1 Y control}
#set title(xRG2)    {RG2->L1:PM1 X control}
#set title(yRG2)    {RG2->L1:PM1 Y control}
set title(xLinac)  {            X control}
set title(yLinac)  {            Y control}
set title(xRG2PlusLinac)  {            X control}
set title(yRG2PlusLinac)  {            Y control}
set title(xRG1PlusLinac)  {            X control}
set title(yRG1PlusLinac)  {            Y control}
set title(xMinMagLinac)  {            X control}
set title(yMinMagLinac)  {            Y control}
set title(xLinacPCG)  {            X control}
set title(yLinacPCG)  {            Y control}
set title(linacBeamRfPhase-RFGUN1)           {(RG1) LinBeam-RfPhase-RFGUN1 Phase Control}
set title(linacBeamRfPhase-RFGUN2)           {(RG2) LinBeam-RfPhase-RFGUN2 Phase Control}
set title(linacBeamRfPhase-RFGUN2-K1Dn)           {(RG2) K1Dn LinBeam-RfPhase-RFGUN2 Phase Control}
set title(linacBeamRfPhase-RFGUN2-K2Dn)           {(RG2) K2Dn LinBeam-RfPhase-RFGUN2 Phase Control}
set title(linacBeamRfPhase-L4AS1-L3P3)       {(L4) L4AS1-L3P3   Phase Control}
set title(linacBeamRfPhase-L5AS1-L4P1)       {(L5) L5AS1-L4P1   Phase Control}
set title(linacBeamRfPhase-L1RFGun1-L2-L4-L5)      {L1RFGun1-L2-L4-L5 Phase Control}
set title(linacBeamRfPhase-L1RFGun2-L2-L4-L5)      {L1RFGun2-L2-L4-L5 Phase Control}
set title(linacBeamRfPhase-K2Dn-RFGUN2_L1P1)       {K2Dn-RFGUN2_L1P1 Phase Control}
set title(linacBeamRfPhase-PCGun-Laser)            {PCGun-Laser       Phase Control}
set title(linacBeamRfPhase-PCGun-L1_L2_L4_L5)      {PCGun-L1_L2_L4_L5 Phase Control}
set title(xLeutl-157nm)  {X control 157nm}
set title(yLeutl-157nm)  {Y control 157nm}
set title(xLeutl-265nm)  {X control 265nm}
set title(yLeutl-265nm)  {Y control 265nm}
set title(xBypass)  {X control}
set title(yBypass)  {Y control}
set title(rfPhaseL1) {L1 Phase Control}
set title(rfPhaseL2) {L2 Phase Control}
set title(rfPhaseL3) {L3 Phase Control}
set title(rfPhaseL4) {L4 Phase Control}
set title(rfPhaseL5) {L5 Phase Control}
set title(rfPowerL1) {L1 Power Control}
set title(rfPowerL2) {L2 Power Control}
set title(rfPowerL3) {L3 Power Control}
set title(rfPowerL4) {L4 Power Control}
set title(rfPowerL5) {L5 Power Control}
set title(rfPowerL6) {L6 Power Control}
set title(srYEmittance) {SR y-emittance Control}
set title(srEmittanceRatio) {SR emittance ratio Control}
set title(longBooster) {Booster Longitudinal Correction}
set title(bcontrolBM) {Booster BM bcontrol}
set title(bcontrolQF) {Booster QF bcontrol}
set title(bcontrolQD) {Booster QD bcontrol}
set title(bcontrolSF) {Booster SF bcontrol}
set title(bcontrolSD) {Booster SD bcontrol}
set title(xBooster)    {Booster Horizontal Correction  }
set title(yBooster)    {Booster Vertical Correction    }
set title(xBoosterDirInj) {Direct Injection Horizontal    
Trajectory Correction}
set title(yBoosterDirInj) {Direct Injection Vertical      
Trajectory Correction}
set title(injTune) {Booster Injection Tune Controllaw}
set groupTitle(ltp) {LTP control}
set groupTitle(ptb) {PTB control}
set groupTitle(bts) {BTS control}
set groupTitle(btsFull) {BTS Full control}
set groupTitle(btx) {BTX control}
set groupTitle(par) {PAR orbit control}
# no lnoger supported
#set groupTitle(srrf) {SR cavity amplitude control}
set groupTitle(srrfErr) {SR cavity amplitude control}
set groupTitle(srrfFreq) {SR dispersion orbit control}
set groupTitle(l2) {L2 control}
set groupTitle(l4) {L4 control}
set groupTitle(l5) {L5 control}
set groupTitle(linac) {Linac control}
set groupTitle(rg2PlusLinac) {Linac control from RG2}
set groupTitle(rg1PlusLinac) {Linac control from RG1}
set groupTitle(minMagLinac) {Linac control from Minimum Magnets}
set groupTitle(linacPCG) {Linac Using PCGun control}
set groupTitle(linacPCGBeamRfPhaseGlobal) {Linac PCGun RF-Beam Phase Control}
set groupTitle(linacBeamRfPhaseGlobal) {Linac RF-Beam Phase Control}
set groupTitle(linacBeamRfPhaseIndividual) {Individual Linac RF-Beam Phase Control}
set groupTitle(leutl) {Leutl control}
set groupTitle(bypass) {PAR and Booster Bypass control}
set groupTitle(linacRfPhase) {Linac rf Phase}
set groupTitle(linacRfPower) {Linac rf Power}
set groupTitle(srYEmittance) {SR y-emittance Control}
set groupTitle(srEmittanceRatio) {SR emittance ratio Control}
set groupTitle(booster) { Booster Injection Correction}
set groupTitle(bcontrollaw) {Booster bcontrol}
set groupDef(ltp) {xLTP yLTP}
set groupDef(ptb) {xPTB yPTB}
set groupDef(par) {xPAR yPAR}
set groupDef(bts) {xyBTS}
set groupDef(btsFull) {BTSFull}
set groupDef(btx) {xBTX yBTX}
set groupDef(srrfErr) {rf3637Err rf3840Err}
set groupDef(srrfFreq) {rfFreq rfFreqFast}
set groupDef(l2) {xL2 yL2}
set groupDef(l4) {xL4 yL4}
set groupDef(l5) {xL5 yL5}
set groupDef(linac) {xLinac yLinac}
set groupDef(rg2PlusLinac) {xRG2PlusLinac yRG2PlusLinac}
set groupDef(rg1PlusLinac) {xRG1PlusLinac yRG1PlusLinac}
set groupDef(minMagLinac) {xMinMagLinac yMinMagLinac}
set groupDef(linacPCG) {xLinacPCG yLinacPCG}
set groupDef(linacPCGBeamRfPhaseGlobal) {linacBeamRfPhase-PCGun-Laser linacBeamRfPhase-PCGun-L1_L2_L4_L5}
set groupDef(linacBeamRfPhaseGlobal) {linacBeamRfPhase-L1RFGun1-L2-L4-L5 linacBeamRfPhase-L1RFGun2-L2-L4-L5 linacBeamRfPhase-K2Dn-RFGUN2_L1P1}
set groupDef(linacBeamRfPhaseIndividual) {linacBeamRfPhase-RFGUN1 linacBeamRfPhase-RFGUN2 linacBeamRfPhase-RFGUN2-K1Dn linacBeamRfPhase-RFGUN2-K2Dn linacBeamRfPhase-L4AS1-L3P3 linacBeamRfPhase-L5AS1-L4P1}
set groupDef(leutl) {xLeutl-157nm yLeutl-157nm xLeutl-265nm yLeutl-265nm}
set groupDef(bypass) {xBypass yBypass}
set groupDef(linacRfPhase) { rfPhaseL1 rfPhaseL2 rfPhaseL3 rfPhaseL4 rfPhaseL5 }
set groupDef(srYEmittance) {srYEmittance}
set groupDef(srEmittanceRatio) {srEmittanceRatio}
set groupDef(booster) {longBooster xBooster yBooster xBoosterDirInj yBoosterDirInj injTune}
set groupDef(bcontrollaw) {bcontrolBM bcontrolQF bcontrolQD bcontrolSF bcontrolSD}
set groupSetpoint(linacRfPhase) {L1:AUTO:PH:setPointAO L2:AUTO:PH:setPointAO L3:AUTO:PH:setPointAO \
                              L4:AUTO:PH:setPointAO L5:AUTO:PH:setPointAO}
set groupReadback(linacRfPhase) {L1:SE:DC1AIQ L2:SD:DC1AIQ L3:SE:DC1AIQ L4:SD:DC1AIQ L5:SD:DC1AIQ }

if $includeL3PowerControl {
    set groupDef(linacRfPower) { rfPowerL1 rfPowerL2 rfPowerL3 rfPowerL4 rfPowerL5 rfPowerL6 }
    set groupSetpoint(linacRfPower) {L1:KY:DC2ARF:SetpointP L2:SD:DC1ARF:SetpointP \
                                       L3:KY:DC2ARF:SetpointP L4:SD:DC1ARF:SetpointP \
                                       L5:SD:DC1ARF:SetpointP L6:KY:DC2ARF:SetpointP }
    set groupReadback(linacRfPower) {L1:KY:DC2ARF.VAL L-K2:LLRF:SD:Fwd_PkPwrRemoteM L3:KY:DC2ARF.VAL \
                                       L4:SD:DC1ARF.VAL L-K5:LLRF:SD:Fwd_PkPwrRemoteM L6:KY:DC2ARF.VAL }
} else {
    set groupDef(linacRfPower) { rfPowerL1 rfPowerL2 rfPowerL4 rfPowerL5 rfPowerL6 }
    set groupSetpoint(linacRfPower) {L1:KY:DC2ARF:SetpointP L2:SD:DC1ARF:SetpointP \
                                       L4:SD:DC1ARF:SetpointP \
                                       L5:SD:DC1ARF:SetpointP L6:KY:DC2ARF:SetpointP }
    set groupReadback(linacRfPower) {L1:KY:DC2ARF.VAL L-K2:LLRF:SD:Fwd_PkPwrRemoteM \
                                       L4:SD:DC1ARF.VAL L-K5:LLRF:SD:Fwd L6:KY:DC2ARF.VAL }
}

set allGroups {ltp ptb par bts btx btsFull srrf srrfErr srrfFreq l2 l4 l5 linac linacPCG linacBeamRfPhaseGlobal linacBeamRfPhaseIndividual linacPCGBeamRfPhaseGlobal leutl bypass linacRfPhase linacRfPower srYEmittance srEmittanceRatio booster bcontrollaw rg2PlusLinac rg1PlusLinac minMagLinac}

proc MakeLinacRfSpecialWidgets {args} {
    set parent ""
    set group linacRfPower
    APSStrictParseArguments {parent group}
                   
    global groupDef groupSetpoint groupReadback
    set realParent $parent.$group.frame.full.frame.members
    foreach member $groupDef($group) readback $groupReadback($group) \
      setpoint $groupSetpoint($group) {
        set widget $realParent.frame.$member.frame
        APSButton .transfer -parent $widget -text "Readback->setpoint" \
          -contextHelp "Averages the phase readback and transfers it to the setpoint." \
          -command \
          "set status($member) \"Updating setpoint...\"; update; APSCAAverageAndTransfer -readbackList $readback -setpointList $setpoint -average 10 -interval 1 ; set status($member) \"Setpoint updated\"; update"
    }
    set realParent $parent.$group.frame.full.frame
    APSButton .transfer -parent $realParent -text "All Readbacks->setpoints" \
      -contextHelp "Averages the phase readbacks and transfers them to the setpoints." \
      -command \
      "APSCAAverageAndTransfer -readbackList \"$groupReadback($group)\" -setpointList \"$groupSetpoint($group)\" -average 10 -interval 1 -statusCallback \"APSSetVarAndUpdate mainStatus\""
}

proc MakePTBSpecialWidgets {args} {
    set parent ""
    set group ptb
    APSStrictParseArguments {parent group}

    set widget $parent.$group.frame.full.frame.members.frame
    APSButton .adt1 -parent $widget \
      -text "BPM ADT" \
      -command "exec adt -f /home/helios/oagData/ADTFiles/ptb/ptb.bpm.pv &"
    
    APSButton .adt2 -parent $widget \
      -text "BPM Errors ADT" \
      -command "exec adt -f /home/helios/oagData/ADTFiles/ptb/ptb.bpm.error.pv &"
    
    APSButton .adt3 -parent $widget \
      -text "BPM and BPM Errors ADT" \
      -command "exec adt -f /home/helios/oagData/ADTFiles/ptb/ptb.bpm.with.error.pv &"
}

proc MakeBTSSpecialWidgets {args} {
    set parent ""
    set group bts
    APSStrictParseArguments {parent group}

    set widget $parent.$group.frame.full.frame.members.frame
    APSButton .adt1 -parent $widget \
      -text "BPM ADT" \
      -command "exec adt -f /home/helios/oagData/ADTFiles/bts/bts.bpm.positions.pv -a /home/helios/oagData/ADTFiles/bts &"
    
    APSButton .adt2 -parent $widget \
      -text "BPM Errors ADT" \
      -command "exec adt -f /home/helios/oagData/ADTFiles/bts/bts.bpm.error.pv -a /home/helios/oagData/ADTFiles/bts &"
    
    APSButton .adt3 -parent $widget \
      -text "BPM Sum ADT" \
      -command "exec adt -f /home/helios/oagData/ADTFiles/bts/bts.bpm.sum.pv -a /home/helios/oagData/ADTFiles/bts &"

    APSButton .pvhistory1 -parent $widget \
      -text "Setpoint History" \
      -command "exec PVHistoryTool -bts 1 &"
}

pack .userFrame -fill x

foreach group $controlList {
    if {[lsearch $allGroups $group]==-1} {
        APSAlertBox .alertbox -errorMessage "Can't find group $group."
        update
    } else {
        APSControlLawMakeWidgetGroup .$group -parent .userFrame -group $group
        switch $group {
            linacRfPhase -
            linacRfPower {
                MakeLinacRfSpecialWidgets -parent .userFrame -group $group
            } 
            ptb {
                MakePTBSpecialWidgets -parent .userFrame -group $group
            }
            bts {
                MakeBTSSpecialWidgets -parent .userFrame -group $group
            }
            default {
            }
        }
    }
}
if {$startLinacRfPower == "1"} {
  .userFrame.linacRfPower.frame.brief.frame.option.frame.details.button invoke
  .userFrame.linacRfPower.frame.full.frame.members.frame.rfPowerL1.frame.start.button invoke
  .userFrame.linacRfPower.frame.full.frame.members.frame.rfPowerL2.frame.start.button invoke
}

# pack forget .userFrame.status
