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

APSApplication . -name "Booster Ramp Waveform Glitch Logger Review"

proc PlotData {args} {
    set file ""
    set page 1
    APSStrictParseArguments {file page}
    
    global BM QF QD SF SD
    global VoltageRefWF sPSVoltageWF sCurrentWF

    set found 0
    foreach magnet "BM QF QD SF SD" {
        if {[set $magnet]} {
            set found 1
        }
    }
    if {$found == 0} {
        APSSetVarAndUpdate status "No magnets selected"
        return
    }
    
    set tmpFile /tmp/[APSTmpString]
    set file1 /tmp/[APSTmpString]
    set file2 /tmp/[APSTmpString]
    APSAddToTempFileList $tmpFile ${tmpFile}2 $file1 $file2
    
    if {[catch {exec sddsconvert $file -pipe=out \
                  -frompage=$page -topage=$page \
                  "-delete=column,*" "-delete=parameter,*" | \
                  tee $tmpFile | \
                  sddsarray2column -pipe -convert=Time | \
                  sddsconvert -pipe "-delete=array,*" | \
                  sdds2stream -pipe=in -col=Time} timeList]} {
        APSSetVarAndUpdate status "error: $timeList"
        return
    }
    foreach t $timeList {
        lappend data(Parameter.Time) [clock format [expr {int($t)}]]
    }
    set data(ParameterNames) "Time"
    sdds save ${tmpFile}2 data
    
    if {$VoltageRefWF} {
        set option ""
        foreach type "VoltageRefWF" {
            foreach magnet "BM QF QD SF SD" {
                if {[set $magnet]} {
                    append option "-convert=B:${magnet}:$type "
                }
            }
        }
        if {[catch {eval exec sddsarray2column $tmpFile -pipe=out $option | \
                      sddsconvert -pipe "-delete=array,*" | \
                      sddsbreak -rowlimit=512 -pipe | \
                      sddsprocess -pipe -define=column,Index,i_row | \
                      sddsxref -pipe=in ${tmpFile}2 $file1 -transfer=parameter,Time} result]} {
            APSSetVarAndUpdate status "error: $result"
            return
        }
    }

    if {$sPSVoltageWF || $sCurrentWF} {
        set option ""
        foreach type "sPSVoltageWF sCurrentWF" {
            if {[set $type]} {
                foreach magnet "BM QF QD SF SD" {
                    if {[set $magnet]} {
                        append option "-convert=B:${magnet}:$type "
                    }
                }
            }
        }
        if {[catch {eval exec sddsarray2column $tmpFile -pipe=out $option | \
                      sddsconvert -pipe "-delete=array,*" | \
                      sddsbreak -rowlimit=527 -pipe | \
                      sddsprocess -pipe -define=column,Index,i_row | \
                      sddsxref -pipe=in ${tmpFile}2 $file2 -transfer=parameter,Time} result]} {
            APSSetVarAndUpdate status "error: $result"
            return
        }
    }

    file delete $tmpFile ${tmpFile}2
    
    if {$VoltageRefWF} {
        set cols ""
        foreach magnet "BM QF QD SF SD" {
            if {[set $magnet]} {
                lappend cols "B:${magnet}:VoltageRefWF"
            }
        }
        exec sddsplot -split=page -sep=page \
          -yScalesGroup=namestring -graph=line,vary \
          -title=@Time -legend $file1 \
          -col=Index,([join $cols ,]) &
    }
    if {$sPSVoltageWF} {
        set cols ""
        foreach magnet "BM QF QD SF SD" {
            if {[set $magnet]} {
                lappend cols "B:${magnet}:sPSVoltageWF"
            }
        }
        exec sddsplot -split=page -sep=page \
          -yScalesGroup=namestring -graph=line,vary \
          -title=@Time -legend $file2 \
          -col=Index,([join $cols ,]) &
    }
    if {$sCurrentWF} {
        set cols ""
        foreach magnet "BM QF QD SF SD" {
            if {[set $magnet]} {
                lappend cols "B:${magnet}:sCurrentWF"
            }
        }
        exec sddsplot -split=page -sep=page \
          -yScalesGroup=namestring -graph=line,vary \
          -title=@Time -legend $file2 \
          -col=Index,([join $cols ,]) &
    }
    APSSetVarAndUpdate status "Done plotting"
}

proc GlitchChoiceCallback {item doubleClick} {
    global fileInfo filePageInfo
    if {$doubleClick} {
        APSSetVarAndUpdate status "Plotting..."
        PlotData -file $fileInfo($item) -page $filePageInfo($item)
    }
}


set status Working...
APSScrolledStatus .status \
  -parent .userFrame \
  -textVariable status \
  -packOption "-fill both -expand true" \
  -width 70

pack [frame .userFrame.top -bg red] -fill x
foreach magnet "BM QF QD SF SD" {
    set $magnet 1
}
APSCheckButtonFrame .supply \
  -parent .userFrame.top \
  -label "Supply" \
  -buttonList "BM QF QD SF SD" \
  -variableList "BM QF QD SF SD" \
  -packOption "-side left" \
  -allNone 1

set VoltageRefWF 1
set sPSVoltageWF 1
set sCurrentWF 1
APSCheckButtonFrame .waveform \
  -parent .userFrame.top \
  -label "Waveform" \
  -buttonList "VoltageRefWF sPSVoltageWF sCurrentWF" \
  -variableList "VoltageRefWF sPSVoltageWF sCurrentWF" \
  -packOption "-side left" \
  -allNone 1

APSScrolledList .glitchList \
  -parent .userFrame.top \
  -height 15 \
  -itemList <None> \
  -callback GlitchChoiceCallback \
  -selectMode single \
  -packOption "-side left -fill x -expand true" 
set glitchListWidget .userFrame.top.glitchList.listbox

update

set files [lsort -dictionary [glob -nocomplain /home/helios/oagData/glitchLogs/BoosterRamps/BoosterRamps-*]]

set triggers ""
set i 0
foreach suffix "SlopeErrAOTriggered SlopeErrAOTriggered DeltaIrmsAOTriggered" {
    foreach magnet "BM QF QD SF SD" {
        lappend triggers B:${magnet}:${suffix}$i
        incr i
    }
}
set triggers [join $triggers ,]

$glitchListWidget delete 0 end
foreach f $files {
    set timestamps [exec sdds2stream $f -parameter=TimeStamp,$triggers]
    set page 1
    foreach "ts BM1 QF1 QD1 SF1 SD1 BM2 QF2 QD2 SF2 SD2 BM3 QF3 QD3 SF3 SD3" $timestamps {
        set string "$ts"
        foreach magnet "BM QF QD SF SD" {
            set ${magnet}trigger 0
            for {set i 1} {$i <= 3} {incr i} {
                if {[set ${magnet}$i]} {
                    set ${magnet}trigger 1
                }
            }
            if {[set ${magnet}trigger]} {
                append string " ($magnet)"
            }
        }
        $glitchListWidget insert 0 $string
        set fileInfo($string) $f
        set filePageInfo($string) $page
        incr page
    }
    update
}
set status Ready...

