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

# $Log: not supported by cvs2svn $
# Revision 1.73  2011/06/30 19:19:32  shang
# removed special calibration factor for ID34 since it is the same as others now.
#
# Revision 1.72  2011/06/28 21:15:29  shang
# doubled the ID34 calibration factor because its half-length is doubled.
#
# Revision 1.71  2011/06/03 17:35:06  shang
# added displaying the datapool steering controllaw options in a pop-up window when starting controllaw.
#
# Revision 1.70  2010/04/08 14:47:41  shang
# added error message returned from APSCheckAndUpdateLocalSteeringConfigs to alert box to help debugging.
#
# Revision 1.69  2010/02/16 20:58:27  shang
# added checking BPLD limits to "Apply" setpoint button
#
# Revision 1.68  2009/10/14 05:20:27  lemery
# Changed default interval to 1.5 (until S24A:H3 is fixed).
#
# Revision 1.67  2009/10/13 23:13:28  lemery
# Changed the steering limit of correctors to be consistent with
# corrector limits in global orbit correction.
#
# Revision 1.66  2006/08/08 23:49:50  emery
# Changed the APPLY/START button to just a START button. (Shang.)
#
# Revision 1.65  2006/08/02 00:59:39  emery
# Shang's changes: use -infiniteLoop argument to sddscontrollaw.
#
# Revision 1.64  2006/02/07 21:06:24  shang
# fixed bug [lsearch $gainList "?"] which should be [lsearch $gainList "\\?"] instead.
#
# Revision 1.63  2005/10/24 20:48:14  shang
# added TEST button to sector dialogs.
#
# Revision 1.62  2005/10/12 05:42:25  emery
# Added timeDebug commandline argument so that the time stamps
# added in the previous two versions appear under this debug mode.
# Removed bell from status call.
# Fixed medm commands for displaying steering runcontrol PVs.
#
# Revision 1.61  2005/10/11 23:22:41  emery
# Moved logMessage after checking correctors.
#
# Revision 1.60  2005/10/11 22:58:56  emery
# Added more time stamped messages.
# Increased condition number threshold from 1e3 to 2e3.
# Added newline at end.
#
# Revision 1.59  2005/10/11 22:31:40  emery
# Added time stamps to all statuCallback arguments.
#
# Revision 1.58  2005/09/30 21:45:04  shang
# added automatically updating controllaw files when sector button is clicked.
#
# Revision 1.57  2005/08/22 14:44:35  shang
# fixed a bug in previous where the controllawDir variable was missing for checking controllaw files.
#
# Revision 1.56  2005/08/22 14:34:09  shang
# added checking if controllaw directory and controllaw files exits
#
# Revision 1.55  2005/05/31 14:11:53  shang
# added CompareSetpointsWithBPLDLimit proc to check if the steering will trip BPLD system.
#
# Revision 1.54  2004/09/28 17:57:07  emery
# Moved the evaluation of IDSectorList before the creation
# of widgets.
#
# Revision 1.53  2004/09/24 17:08:44  emery
# Removed special case for sector 11 for forcing a P0 steering.  Wrapped
# the code for checking for "in use" ID xray bpms (most recent change in
# cvs) inside of an if statement checking that the sector in question is
# expected to have ID xray bpms. Otherwise the cavget command for a
# non-light source sector, say, sector 39, would timeout on S39ID xray
# bpms, and give a CA error.
#
# Revision 1.52  2004/07/26 21:18:23  shang
# added a reminder if X-ray BPMs in the chosen sector are in used for orbit
# correction
#
# Revision 1.51  2002/10/09 20:46:48  emery
# Removed extraneous return command between a tranfer and the
# sddscontrollaw in StartControllaw
#
# Revision 1.50  2002/10/09 10:19:19  emery
# Added status messages for bpms setpoint changes.
#
# Revision 1.49  2002/10/09 06:51:40  shang
# replaced APSTransferVectorAdjust by APSRefreshVectorAdjust which takes shorter time
#
# Revision 1.48  2002/10/07 17:03:43  soliday
# Restored the auto_path to the correct value.
#
# Revision 1.47  2002/10/06 21:13:31  emery
# Added status message before the call to APSTransferVectorAdjust
# is made.
#
# Revision 1.46  2002/10/06 05:53:53  emery
# Simplified the coding of the cavput in ApplySetpoint.
# Replaced the string values PSCU and Diag with
# Maintenance and Operation.
#
# Revision 1.45  2002/09/04 21:47:41  shang
# added running in IOC by using datapool bpms feature
#
# Revision 1.44  2002/02/27 23:54:39  emery
# Added controlQuantityDefinition option to sddscontrollaw to that the
# appropriate definition file will be selected based on the
# setpoint sources (Diag or PSCU) of correctors.
#
# Revision 1.43  2002/02/26 21:07:18  emery
# Changed default steering interval to 0.5 sec since we are now
# using speedy corrector PVs.
#
# Revision 1.42  2001/05/24 17:04:12  emery
# Changed R12, R34 for special case of sector 34 where
# P0 bpms are 2.5 m apart.
#
# Revision 1.41  1999/04/29 15:22:09  emery
# Now that the P0 and P1 PVs are attached to the respective buttons,
# the assignment of the light source coordinate coefficients is simplified.
#
# Revision 1.40  1999/02/15 16:24:01  emery
# Made variable errorCode global.
#
# Revision 1.39  1999/02/05 22:28:16  emery
# Updated the section where different matrix elements
# are assigned to ID because of using new bpms.
#
# Revision 1.38  1999/01/28 08:51:24  emery
# Removed another extraneous puts statement.
#
# Revision 1.37  1999/01/28 08:50:33  emery
# Removed extraneous puts stderr statement.
#
# Revision 1.36  1999/01/28 08:49:43  emery
# Fixed mix-up with what 0 and 1 values for P0Sector means.
#
# Revision 1.35  1999/01/28 08:22:37  emery
# Used local steering directory links to determine
# which BPMS are used for steering.
#
# Revision 1.34  1999/01/20 15:25:07  borland
# Added -fastClick 1 option to the In/Out/Up/Down buttons on the steering
# dialog.
#
# Revision 1.33  1998/10/18 20:58:01  borland
# Added P0 support.  Uses new data directory.
#
# Revision 1.32  1998/05/21 20:55:21  emery
# Changed data file for light source point bpm
# used in DoTransfer procedure.
#
# Revision 1.31  1997/08/21 04:54:25  emery
# Made variable includeSourcePoints a command line argument.
#
# Revision 1.30  1997/07/24 23:09:36  emery
# By default only the light sources will have the sector button
# enabled. The command line option allowAllSectors
# may be used to allow steering in all sectors.
#
# Revision 1.29  1997/04/25 19:38:45  emery
# Added -lineLimit 1024 to APSExecLog
#
# Revision 1.28  1997/04/21 18:25:53  emery
# Changed button label START to APPLY/START
#
# Revision 1.27  1997/03/26 17:00:38  emery
# Added more context help messages.
#
# Revision 1.26  1997/03/21 22:31:36  emery
# Added accumulator output boxes for the x and y
# steering.
#
# Revision 1.25  1997/03/03 15:39:07  emery
# Added continuation char. at end of -unixCommand option
#
# Revision 1.24  1997/03/03 15:27:08  emery
# Added name to sddscontrollaw exec log.
#
# Revision 1.23  1997/03/01 22:28:38  borland
# Removed previous changes.  Now start controllaw "locally" as before in
# an APSExecLog window.  Sets averaging for BPMs being controlled.  Uses
# new directory and names for matrix and test files.
#
# Revision 1.21  1996/12/13 18:17:29  borland
# Added option to not transfer source point orbit to setpoints.
#
# Revision 1.20  1996/10/08 08:05:48  emery
# Changed the labeling of the DECR INCR buttons to
# read UP DOWN IN OUT for x xp y yp adjustments.
# Adjusted borderwith of LabeledOutputFrame boxes and the
# spacing of the UP DOWN IN OUT buttons to match the
# spacing of the individual labeled entry.
# Replaced $var=="" type statements with ![string length $var]
# statements.
#
# Revision 1.19  1996/10/08 01:07:35  borland
# Added -allowTransfer and -adjustOnly options for control of what the user
# is allowed to do.
#
# Revision 1.18  1996/10/07 15:44:13  borland
# Added widgets to allow transferring all setpoints for x, y, or both.
#
# Revision 1.17  1996/09/28 05:32:10  emery
# Use mswAve bpm PVs for displaying the AdjustedCC
# and ErrorCC PV in the dialog box.
# Use matrices that use msAVe PVs for the bpms. The matrix
# directory is /home/helios/oagData/controllaw/ID/P1HV2.
# The ioc averaging is enabled for the bpms in the local correection.
# Use caputs to suspend the SR orbit controllaw.
#
# Revision 1.16  1996/09/28 01:21:08  emery
# Restored input variables interval and gain in the Options widget.
#
# Revision 1.15  1996/09/28 00:40:36  emery
# Added logMessage commands to log the instances of
# starting sddscontrollaw of the various ID sections.
# Force the SR orbit correction runcontrol PVs in suspend
# mode, therefore some of the testing of the SR orbit
# runcontrol has been removed in this version.
#
# Revision 1.14  1996/09/18 20:26:23  borland
# Removed disabling of start buttons.  Replaced with test of whether
# orbit controllaw is running.
#
# Revision 1.13  1996/09/18 20:09:41  borland
# Added APSDisableButton for Start button, to prevent use of screen for
# anything other than changing steering setpoints.
#
# Revision 1.12  1996/09/12 18:35:38  emery
# Changed controllaw data directories to
# /home/helios/oagData/controllaw/ID/P1 for P1 steering and
# /home/helios/oagData/controllaw/ID/P2 for P2 steering and
#
# Revision 1.11  1996/09/12 06:05:48  emery
# Removed the "ID" part of the button labels to make the main
# window narrower, and to make a more consitent labeling
# across SR BPM tcl interfaces.
#
# Revision 1.10  1996/08/19 06:21:49  emery
# Simplified interface so that the function of the MORE button
# (i.e. releaving AdjustedCC and ErrorCC values) is always
# in effect. ALso, the delta x x' y y' steering dialog is
# now a permanent part of the ID dialog box.
#
# Revision 1.9  1996/08/03 05:21:36  emery
# Added the three dots in a button text to indicate a new window.
#
# Revision 1.8  1996/07/02  11:24:18  emery
# Added x x' y y' increment dialog box for changing
# setpoint variables. One still has to press Apply button
# to send the values to EPICS.
#
# Revision 1.7  1996/07/02  08:09:52  emery
# Corrected the -deltaLimit syntax
#
# Revision 1.6  1996/07/02  05:24:35  emery
# Added a -deltalimit=2 option value for sddscontrollaw
#
# Revision 1.5  1996/05/08  06:52:08  emery
# Added buttons MORE LESS and TRANSFER to the dialog boxes.
# Added offset, adjusted, and error values of the bpms.
# These values appear after pressing the MORE button.
#
# Revision 1.4  1996/05/06  19:16:36  borland
# Set tcl_precision to 6 to avoid ridiculously long displays of setpoint
# values.
#
# Revision 1.3  1996/05/05  08:29:41  emery
# Added a callback to the APSExecLog of the sddscontrnollaw so that
# the user will be notified when the sddscontrollaw is completed.
#
# Revision 1.2  1996/05/05  05:09:34  emery
# commented out a personal auto_path command
#
# Revision 1.1  1996/05/04  13:48:42  emery
# First commit of SRIDSteering, an interface for steering the SR beam
# in any ID section.
#

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 auto_path [linsert $auto_path 0 /home/oxygen/SHANG/oag/apps/src/mplib/sr]
APSDebugPath

set args $argv
set allowAllSectors 0
set timeDebug 0
set ignoreLock 0
APSStrictParseArguments {allowAllSectors ignoreLock}
set CVSRevisionAuthor "\$Revision: 1.74 $ \$Author: shang $"

#if [regexp {.0} $env(DISPLAY)] {
#    set otherDisplay :0.1
#} else {
    set otherDisplay :0.0
#}

APSApplication . -name SRIDSteering.new \
  -overview "SRIDSteering provides convenience controls for ID steering."

set tcl_precision 6

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

proc SetIDSteeringStatus {text} {
    global IDSteeringStatus
    set IDSteeringStatus "[clock format [clock seconds] -format %H:%M:%S]: $text"
    update
#    bell
}

proc MakeSectorsWidget {widget args} {
    global sector allowAllSectors IDSectorList otherDisplay

    set parent ""
    APSParseArguments {parent}

    set w $parent$widget
    APSFrame $widget -parent $parent \
      -label "Storage Ring ID selection for steering." \
      -contextHelp {ID selection frame} 

    if !$allowAllSectors {
        set sectorList $IDSectorList 
    }
    
    for {set quad 1} {$quad<5} {incr quad} {
        set start [expr ($quad-1)*10+1]
        set end   [expr $start+9]
        set buttonList {}
        set valueList {}
        APSFrame .sector$quad -parent $w.frame 
        $w.frame.sector$quad.frame configure -relief flat
        for {set sector $start} {$sector<=$end} {incr sector} {
            set cbLabel $sector
            if {$sector<10} {set cbLabel "0$sector"}
            APSButton .sector$sector -parent $w.frame.sector$quad.frame \
              -text "$cbLabel" \
              -command "IDSteeringDialog -sector $sector" \
              -contextHelp "Brings up dialog box for ID$cbLabel steering."
            if !$allowAllSectors {
                if [expr -1 == [lsearch $sectorList $sector]] {
                    APSDisableButton $w.frame.sector$quad.frame.sector$sector.button
                }
            }
        }
    }
    APSFrame .adt -parent $parent
    APSButton .adt -parent $parent.adt.frame -text "SR BPM AdjustedCC ADT (difference mode)" -command "exec adt  -geometry +30+0 -f /home/helios/OAG/oagData/ADTFiles/srBpm/sr.bpm.adjusted.pv -z 3 -d &"
}


proc IDSteeringDialog {args} {
    global P0Sector IDSectorList timeDebug otherDisplay

    set sector ""
    APSParseArguments {sector}
    if ![string length $sector] {
        APSAlertBox [APSUniqueName .] -errorMessage \
          "No sector variable specified in IDSteeringDialog"
        return 1
    }
    if {0} {
        #6/2/2021 this warning message was removed because ID29 is approved by Louis Emery
    if {$sector==29} {
        set answer [APSMultipleChoice .alert29 -width 100 -type warning -question "*** There shall be no steering of ID29 requested by the users. ***\n\nIf this steering is requested by users during a run, it has to be approved by Aimin Xiao, Louis Emery or Karen Schroeder;\n Otherwise, exit this steering, press \"exit\" button.\n\nSteering by machine studies who understand the large vertical beam size of the IEX photon beam in relation to the vertical aperture limits is allowed, press \"continue\" button to steer ID29." -labelList {exit continue} -returnList {exit continue} -name "Warning steering IEX"]
        switch $answer {
            exit {
                return
            }
            continue {
            }
        }
    }
    }
    if [catch {APSCheckAndUpdateLocalSteeringConfigs -steeringType ID -sector $sector -statusCallback SetIDSteeringStatus} result] {
        SetIDSteeringStatus "$result"
        APSAlertBox [APSUniqueName .] -errorMessage "Error in updating local steering configs for sector $sector: $result"
        return 1
    }

    if {-1<[lsearch $IDSectorList $sector]} {
        SetIDSteeringStatus "Check and remove sector $sector xbpms if they are in orbit correction..."
        # Here source is expected to be only the BM and ID, no CU side specified.
        if [catch {APSSRRemoveXrayBPMFromOrbitCorrection -sector $sector  -restart 1 -source ID} result] {
            SetIDSteeringStatus "Error in removing sector $sector xray bpms from orbit correction: $result"
            return
        }
        SetIDSteeringStatus "$result"
    }

    global waveformFile
    if $P0Sector($sector) {
        set digit 0
        set waveformFile($sector) p0BpmInfo.sdds
    } else {
        set digit 1
        set waveformFile($sector) rfBpmInfo.sdds
    }

    global BPx BPy APx APy BPx0 BPy0 APx0 APy0 
    global statusCallback adjustOnly allowTransfer errorCode

    set dialogFrame .dialogID$sector.userFrame
    APSDialogBox .dialogID$sector  \
      -name "ID$sector Dialog" \
      -contextHelp "Dialog box for steering in ID$sector."

    set Sn $sector
    set Sn1 [exec rpnl "$Sn 1 + 40 > pop ? 40 - : \$"]
    if {[pv linkw \
           [list BPx($sector) BPy($sector) APx($sector) APy($sector)] \
           [list S${Sn}B:P${digit}:ms:x:SetpointAO S${Sn}B:P${digit}:ms:y:SetpointAO \
              S${Sn1}A:P${digit}:ms:x:SetpointAO S${Sn1}A:P${digit}:ms:y:SetpointAO ]] != 0} {
        APSAlertBox .alert -errorMessage "linkw error $errorCode"
        exit
    }
    if {[pv umon BPx($sector)] != 0} {
        APSAlertBox .alert -errorMessage "umon error $errorCode"
        exit
    }
    if {[pv umon BPy($sector)] != 0} {
        APSAlertBox .alert -errorMessage "umon error $errorCode"
        exit
    }
    if {[pv umon APx($sector)] != 0} {
        APSAlertBox .alert -errorMessage "umon error $errorCode"
        exit
    }
    if {[pv umon APy($sector)] != 0} {
        APSAlertBox .alert -errorMessage "umon error $errorCode"
        exit
    }
    
    set BPx0($sector) $BPx($sector)
    set BPy0($sector) $BPy($sector)
    set APx0($sector) $APx($sector)
    set APy0($sector) $APy($sector)
    set border 2
    APSFrame .parameters -parent $dialogFrame -packOption "-side left"
    $dialogFrame.parameters.frame configure -relief flat
    APSFrame .setpoints -parent $dialogFrame.parameters.frame -packOption "-side left" \
      -label "Setpoints for bpms"  -width 10 \
      -contextHelp "Enter setpoints for the four bpm readbacks of ID$sector"
    $dialogFrame.parameters.frame.setpoints.frame configure -relief flat
    APSLabeledOutput .bp1x \
      -parent $dialogFrame.parameters.frame.setpoints.frame \
      -label "S${Sn}B:P${digit}:x (mm)"  -width 10 \
      -textVariable BPx($sector) \
      -contextHelp "Enter value for S${Sn}B:P${digit}:ms:x:SetpointAO to be applied. These values change when one of the associated coordinate delta button is pressed."
    $dialogFrame.parameters.frame.setpoints.frame.bp1x.entry  configure -borderwidth $border
    APSLabeledOutput .bpy \
      -parent $dialogFrame.parameters.frame.setpoints.frame \
      -label "S${Sn}B:P${digit}:y (mm)"  -width 10 \
      -textVariable BPy($sector) \
      -contextHelp "Enter value for S${Sn}B:P${digit}:ms:y:SetpointAO to be applied. These values change when one of the associated coordinate delta button is pressed."
    $dialogFrame.parameters.frame.setpoints.frame.bpy.entry  configure -borderwidth $border
    APSLabeledOutput .apx \
      -parent $dialogFrame.parameters.frame.setpoints.frame \
      -label "S${Sn1}A:P${digit}:x (mm)"  -width 10 \
      -textVariable APx($sector) \
      -contextHelp "Enter value for S${Sn1}A:P${digit}:ms:x:SetpointAO to be applied. These values change when one of the associated coordinate delta button is pressed."
    $dialogFrame.parameters.frame.setpoints.frame.apx.entry  configure -borderwidth $border
    APSLabeledOutput .apy \
      -parent $dialogFrame.parameters.frame.setpoints.frame \
      -label "S${Sn1}A:P${digit}:y (mm)"  -width 10 \
      -textVariable APy($sector) \
      -contextHelp "Enter value for S${Sn1}A:P${digit}:ms:y:SetpointAO to be applied. These values change when one of the associated coordinate delta button is pressed."
     $dialogFrame.parameters.frame.setpoints.frame.apy.entry  configure -borderwidth $border
    
    global stepSizeLimit stepInterval
    set stepInterval 1
    APSLabeledEntry .limit -parent .dialogID$sector -label "Corrector change limit (A):" -textVariable stepSizeLimit -width 50
    APSLabeledEntry .interval -parent .dialogID$sector -label "Corrector change interval(seconds):" -textVariable stepInterval -width 50
   
     APSButton .adt -parent .dialogID$sector.buttonRow -text "SR BPM AdjustedCC ADT (difference mode)" -command "exec adt -geometry +30+0 -f /home/helios/OAG/oagData/ADTFiles/srBpm/sr.bpm.adjusted.pv -s $sector -z 3 -d &"
    
    APSButton .review -parent .dialogID$sector.buttonRow -text "Review Pending Setpoint Changes"  -command "ApplySetpoints -sector $sector -review 1  -statusCallback SetIDSteeringStatus" -contextHelp  "review above setpoint value changes to setpoint PVs of ID$sector bpms." 
    
    APSButton .apply -parent .dialogID$sector.buttonRow -text "APPLY Delta Steering"  -command "ApplySetpoints -sector $sector -statusCallback SetIDSteeringStatus" -contextHelp  "Applies above setpoint values to setpoint PVs of ID$sector bpms."
   
    if {[pv linkw \
           [list BPxOffset($sector) BPyOffset($sector) APxOffset($sector) APyOffset($sector)] \
           [list S${Sn}B:P${digit}:ms:x:OffsetAO S${Sn}B:P${digit}:ms:y:OffsetAO \
              S${Sn1}A:P${digit}:ms:x:OffsetAO S${Sn1}A:P${digit}:ms:y:OffsetAO ]] != 0} {
        APSAlertBox .alert -errorMessage "$errorCode"
        exit
    }
    if {[pv linkw \
           [list BPxAdjusted($sector) BPyAdjusted($sector) APxAdjusted($sector) APyAdjusted($sector)] \
           [list S${Sn}B:P${digit}:mswAve:x:AdjustedCC S${Sn}B:P${digit}:mswAve:y:AdjustedCC \
              S${Sn1}A:P${digit}:mswAve:x:AdjustedCC S${Sn1}A:P${digit}:mswAve:y:AdjustedCC ]] != 0} {
        APSAlertBox .alert -errorMessage "$errorCode"
        exit
    }
    if {[pv linkw \
           [list BPxError($sector) BPyError($sector) APxError($sector) APyError($sector)] \
           [list S${Sn}B:P${digit}:mswAve:x:ErrorCC S${Sn}B:P${digit}:mswAve:y:ErrorCC \
              S${Sn1}A:P${digit}:mswAve:x:ErrorCC S${Sn1}A:P${digit}:mswAve:y:ErrorCC ]] != 0} {
        APSAlertBox .alert -errorMessage "$errorCode"
        exit
    }
    
        
    if {[pv umon BPxOffset($sector)] != 0} {
        APSAlertBox .alert -errorMessage "$errorCode"
        exit
    }
    if {[pv umon BPyOffset($sector)] != 0} {
        APSAlertBox .alert -errorMessage "$errorCode"
        exit
    }
    if {[pv umon APxOffset($sector)] != 0} {
        APSAlertBox .alert -errorMessage "$errorCode"
        exit
    }
    if {[pv umon APyOffset($sector)] != 0} {
        APSAlertBox .alert -errorMessage "$errorCode"
        exit
    }

    if {[pv umon BPxAdjusted($sector)] != 0} {
        APSAlertBox .alert -errorMessage "$errorCode"
        exit
    }
    if {[pv umon BPyAdjusted($sector)] != 0} {
        APSAlertBox .alert -errorMessage "$errorCode"
        exit
    }
    if {[pv umon APxAdjusted($sector)] != 0} {
        APSAlertBox .alert -errorMessage "$errorCode"
        exit
    }
    if {[pv umon APyAdjusted($sector)] != 0} {
        APSAlertBox .alert -errorMessage "$errorCode"
        exit
    }

    if {[pv umon BPxError($sector)] != 0} {
        APSAlertBox .alert -errorMessage "$errorCode"
        exit
    }
    if {[pv umon BPyError($sector)] != 0} {
        APSAlertBox .alert -errorMessage "$errorCode"
        exit
    }
    if {[pv umon APxError($sector)] != 0} {
        APSAlertBox .alert -errorMessage "$errorCode"
        exit
    }
    if {[pv umon APyError($sector)] != 0} {
        APSAlertBox .alert -errorMessage "$errorCode"
        exit
    }

    APSFrame .moreParameters -parent $dialogFrame -packOption "-side left"
    $dialogFrame.moreParameters.frame configure -relief flat
    APSLabeledOutputFrame .offset -parent $dialogFrame.moreParameters.frame \
      -label Offsets -packOption "-side left" \
      -variableList "BPxOffset($sector) BPyOffset($sector) APxOffset($sector) APyOffset($sector)"\
      -orientation vertical -width 10 \
      -contextHelp "Electrical offset of ID$sector bpms."
    $dialogFrame.moreParameters.frame.offset.frame configure -relief flat

    APSLabeledOutputFrame .adjusted -parent $dialogFrame.moreParameters.frame \
      -label "Adjusted" -packOption "-side left" \
      -variableList "BPxAdjusted($sector) BPyAdjusted($sector) APxAdjusted($sector) APyAdjusted($sector)"\
      -orientation vertical -width 10 \
      -contextHelp "Adjusted readbacks of ID$sector bpms: raw readback - offsets."
    $dialogFrame.moreParameters.frame.adjusted.frame configure -relief flat

    APSLabeledOutputFrame .error -parent $dialogFrame.moreParameters.frame \
      -label "Error" -packOption "-side left" \
      -variableList "BPxError($sector) BPyError($sector) APxError($sector) APyError($sector)"\
      -orientation vertical -width 10 \
      -contextHelp "Error readbacks of ID$sector bpms: adjusted readback - setpoint."
    $dialogFrame.moreParameters.frame.error.frame configure -relief flat

    set border 3
    foreach outputFrame {offset adjusted error} {
        foreach entry {1 2 3 4} {
            $dialogFrame.moreParameters.frame.${outputFrame}.frame.entry${entry} \
              configure -borderwidth $border
        }
    }

    AdjustSetpoints -sector $sector -parent $dialogFrame
    APSEnableButton .dialogID$sector.buttonRow.ok.button
    
    update
    if {$statusCallback!="" && $timeDebug} {
        $statusCallback "[clock format [clock seconds] -format %H:%M:%S]: Enabling averaging for S${Sn}B:P${digit} and S${Sn1}A:P${digit}."
    }
    
    if [catch {exec cavput -list=S${Sn}B:P${digit},S${Sn1}A:P${digit} \
                  -list=:msAve:AveEnbBO=Enable \
                  -pendIoTime=10 \
              } result ] {
        APSAlertBox .alert -errorMessage "$result\nSomething wrong with a cavput command. Averaging may not be enabled."
        return
    }
    
    if [catch {APSSaveMachine -machine SROrbitSetPt -description "Save before sector $sector ID steering." } result] {
        return -code error "Error doing SR bpm setpoint save: $result"
    }
    if [catch {APSSaveMachine -machine SRCorSetpts -description "Save before sector $sector ID steering." } result] {
        return -code error "Error doing SR corrector setpoint save: $result"
    }
}

proc AdjustSetpoints {args} {
    global deltax deltaxp deltay deltayp P0Sector
    global deltaxAcc deltaxpAcc deltayAcc deltaypAcc

    set sector ""
    set parent ""
    APSParseArguments {sector parent}
    if ![string length $sector] {
        APSAlertBox [APSUniqueName .] -errorMessage \
          "No sector variable specified in AdjustSetpoints"
        return 1
    }
    if $P0Sector($sector) {
        set digit 0
    } else {
        set digit 1
    }
    global BPx BPy APx APy
    set adjustFrame $parent.adjust.frame
    APSFrame .adjust -parent $parent
    $adjustFrame configure -relief flat

   # accumulators for steering changes.
    set deltaxAcc($sector) 0
    set deltaxpAcc($sector) 0
    set deltayAcc($sector) 0
    set deltaypAcc($sector) 0

    set Sn $sector
    set Sn1 [exec rpnl "$Sn 1 + 40 > pop ? 40 - : \$"]

    APSFrame .parameters -parent $adjustFrame -packOption "-side left"
   # $adjustFrame.parameters.frame configure -relief flat 

   

    APSFrame .deltas -parent $adjustFrame.parameters.frame -packOption "-side left" \
      -label "BUTTON    SCALES"  -width 20\
      -contextHelp "Enter deltas for the x, x', y, y' coordinates  in ID$sector"
    $adjustFrame.parameters.frame.deltas.frame configure -relief flat
    if ![info exists deltax($sector)] {
        set deltax($sector) 0
    }
    if ![info exists deltaxp($sector)] {
        set deltaxp($sector) 0
    }
    if ![info exists deltay($sector)] {
        set deltay($sector) 0
    }
    if ![info exists deltayp($sector)] {
        set deltayp($sector) 0
    }
    APSLabeledEntry .bpx \
      -parent $adjustFrame.parameters.frame.deltas.frame \
      -label "delta x (um)"  -width 10\
      -textVariable deltax($sector) \
      -contextHelp "Enter value for delta x"
    APSLabeledEntry .bpy \
      -parent $adjustFrame.parameters.frame.deltas.frame \
      -label "delta xp (urad)"  -width 10\
      -textVariable deltaxp($sector) \
      -contextHelp "Enter value for delta xp"
    APSLabeledEntry .apx \
      -parent $adjustFrame.parameters.frame.deltas.frame \
      -label "delta y (um)"  -width 10\
      -textVariable deltay($sector) \
      -contextHelp "Enter value for delta y"
    APSLabeledEntry .apy \
      -parent $adjustFrame.parameters.frame.deltas.frame \
      -label "delta yp (urad)"  -width 10\
      -textVariable deltayp($sector) \
      -contextHelp "Enter value for delta yp"

   
    APSFrame .incrButtons -parent $adjustFrame.parameters.frame -packOption "-side left" \
      -label " "  -width 10\
      -contextHelp "Causes setpoints to increment by the corresponding coordinate"
    $adjustFrame.parameters.frame.incrButtons.frame configure -relief flat

    APSFrame .decrButtons -parent $adjustFrame.parameters.frame -packOption "-side left" \
      -label " "  -width 10\
      -contextHelp "Causes setpoints to decrement by the corresponding coordinate"
    $adjustFrame.parameters.frame.decrButtons.frame configure -relief flat

   
    APSButton .incrx -parent $adjustFrame.parameters.frame.incrButtons.frame  \
        -packOption "-side top" -text OUT -command "IncrX -sector $Sn" \
        -contextHelp  "Changes x setpoints using delta x." -fastClick 1
    APSButton .incrxp -parent $adjustFrame.parameters.frame.incrButtons.frame  \
        -packOption "-side top" -text OUT -command "IncrXp -sector $Sn" \
        -contextHelp  "Changes x setpoints using delta xp." -fastClick 1
   
    APSButton .incry -parent $adjustFrame.parameters.frame.incrButtons.frame  \
        -packOption "-side top" -text UP -command "IncrY -sector $Sn" \
        -contextHelp  "Changes y setpoints using delta y." -fastClick 1
    APSButton .incryp -parent $adjustFrame.parameters.frame.incrButtons.frame  \
        -packOption "-side top" -text UP -command "IncrYp -sector $Sn" \
        -contextHelp  "Changes y setpoints using delta yp." -fastClick 1
   
    APSButton .decrx -parent $adjustFrame.parameters.frame.decrButtons.frame  \
        -packOption "-side top" -text IN -command "IncrX -sector $Sn -sign -1" \
        -contextHelp  "Changes x setpoints using delta x." -fastClick 1
    APSButton .decrxp -parent $adjustFrame.parameters.frame.decrButtons.frame  \
        -packOption "-side top" -text IN -command "IncrXp -sector $Sn -sign -1" \
        -contextHelp  "Changes x setpoints using delta xp." -fastClick 1
   
    APSButton .decry -parent $adjustFrame.parameters.frame.decrButtons.frame  \
        -packOption "-side top" -text DOWN -command "IncrY -sector $Sn -sign -1" \
        -contextHelp  "Changes y setpoints using delta y." -fastClick 1
    APSButton .decryp -parent $adjustFrame.parameters.frame.decrButtons.frame  \
        -packOption "-side top" -text DOWN -command "IncrYp -sector $Sn -sign -1" \
        -contextHelp  "Changes y setpoints using delta yp." -fastClick 1

    
    global steeringX steeringXp steeringY steeringYp
    set steeringX($sector) 0
    set steeringXp($sector) 0
    set steeringY($sector) 0
    set steeringYp($sector) 0
    
    APSLabeledOutputFrame .steering \
      -parent $adjustFrame.parameters.frame \
      -label "Pending Steering" -packOption "-side left" \
      -variableList "steeringX($sector) steeringXp($sector) steeringY($sector) steeringYp($sector)" \
      -orientation vertical -width 10 \
      -contextHelp "pending steering delta, will return to zero after apply button is clicked."
    $adjustFrame.parameters.frame.steering.frame configure -relief flat
    set border 3
    foreach entry {1 2 3 4} {
        $adjustFrame.parameters.frame.steering.frame.entry${entry} \
          configure -borderwidth $border
    }
    
    APSLabeledOutputFrame .accumulation \
      -parent $adjustFrame.parameters.frame \
      -label "Accumulators" -packOption "-side left" \
      -variableList "deltaxAcc($sector) deltaxpAcc($sector) deltayAcc($sector) deltaypAcc($sector)" \
      -orientation vertical -width 10 \
      -contextHelp "Accumulated coordinate deltas. Values return to zero when dialog box is closed and reopened."
    $adjustFrame.parameters.frame.accumulation.frame configure -relief flat
    set border 3
    foreach entry {1 2 3 4} {
        $adjustFrame.parameters.frame.accumulation.frame.entry${entry} \
          configure -borderwidth $border
    }
    set padding 2
    set width 4
    $adjustFrame.parameters.frame.incrButtons.frame.incrx.button configure -width $width -pady $padding
    $adjustFrame.parameters.frame.incrButtons.frame.incrxp.button configure -width $width -pady $padding
    $adjustFrame.parameters.frame.incrButtons.frame.incry.button configure -width $width -pady $padding
    $adjustFrame.parameters.frame.incrButtons.frame.incryp.button configure -width $width -pady $padding
    $adjustFrame.parameters.frame.decrButtons.frame.decrx.button configure -width $width -pady $padding
    $adjustFrame.parameters.frame.decrButtons.frame.decrxp.button configure -width $width -pady $padding
    $adjustFrame.parameters.frame.decrButtons.frame.decry.button configure -width $width -pady $padding
    $adjustFrame.parameters.frame.decrButtons.frame.decryp.button configure -width $width -pady $padding


    
    return 0
}

proc IncrX {args} {
    global deltax deltaxp deltay deltayp R11
    global deltaxAcc deltaxpAcc deltayAcc deltaypAcc P0Sector steeringX steeringXp steeringY steeringYp
    set sector ""
    set sign 1
    APSParseArguments {sector sign}
    if ![string length $sector] {
        APSAlertBox [APSUniqueName .] -errorMessage \
          "No sector variable specified in IDSteeringDialog"
        return 1
    }
    if $P0Sector($sector) {
        set digit 0
    } else {
        set digit 1
    }
    global BPx BPy APx APy 
    set deltax($sector) [scan $deltax($sector) %ld]
    set deltaxAcc($sector) [expr $deltaxAcc($sector) + $sign * $deltax($sector)]
    set steeringX($sector) [expr $steeringX($sector) + $sign * $deltax($sector)]
    
   # set BPx($sector) [expr $BPx($sector) + $sign * $R11($sector) * $deltax($sector)]
   # set APx($sector) [expr $APx($sector) + $sign * $R11($sector) *$deltax($sector)]
    return 0
}

proc IncrXp {args} {
    global deltax deltaxp deltay deltayp R12
    global deltaxAcc deltaxpAcc deltayAcc deltaypAcc P0Sector steeringX steeringXp steeringY steeringYp
    set sector ""
    set sign 1
    APSParseArguments {sector sign}
    if ![string length $sector] {
        APSAlertBox [APSUniqueName .] -errorMessage \
          "No sector variable specified in IDSteeringDialog"
        return 1
    }
    if $P0Sector($sector) {
        set digit 0
    } else {
        set digit 1
    }
    global BPx BPy APx APy
    set deltaxp($sector) [scan $deltaxp($sector) %ld]
    set deltaxpAcc($sector) [expr $deltaxpAcc($sector) + $sign * $deltaxp($sector)]
    set steeringXp($sector) [expr $steeringXp($sector) + $sign * $deltaxp($sector)]

   # set BPx($sector) [expr $BPx($sector) - $sign * $R12($sector) * $deltaxp($sector)]
   # set APx($sector) [expr $APx($sector) + $sign * $R12($sector) * $deltaxp($sector)]
    return 0
}

proc IncrY {args} {
    global deltax deltaxp deltay deltayp R33
    global deltaxAcc deltaxpAcc deltayAcc deltaypAcc P0Sector steeringX steeringXp steeringY steeringYp
    set sector ""
    set sign 1
    APSParseArguments {sector sign}
    if ![string length $sector] {
        APSAlertBox [APSUniqueName .] -errorMessage \
          "No sector variable specified in IDSteeringDialog"
        return 1
    }
    if $P0Sector($sector) {
        set digit 0
    } else {
        set digit 1
    }
    global BPx BPy APx APy
    set deltay($sector) [scan $deltay($sector) %ld]
    set deltayAcc($sector) [expr $deltayAcc($sector) + $sign * $deltay($sector)]
    set steeringY($sector) [expr $steeringY($sector) + $sign * $deltay($sector)]
  #  set BPy($sector) [expr $BPy($sector) + $sign * $R33($sector) * $deltay($sector)]
  #  set APy($sector) [expr $APy($sector) + $sign * $R33($sector) * $deltay($sector)]
    return 0
}
proc IncrYp {args} {
    global deltax deltaxp deltay deltayp R34
    global deltaxAcc deltaxpAcc deltayAcc deltaypAcc P0Sector steeringX steeringXp steeringY steeringYp

    set sector ""
    set sign 1
    APSParseArguments {sector sign}
    if ![string length $sector] {
        APSAlertBox [APSUniqueName .] -errorMessage \
          "No sector variable specified in IDSteeringDialog"
        return 1
    }
    if $P0Sector($sector) {
        set digit 0
    } else {
        set digit 1
    }
    global BPx BPy APx APy
    set deltayp($sector) [scan $deltayp($sector) %ld]
    set deltaypAcc($sector) [expr $deltaypAcc($sector) + $sign * $deltayp($sector)]
    set steeringYp($sector) [expr $steeringYp($sector) + $sign * $deltayp($sector)]
    
  #  set BPy($sector) [expr $BPy($sector) - $sign * $R34($sector) * $deltayp($sector)]
  #  set APy($sector) [expr $APy($sector) + $sign * $R34($sector) * $deltayp($sector)]
    return 0
}

set stepSizeLimit 1
proc ApplySetpoints {args} {
    set review 0
    APSParseArguments {review}
    global timeLimit tolerance statusCallback timeDebug P0Sector FFWaveformFile stepSizeLimit corrRangeFile stepInterval
    global hbpmList vbpmList hcorrList vcorrList hSetpoint0 vSetpoint0 corrNameFile
    global steeringX steeringXp steeringY steeringYp ignoreLock
    
    set sector ""
    set returnerror 0
    APSParseArguments {sector returnerror}
    if ![string length $sector] {
        APSAlertBox [APSUniqueName .] -errorMessage \
          "No sector variable specified in IDSteeringDialog"
        if {$returnerror} {
            return -code error "AppySetpoints: No sector variable specified in IDSteeringDialog"  
        } else {
            return 1
        }
    }
    if {$steeringX($sector)==0 && $steeringXp($sector)==0 && $steeringY($sector)==0 && $steeringYp($sector)==0} {
        SetIDSteeringStatus "All steering deltas are zero, no steering is done for sector $sector."
        return 1
    }
    
    if [catch {CompareSetpointsWithBPLDLimit -sector $sector} result] {
        set answer [APSMultipleChoice [APSUniqueName .] \
                      -question "$result. The steering will probably trip the BPLD system, go ahead or cancel the steering? " -returnList {Go Cancel} \
                      -labelList {Go-Ahead Cancel} ]
        if {$answer == "Cancel"} {
            if {$statusCallback!=""} {
                $statusCallback "[clock format [clock seconds] -format %H:%M:%S]: Steering was cancel due to the probability of BPLD tripping."
            }
            return 1
        }
    } else {
        if {$statusCallback!="" && $timeDebug} {
            $statusCallback "[clock format [clock seconds] -format %H:%M:%S]: The setpoints are within the BPLD trip limits."
        }
    }
    
    if $P0Sector($sector) {
        set digit 0
    } else {
        set digit 1
    }
    set Sn $sector
    set Sn1 [exec rpnl "$Sn 1 + 40 > pop ? 40 - : \$"]
    set bpm1 S${Sn}B:P${digit}
    set bpm2 S${Sn1}A:P${digit}
    global BPx BPy APx APy R11 R12 R33 R34
    set controllawDir  /home/helios/oagData/sr/localSteering/lattices/default/IDs/[format %02ld ${sector}]ID
    set refMatrixDir /home/helios/oagData/sr/orbitControllaw/lattices/default/refMatrices
    set waveformDir /home/helios/oagData/sr/orbitControllaw/waveforms
    
    if {!$review && !$ignoreLock} {
        SetIDSteeringStatus "Lock out global steering..."
        if [catch {exec cavput -list=SRID:SteeringLockBI.VAL=1 -pend=30} result] {
            return -code error "Error in locking out global steering: $result"
        }
    }
    foreach plane {h v} coord {x y} Coord {X Y} {
        set delta [expr [set steering${Coord}($sector)]/1000.0]
        set deltap [expr [set steering${Coord}p($sector)]/1000.0]
        if {$delta==0 && $deltap==0} {
            SetIDSteeringStatus "No setpoint changes needed for $plane plane."
            continue
        }
        if {$coord=="x"} {
            set deltaBP [expr $R11($sector) * $delta -  $R12($sector) * $deltap]
            set deltaAP [expr $R11($sector) * $delta +  $R12($sector) * $deltap]
        } else {
            set deltaBP [expr $R33($sector) * $delta -  $R34($sector) * $deltap]
            set deltaAP [expr $R33($sector) * $delta +  $R34($sector) * $deltap]
        }
      #  puts "$R11($sector) $R12($sector)  $R33($sector) $R34($sector)"
        if !$review {
            SetIDSteeringStatus "Change corrector rangeErrors..."
            if [catch {exec sddscasr -restore $controllawDir/$plane.corr.range } result] {
                return -code error "Error changing corrector rangeErrors: $result"
            }
        }
        if [catch {APSSRApplySteeringSetpoints -sector $sector -source ID -plane $plane \
                     -xp $steeringXp($sector) -yp $steeringYp($sector) \
                     -bpmList [list $bpm1 $bpm2] -deltaList [list $deltaBP $deltaAP] \
                     -FFWaveform $FFWaveformFile($plane) \
                     -review $review -dryRun 0 \
                     -statusCallback SetIDSteeringStatus \
                     -stepSizeLimit $stepSizeLimit \
                     -stepInterval $stepInterval \
                     -refMatrix $controllawDir/${plane}.steering.rm } result] {
            if !$review {
                if [catch {exec sddscasr -restore $controllawDir/$plane.corr.range.orig } result1] {
                    return -code error "$result\nError restoring corrector rangeErrors: $result1"
                }
            }
            return -code error $result
        }
        if !$review {
            SetIDSteeringStatus "restore corrector rangeErrors..."
            if [catch {exec sddsprocess $controllawDir/$plane.corrName -pipe=out -edit=col,ControlName,CorrName,ei/:DacAI/ \
                         | sddscasr -pipe -save -pend=30 \
                         | sddsprocess -pipe -reedit=col,ControlName,%/DacAI/RangeErrorCALC.B/ \
                         | sddscasr -pipe=in -restore } result] {
                if [catch {exec sddscasr -restore $controllawDir/$plane.corr.range.orig } result1] {
                     return -code error "$result\nError restoring corrector rangeErrors: $result1"
                }
                return -code error "Error tranfer DacAI to RangeErrorCALC.B: $result"
            }
            if [catch {exec sddscasr -restore $controllawDir/$plane.corr.range.orig } result] {
                return -code error "Error restoring corrector rangeErrors: $result"
            }
        }
    }
    if $review {
        return
    }
    if !$ignoreLock {
        SetIDSteeringStatus "Unlock global steering..."
        if [catch {exec cavput -list=SRID:SteeringLockBI.VAL=0 -pend=30} result] {
            return -code error "Error in unlocking global steering: $result"
        }
    }
    # save SR. For now use the smaller special files in order to make this quick.
    if [catch {APSSRSaveSteeringToOps -installUBOP 1 -statusCallback SetIDSteeringStatus \
                 -description "Steering save: ID${sector} deltaX: $steeringX($sector) deltaXp: $steeringXp($sector) deltaY: $steeringY($sector) deltaYp: $steeringYp($sector)" } result] {
        return -code error "Error in saving steering to UBOP: $result"
    }
    set steeringX($sector) 0
    set steeringXp($sector) 0
    set steeringY($sector) 0
    set steeringYp($sector) 0

    SetIDSteeringStatus "Applying $sector sector setpoints done."
    return   
}

proc CompareSetpointsWithBPLDLimit {args} {
    global R11 R12 R33 R34 
    set sector ""
    set steerXp 0
    set steerYp 0
    set debug 0
    APSParseArguments {sector steerXp steerYp debug}
    if ![string length $sector] {
        return -code error "No sector variable specified in IDSteeringDialog"
    }
    if [catch {exec sdds2stream /home/helios/oagData/sr/BPLDs/sectors.sdds -col=Sector} BPLDList] {
        return -code error $BPLDList
    }
    set index [lsearch -exact $BPLDList $sector]
    if {$index<0} {
        #no need to check
        return
        # return -code error "Sector $sector is not included in BPLD sectors.sdds file."
    }
    set Sn $sector
    set Sn1 [exec rpnl "$Sn 1 + 40 > pop ? 40 - : \$"]
    # only the P1 are the BPLDs now
    if [catch {exec cavget -pend=30 -list=S${Sn}B:P1,S${Sn1}A:P1 \
                   -list=:dbpld: \
                   -list=x,y -list=hi,lo -list=AO.VAL -pend=30} tripLimits] {
        return -code error $tripLimits
    }
    foreach {bxUp bxLow byUp byLow axUp axLow ayUp ayLow} $tripLimits {}
    set badList ""
    set digit 1
    if [catch {exec cavget -list=S${Sn}B:,S${Sn1}A: -list=P${digit}:ms: \
                 -list=x,y -list=:GainAO -pend=30 -printErrors} gainList] {
        return -code error "Error in reading gain value of sector $sector pvs."
    }
    if [catch {exec cavget -list=S${Sn}B:,S${Sn1}A: -list=P${digit}:ms: \
                 -list=x,y -list=:SetpointAO -pend=30 -printErrors} setpointList] {
        return -code error "Error in reading setpoint value of sector $sector pvs."
    }
    if [catch {exec cavget -list=S${Sn}B:,S${Sn1}A: -list=P${digit}:ms: \
                 -list=x,y -list=:OffsetAO -pend=30 -printErrors} offsetList] {
        return -code error "Error in reading offset value of sector $sector pvs."
    }
    if $debug {
        puts stdout "tripLimits $tripLimits"
        puts stdout "gain $gainList"
        puts stdout "setpoint $setpointList"
        puts stdout "offset $offsetList"
    }
    foreach {BPxGain BPyGain APxGain APyGain} $gainList {} 
    foreach {BPx BPy APx APy} $setpointList {}
    foreach {BPxOffset BPyOffset APxOffset APyOffset} $offsetList {}

    # changed to use setpoints plus offsets divided by gain, instead of only setpoints 11/20/2013, H. Shang
    # which is important because BPLDs only reads back raw bpm values.
    set deltabx [expr  -$R12(P1) * $steerXp]
    set deltaax [expr  $R12(P1) * $steerXp]
    set deltaby [expr  -$R34(P1) * $steerYp]
    set deltaay [expr  $R34(P1) * $steerYp]

    set bx [expr ($BPx + $deltabx + $BPxOffset) / $BPxGain]
    set by [expr ($BPy + $deltaby + $BPyOffset) / $BPyGain]
    set ax [expr ($APx + $deltaax + $APxOffset) / $APxGain]
    set ay [expr ($APy + $deltaay + $APyOffset) / $APyGain]
    if $debug {
        puts stdout "Compare with limits"
        puts stdout "tripLimits $tripLimits"
        puts stdout "bx=$bx by=$by ax=$ax ay=$ay"
    }
    set badList ""
    set alarmMargin 0.3
    if {$bx<[expr $bxLow+$alarmMargin] || $bx>[expr $bxUp-$alarmMargin]} {
        append badList "The setpoint of S${Sn}B:P${digit}:x is outside of BPLD minor alarm limit.\n"
    }
    if {$by<[expr $byLow+$alarmMargin] || $by>[expr $byUp-$alarmMargin]} {
        append badList "The setpoint of S${Sn}B:P${digit}:y is outside of BPLD minor alarm limit.\n"
    }
    if {$ax<[expr $axLow+$alarmMargin] || $ax>[expr $axUp-$alarmMargin]} {
        append badList "The setpoint of S${Sn1}A:P${digit}:x is outside of BPLD minor alarm limit.\n"
    }
    if {$ay<[expr $ayLow+$alarmMargin] || $ay>[expr $ayUp-$alarmMargin]} {
        append badList "The setpoint of S${Sn1}A:P${digit}:y is outside of BPLD minor alarm limit.\n"
    }


    if {$bx<$bxLow || $bx>$bxUp} {
        append badList "The setpoint of S${Sn}B:P${digit}:x is outside of BPLD trip limit as well.\n"
    }
    if {$by<$byLow || $by>$byUp} {
        append badList "The setpoint of S${Sn}B:P${digit}:y is outside of BPLD trip limit as well.\n"
    }
    if {$ax<$axLow || $ax>$axUp} {
        append badList "The setpoint of S${Sn1}A:P${digit}:x is outside of BPLD trip limit as well.\n"
    }
    if {$ay<$ayLow || $ay>$ayUp} {
        append badList "The setpoint of S${Sn1}A:P${digit}:y is outside of BPLD trip limit as well."
    }
    if [llength $badList] {
        return -code error $badList
    }
}

proc PrepareFFFiles {args} {
    global FFWaveformFile
    set tmpRoot [APSGoToDailyDirectory -subdirectory IDsteering]/[APSTmpString]
    set waveformDir /home/helios/oagData/sr/orbitControllaw/waveforms
    foreach plane {h v} coord {x y} {
        if [catch {exec sddsprocess $waveformDir/RTFB[string toupper $coord]bpmInfo.sdds \
            -edit=col,ControlName,DeviceName,ei/:${coord}:SelectedMI/ -pipe=out \
            | sddscasr -save -pipe \
            | sddsconvert -pipe=in $tmpRoot.$plane -rename=col,ValueString=BPMName } result] {
            return -code error $result
        }
        set FFWaveformFile($plane) $tmpRoot.$plane
        APSAddToTmpFileList -ID steering -fileList $tmpRoot.$plane
    }
    
}

set IDSectorList [APSGetSDDSColumn -column Sector \
                    -fileName /home/helios/oagData/sr/IDs/sectors.sdds]
lappend IDSectorList 29
lappend IDSectorList 28
set IDSectorList [lsort -integer $IDSectorList]

MakeSectorsWidget .sectors -parent .userFrame

set statusCallback SetIDSteeringStatus

# global variable P0Sector is used to set the label names
# of the bpms whose setpoints are changed.
set linkDir /home/helios/oagData/sr/localSteering/lattices/default/IDs
for {set sector 1} {$sector<41} {incr sector} {
    set id ${linkDir}/[format %02ld $sector]ID
    set idLink [file readlink $id] 
    switch -regexp $idLink  {
        P1 {
        # means that P1 bpms are used for steering
            set P0Sector($sector) 0
            set R11($sector) 1.09
            set R12($sector) 4.29
            set R33($sector) 0.91
            set R34($sector) 3.67
        }
        P0 {
        # means that P0 bpms are used for steering
            set P0Sector($sector) 1
            set R11($sector) 1.0
            set R12($sector) 2.48
            set R33($sector) 1.0
            set R34($sector) 2.48
	    #removed the special case for ID 34, since it is same as others now, before R12($sector) and R34($sector) were 1.24
        }
    }
}
set R11(P1) 1.09
set R12(P1) 4.29
set R33(P1) 0.91
set R34(P1) 3.67


set BPLDFile /home/helios/oagData/sr/BPLDs/sectors.sdds
sdds load $BPLDFile bpldConfig
set BPLDList [lindex $bpldConfig(Column.Sector) 0]
set IsDigitalList [lindex $bpldConfig(Column.IsDigital) 0]
set Channel2List [lindex $bpldConfig(Column.Channel2) 0]
set Channel1List [lindex $bpldConfig(Column.Channel1) 0]
foreach sector $BPLDList chan1 $Channel1List chan2 $Channel2List {
    set sector1 [expr $sector + 1]
    set firstChannelBPM($sector) S${sector}B:$chan1
    set secondChannelBPM($sector) S${sector1}A:$chan2
}
#PrepareFFFiles
set FFWaveformFile(h) /home/helios/oagData/sr/orbitControllaw/waveforms/FFwaveform.h
set FFWaveformFile(v) /home/helios/oagData/sr/orbitControllaw/waveforms/FFwaveform.v

# Local Variables:
# mode: tcl
# End:
