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

set monFile /home/helios/oagData/logging/FOE/FOE.mon

proc InitTheme {} {
 
    #TButton Options
    #.border -background -borderwidth -relief
    #.focus -focuscolor -focusthickness
    #.padding -padding -relief -shiftrelief
    #.label -compound -space -text -font -foreground -underline -width 
    #       -anchor -justify -wraplength -embossed -image -stipple -background

    ttk::style configure Tight.TButton -padding 2 -shiftrelief 0 -focusthickness 0 -width 0


    #TSpinbox Options
    #.field -fieldbackground -borderwidth
    #.uparrow -background -relief -borderwidth -arrowcolor -arrowsize
    #.downarrow -background -relief -borderwidth -arrowcolor -arrowsize
    #.padding -padding -relief -shiftrelief
    #.textarea -font -width
    #puts [ttk::style layout TSpinbox]
    #puts [ttk::style element options Spinbox.textarea]
    ttk::style configure Tall.TSpinbox -arrowsize 12
}
 
InitTheme 

proc SetupGUI {} {
    global monFile status sectors
    APSApplication . -name "First Optical Enclosure Occupancy" 
    
    set status "Calculates the length of time a FOE door is open while\nzones A-F are in beam permit mode."
    APSScrolledStatus .status \
      -parent .userFrame \
      -textVariable status \
      -width 50 \
      -height 20 \
      -packOption "-fill both -expand true"
    set status Ready...
    
    if {[catch {exec sdds2stream $monFile -col=ControlName} results]} {
        set status $results
        return
    }
    foreach pv $results {
        set sector [string range $pv 3 6]
        if {([string range $sector 2 3] == "BM") ||
            ([string range $sector 2 3] == "ID")} {
            lappend sectors $sector
        }
    }
    set sectors [lsort -unique $sectors]
    eval global $sectors
    
    APSCheckButtonFrame .cbf \
      -parent .userFrame \
      -label "Frontend Beamlines" \
      -limitPerRow 6 \
      -allNone 1 \
      -buttonList $sectors \
      -variableList $sectors

    MakeDateTimeFrame .userFrame.date

    APSButton .calcOccupancy \
      -parent .userFrame \
      -width "" \
      -text "Calculate Occupancy Time" \
      -command CalcOccupancy
}
proc MakeDateTimeFrame {frame} {
    global StartTextDay StartDay StartTextMonth StartYear 
    global StartHour StartMinute StartSecond StartTime
    global EndTextDay EndDay EndTextMonth EndYear 
    global EndHour EndMinute EndSecond EndTime

    set s [clock seconds]

    ttk::frame $frame -padding 2
    pack $frame

    ttk::frame $frame.from
    pack $frame.from 
    set f $frame.from

    ttk::label $f.label -text "From:"
    ttk::spinbox $f.textday -values "Mon Tue Wed Thu Fri Sat Sun" \
      -width 3 -wrap true -textvariable StartTextDay \
      -style Tall.TSpinbox
    bindtags $f.textday "TSpinbox . all .userFrame.date.from.textday "
    bind $f.textday <<Increment>> "TimeAdjusted Start %W up"
    bind $f.textday <<Decrement>> "TimeAdjusted Start %W down"
    ttk::spinbox $f.day -from 1 -to 31 -width 2 -wrap true \
      -textvariable StartDay \
      -validate key -validatecommand {string is integer %P} \
      -style Tall.TSpinbox
    bindtags $f.day "TSpinbox . all .userFrame.date.from.day "
    bind $f.day <<Increment>> "TimeAdjusted Start %W up"
    bind $f.day <<Decrement>> "TimeAdjusted Start %W down"
    ttk::spinbox $f.month \
      -values "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" \
      -width 3 -wrap true -textvariable StartTextMonth \
      -style Tall.TSpinbox
    bindtags $f.month "TSpinbox . all .userFrame.date.from.month "
    bind $f.month <<Increment>> "TimeAdjusted Start %W up"
    bind $f.month <<Decrement>> "TimeAdjusted Start %W down"
    ttk::spinbox $f.year -from 1900 -to 2100 -width 4 -wrap true \
      -textvariable StartYear \
      -validate key -validatecommand {string is integer %P} \
      -style Tall.TSpinbox
    bindtags $f.year "TSpinbox . all .userFrame.date.from.year "
    bind $f.year <<Increment>> "TimeAdjusted Start %W up"
    bind $f.year <<Decrement>> "TimeAdjusted Start %W down"
    ttk::label $f.space -text " "
    ttk::spinbox $f.hour -from 0 -to 23 -width 2 -wrap true \
      -format %02.0f -textvariable StartHour \
      -validate key -validatecommand {string is integer %P} \
      -style Tall.TSpinbox
    bindtags $f.hour "TSpinbox . all .userFrame.date.from.hour "
    bind $f.hour <<Increment>> "TimeAdjusted Start %W up"
    bind $f.hour <<Decrement>> "TimeAdjusted Start %W down"
    ttk::label $f.colon1 -text ":"
    ttk::spinbox $f.minute -from 0 -to 59 -width 2 -wrap true \
      -format %02.0f -textvariable StartMinute \
      -validate key -validatecommand {string is integer %P} \
      -style Tall.TSpinbox
    bindtags $f.minute "TSpinbox . all .userFrame.date.from.minute "
    bind $f.minute <<Increment>> "TimeAdjusted Start %W up"
    bind $f.minute <<Decrement>> "TimeAdjusted Start %W down"
    ttk::label $f.colon2 -text ":"
    ttk::spinbox $f.second -from 0 -to 59 -width 2 -wrap true \
      -format %02.0f -textvariable StartSecond \
      -validate key -validatecommand {string is integer %P} \
      -style Tall.TSpinbox
    bindtags $f.second "TSpinbox . all .userFrame.date.from.second "
    bind $f.second <<Increment>> "TimeAdjusted Start %W up"
    bind $f.second <<Decrement>> "TimeAdjusted Start %W down"

    bind $f.textday <Return> "TimeAdjustedManually"
    bind $f.day <Return> "TimeAdjustedManually"
    bind $f.month <Return> "TimeAdjustedManually"
    bind $f.year <Return> "TimeAdjustedManually"
    bind $f.hour <Return> "TimeAdjustedManually"
    bind $f.minute <Return> "TimeAdjustedManually"
    bind $f.second <Return> "TimeAdjustedManually"

    set StartTextDay [clock format $s -format %a]
    set StartDay [clock format $s -format %d]
    set StartTextMonth [clock format $s -format %b]
    set StartYear [clock format $s -format %Y]
    set StartHour 00
    set StartMinute 00
    set StartSecond 00

    set StartTime [clock scan "$StartTextDay $StartTextMonth $StartDay ${StartHour}:${StartMinute}:${StartSecond} $StartYear"]

   ttk::button $f.reset -text "Reset" -command "set StartTextDay $StartTextDay ; set StartDay $StartDay ; set StartTextMonth $StartTextMonth ; set StartYear $StartYear ; set StartHour $StartHour ; set StartMinute $StartMinute ; set StartSecond $StartSecond ; set StartTime $StartTime" -style Tight.TButton

    pack $f.label $f.textday $f.day $f.month \
      $f.year $f.space $f.hour $f.colon1 \
      $f.minute $f.colon2 $f.second $f.reset -side left

    ttk::button $f.15min -text "last 15min" -command "TimePreset -minutes 15" -style Tight.TButton
    pack $f.15min -side left
    ttk::button $f.30min -text "last 30min" -command "TimePreset -minutes 30" -style Tight.TButton
    pack $f.30min -side left


    ttk::frame $frame.to
    pack $frame.to -anchor e
    set f $frame.to

    ttk::label $f.label -text "To:"
    ttk::spinbox $f.textday -values "Mon Tue Wed Thu Fri Sat Sun" \
      -width 3 -wrap true -textvariable EndTextDay \
      -style Tall.TSpinbox
    bindtags $f.textday "TSpinbox . all .userFrame.date.to.textday "
    bind $f.textday <<Increment>> "TimeAdjusted End %W up"
    bind $f.textday <<Decrement>> "TimeAdjusted End %W down"
    ttk::spinbox $f.day -from 1 -to 31 -width 2 -wrap true \
      -textvariable EndDay \
      -validate key -validatecommand {string is integer %P} \
      -style Tall.TSpinbox
    bindtags $f.day "TSpinbox . all .userFrame.date.to.day "
    bind $f.day <<Increment>> "TimeAdjusted End %W up"
    bind $f.day <<Decrement>> "TimeAdjusted End %W down"
    ttk::spinbox $f.month \
      -values "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" \
      -width 3 -wrap true -textvariable EndTextMonth \
      -style Tall.TSpinbox
    bindtags $f.month "TSpinbox . all .userFrame.date.to.month "
    bind $f.month <<Increment>> "TimeAdjusted End %W up"
    bind $f.month <<Decrement>> "TimeAdjusted End %W down"
    ttk::spinbox $f.year -from 1900 -to 2100 -width 4 -wrap true \
      -textvariable EndYear \
      -validate key -validatecommand {string is integer %P} \
      -style Tall.TSpinbox
    bindtags $f.year "TSpinbox . all .userFrame.date.to.year "
    bind $f.year <<Increment>> "TimeAdjusted End %W up"
    bind $f.year <<Decrement>> "TimeAdjusted End %W down"
    ttk::label $f.space -text " "
    ttk::spinbox $f.hour -from 0 -to 23 -width 2 -wrap true \
      -format %02.0f -textvariable EndHour \
      -validate key -validatecommand {string is integer %P} \
      -style Tall.TSpinbox
    bindtags $f.hour "TSpinbox . all .userFrame.date.to.hour "
    bind $f.hour <<Increment>> "TimeAdjusted End %W up"
    bind $f.hour <<Decrement>> "TimeAdjusted End %W down"
    ttk::label $f.colon1 -text ":"
    ttk::spinbox $f.minute -from 0 -to 59 -width 2 -wrap true \
      -format %02.0f -textvariable EndMinute \
      -validate key -validatecommand {string is integer %P} \
      -style Tall.TSpinbox
    bindtags $f.minute "TSpinbox . all .userFrame.date.to.minute "
    bind $f.minute <<Increment>> "TimeAdjusted End %W up"
    bind $f.minute <<Decrement>> "TimeAdjusted End %W down"
    ttk::label $f.colon2 -text ":"
    ttk::spinbox $f.second -from 0 -to 59 -width 2 -wrap true \
      -format %02.0f -textvariable EndSecond \
      -validate key -validatecommand {string is integer %P} \
      -style Tall.TSpinbox
    bindtags $f.second "TSpinbox . all .userFrame.date.to.second "
    bind $f.second <<Increment>> "TimeAdjusted End %W up"
    bind $f.second <<Decrement>> "TimeAdjusted End %W down"

    bind $f.textday <Return> "TimeAdjustedManually"
    bind $f.day <Return> "TimeAdjustedManually"
    bind $f.month <Return> "TimeAdjustedManually"
    bind $f.year <Return> "TimeAdjustedManually"
    bind $f.hour <Return> "TimeAdjustedManually"
    bind $f.minute <Return> "TimeAdjustedManually"
    bind $f.second <Return> "TimeAdjustedManually"

    set EndTextDay [clock format $s -format %a]
    set EndDay [clock format $s -format %d]
    set EndTextMonth [clock format $s -format %b]
    set EndYear [clock format $s -format %Y]
    set EndHour 23
    set EndMinute 59
    set EndSecond 59

    set EndTime [clock scan "$EndTextDay $EndTextMonth $EndDay ${EndHour}:${EndMinute}:${EndSecond} $EndYear"]

    ttk::button $f.reset -text "Reset" -command "set EndTextDay $EndTextDay ; set EndDay $EndDay ; set EndTextMonth $EndTextMonth ; set EndYear $EndYear ; set EndHour $EndHour ; set EndMinute $EndMinute ; set EndSecond $EndSecond ; set EndTime $EndTime" -style Tight.TButton

    pack $f.label $f.textday $f.day $f.month \
      $f.year $f.space $f.hour $f.colon1 \
      $f.minute $f.colon2 $f.second $f.reset -side left

    ttk::button $f.45min -text "last 45min" -command "TimePreset -minutes 45" -style Tight.TButton
    pack $f.45min -side left
    ttk::button $f.60min -text "last 60min" -command "TimePreset -minutes 60" -style Tight.TButton
    pack $f.60min -side left

}
proc TimePreset {args} {
    APSStrictParseArguments {minutes}
    foreach var "Start End" {
        global ${var}TextDay ${var}Day ${var}TextMonth ${var}Year 
        global ${var}Hour ${var}Minute ${var}Second ${var}Time
    }
    set s [clock seconds]
    
    set EndTextDay [clock format $s -format %a]
    set EndDay [clock format $s -format %d]
    set EndTextMonth [clock format $s -format %b]
    set EndYear [clock format $s -format %Y]
    set EndHour 23
    set EndMinute 59
    set EndSecond 59
    set EndTime [clock scan "$EndTextDay $EndTextMonth $EndDay ${EndHour}:${EndMinute}:${EndSecond} $EndYear"]

    set s [expr $s - ($minutes * 60)]
    set StartTextDay [clock format $s -format %a]
    set StartDay [clock format $s -format %d]
    set StartTextMonth [clock format $s -format %b]
    set StartYear [clock format $s -format %Y]
    set StartHour [clock format $s -format %H]
    set StartMinute [clock format $s -format %M]
    set StartSecond [clock format $s -format %S]
    set StartTime [clock scan "$StartTextDay $StartTextMonth $StartDay ${StartHour}:${StartMinute}:${StartSecond} $StartYear"]


}
proc TimeAdjustedManually {args} {
    foreach var "Start End" {
        global ${var}TextDay ${var}Day ${var}TextMonth ${var}Year 
        global ${var}Hour ${var}Minute ${var}Second ${var}Time
        
        set ${var}Time [clock scan "[set ${var}TextMonth] [set ${var}Day] [set ${var}Hour]:[set ${var}Minute]:[set ${var}Second] [set ${var}Year]"]
        set ${var}Minute [clock format [set ${var}Time] -format %M]
        set ${var}Hour [clock format [set ${var}Time] -format %H]
        set ${var}TextDay [clock format [set ${var}Time] -format %a]
        set ${var}Day [clock format [set ${var}Time] -format %d]
        set ${var}TextMonth [clock format [set ${var}Time] -format %b]
        set ${var}Year [clock format [set ${var}Time] -format %Y]
    }
}

proc TimeAdjusted {var widget direction} {
    global ${var}TextDay ${var}Day ${var}TextMonth ${var}Year 
    global ${var}Hour ${var}Minute ${var}Second ${var}Time

    if {[lindex [split $widget .] end] == "second"} {
        if {$direction == "up"} {
            set direction "+"
        } else {
            set direction "-"
        }
        set ${var}Time [expr "[set ${var}Time] $direction (1)"]
        set ${var}Second [clock format [set ${var}Time] -format %S]
        set ${var}Minute [clock format [set ${var}Time] -format %M]
        set ${var}Hour [clock format [set ${var}Time] -format %H]
        set ${var}TextDay [clock format [set ${var}Time] -format %a]
        set ${var}Day [clock format [set ${var}Time] -format %d]
        set ${var}TextMonth [clock format [set ${var}Time] -format %b]
        set ${var}Year [clock format [set ${var}Time] -format %Y]
    } elseif {[lindex [split $widget .] end] == "minute"} {
        if {$direction == "up"} {
            set direction "+"
        } else {
            set direction "-"
        }
        set ${var}Time [expr "[set ${var}Time] $direction (60)"]
        set ${var}Minute [clock format [set ${var}Time] -format %M]
        set ${var}Hour [clock format [set ${var}Time] -format %H]
        set ${var}TextDay [clock format [set ${var}Time] -format %a]
        set ${var}Day [clock format [set ${var}Time] -format %d]
        set ${var}TextMonth [clock format [set ${var}Time] -format %b]
        set ${var}Year [clock format [set ${var}Time] -format %Y]
    } elseif {[lindex [split $widget .] end] == "hour"} {
        if {$direction == "up"} {
            set direction "+"
        } else {
            set direction "-"
        }
        set ${var}Time [expr "[set ${var}Time] $direction (60 * 60)"]
        set ${var}Hour [clock format [set ${var}Time] -format %H]
        set ${var}TextDay [clock format [set ${var}Time] -format %a]
        set ${var}Day [clock format [set ${var}Time] -format %d]
        set ${var}TextMonth [clock format [set ${var}Time] -format %b]
        set ${var}Year [clock format [set ${var}Time] -format %Y]
    } elseif {[lindex [split $widget .] end] == "textday"} {
        if {$direction == "up"} {
            set direction "+"
        } else {
            set direction "-"
        }
        set ${var}Time [expr "[set ${var}Time] $direction (24 * 60 * 60)"]
        set initTextDay [set ${var}TextDay]
        set ${var}TextDay [clock format [set ${var}Time] -format %a]
        if {$initTextDay != [set ${var}TextDay]} {
            #This is needed for the transition to daylight savings time.
            set ${var}Time [expr "[set ${var}Time] $direction (1 * 60 * 60)"]
            set ${var}TextDay [clock format [set ${var}Time] -format %a]
        }
        set ${var}Day [clock format [set ${var}Time] -format %d]
        set ${var}TextMonth [clock format [set ${var}Time] -format %b]
        set ${var}Year [clock format [set ${var}Time] -format %Y]
    } elseif {[lindex [split $widget .] end] == "day"} {
        if {$direction == "up"} {
            set direction "+"
        } else {
            set direction "-"
        }
        set ${var}Time [expr "[set ${var}Time] $direction (24 * 60 * 60)"]
        set initTextDay [set ${var}TextDay]
        set ${var}TextDay [clock format [set ${var}Time] -format %a]
        if {$initTextDay == [set ${var}TextDay]} {
            #This is needed for the transition to daylight savings time.
            set ${var}Time [expr "[set ${var}Time] $direction (1 * 60 * 60)"]
            set ${var}TextDay [clock format [set ${var}Time] -format %a]
        }
        set ${var}Day [clock format [set ${var}Time] -format %d]
        set ${var}TextMonth [clock format [set ${var}Time] -format %b]
        set ${var}Year [clock format [set ${var}Time] -format %Y]
    } elseif {[lindex [split $widget .] end] == "month"} {
        set month [clock format [set ${var}Time] -format %b]
        set year [clock format [set ${var}Time] -format %Y]
        set s1 [clock scan "$month 01 00:00:00 $year"]
        if {$direction == "up"} {
            if {$month == "Dec"} {
                incr year
            }
        } else {
            if {$month == "Jan"} {
                incr year -1
            }
        }
        set s2 [clock scan "[set ${var}TextMonth] 01 00:00:00 $year"]
        set s [expr {$s2 - $s1 + (60 * 60)}]
        set ${var}Time [expr "[set ${var}Time] + $s"]
        while {[set ${var}TextMonth] != [clock format [set ${var}Time] -format %b]} {
            if {$month == [clock format [set ${var}Time] -format %b]} {
                if {$direction == "up"} {
                    set ${var}Time [expr "[set ${var}Time] + (12 * 60 * 60)"]
                } else {
                    set ${var}Time [expr "[set ${var}Time] - (12 * 60 * 60)"]
                }
            } else {
                if {$direction == "up"} {
                    set ${var}Time [expr "[set ${var}Time] - (12 * 60 * 60)"]
                } else {
                    set ${var}Time [expr "[set ${var}Time] + (12 * 60 * 60)"]
                }
            }
        }
        set ${var}TextDay [clock format [set ${var}Time] -format %a]
        set ${var}Day [clock format [set ${var}Time] -format %d]
        set ${var}TextMonth [clock format [set ${var}Time] -format %b]
        set ${var}Year [clock format [set ${var}Time] -format %Y]
    } elseif {[lindex [split $widget .] end] == "year"} {
        if {([set ${var}Day] == "29") && ([set ${var}TextMonth] == "Feb")} {
            set ${var}Day 28
        }
        set ${var}Time [clock scan "[set ${var}TextMonth] [set ${var}Day] [set ${var}Hour]:[set ${var}Minute]:[set ${var}Second] [set ${var}Year]"]
        set ${var}TextDay [clock format [set ${var}Time] -format %a]
    }
    set ${var}Time [clock scan "[set ${var}TextMonth] [set ${var}Day] [set ${var}Hour]:[set ${var}Minute]:[set ${var}Second] [set ${var}Year]"]

}

proc CalcTime {} {
    foreach var "Start End" {
        global ${var}TextDay ${var}Day ${var}TextMonth ${var}Year 
        global ${var}Hour ${var}Minute ${var}Second ${var}Time
        global dateEntryStyle ${var}Month
        set ${var}Time [clock scan "[set ${var}TextMonth] [set ${var}Day] [set ${var}Hour]:[set ${var}Minute]:[set ${var}Second] [set ${var}Year]"]
    }
}

proc FindPVDataFiles {args} {
    set ReadbackName ""
    set StartTime [clock scan "Jan 01 00:00:00 1990"]
    set EndTime [clock seconds]
    set startDateList ""
    set endDateList ""
    set SampleIntervals "1 2 4 8 16 32 64 128 256"
    APSStrictParseArguments {ReadbackName StartTime EndTime SampleIntervals startDateList endDateList}

    if {[llength $startDateList]} {
        set StartTime [clock scan "[lindex $startDateList 2]/[lindex $startDateList 3]/[lindex $startDateList 0]"]
    }
    if {[llength $endDateList]} {
        set EndTime [clock scan "23:59:59 [lindex $endDateList 2]/[lindex $endDateList 3]/[lindex $endDateList 0]"]
    }
    
    set fileList ""
    set ReadbackName [join [split $ReadbackName / ] + ]
    set year [clock format $StartTime -format %Y]
    set month [clock format $StartTime -format %m]
    set endyear [clock format $EndTime -format %Y]
    set endmonth [clock format $EndTime -format %m]
    while {($year < $endyear) || (($year == $endyear) && ($month <= $endmonth))} {
        append fileList "[lsort [glob -nocomplain /home/helios/oagData/logging/Variable/[string index ${ReadbackName} 0]/${ReadbackName}/log-${year}-${month}.{gz,xz}]] "
        append fileList "[lsort [glob -nocomplain /home/helios/oagData/logging/\{[join $SampleIntervals ,]\}/${ReadbackName}/log-${year}-${month}.{gz,xz,????}]] "
        if {$month == 12} {
            set month 01
            incr year
        } else {
            scan $month %d month
            incr month
            set month [format %02d $month]
        }
    }
    return $fileList
}

proc CalcOccupancy {} {
    global sectors monFile StartTime EndTime status
    CalcTime

    if {$StartTime >= $EndTime} {
        bell
        APSSetVarAndUpdate status "The date/time range is invalid"
        return
    }
    APSSetVarAndUpdate status "Calculating..."

    if {[catch {exec sdds2stream $monFile -col=ReadbackName} readbackNames]} {
        bell
        set status $readbackNames
        return
    }
    
    set filteredFiles ""
    set modes "ACIS:FA_BP_MODE ACIS:FB_BP_MD ACIS:RA_BP_MODE ACIS:RB_BP_MODE"
    foreach mode $modes {
        set files($mode) [FindPVDataFiles -ReadbackName $mode -StartTime $StartTime -EndTime $EndTime -SampleIntervals 4]
        if {![llength $files($mode)]} {
            bell
            APSSetVarAndUpdate status "No data found for the time frame."
            return
        }
        set datafile($mode) /tmp/[APSTmpString]
        APSAddToTempFileList $datafile($mode)
        if {[catch {eval exec sddscombinelogfiles $files($mode) -pipe=out | sddsprocess -pipe -filter=column,Time,$StartTime,$EndTime -filter=column,$mode,.9,1.1 -nowarn | sddsconvert -pipe=in $datafile($mode) -delete=column,$mode} result]} {
            bell
            set status $result
            return
        }
        append filteredFiles "$datafile($mode) "
    }
    set datafile(combinedMode) /tmp/[APSTmpString]
    APSAddToTempFileList $datafile(combinedMode)
    if {[catch {eval exec sddscombine $filteredFiles -pipe=out -merge | sddssort -pipe=in $datafile(combinedMode) -col=Time -unique} result]} {
        bell
        set status $result
        return
    }
    

    foreach sector $sectors {
        global $sector
        if {[set $sector]} {
            set doors ""
            foreach rbn $readbackNames {
                if {[string match "*${sector}*" $rbn]} {
                    lappend doors $rbn
                }
            }
            set filteredFiles ""
            foreach door $doors {
                set files($door) [FindPVDataFiles -ReadbackName $door -StartTime $StartTime -EndTime $EndTime -SampleIntervals 4]
                if {![llength $files($door)]} {
                    bell
                    APSSetVarAndUpdate status "No data found for the time frame."
                    return
                }
                set datafile($door) /tmp/[APSTmpString]
                APSAddToTempFileList $datafile($door)
                if {[catch {eval exec sddscombinelogfiles $files($door) -pipe=out | sddsprocess -pipe -filter=column,Time,$StartTime,$EndTime -filter=column,$door,-.1,.1 -nowarn | sddsconvert -pipe=in $datafile($door) -delete=column,$door} result]} {
                    bell
                    set status $result
                    return
                }
                append filteredFiles "$datafile($door) "
            }
            set datafile(combined$door) /tmp/[APSTmpString]
            APSAddToTempFileList $datafile(combined$door)
            if {[catch {eval exec sddscombine $filteredFiles -pipe=out -merge | sddssort -pipe=in $datafile(combined$door) -col=Time -unique} result]} {
                bell
                set status $result
                return
            }
            if {[catch {exec sddsselect $datafile(combined$door) $datafile(combinedMode) -pipe=out -equate=Time -nowarning | sdds2stream -pipe=in -rows=bare} result]} {
                set result 0
            }
            set minutes [expr $result / 15.0]
            set percentage [expr 100 * ($result * 4.0) / ($EndTime - $StartTime)]
            APSSetVarAndUpdate status "$sector [format %.2f $minutes] minutes, [format %.5f $percentage] % of the timeframe"
            
        }
    }
    APSSetVarAndUpdate status "Done..."
}


SetupGUI
