#!/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)]
#APSStandardSetup
set CVSRevisionAuthor "\$Revision: 1.0 $ \$Author: shang $"
APSApplication . -name "SRXrayBPMSanityCheck"  -version $CVSRevisionAuthor \
  -overview "Does SR XrayBPM sanity check."
set status ""

set archiveDir /home/helios/oagData/sr/gapScans/data/gapScanFull

APSScrolledStatus .status -parent .userFrame -width 80 -textVariable status

set interval 0.5
set logTime 60
set outputDir [APSGoToDailyDirectory -subdirectory XrayBPMSanityCheck]

APSLabeledEntry .interval -parent .userFrame -label "Data logger interval (seconds):" -textVariable interval -width 40
APSLabeledEntry .logtime -parent .userFrame -label "Data logging time (seconds):" -textVariable logTime -width 40
APSLabeledEntry .dir -parent .userFrame -label "Output directory:" -textVariable outputDir -width 75

APSButton .start -parent .userFrame -text "Start" -command "StartSanityCheck"
APSButton .review -parent .userFrame -text "Review" -command "Review"

proc SetSanityCheckStatus {text} {
    global status
    set status "[clock format [clock seconds] -format %H:%M:%S] $text"
    update
}

proc Review {args} {
    set file ""
    APSParseArguments {file}
    if ![string length $file] {
        global outputDir 
        set file [APSFileSelectDialog [APSUniqueName .] -path $outputDir -pattern *.sdds -width 80 -title "select a file"]
    }
    
    set xFinishTime [exec sdds2stream -par=xFinishTime $file]
    if [string length $file] {
        exec sddsplot  -sep=10  -leg=edit=%/:ms:x//%/:ErrorCC//  -grap=line,vary -tick=xtime -filter=col,Time,0,$xFinishTime  \
          -col=Time,S*ID*x*ErrorCC $file "-title=Horizontal" -mode=y=offset "-topline=Horizontal change due to horizontal steering" &
        
        exec sddsplot  -sep=10  -leg=edit=%/:ms:x//%/:ErrorCC//  -grap=line,vary -tick=xtime -filter=col,Time,$xFinishTime,[expr $xFinishTime + 50]  \
          -col=Time,S*ID*x*ErrorCC $file "-title=Horizontal motion from vertical coupling" -mode=y=offset  "-topline=Horizontal change due to vertical steering"  &
        

        exec sddsplot  -sep=10  -leg=edit=%/:ms:y//%/:ErrorCC//  -grap=line,vary -tick=xtime -filter=col,Time,$xFinishTime,[expr $xFinishTime + 25] \
          -col=Time,S*ID*y*ErrorCC $file "-title=Vertical" -mode=y=offset   "-topline=vertical change due to vertical steering" &
        

        exec sddsplot  -sep=10  -leg=edit=%/:ms:y//%/:ErrorCC//  -grap=line,vary -tick=xtime -filter=col,Time,0,$xFinishTime \
          -col=Time,S*ID*y*ErrorCC $file "-title=Vertical motion from horizontal coupling" -mode=y=offset "-topline=vertical change due to horizontal steering"   &
        
    }
    
}
proc StartSanityCheck1 {args} {
    global interval logTime outputDir monID
    SetSanityCheckStatus "Step 7: start data monitoring..."
   # set monFile /home/helios/oagData/sr/gapScans/feedforwardInputFiles/SR_msAve.mon
    set monFile /home/helios/oagData/logging/srBPMs/srBPMs.mon
    set outputFile $outputDir/[clock format [clock seconds] -format "%Y-%m%d:%H:%M:%S"].sdds
    
    set monID [exec sddsmonitor $monFile $outputFile -interval=$interval -time=$logTime &]
    after 10000
    catch {exec kill -9 $monID}
    #plot data
    #exec sddsplot -sep -col=Time,S*ErrorCC -tick=xtime $outputFile -same &
}
proc StartSanityCheck {args} {
    global interval logTime outputDir monID startXRDP
    if [APSYesNoPopUp "Start XRDP controllaw?"] {
        SetSanityCheckStatus "Step1: Start XRDP orbit correction..."
        APSInfoWindow .warn -name "Start XRDP orbit correction" -modal 1 \
          -infoMessage "Start XRDP orbit correction."
        while {1} {
            if [catch {APSCheckControllawRunning -config h.defaultXRDP} hRunning] {
                return -code error "Error1 - check h plane controllaw): $hRunning"
            }
            if [catch {APSCheckControllawRunning -config v.defaultXRDP} vRunning] {
                return -code error "Error3: check v plane controllaw): $vRunning"
            }
            if {$hRunning && $vRunning} {
                break
            } else {
                if {!$hRunning && !$vRunning} {
                    set desc "Both h and v plane defaultXPDP controllaw not started yet"
                } elseif {!$hRunning} {
                    set desc "h plane defaultXPDP controllaw not started yet"
                } elseif {!$vRunning} {
                    set desc "v plane defaultXPDP controllaw not started yet"
                }
                set answer [APSMultipleChoice .info -name "XRDP controllaw not running" \
                              -question "${desc}, pless Check-Again to check again or abort to abort the pem." -labelList {Check-Again Abort} \
                              -returnList {Check Abort} ]
                if {$answer=="Abort"} {
                    return -code error "Error4: Xray bpm sanity check was aborted."
                }
                after 1000
            }
        }
    }
    
    if [APSYesNoPopUp "move gaps to 15mm?"] {
        SetSanityCheckStatus "Step 4: move gaps to 15mmm..."
        if [catch {APSMpIDRestoreXbpmRefGaps -pem 0 -group Both} result] {
            return -code error "Error9: error moving gaps to 15mm: $result"
        }
    }
    SetSanityCheckStatus "Step 5:  check SR current."
    if [catch {exec cavget -list=S-DCCT:CurrentM -pend=30 -printErrors} current] {
        return -code error "Error7:  cavget -list=S-DCCT:CurrentM): $current"
    }
    if {$current<90} {
        set answer [APSMultipleChoice [APSUniqueName .] -name "Check SR current" \
                      -question "SR current now is $current mA, less than 99mA.\n\n Would you like to continue or abort the pem." -labelList {Continue Abort} \
                      -returnList {Continue Abort} ]
        if {$answer=="Abort"} {
            return -code error "Error8: aborted due to SR current ($current) was too low."
        }
    }
    
    SetSanityCheckStatus "Step 6: switch to BPDVerificationDP orbit correction..."
    APSInfoWindow .warn -name "Start BPLDVerificationDP orbit correction" -modal 1 \
      -infoMessage "Start BPLDVerification orbit correction."
    while {1} {
        if [catch {APSCheckControllawRunning -config h.BPLDVerificationDP} hRunning] {
            return -code error "Error9 - check h plane controllaw): $hRunning"
        }
        if [catch {APSCheckControllawRunning -config v.BPLDVerificationDP} vRunning] {
            return -code error "Error10: check v plane controllaw): $vRunning"
        }
        if {$hRunning && $vRunning} {
            break
        } else {
            if {!$hRunning && !$vRunning} {
                set desc "Both h and v plane BPLDVerificationDP controllaw not started yet"
            } elseif {!$hRunning} {
                set desc "h plane BPLDVerificationDP controllaw not started yet"
            } elseif {!$vRunning} {
                set desc "v plane BPLDVerficationDP controllaw not started yet"
            }
            set answer [APSMultipleChoice .info -name "BPLDVerification controllaw not running" \
                          -question "${desc}, pless Check-Again to check again or abort to abort the pem." -labelList {Check-Again Abort} \
                          -returnList {Check Abort} ]
            if {$answer=="Abort"} {
                return -code error "Error11: Xray bpm sanity check was aborted."
            }
            after 1000
        }
    }
    
    SetSanityCheckStatus "Step 7: start data monitoring..."
   # set monFile /home/helios/oagData/sr/gapScans/feedforwardInputFiles/SR_msAve.mon
    set monFile /home/helios/oagData/logging/srBPMs/srBPMs.mon
    set outputFile $outputDir/[clock format [clock seconds] -format "%Y-%m%d:%H:%M:%S"].sdds
   
    set monID [exec sddsmonitor $monFile $outputFile -interval=$interval -time=$logTime &]
    
    SetSanityCheckStatus "Step 8: 10 microrads outboard in x plane..."
    if [catch {exec cavput -list=S -range=begin=1,end=24 -list=A:P1 -list=:ms:x:SetpointAO=0.025 -delta
        exec cavput -list=S -range=begin=1,end=24 -list=B:P1 -list=:ms:x:SetpointAO=-0.025 -delta
        exec cavput -list=S -range=begin=26,end=27 -list=A:P1 -list=:ms:x:SetpointAO=0.025 -delta
        exec cavput -list=S -range=begin=26,end=27 -list=B:P1 -list=:ms:x:SetpointAO=-0.025 -delta
        exec cavput -list=S -range=begin=28,end=35 -list=A:P1 -list=:ms:x:SetpointAO=0.025 -delta
        exec cavput -list=S -range=begin=28,end=35 -list=B:P1 -list=:ms:x:SetpointAO=-0.025 -delta } result] {
        return -code error "Error steering x orbit: $result"
    }
    after 5000
    SetSanityCheckStatus "Step 9: puts x plane orbit back..."
    if [catch {exec cavput -list=S -range=begin=1,end=24 -list=A:P1 -list=:ms:x:SetpointAO=-0.025 -delta
        exec cavput -list=S -range=begin=1,end=24 -list=B:P1 -list=:ms:x:SetpointAO=0.025 -delta
        exec cavput -list=S -range=begin=26,end=27 -list=A:P1 -list=:ms:x:SetpointAO=-0.025 -delta
        exec cavput -list=S -range=begin=26,end=27 -list=B:P1 -list=:ms:x:SetpointAO=0.025 -delta
        exec cavput -list=S -range=begin=28,end=35 -list=A:P1 -list=:ms:x:SetpointAO=-0.025 -delta
        exec cavput -list=S -range=begin=28,end=35 -list=B:P1 -list=:ms:x:SetpointAO=0.025 -delta } result] {
        return -code error "Error restore x  orbit: $result"
    }
    set xFinishTime [expr [clock seconds] + 2]
    after 5000
    SetSanityCheckStatus "Step 8: 10 microrads outboard in y plane..."
    if [catch {exec cavput -list=S -range=begin=1,end=24 -list=A:P1 -list=:ms:y:SetpointAO=0.025 -delta
        exec cavput -list=S -range=begin=1,end=24 -list=B:P1 -list=:ms:y:SetpointAO=-0.025 -delta
        exec cavput -list=S -range=begin=26,end=27 -list=A:P1 -list=:ms:y:SetpointAO=0.025 -delta
        exec cavput -list=S -range=begin=26,end=27 -list=B:P1 -list=:ms:y:SetpointAO=-0.025 -delta
        exec cavput -list=S -range=begin=28,end=35 -list=A:P1 -list=:ms:y:SetpointAO=0.025 -delta
        exec cavput -list=S -range=begin=28,end=35 -list=B:P1 -list=:ms:y:SetpointAO=-0.025 -delta } result] {
        return -code error "Error steering y orbit: $result"
    }
    after 5000
    SetSanityCheckStatus "Step 9: puts y plane orbit back..."
    if [catch {exec cavput -list=S -range=begin=1,end=24 -list=A:P1 -list=:ms:y:SetpointAO=-0.025 -delta
        exec cavput -list=S -range=begin=1,end=24 -list=B:P1 -list=:ms:y:SetpointAO=0.025 -delta
        exec cavput -list=S -range=begin=26,end=27 -list=A:P1 -list=:ms:y:SetpointAO=-0.025 -delta
        exec cavput -list=S -range=begin=26,end=27 -list=B:P1 -list=:ms:y:SetpointAO=0.025 -delta
        exec cavput -list=S -range=begin=28,end=35 -list=A:P1 -list=:ms:y:SetpointAO=-0.025 -delta
        exec cavput -list=S -range=begin=28,end=35 -list=B:P1 -list=:ms:y:SetpointAO=0.025 -delta } result] {
        return -code error "Error restore y orbit: $result"
    }
    after 1000
    catch {exec kill -9 $monID}
    puts $xFinishTime
    catch {exec sddsprocess $outputFile "-redefine=par,xFinishTime,$xFinishTime" -nowarnings}
    
    #plot data
    Review -file $outputFile
}
