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

# $Log: not supported by cvs2svn $
# Revision 1.2  2010/12/09 16:08:27  shang
# normalized the current and change the FFT plots to use log scale.
#
# Revision 1.1  2010/12/07 19:07:43  shang
# for collecting booster ramp current waveforms and fft processing.
#

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.3 $ \$Author: shang $"

proc ReadCurrentWF {args} {
    global outputDir
    SetStatus "collecting data..."
    set filename $outputDir/BRamp-[clock format [clock seconds] -format %Y-%j-%m%d.%H%M%S]
    if [catch {exec  sddswmonitor -erase $filename.1 -step=10 \
                 -pvnames=B:BM:CurrentWF,B:QF:CurrentWF,B:QD:CurrentWF,B:SF:CurrentWF,B:SD:CurrentWF,B:SF-U:CurrentWF,B:SD-U:CurrentWF } result] {
        return -code error "Error in reading booster ramp current waveforms: $result"
    }

    if [catch {exec cavget -list=B:SampleperiodAI -pend=20} sampleInterval] {
        puts stderr "error reading B:SampleperiodAI: $sampleInterval"
        exit 1
    }
    set timePerPointNew [expr $sampleInterval / 4000.0]
    foreach magnet {BM QF QD SF SD SF-U SD-U} {
        if [catch {exec cavget -list=B:${magnet}:SlopeInterceptSUB. -list=L,K,D -pend=10 } valueList] {
            puts stderr "Error in reading $magnet offset and scaling: $result"
            exit 1
        }
        set ${magnet}CurrentScale [lindex $valueList 1]
        set ${magnet}CurrentOffset [lindex $valueList 0]
        set ${magnet}TimeShift [lindex $valueList 2]    
    }
    foreach magnet {BM QF QD SF SD} {
        set timeShift [set ${magnet}TimeShift]
        if [catch {exec sddsprocess $filename.1 -pipe=out "-redefine=col,time,Index $timePerPointNew * $timeShift -" \
                     | sddsconvert -pipe -retain=col,time,*${magnet}*WF \
                     | sddsinterp -pipe=in $filename.$magnet -sequence=5274,0,514.90233332 \
                     -col=time,*WF -aboveRange=saturate} result] {
            return -code error $result
        }
    }
    if [catch {exec sddsxref $filename.BM $filename.QF $filename.QD $filename.SF $filename.SD \
                 -leave=time $filename } result] {
        return -code error "error in combining data: $result"
    }
    file delete -force $filename.BM $filename.QF $filename.QD $filename.SF $filename.SD $filename.1
    
    if [catch {exec  sddsprocess $filename -pipe=out \
                 "-redefine=col,Index,i_row,type=long" \
                 "-redefine=col,B:BM:CurrentWF,B:BM:CurrentWF $BMCurrentScale * $BMCurrentOffset +,units=Amperes" \
                 "-redefine=col,B:QF:CurrentWF,B:QF:CurrentWF $QFCurrentScale * $QFCurrentOffset +,units=Amperes" \
                 "-redefine=col,B:QD:CurrentWF,B:QD:CurrentWF $QDCurrentScale * $QDCurrentOffset +,units=Amperes" \
                 "-redefine=col,B:SF:CurrentWF,B:SF:CurrentWF $SFCurrentScale * $SFCurrentOffset +,units=Amperes" \
                 "-redefine=col,B:SD:CurrentWF,B:SD:CurrentWF $SDCurrentScale * $SDCurrentOffset +,units=Amperes" \
                 "-redefine=col,B:SF-U:CurrentWF,B:SF-U:CurrentWF $SFCurrentScale * $SFCurrentOffset +,units=Amperes" \
                 "-redefine=col,B:SD-U:CurrentWF,B:SD-U:CurrentWF $SDCurrentScale * $SDCurrentOffset +,units=Amperes" \
                 "-redefine=col,RampTime,Index 10.240 /,units=ms" \
                 | sddsprocess -pipe=in ${filename}.sdds \
                 "-redefine=col,B:BM:CurrentWF,B:BM:CurrentWF 0.015259021896696 *,units=V" \
                 "-redefine=col,B:QF:CurrentWF,B:QF:CurrentWF 0.015259021896696 *,units=V" \
                 "-redefine=col,B:QD:CurrentWF,B:QD:CurrentWF 0.015259021896696 *,units=V" \
                 "-redefine=col,B:SF:CurrentWF,B:SF:CurrentWF 0.002288853284504 *,units=V" \
                 "-redefine=col,B:SD:CurrentWF,B:SD:CurrentWF 0.002288853284504 *,units=V" \
                 "-redefine=col,B:SF-U:CurrentWF,B:SF-U:CurrentWF 0.002288853284504 *,units=V" \
                 "-redefine=col,B:SD-U:CurrentWF,B:SD-U:CurrentWF 0.002288853284504 *,units=V" \
             } result] {
        return -code error  "Error in processing booster ramp current waveforms: $result"
    }
    file delete -force $filename
    exec sddsplot -grap=line,vary -leg -sep=5  -split=pages -col=RampTime,*WF ${filename}.sdds &
    ProcessFFT -filename ${filename}.sdds
    SetStatus "done."
}

proc ProcessFFT {args} {
    set filename ""
    set magnet ""
    APSParseArguments {filename magnet}
    global outputDir BM SD SF QD QF SF-U SD-U fileSelected BMstart BMend QDstart QDend SFstart SFend SDstart SDend QFstart QFend
    global SF-Ustart SF-Uend SD-Ustart SD-Uend
    if ![string length $magnet] {
        set magnetList {BM SD SF QD QF SF-U SD-U}
    } else {
        set magnetList $magnet
        set $magnet 1
    }
    foreach magnet $magnetList {
        set start [set ${magnet}start]
        set end [set ${magnet}end]
        if [catch {exec sddsprocess $filename \
                     -filter=col,RampTime,$start,$end  -pipe=out \
                     | sddsprocess -pipe -proc=B:${magnet}:CurrentWF,max,MaxCurr \
                     | sddsprocess -pipe "-redefine=col,B:${magnet}:CurrentWF, B:${magnet}:CurrentWF MaxCurr / 10 *" \
                     | sddspfit -col=RampTime,B:${magnet}:CurrentWF \
                     -copyParameters  -pipe  \
                     | sddsprocess \
                     -redefine=col,${magnet}MagnetI,B:${magnet}:CurrentWFResidual \
                     "-redefine=col,RampTime,RampTime 1000 /,units=s" -pipe \
                     |  tee ${filename}-${magnet}-pfit \
                     | sddsfft -col=RampTime,${magnet}MagnetI \
                     -padwithzeroes=3 -windows \
                     -pipe=in ${filename}-${magnet}-fft } result] {
            return -code error "Error in process $magnet: $result"
        }
        if [set $magnet] {
            exec sddsplot -col=f,FFT${magnet}MagnetI ${filename}-${magnet}-fft -mode=y=log -tick=ylog  \
              -split=pages -filter=col,f,0,2000 "-title=FFT of $magnet after normalized to 10V." \
              -grap=dot,vary -file &
        }
    }
}

proc SetStatus {text} {
    global status
    set status "[exec date] $text"
    update
}
proc ReviewData {args} {
    global outputDir BM SD SF QD QF SF-U SD-U fileSelected BMstart BMend QDstart QDend SFstart SFend SDstart SDend QFstart QFend reprocessFFT
    set oldDir [pwd]
    cd $outputDir
    set files [lsort -decreasing [glob -nocomplain BRamp*.sdds]]
    if ![llength $files] {
        SetStatus "No files found."
        return
    }
    set fileSelected ""
    APSScrolledListWindow .fileselect -name "Select ramp current waveforms" \
        -label "Select files"  \
        -itemList $files -selectionVar fileSelected \
        -directory $outputDir  \
        -rootnameOnly 1 
    tkwait variable fileSelected
    foreach file $fileSelected {
        exec sddsplot -grap=line,vary -leg -sep=5  -split=pages -col=RampTime,*WF $file &
        foreach magnet {BM SD SF QD QF SF-U SD-U} {
            if [set $magnet] {
                if {![file exist ${file}-${magnet}-fft] || $reprocessFFT} {
                    if [catch {ProcessFFT -filename $outputDir/$file -magnet $magnet} result] {
                        return -code error "error in processing FFT of $magnet: $result"
                    }
                }
                exec sddsplot -col=f,FFT${magnet}MagnetI ${file}-${magnet}-fft -mode=y=log -tick=ylog  \
                  -split=pages -filter=col,f,0,2000 \
                  -grap=dot,vary -file &
            }
        }
    }
    cd $oldDir
}

foreach ramp {BM SF SD QF QD SF-U SD-U} {
    set ${ramp}start 40
    set ${ramp}end 250
    set ${ramp} 1
}
set reprocessFFT 0
set SF 0
set SD 0
set outputDir [APSGoToDailyDirectory -subdirectory bRampCurrent]

set status ""
APSApplication . -name BRampCurrentFFT -version "$CVSRevisionAuthor" \
  -overview {This utility collects Booster ramps current waveform and does FFT process}

APSScrolledStatus .status  -parent .userFrame  -textVariable status -width 60 \
  -height 8 -withButtons 1 -packOption "-fill x"

APSLabeledEntry .dir -parent .userFrame -label "Output dir:" -textVariable outputDir -width 70
APSLabel .label -parent .userFrame -text "                                 Fit StartTime(ms)      Fit EndTime (ms)"
APSLabeledEntryFrame .bm -parent .userFrame -label "BM:" -width 21 \
  -variableList {BMstart BMend} -orientation horizontal
APSLabeledEntryFrame .sf -parent .userFrame -label "SF:" -width 21 \
  -variableList {SFstart SFend} -orientation horizontal
APSLabeledEntryFrame .sd -parent .userFrame -label "SD:" -width 21 \
  -variableList {SDstart SDend} -orientation horizontal
APSLabeledEntryFrame .qf -parent .userFrame -label "QF:" -width 21 \
  -variableList {QFstart QFend} -orientation horizontal
APSLabeledEntryFrame .qd -parent .userFrame -label "QD:" -width 21 \
  -variableList {QDstart QDend} -orientation horizontal
APSCheckButtonFrame .sel -parent .userFrame -label "Select magnet for FFT plot:" -buttonList {BM QF QD SF SD SF-U SD-U} \
  -variableList {BM QF QD SF SD SF-U SD-U} -orientation horizontal -allNone 1
APSRadioButtonFrame .rep -parent .userFrame -label "Reprocess FFT?" -buttonList {Yes No} -valueList {1 0} \
  -variable reprocessFFT -orientation horizontal
APSButton .collect -parent .userFrame -text "Collect Data" -command "ReadCurrentWF"
APSButton .process -parent .userFrame -text "Review Data" -command "ReviewData"

