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

wm geometry . +10+10

set args $argv

proc ReadBoosterSteeringConfig {args} {
    global sectorList
    eval global $sectorList
    
    set configFile /home/helios/oagData/booster/localSteering/steeringConfig.sdds
  
    foreach plane {h v} {
        set configFile /home/helios/oagData/booster/localSteering/${plane}steeringConfig.sdds
        foreach nm {Sector BPMName Corr1 Corr2 Corr3 Corr4 PollutedBPMs} {
            set ${nm}List [exec sdds2stream -col=$nm $configFile]
        }
        set sectorList $SectorList
        set index 0
        foreach sector $SectorList {
            set ${sector}($plane.BPMName) [lindex $BPMNameList $index]
            set ${sector}($plane.corr1) [lindex $Corr1List $index]
            set ${sector}($plane.corr2) [lindex $Corr2List $index]
            set ${sector}($plane.corr3) [lindex $Corr3List $index]
            set ${sector}($plane.corr4) [lindex $Corr4List $index]
            set ${sector}($plane.pollutedBPMs) [lindex $PollutedBPMsList $index]
            
            incr index
        }
    }
    #the 3-corrector response were measured for region1 and region2 only on 11/22/2017
    set regionList {0 1 2 3 4 5 6 7 8 9} 
    foreach region $regionList {
        foreach plane {h v} {
            set factorFile /home/helios/oagData/booster/localSteering/lattices/default/$plane.region$region.steeringFactor
            if [file exist $factorFile] {
                set sectorList1 [exec sdds2stream -col=Sector $factorFile]
                set factorList1 [exec sdds2stream -col=Factor $factorFile]
                foreach sector $sectorList1 factor $factorList1 {
                    #  puts "$region $sector"
                    set ${sector}($plane.region$region.factor) $factor
                }
            }
        }
    }
}


APSApplication . -name BoosterOrbitSteeering -version 1 \
  -overview {This application allows steering configuration of booster.  You may choose the lattice, which monitors and correctors to use, and restrict your choices to only good components.}
set Status ""
APSScrolledStatus .status -parent .userFrame -width 60 \
  -textVariable Status 

set sectorList ""
for {set b 1} {$b<5} {incr b} {
    for {set c 0} {$c<10} {incr c} {
	lappend sectorList B${b}C$c
	lappend commandList "SelectSector -sector B${b}C$c"
    }
}


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

proc SectorDialog {args} {
    set sector ""
    APSParseArguments {sector}
    global sectorList  mainDir $sector region errorCode vBadSectors
    eval global $sectorList
    
    

    global P1x P1y
    set P1x($sector.bpm) [set ${sector}(h.BPMName)]
    set P1y($sector.bpm) [set ${sector}(v.BPMName)]
    
    set bpmx $P1x($sector.bpm)
    set bpmy $P1y($sector.bpm)
    
    set dialogFrame .dialog$sector.userFrame
    APSDialogBox .dialog$sector  \
	-name "$sector region$region Dialog" \
	-contextHelp "Dialog box for steering in $sector region$region."
    
    
    if {[pv linkw P1x($sector) ${bpmx}:region$region:x:SetpointAO]!=0} {
        APSAlertBox .alert -errorMessage "linkw error for x setpoint ($bpmx:region$region:x:SetpointAO): $errorCode"
        exit
    }
    if {[pv umon P1x($sector)] != 0} {
        APSAlertBox .alert -errorMessage "umon error $errorCode"
        exit
    }
    
    if {[lsearch -exact $vBadSectors $sector]<0} {
        if {[pv linkw  P1y($sector)  ${bpmy}:region$region:y:SetpointAO ]!= 0} {
            APSAlertBox .alert -errorMessage "linkw error for y setpoint: $errorCode"
            exit
        }
        if {[pv umon P1y($sector)] != 0} {
            APSAlertBox .alert -errorMessage "umon error $errorCode"
            exit
        }
    }
    
    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
    APSLabeledEntry .bp1x \
      -parent $dialogFrame.parameters.frame.setpoints.frame \
      -label "$bpmx:x (mm)"  -width 10 \
      -textVariable P1x($sector) \
      -contextHelp "Enter value for $bpmx:ms:x:SetpointAO to be applied. These values change when one of the associated coordinate delta button is pressed."
    
    if {[lsearch -exact $vBadSectors $sector]<0} {
        APSLabeledEntry .apx \
          -parent $dialogFrame.parameters.frame.setpoints.frame \
          -label "$bpmy:y (mm)"  -width 10 \
          -textVariable P1y($sector) \
          -contextHelp "Enter value for $bpmy:ms:y:SetpointAO to be applied. These values change when one of the associated coordinate delta button is pressed."
    }
    
    APSButton .review -parent .dialog$sector.buttonRow -text "Review Pending Setpoint Changes" -command "ApplySetpoints -sector $sector -dryRun 1 -review 1"
    APSButton .apply -parent .dialog$sector.buttonRow -text APPLY  -command "ApplySetpoints -sector $sector" -contextHelp  "Applies above setpoint values to setpoint PVs of ID$sector bpms."
    APSButton .install -parent  .dialog$sector.buttonRow -text INSTALL -command "InstallSteering -sector $sector"
   
    global P1xError P1yError
    if {[pv linkw P1xError($sector) ${bpmx}:region$region:x:ErrorCC] != 0} {
        APSAlertBox .alert -errorMessage "unable to link error pvs: $errorCode"
        exit
    }
    if {[pv umon P1xError($sector)] != 0} {
        APSAlertBox .alert -errorMessage "$errorCode"
        exit
    }
    
    if {[lsearch -exact $vBadSectors $sector]<0} {
        if {[pv linkw  P1yError($sector)  ${bpmx}:region$region:y:ErrorCC ] != 0} {
            APSAlertBox .alert -errorMessage "unable to link error pvs: $errorCode"
            exit
        }
        if {[pv umon P1yError($sector)] != 0} {
            APSAlertBox .alert -errorMessage "$errorCode"
            exit
        }
    }

    APSFrame .moreParameters -parent $dialogFrame -packOption "-side left"
    $dialogFrame.moreParameters.frame configure -relief flat
    if {[lsearch -exact $vBadSectors $sector]<0} {
        APSLabeledOutputFrame .error -parent $dialogFrame.moreParameters.frame \
          -label "Error" -packOption "-side left" \
          -variableList "P1xError($sector) P1yError($sector)"\
          -orientation vertical -width 10 \
          -contextHelp "Error readbacks of ID$sector bpmys: adjusted readback - setpoint."
        set entries {1 2}
    } else {
        APSLabeledOutputFrame .error -parent $dialogFrame.moreParameters.frame \
          -label "Error" -packOption "-side left" \
          -variableList "P1xError($sector)"\
          -orientation vertical -width 10 \
          -contextHelp "Error readbacks of ID$sector bpms: adjusted readback - setpoint."
        set entries {1}
    }
    $dialogFrame.moreParameters.frame.error.frame configure -relief flat

    set border 3
    foreach entry $entries {
        $dialogFrame.moreParameters.frame.error.frame.entry${entry} \
          configure -borderwidth $border
    }
    AdjustSetpoints -sector $sector -parent $dialogFrame
    APSEnableButton .dialog$sector.buttonRow.ok.button
    
    update
  
}

proc IncrX {args} {
    global deltaxAcc deltax steeringX
    set sector ""
    set sign 1
    APSParseArguments {sector sign}
    if ![string length $sector] {
        APSAlertBox [APSUniqueName .] -errorMessage \
          "No sector variable specified in IDSteeringDialog"
        return 1
    }
    set deltaxAcc($sector) [format %.3f [expr [set deltaxAcc($sector)] + $sign * [set deltax($sector)]]]
    set steeringX($sector) [format %.3f [expr [set steeringX($sector)] + $sign * [set deltax($sector)]]]
    
    return 0
}

proc IncrY {args} {
    global deltayAcc deltay steeringY region
    set sector ""
    set sign 1
    APSParseArguments {sector sign}
    if ![string length $sector] {
        APSAlertBox [APSUniqueName .] -errorMessage \
          "No sector variable specified in IDSteeringDialog"
        return 1
    }
    
    
    set deltayAcc($sector) [format %.3f [expr [set deltayAcc($sector)] + $sign * [set deltay($sector)]]]
    set steeringY($sector) [format %.3f [expr [set steeringY($sector)] + $sign * [set deltay($sector)]]]
    
    return 0
}

proc AdjustSetpoints {args} {
    global deltax deltay
    global deltaxAcc deltayAcc region vBadSectors

    set sector ""
    set parent ""
    APSParseArguments {sector parent}
    if ![string length $sector] {
        APSAlertBox [APSUniqueName .] -errorMessage \
          "No sector variable specified in AdjustSetpoints"
        return 1
    }
   
    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

  
    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.1
    }
    
    if ![info exists deltay($sector)] {
        set deltay($sector) 0.1
    }
    
    APSLabeledEntry .bpx \
      -parent $adjustFrame.parameters.frame.deltas.frame \
      -label "delta x (mm)"  -width 10\
      -textVariable deltax($sector) \
      -contextHelp "Enter value for delta x"
  
   
    global $sector
    if {[lsearch -exact $vBadSectors $sector]<0} {
        APSLabeledEntry .bpy \
          -parent $adjustFrame.parameters.frame.deltas.frame \
          -label "delta y (mm)"  -width 10 \
          -textVariable deltay($sector) \
          -contextHelp "Enter value for delta y"
        
    }
    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 $sector" \
        -contextHelp  "Changes x setpoints using delta x." -fastClick 1
   
    if {[lsearch -exact $vBadSectors $sector]<0} {
         APSButton .incry -parent $adjustFrame.parameters.frame.incrButtons.frame  \
           -packOption "-side top" -text UP -command "IncrY -sector $sector" \
           -contextHelp  "Changes y setpoints using delta y." -fastClick 1
      
     }
    APSButton .decrx -parent $adjustFrame.parameters.frame.decrButtons.frame  \
        -packOption "-side top" -text IN -command "IncrX -sector $sector -sign -1" \
        -contextHelp  "Changes x setpoints using delta x." -fastClick 1
   
    if {[lsearch -exact $vBadSectors $sector]<0} {
        APSButton .decry -parent $adjustFrame.parameters.frame.decrButtons.frame  \
          -packOption "-side top" -text DOWN -command "IncrY -sector $sector -sign -1" \
          -contextHelp  "Changes y setpoints using delta y." -fastClick 1
    }
    
    global steeringX  steeringY 
    set steeringX($sector) 0
    set steeringY($sector) 0
    
    if {[lsearch -exact $vBadSectors $sector]<0} {
        APSLabeledOutputFrame .steering \
          -parent $adjustFrame.parameters.frame \
          -label "Pending Steering" -packOption "-side left" \
          -variableList "steeringX($sector) steeringY($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 entries {1 2}
    } else {
         APSLabeledOutputFrame .steering \
          -parent $adjustFrame.parameters.frame \
          -label "Pending Steering" -packOption "-side left" \
          -variableList "steeringX($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 entries {1}
    }
    set border 3
    foreach entry $entries {
        $adjustFrame.parameters.frame.steering.frame.entry${entry} \
          configure -borderwidth $border
    }
    if {[lsearch -exact $vBadSectors $sector]<0} {
        APSLabeledOutputFrame .accumulation \
          -parent $adjustFrame.parameters.frame \
          -label "Accumulators" -packOption "-side left" \
          -variableList "deltaxAcc($sector) deltayAcc($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 entries {1 2}
    } else {
         APSLabeledOutputFrame .accumulation \
          -parent $adjustFrame.parameters.frame \
          -label "Accumulators" -packOption "-side left" \
          -variableList "deltaxAcc($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 entries {1}
    }
    set border 3
    foreach entry $entries {
        $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
    if {[lsearch -exact $vBadSectors $sector]<0} {
        $adjustFrame.parameters.frame.incrButtons.frame.incry.button configure -width $width -pady $padding
    }
    $adjustFrame.parameters.frame.decrButtons.frame.decrx.button configure -width $width -pady $padding
    if {[lsearch -exact $vBadSectors $sector]<0} {
        $adjustFrame.parameters.frame.decrButtons.frame.decry.button configure -width $width -pady $padding
    }

    
    return 0
}

proc MakeSectorFrame {widget args} {
    set parent ""
    APSParseArguments {parent}
    global sectorList Sector badSectors
    
     set w $parent$widget
    APSFrame $widget -parent $parent \
      -label "Booster sector selection for steering." \
      -contextHelp {Sector selection frame} 
    set sectorList ""
    for {set b 1} {$b<5} {incr b} {
	set quad $b
	APSFrame .sector$quad -parent $w.frame 
        $w.frame.sector$quad.frame configure -relief flat
	for {set c 0} {$c<10} {incr c} {
	    set sector B${b}C$c
	    lappend sectorList $sector
	    APSButton .sector$sector -parent $w.frame.sector$quad.frame \
		-text $sector \
		-command "SectorDialog -sector $sector" \
		-contextHelp "Brings up dialog box for $sector steering."
	    if {[lsearch -exact $badSectors $sector]>=0} {
		APSDisableButton $w.frame.sector$quad.frame.sector$sector.button
	    }
	}
    }
}

set hFactor 0.7268
set vFactor 0.746

proc InstallSteering {args} {
    set sector ""
    APSParseArguments {sector}
    global outDir
    set oldDir [pwd]
    set rampDir /home/helios/oagData/booster/ramps/correctors/lattices/default
    set fileList ""
    set opt ""
    set tmpRoot /tmp/[APSTmpString]
    foreach plane {h v} {
        set rampFile $outDir/${plane}.${sector}.ramp
        if [file exist $rampFile] {
            set corrs [exec sdds2stream -par=CorrName $rampFile]
            exec sddsplot -grap=line,vary -split=page -sep=2 -group=page -topline=@CorrName \
              -col=RampTime,RampSetpoint -leg=spec=steer $rampFile  -col=RampTime,RefRampSetpoint -leg=spec=ref $rampFile &

            if [APSYesNoPopUp "Are you sure to install $plane $sector steer result?"] {
                lappend fileList $rampFile
                foreach corr $corrs {
                    lappend opt "-match=par,CorrName=$corr,!"
                }
            }
        } else {
            SetStatus "No steer found for $plane $sector."
        }
    }
    if [llength $fileList] {
        if [catch {eval exec sddsprocess $rampDir/HVCorr.ramp $opt $tmpRoot.other } result] {
            return -code error "Error2: $result"
        }
        set newFile [APSNextGenerationedName -directory $rampDir -name HVCorr.ramp-0000 -newFile 1 -separator -]
        
        if [catch {eval exec sddscombine $tmpRoot.other $fileList -pipe=out \
                     | sddssort -pipe=in -par=CorrName $rampDir/$newFile } result] {
            return -code error "Error3: $result"
        }
        cd $rampDir 
        exec rm HVCorr.ramp
        exec ln -s $newFile HVCorr.ramp
        SetStatus "$sector steer installed."
    }
    cd $oldDir
}

set outDir [APSGoToDailyDirectory -subdirectory boosterSteering]

proc APSBoosterApplySteeringsetpoints {args} {
    set region ""
    set sector ""
    set x 0
    set y 0
    set plane h
    set review 0
    set stepSizeLimit 0.1
    set statusCallback ""
    set dryRun 0
    set bpmx ""
    set bpmy ""
    APSParseArguments {region sector x y plane review stepSizeLimit statusCallback dryRun bpmx bpmy}

    global $sector outDir OAGGlobal
    set tmpRoot /tmp/[APSTmpString]
    set zeroDispBPMs {B1C0P1 B1C0P2  B2C9P2 B3C0P1 B3C0P2 B4C9P2}
    exec sddsmakedataset $tmpRoot.zeroDisp -col=BPMName,type=string -data=[join $zeroDispBPMs ,]
    switch $plane {
        H -
        h {
            set delta $x
            set coord x
            set plane h
            set bpm $bpmx
            if [info exist ${sector}(h.region$region.factor)] {
                set factor [set ${sector}(h.region$region.factor)]
            } else {
                set factor 1.0
            }
        }
        V -
        v {
            set delta $y
            set coord y
            set plane v
            set bpm $bpmy
            if [info exist ${sector}(v.region$region.factor)] {
                set factor [set ${sector}(v.region$region.factor)]
            } else {
                set factor 1.0
            }
        }
        default {
            return -code error "APSBoosterApplySteeringsetpoints1: Invalid plane provided."
        }
    }
    if {$factor>1.0} {
        set factor 1.0
    }
    
    set twissFile $OAGGlobal(BoosterLatticesDirectory)/default/refMatrices/booster.twi
    set controllawDir  /home/helios/oagData/booster/localSteering/lattices/default/$sector
    
    if [catch {exec sddsmakedataset $tmpRoot.$plane.setpoint -col=BPMName,type=string \
                 -data=$bpm \
                 -col=delta,type=double -data=$delta } result] {
        return -code error "APSBoosterApplySteeringsetpoints2: $result"
    }


    if [catch {exec sddsquery -col $controllawDir/irm.$coord -sddsOutput=$tmpRoot.$plane.bpm
        exec sddsprocess $tmpRoot.$plane.bpm -pipe=out -match=col,Name=B*C*P* \
                 | sddsxref -pipe $tmpRoot.$plane.setpoint -fillIn -match=Name=BPMName -take=delta -nowarnings \
                 | sddsconvert -pipe=in $tmpRoot.$plane.bpm1 -retain=col,Name,delta } result] {
        return -code error "APSBoosterApplySteeringsetpoints3: $result"
    }
    
    #get the corrector delta changes
    if [catch {exec sddsmatrixmult $controllawDir/irm.$coord $tmpRoot.$plane.bpm1 -pipe=out \
                 | sddsxref -pipe $controllawDir/irm.$coord -nowarnings -take=ControlName \
                 | tee $tmpRoot.$plane.corr \
                 | sddsprocess -pipe=in "-redefine=col,absChange,delta abs" -process=absChange,max,MaxChange \
                 $tmpRoot.$plane.corr1 } result] {
        return -code error "APSBoosterApplySteeringsetpoints4: $result"
    }
    
    if [catch {exec sddsxref $tmpRoot.$plane.corr $twissFile -nowarnings -pipe=out \
                 -match=ControlName=ElementName -take=eta$coord \
                 | sddsprocess -pipe "-define=col,corrEta,delta eta$coord *" \
                 | sddsprocess -pipe -process=corrEta,sum,corrEtaSum \
                 | sdds2stream -pipe=in -par=corrEtaSum } corrEta] {
        return -code error "APSBoosterApplySteeringsetpoints4a: $corrEta"
    }

    #get the in-bound bpm setpoint changes
    set refMatrix $controllawDir/$plane.steering.rm
    
    set bpmList [exec sdds2stream -col=BPMName $controllawDir/$plane.steering.rm]
   
    if [catch {exec sddsmatrixmult  $refMatrix  $tmpRoot.$plane.corr  -pipe=out \
                 | sddsxref -pipe $refMatrix -take=BPMName \
                 | sddsprocess -pipe=in $tmpRoot.bpm$plane  } result] {
        return -code error "APSBoosterApplySteeringsetpoints5: $result"
    }
    set bpmList [exec sdds2stream -col=BPMName $tmpRoot.bpm$plane]
    set index [lsearch -exact $bpmList $bpm]
    if [catch {exec sddsprocess $tmpRoot.bpm$plane "-define=par,SteerPos,$index" "-define=par,SteerRequest,$delta" -nowarnings } result] {
        return -code error "APSBoosterApplySteeringsetpoints5a: $result"
    }
    
    if [catch {exec sddsselect $tmpRoot.bpm$plane $tmpRoot.zeroDisp -match=BPMName -invert -pipe=out \
                 | sddsprocess -pipe -process=delta,sum,deltaSum \
                 | sdds2stream -pipe=in -par=deltaSum} bpmDelta] {
        return -code error "APSBoosterApplySteeringsetpoints5b: $bpmDelta"
    }
    if $review {
        exec sddsplot -par=SteerPos,SteerRequest -grap=sym,scale=2,fill,sub=1 -leg=spec=SteerRequest $tmpRoot.bpm$plane \
          -col=BPMName,delta  -grap=sym,conn,scale=2,fill -axes=x "-topline=corrEtaSum [format %.3e $corrEta]; bpm delta sum [format %.3e $bpmDelta]" \
          "-title=Sector $sector $plane plane expected bpm setpoint changes" $tmpRoot.bpm$plane  &
        after 1000
        set files [glob $tmpRoot.*]
       # APSAddToTmpFileList -ID steering -fileList $files
        return
    }
    
    set deltaList [exec sdds2stream -col=delta $tmpRoot.bpm$plane]
    set bpmList [exec sdds2stream -col=BPMName $tmpRoot.bpm$plane]
    set maxChange [exec sdds2stream -par=MaxChange $tmpRoot.$plane.corr1]
    set steps [format %.0f [expr $maxChange/$stepSizeLimit + 1]]
    
    set corrList [exec sdds2stream -col=ControlName $tmpRoot.$plane.corr]
    set corrChangeList [exec sdds2stream -col=delta $tmpRoot.$plane.corr]
    
   # set steps 1
    set putcomm ""
    foreach bpm $bpmList delta $deltaList {
        set pv ${bpm}:region$region:$coord:SetpointAO
        set value [expr $delta /($steps*1.0)]
        lappend putcomm $pv=$value
    }
    set putcomm1 ""
    set ampList ""
    set ampList1 ""
    foreach corr $corrList delta $corrChangeList {
       # lappend putcomm1 B:$corr:CorrectionAI=[expr $delta/($steps*1.0)]
        lappend ampList [expr $delta/($steps*1.0)/$factor]
        lappend ampList1 [expr $delta/$factor]
    }
    if [catch {exec makeboosterbump -correctorList=[join $corrList ,] -amplitude=[join $ampList1 ,] \
                 -dryRun -outRampFile=$outDir/${plane}.$sector.ramp } result] {
        return -code error "Error generating $plane $sector ramp: $result"
    }
    for {set i 0} {$i<$steps} {incr i} {
        if [string length $statusCallback] {
            eval $statusCallback {"Step $i ..."}
        }
        if !$dryRun {
            SetStatus "step $i : $putcomm; $ampList [join $corrList ,]"
            if [catch {exec cavput -list=[join $putcomm ,] -delta -pend=30} result] {
                return -code error "APSBoosterApplySteeringsetpoints6: Error in setting bpm  setpoints: $result"
            }
            #if [catch {exec cavput -list=[join $putcomm1 ,] -delta -pend=30 } result] {
            #    return -code error "APSBoosterApplySteeringsetpoints7: Error in setting corrector setpoints: $result"
            #}
            if [catch {exec makeboosterbump -correctorList=[join $corrList ,] -amplitude=[join $ampList ,] -regions=$region -outRampFile=$tmpRoot.ramp.$i } result] {
                return -code error "APSBoosterApplySteeringsetpoints8: Error in setting corrector ramps: $result"
            }
        }
    }
    return
}

proc ApplySetpoints {args} {
    set dryRun 0
    set sector ""
    set review 0
    APSParseArguments {dryRun sector review}
    
    global steeringX  steeringY  region
    global $sector

    set bpmx [set ${sector}(h.BPMName)]
    set bpmy [set ${sector}(v.BPMName)]
    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  && $steeringY($sector)==0 } {
        SetStatus "All steering deltas are zero, no steering is done for sector $sector."
        return 1
    }
    
    foreach plane {h v} Plane {H V} {
        switch $plane {
            h {
                set delta $steeringX($sector)
            }
            v {
                set delta $steeringY($sector)
            }
        }
        if {!$delta} {
            continue
        }
        
        SetStatus "Apply/review setpoints for $plane plane -- ${sector}P1..."
        if [catch {APSBoosterApplySteeringsetpoints -region $region -sector $sector \
                     -x $steeringX($sector)  \
                     -y $steeringY($sector)  \
                     -plane $plane \
                     -bpmx $bpmx -bpmy $bpmy \
                     -statusCallback SetStatus \
                     -dryRun $dryRun -review $review } result] {
            return -code error "$result"
            
        }
    
    }
    SetStatus "done."

    if $dryRun {
        return
    }
    
    set steeringX($sector) 0
    set steeringXp($sector) 0
    set steeringY($sector) 0
    set steeringYp($sector) 0

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

proc StartADT {args} {
    global region
    
    exec adt -geometry +30+0 -f /home/helios/oagData/ADTFiles/booster/booster.bpm.pv-region$region.pv -d &
}

#bad sectors for both h and v plane, steering is not allowed for these sectors for both planes
#set badSectors {B2C9 B3C2 B4C8 B4C9}
set badSectors B3C2
#v plane bad corrector, B1C6 no vertical gain, B2C8, B3C0 because of missing B2C(
#set vBadSectors {B1C6 B2C8 B3C0}
set  vBadSectors {B1C6 B2C8 B2C9 B3C0 B3C1}

set mainDir /home/helios/oagData/booster/localSteering/lattices/default
ReadBoosterSteeringConfig 
set statusCallback SetStatus
MakeSectorFrame .sectors -parent .userFrame

set region 0
APSRadioButtonFrame .region -parent .userFrame -label "Steering time region:" -buttonList {0 1 2 3 4 5 6 7 8 9} \
  -variable region -valueList {0 1 2 3 4 5 6  7 8 9} -orientation horizontal
APSButton .adt -parent .userFrame -text "ADT" -command "StartADT"
