#!/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
set CVSRevisionAuthor "\$Revision: 1.8 $ \$Author: borland $"

set originalDir [pwd]

APSStandardSetup

set args $argv

set MonDataDirRoot /home/helios/oagData

set TabNameList ""
set DirectoryList ""
set RootnameList ""
proc AddToMonDataLists {name directory rootname} {
    global TabNameList DirectoryList RootnameList
    lappend TabNameList $name
    lappend DirectoryList $directory
    lappend RootnameList $rootname
}


AddToMonDataLists  "BPMs" logging/linacDiag linacDiag
AddToMonDataLists  "Power Supplies" monitoring/linacPS linacPS 
#AddToMonDataLists  "Gun" monitoring/gun gun 
#AddToMonDataLists  "Modulators" monitoring/linacModulators linacModulators 
#AddToMonDataLists  "RF" monitoring/linacRF linacRF 
#AddToMonDataLists  "Vacuum" monitoring/linacVacuum linacVacuum 
set DataDir ""

proc MakeDateTimeFrame {widget args} {
    set parent .
    APSStrictParseArguments {parent}
    set label "Date/Time Range of Interest"
    
    APSFrame $widget -parent $parent -label $label
    set w $parent$widget.frame
    
    APSDateTimeAdjEntry .startDate -parent $w \
      -yearVariable StartYear \
      -monthVariable StartMonth \
      -dayVariable StartDay \
      -hourVariable StartHour \
      -label "Starting date/time (year, month, day, hour): " -defaultHour 0 
    APSDateTimeAdjEntry .endDate -parent $w \
      -yearVariable EndYear \
      -monthVariable EndMonth \
      -dayVariable EndDay \
      -hourVariable EndHour \
      -label "Ending date/time (year, month, day, hour):   " -defaultHour 24 

    SetDateTimeToToday -rootname Start -hour 0
    SetDateTimeToToday -rootname End  -hour 24
}

proc SetDateTimeToToday {args} {
    set rootname ""
    set hour 0
    APSStrictParseArguments {rootname hour}

    global ${rootname} Month ${rootname}Year ${rootname}Day ${rootname}Hour
    
    APSDateBreakDown -dayVariable ${rootname}Day -yearVariable ${rootname}Year \
      -monthVariable ${rootname}Month -twoDigitYear 0 -leadingZeros 0
    set ${rootname}Hour $hour
}

proc SwitchBPMRegion {newRegion} {
    global BPMSumSignal BPMSumSignalLL BPMSumSignalUL BPMSparsingFactor BPMRegion
    global BPMNormSignal
    switch $newRegion {
        bypass {
            set BPMSumSignal BB:PM6:sum
            set BPMSumSignalLL 10
            set BPMSumSignalUL 1e6
            set BPMNormSignal PB:PM1:sum
        }
        undulator {
            set BPMSumSignal F:CM1:measCurrent
            set BPMSumSignalLL -1e6
            set BPMSumSignalUL -0.01
            set BPMNormSignal F:PM1:sum
        }
        default {
            set BPMSumSignal L5:P4:sum
            set BPMSumSignalLL 1e-3
            set BPMSumSignalUL 1
            set BPMNormSignal L2:P1:sum
        }
    }
}

proc FillBPMsFrame {parent} {
    global BPMSumSignal BPMSumSignalLL BPMSumSignalUL BPMSparsingFactor BPMRegion BPMTrajectoryReferenceFile
    global BPMNormSignal BPMTrajOutputFile BPMPlotMaxInMM BPMPlotMinInMM
    global StartYear StartDay StartHour StartMonth
    global EndYear EndDay EndHour EndMonth
    set BPMTrajOutputFile ""
    set BPMPlotMinInMM 0
    set BPMPlotMaxInMM 0
    set BPMSumSignal L5:P4:sum
    set BPMSumSignalLL 1e-3
    set BPMSumSignalUL 1
    set BPMSparsingFactor 1
    set BPMNormSignal L2:P1:sum
    set BPMRegion linac
    set BPMTrajectoryReferenceFile ""

    set row 0
    APSRadioButtonFrame .rb0 -parent $parent -label "Region: " \
      -gridPack "-row $row -column 0 -columnspan 3" \
      -orientation horizontal -valueList {linac bypass undulator} \
      -buttonList {Linac Bypass Undulator} -variable BPMRegion \
      -commandList {"SwitchBPMRegion linac" "SwitchBPMRegion bypass" \
                      "SwitchBPMRegion undulator" }
    incr row
    
    APSFrame .sumFilter -parent $parent -label "Sum signal filter" -gridPack "-row $row -column 0"
    set w $parent.sumFilter.frame
    APSLabeledEntry .le1 -parent $w -label "Signal name: " -textVariable BPMSumSignal
    APSLabeledEntry .le2 -parent $w -label "Lower limit: " -textVariable BPMSumSignalLL
    APSLabeledEntry .le3 -parent $w -label "Upper limit: " -textVariable BPMSumSignalUL

    APSLabeledEntry .normsig -parent $parent -label "Normalization signal: " \
      -textVariable BPMNormSignal -gridPack "-row $row -column 1"
    incr row

    APSLabeledEntry .minmm -parent $parent -label "Plot min. in mm: " \
      -textVariable BPMPlotMinInMM -gridPack "-row $row -column 0"
    APSLabeledEntry .maxmm -parent $parent -label "Plot max. in mm: " \
      -textVariable BPMPlotMaxInMM -gridPack "-row $row -column 1"
    incr row

    APSRadioButtonFrame .rb1 -parent $parent -label "Sparsing: " \
      -gridPack "-row $row -column 0 -columnspan 3" \
      -orientation horizontal -valueList {1 2 3 4 5 6 7 8 9 10 16 32 64} \
      -buttonList {None 2 3 4 5 6 7 8 9 10 16 32 64} \
      -variable BPMSparsingFactor
    incr row

    APSButton .intensity -parent $parent -text "Plot intensity vs time." -gridPack "-row $row -column 0" \
      -command {APSLinacPlotIntensities \
                  -region $BPMRegion \
                  -sparsingFactor $BPMSparsingFactor \
                  -startYear $StartYear -startMonth $StartMonth \
                  -startDay $StartDay -startHour $StartHour \
                  -endYear $EndYear -endMonth $EndMonth \
                  -endDay $EndDay -endHour $EndHour \
                  -filterSignalName $BPMSumSignal -filterSignalLL $BPMSumSignalLL \
                  -filterSignalUL $BPMSumSignalUL \
                  -statusCallback "APSSetVarAndUpdate status" }

    APSButton .nintensity -parent $parent -text "Plot normalized intensity vs time." \
      -gridPack "-row $row -column 1" \
      -command {APSLinacPlotIntensities -normalizeTo $BPMNormSignal \
                  -region $BPMRegion \
                  -sparsingFactor $BPMSparsingFactor \
                  -startYear $StartYear -startMonth $StartMonth \
                  -startDay $StartDay -startHour $StartHour \
                  -endYear $EndYear -endMonth $EndMonth \
                  -endDay $EndDay -endHour $EndHour \
                  -filterSignalName $BPMSumSignal -filterSignalLL $BPMSumSignalLL \
                  -filterSignalUL $BPMSumSignalUL \
                  -statusCallback "APSSetVarAndUpdate status" }
    incr row

    APSButton .plottraj -parent $parent -text "Plot trajectories" -gridPack "-row $row -column 0" -command \
      {APSMakeLinacTrajectories -plot 1 \
         -region $BPMRegion -referenceFile $BPMTrajectoryReferenceFile \
         -type BPM -dataDirectory /home/helios/oagData/monitoring/linacDiag \
         -rootname linacDiag -sparsingFactor $BPMSparsingFactor \
         -startYear $StartYear -startMonth $StartMonth \
         -startDay $StartDay -startHour $StartHour \
         -endYear $EndYear -endMonth $EndMonth \
         -endDay $EndDay -endHour $EndHour \
         -filterSignalName $BPMSumSignal -filterSignalLL $BPMSumSignalLL \
         -filterSignalUL $BPMSumSignalUL \
         -plotMinMM $BPMPlotMinInMM -plotMaxMM $BPMPlotMaxInMM \
         -statusCallback "APSSetVarAndUpdate status" }

    APSButton .plotavetraj -parent $parent -text "Plot average trajectory" -gridPack "-row $row -column 1" \
      -command \
      {APSMakeLinacTrajectories -plot 1 -average 1 \
         -region $BPMRegion -referenceFile $BPMTrajectoryReferenceFile \
         -type BPM -dataDirectory /home/helios/oagData/monitoring/linacDiag \
         -rootname linacDiag -sparsingFactor $BPMSparsingFactor \
         -startYear $StartYear -startMonth $StartMonth \
         -startDay $StartDay -startHour $StartHour \
         -endYear $EndYear -endMonth $EndMonth \
         -endDay $EndDay -endHour $EndHour \
         -filterSignalName $BPMSumSignal -filterSignalLL $BPMSumSignalLL \
         -filterSignalUL $BPMSumSignalUL \
         -plotMinMM $BPMPlotMinInMM -plotMaxMM $BPMPlotMaxInMM \
         -statusCallback "APSSetVarAndUpdate status" }
    incr row

    APSButton .exporttraj -parent $parent -text "Export average trajectory -> " -gridPack "-row $row -column 0" \
      -command \
      {APSMakeLinacTrajectories -plot 0 -average 1 -exportFile $BPMExportFile \
         -region $BPMRegion \
         -type BPM -dataDirectory /home/helios/oagData/monitoring/linacDiag \
         -rootname linacDiag -sparsingFactor $BPMSparsingFactor \
         -startYear $StartYear -startMonth $StartMonth \
         -startDay $StartDay -startHour $StartHour \
         -endYear $EndYear -endMonth $EndMonth \
         -endDay $EndDay -endHour $EndHour \
         -filterSignalName $BPMSumSignal -filterSignalLL $BPMSumSignalLL \
         -filterSignalUL $BPMSumSignalUL \
         -statusCallback "APSSetVarAndUpdate status" }
    APSLabeledEntry .exportFile -parent $parent -label "" -gridPack "-row $row -column 1" \
      -textVariable BPMExportFile -width 50
    incr row

    APSLabeledEntry .refFile -parent $parent -label "Trajectory reference file (optional)" \
      -gridPack "-row $row -column 0 -columnspan 2" \
      -textVariable BPMTrajectoryReferenceFile -width 50 \
      -contextHelp "Enter the name of a file created with the export button above.  It will be subtracted from all displayed and exported trajectories."
}

proc FillPowerSupplyFrame {parent} {
    global StartYear StartDay StartHour StartMonth
    global EndYear EndDay EndHour EndMonth
    global PSSparsingFactor 
    set PSSparsingFactor 1

    APSRadioButtonFrame .rb1 -parent $parent -label "Sparsing: " \
      -gridPack "-row 0 -column 0 -columnspan 4" \
      -orientation horizontal -valueList {1 2 3 4 5 6 7 8 9 10 16 32 64} \
      -buttonList {None 2 3 4 5 6 7 8 9 10 16 32 64} \
      -variable PSSparsingFactor

    APSFrame .buttons -parent $parent -label "" -relief flat \
      -gridPack "-row 1 -column 0 -columnspan 4"
    set w $parent.buttons.frame
    
    APSButton .intensity -parent $w -text "Plot correctors vs time." \
      -command {APSLinacPlotCorrectors \
                  -sparsingFactor $PSSparsingFactor \
                  -startYear $StartYear -startMonth $StartMonth \
                  -startDay $StartDay -startHour $StartHour \
                  -endYear $EndYear -endMonth $EndMonth \
                  -endDay $EndDay -endHour $EndHour \
                  -statusCallback "APSSetVarAndUpdate status" }
    
    APSButton .traj -parent $w -text "Plot corrector movie" -command \
      {APSMakeLinacTrajectories -plot 1 \
         -type corrector -dataDirectory /home/helios/oagData/monitoring/linacPS \
         -rootname linacPS -sparsingFactor $PSSparsingFactor \
         -startYear $StartYear -startMonth $StartMonth \
         -startDay $StartDay -startHour $StartHour \
         -endYear $EndYear -endMonth $EndMonth \
         -endDay $EndDay -endHour $EndHour \
         -statusCallback "APSSetVarAndUpdate status" }
}

proc APSConvertDateTimeToEpoch {args} {
    set year 0
    set day 0
    set month 0
    set hour 0
    APSStrictParseArguments {year day month hour}

    if [catch {APSConvertTimeToHours $hour} hour0] {
        return -code error "Invalid hour: $hour"
    }
    if [catch {exec timeconvert \
                 -breakdown=year=$year,day=$day,month=$month,hour=$hour0} epochTime] {
        return -code error "$epochTime"
    }
    return $epochTime
}

proc APSLinacFindFiles {args} {
    set dataDirectory ""
    set rootname ""
    set startYear 0
    set startMonth 0
    set startDay 0
    set startHour 0
    set endYear 0
    set endMonth 0
    set endDay 0
    set endHour 24
    APSStrictParseArguments {dataDirectory rootname \
                               startYear startMonth startDay startHour \
                               endYear endMonth endDay endHour}

    return [APSFindFilesBetweenDates -tailsOnly 0 -rootname ${rootname}- -directory $dataDirectory \
              -startDateList [APSFormatDate -year $startYear -day $startDay -month $startMonth \
                                -dateFormat list] \
              -endDateList [APSFormatDate -year $endYear -day $endDay -month $endMonth \
                              -dateFormat list] ]
}

proc APSLinacPlotIntensities {args} {
    set filterSignalName ""
    set filterSignalLL 0
    set filterSignalUL 0
    set sparsingFactor 1
    set region linac
    set startYear 0
    set startMonth 0
    set startDay 0
    set startHour 0
    set endYear 0
    set endMonth 0
    set endDay 0
    set endHour 24
    set statusCallback APSNoOp
    set normalizeTo ""
    APSStrictParseArguments {filterSignalName filterSignalLL filterSignalUL \
                               sparsingFactor normalizeTo region \
                               startYear startMonth startDay startHour \
                               endYear endMonth endDay endHour statusCallback}
    
    set dataFileList \
      [APSLinacFindFiles -dataDirectory /home/helios/oagData/monitoring/linacDiag \
         -rootname linacDiag \
         -startYear $startYear -startMonth $startMonth -startDay $startDay -startHour $startHour \
         -endYear $endYear -endMonth $endMonth -endDay $endDay -endHour $endHour]
    eval $statusCallback {"[llength $dataFileList] files found"}
    if ![llength $dataFileList] return
    set time0 [APSConvertDateTimeToEpoch \
                 -year $startYear -month $startMonth -day $startDay -hour $startHour]
    set time1 [APSConvertDateTimeToEpoch \
                 -year $endYear -month $endMonth -day $endDay -hour $endHour]

    set filterSignalName [string trim $filterSignalName]
    set filterOption ""
    if {[string length $filterSignalName] && $filterSignalLL<$filterSignalUL} {
        set filterOption -filter=column,$filterSignalName,$filterSignalLL,$filterSignalUL
    }

    switch $region {
        bypass {
            set columnFilter ?B:PM*:sum
        }
        undulator {
            set columnFilter F:PM*:sum
        }
        default {
            set columnFilter L?:P?:sum
        }
    }
    set normalizeTo [string trim $normalizeTo]
    set xgap [expr $sparsingFactor*30.0]
    if [string length $normalizeTo] {
        set tmpFile /tmp/[APSTmpString]
        APSAddToTempFileList $tmpFile
        if [catch {eval exec sddscombine -recover $dataFileList -pipe=out -merge \
                     -retain=column,Time,$columnFilter,$filterSignalName -sparse=$sparsingFactor \
                     | sddsprocess -pipe=in $tmpFile $filterOption \
                     -filter=col,Time,$time0,$time1 -process=$normalizeTo,ave,RefSumAve \
                     {"-redefine=column,%s,%s RefSumAve /,select=$columnFilter,units=Ave($normalizeTo)"}} result] {
            return -code error "$result"
        }
        set sparsingFactor 1
        set filterOption ""
        set dataFileList $tmpFile
    }
        
    eval exec sddsplot $dataFileList -presparse=$sparsingFactor $filterOption \
      -sever=xgap=$xgap -groupby=names -separate=names \
      -filter=column,Time,$time0,$time1 -unsup=y \
      -column=Time,$columnFilter -ticks=xtime &
    eval $statusCallback {"Plot launched."}
}

proc APSMakeLinacTrajectories {args} {
    set plot 0
    set average 0
    set exportFile ""
    set referenceFile ""
    set type BPM 
    set region linac
    set filterSignalName ""
    set filterSignalLL 0
    set filterSignalUL 0
    set dataDirectory ""
    set sparsingFactor 1
    set rootname ""
    set startYear 0
    set startMonth 0
    set startDay 0
    set startHour 0
    set endYear 0
    set endMonth 0
    set endDay 0
    set endHour 24
    set statusCallback APSNoOp
    set plotMinMM 0 
    set plotMaxMM 0
    APSStrictParseArguments {type filterSignalName filterSignalLL filterSignalUL referenceFile \
                               dataDirectory rootname sparsingFactor region plot average exportFile \
                               startYear startMonth startDay startHour \
                               endYear endMonth endDay endHour plotMinMM plotMaxMM statusCallback}

    set type [string tolower $type]
    if [lsearch -exact [list bpm corrector] $type]==-1 {
        return -code error "APSMakeLinacTrajectories: unknown type: $type"
    }
    switch $type {
        bpm {
            set linacOrderFile /home/helios/oagData/logging/linacDiag/linacDiag.bpmOrder
            switch $region {
                linac {
                    lappend signalList L?:P*x L?:P*y L?:P*sum
                    set convertOption -delete=column,L*FCN*,F*,?B*
                }
                bypass {
                    lappend signalList ?B:PM*x ?B:PM*y ?B:PM*sum
                    set convertOption -delete=column,L*,F*
                }
                undulator {
                    lappend signalList F:PM*x F:PM*y F:PM*sum
                    set convertOption -delete=column,L*,?B*
                }
            }
            lappend xrefCommand  sddsxref -pipe $linacOrderFile -match=Rootname=BPMName -take=Index -nowarning -reuse=page
            set sortColumn Index
            lappend collectOptionList \
              -collect=suffix=:x,column=x -collect=suffix=:y,column=y  \
              -collect=suffix=:sum,column=sumSignal
            lappend envelopeOptionList -mean=x -mean=y -mean=sumSignal 
            lappend envelopeOptionList -sigma=x -sigma=y -sigma=sumSignal 
            lappend envelopeOptionList -stand=x -stand=y -stand=sumSignal 
            if !$average {
                if [string length $referenceFile] {
                    lappend plotPairsList -column=Rootname,xDelta -column=Rootname,yDelta \
                      -scale=0,0,$plotMinMM,$plotMaxMM \
                      -column=Rootname,sumSignalDelta
                } else {
                    lappend plotPairsList -column=Rootname,x -column=Rootname,y \
                      -scale=0,0,$plotMinMM,$plotMaxMM -column=Rootname,sumSignal
                }
                set graphicType line,vary
            } else {
                if [string length $referenceFile] {
                    lappend plotPairsList \
                      -column=Rootname,xMeanDelta,xDeltaSigma \
                      -column=Rootname,yMeanDelta,yDeltaSigma \
                      -scale=0,0,$plotMinMM,$plotMaxMM \
                      -column=Rootname,sumSignalMeanDelta,sumSignalDeltaSigma
                } else {
                    lappend plotPairsList -column=Rootname,xMean,xSigma -column=Rootname,yMean,ySigma \
                      -scale=0,0,$plotMinMM,$plotMaxMM \
                      -column=Rootname,sumSignalMean,sumSignalSigma
                }
                set graphicType error,vary=subtype
            }
        }
        corrector {
            lappend signalList L?:*HZ*MeasCurrent L?:*VL*MeasCurrent
            set convertOption -editNames=column,*,%/:MeasCurrent//
            lappend collectOptionList -collect=suffix=HZ,column=H -collect=suffix=VL,column=V
            lappend envelopeOptionList -mean=H -mean=V
            lappend envelopeOptionList -sigma=H -sigma=V
            lappend envelopeOptionList -stand=H -stand=V
            set xrefCommand cat
            set sortColumn Rootname
            if !$average {
                if [string length $referenceFile] {
                    lappend plotPairsList -column=Rootname,HDelta -column=Rootname,VDelta
                } else {
                    lappend plotPairsList -column=Rootname,H -column=Rootname,V
                }
                set graphicType line,vary
            } else {
                if [string length $referenceFile] {
                    lappend plotPairsList \
                      -column=Rootname,HMeanDelta,HDeltaSigma \
                      -column=Rootname,VMeanDelta,VDeltaSigma
                } else {
                    lappend plotPairsList -column=Rootname,HMean,HSigma -column=Rootname,VMean,VSigma
                }
                set graphicType error,vary=subtype
            }
        }
    }

    set dataFileList \
      [APSLinacFindFiles -dataDirectory $dataDirectory -rootname $rootname \
         -startYear $startYear -startMonth $startMonth -startDay $startDay -startHour $startHour \
         -endYear $endYear -endMonth $endMonth -endDay $endDay -endHour $endHour]
    eval $statusCallback {"[llength $dataFileList] files found"}
    if ![llength $dataFileList] return
    set time0 [APSConvertDateTimeToEpoch \
                 -year $startYear -month $startMonth -day $startDay -hour $startHour]
    set time1 [APSConvertDateTimeToEpoch \
                 -year $endYear -month $endMonth -day $endDay -hour $endHour]

    set filterSignalName [string trim $filterSignalName]
    set filterOption ""
    if {[string length $filterSignalName] && $filterSignalLL<$filterSignalUL} {
        set filterOption -filter=column,$filterSignalName,$filterSignalLL,$filterSignalUL
        lappend signalList $filterSignalName
    }
    set tmpFile /tmp/[APSTmpString]
    APSAddToTempFileList $tmpFile $tmpFile.1 $tmpFile.2
    
    eval $statusCallback {"Processing data..."}
    if [catch {eval exec sddscombine -recover $dataFileList -pipe=out -merge \
                 -merge -retain=column,[join $signalList ,],Time -sparse=$sparsingFactor \
                 | sddsconvert -pipe $convertOption \
                 | sddsprocess -pipe $filterOption \
                 -filter=column,Time,$time0,$time1 \
                 | sddscollect -pipe $collectOptionList -nowarning \
                 | $xrefCommand \
                 | sddstimeconvert -pipe \
                 -breakdown=parameter,Time,text=TimeText \
                 | sddssort -pipe=in -column=$sortColumn $tmpFile} result] {
        return -code error "$result"
    }
    if $average {
        if [catch {eval exec sddsenvelope $tmpFile -pipe=out \
                     -copy=Rootname -copy=Index $envelopeOptionList \
                     | sddsprocess -pipe=in $tmpFile.1 \
                     -print=parameter,Region,$region \
                     {"-print=parameter,TimeText,Averaged from $startYear/$startMonth/$startDay@$startHour to $endYear/$endMonth/$endDay@$endHour"}
            file rename -force $tmpFile.1 $tmpFile} result] {
            return -code error "$result"
        }
    }
    if [string length $referenceFile] {
        if ![file exists $referenceFile] {
            return -code error "Not found: $referenceFile"
        }
        if [catch {exec sdds2stream -parameter=Region $referenceFile} result] {
            return -code error "Invalid reference file: $result"
        }
        if [string compare $result $region]!=0 {
            return -code error "File $referenceFile is for region $result, not $region."
        }
        if $average {
            if [catch {exec sddsconvert $referenceFile $tmpFile.1 \
                         -edit=column,x*,ei/0/ -edit=column,y*,ei/0/ \
                         -edit=column,sumSignal*,ei/0/
                exec sddsxref $tmpFile $tmpFile.1 -pipe=out -match=Rootname -take=*0 -reuse=page \
                         | sddsprocess -pipe=in $tmpFile.2 \
                         "-define=column,xMeanDelta,xMean xMean0 - ,units=mm" \
                         "-define=column,yMeanDelta,yMean yMean0 - ,units=mm" \
                         "-define=column,sumSignalMeanDelta,sumSignalMean sumSignalMean0 - ,units=?" \
                         "-define=column,xDeltaSigma,xSigma sqr xSigma0 sqr + sqrt,units=mm" \
                         "-define=column,yDeltaSigma,ySigma sqr ySigma0 sqr + sqrt,units=mm" \
                         "-define=column,sumSignalDeltaSigma,sumSignalSigma sqr sumSignalSigma0 sqr + sqrt,units=?" 
                file rename -force $tmpFile.2 $tmpFile} result] {
                return -code error "Problem subtracting reference file: $result"
            }
        } else {
            if [catch {exec sddsconvert $referenceFile $tmpFile.1 \
                         -edit=column,x*,ei/0/ -edit=column,y*,ei/0/ \
                         -edit=column,sumSignal*,ei/0/
                exec sddsxref $tmpFile $tmpFile.1 -pipe=out -match=Rootname -take=*0 -reuse=page \
                         | sddsprocess -pipe=in $tmpFile.2 \
                         "-define=column,xDelta,x xMean0 - ,units=mm" \
                         "-define=column,yDelta,y yMean0 - ,units=mm" \
                         "-define=column,sumSignalDelta,sumSignal sumSignalMean0 - ,units=?"
                file rename -force $tmpFile.2 $tmpFile} result] {
                return -code error "Problem subtracting reference file: $result"
            }
        }
    }
    if $plot {
        eval $statusCallback {"Plot launched."}
        eval exec sddsplot $tmpFile -graph=$graphicType -separate=page -group=page,names \
          -split=page -same -legend -title=@TimeText -unsup=y \
          $plotPairsList -yscale=names &
    }
    if [string length $exportFile] {
        if {[file exists $exportFile] && \
              ![APSMultipleChoice [APSUniqueName .] \
                  -question "$exportFile already exists.  What do you want to do?" \
                  -labelList {Overwrite Cancel} -returnList {1 0}]} {
            return
        }
        file copy -force $tmpFile $exportFile
        eval $statusCallback {"Data exported."}
    }
}

APSApplication . -name ReviewLinacDataLogs -version $CVSRevisionAuthor -overview ""

set status ""
APSScrolledStatus .status -parent .userFrame -textVariable status -width 60

set tabFrameWidgetList [APSTabFrame .main -parent .userFrame -label "" \
                  -labelList $TabNameList -width 800 -height 400]

MakeDateTimeFrame .datetime -parent .userFrame

FillBPMsFrame [lindex $tabFrameWidgetList [lsearch $TabNameList BPM*]]
FillPowerSupplyFrame [lindex $tabFrameWidgetList [lsearch $TabNameList Power*]]



