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

APSStandardSetup
set CVSRevisionAuthor "\$Revision: 1.6 $ \$Author: soliday $"
APSApplication . -name SRRMSAlarmEditCause -version $CVSRevisionAuthor \
  -overview "SRRMSAlarmEditCause generates a list of RMS alarms that has occured, and allows the user to edit the causes of a particular alarm."

set statusText Ready.
APSScrolledStatus .status -parent .userFrame -width 80 -textVariable statusText \
  -withButtons 1

proc SetStatusText {text} {
    global statusText
    set statusText "$text [exec date +%H:%M:%S]"
    update
}

proc MakeWidgetFrame {widget args} {
    global dayToPlot0 monthToPlot0 yearToPlot0 hourToPlot0
    global dayToPlot1 monthToPlot1 yearToPlot1 hourToPlot1
    
    APSFrame .data -parent .userFrame -label "Data selection" 
    set w .userFrame.data.frame

    APSDateTimeAdjEntry .date0 -parent $w \
      -dayVariable dayToPlot0 -monthVariable monthToPlot0 \
      -yearVariable yearToPlot0 \
      -label "Search Year/Month/Day: "
    set hourToPlot0 0
    set hourToPlot1 24
    return
}

proc MakePrintoutButtons {widget args} {
    set parent ""
    APSParseArguments {parent}
    APSFrame $widget -parent $parent
    set w $parent$widget.frame
    APSButton .print -parent $w -text "PRINTOUT ALARMS" -command DoAlarmLogPrintout \
      -contextHelp "Prints RMS orbit alarm history sorted by time." 
    APSButton .review -parent $w -text "REVIEW CAUSES" -command ReviewCauses \
      -contextHelp "Displays rms alarms and causes for day selected." 
    APSButton .edit -parent $w -text "EDIT CAUSES" -command EditCauses \
      -contextHelp "Allows editing of rms alarms causes for day selected." 
}

proc MakeDataFileList {} {
    global debugReviewAlarmLog
    if $debugReviewAlarmLog { puts stderr "In MakeDataFileList"}
    global dayToPlot0 monthToPlot0 yearToPlot0 hourToPlot0
    global dayToPlot1 monthToPlot1 yearToPlot1 hourToPlot1
    global dataDir

    set dataFileList \
        [APSFindFilesBetweenDates -tailsOnly 1 \
           -rootname sr- -directory $dataDir \
           -startDateList [APSFormatDate -year $yearToPlot0 \
                             -month $monthToPlot0 -day $dayToPlot0 -dateFormat list] \
           -endDateList [APSFormatDate -year $yearToPlot0 \
                             -month $monthToPlot0 -day $dayToPlot0 -dateFormat list] \
           ]
    return $dataFileList
}

proc DoAlarmLogProcessing {args} {
    global debugReviewAlarmLog
    if $debugReviewAlarmLog { puts stderr "In DoAlarmLogProcessing"}
    global doMajor doNoAlarm doMinor doInvalid interestLevel pvMatch pvExclude  
    global timeFilterMin timeFilterMax
    global lastFileList lastDataFile
    global env dataDir userFilename lastTimeFilterMin lastTimeFilterMax
    global dayToPlot0 monthToPlot0 yearToPlot0 hourToPlot0
    global dayToPlot1 monthToPlot1 yearToPlot1 hourToPlot1
    global apsScriptUser 
    global causeDir

    APSStrictParseArguments {doIndex doSplit}
    set dataFileList [MakeDataFileList]

    if [llength $dataFileList]==0 {
        SetStatusText "No file chosen or found."
        return -code error
    } 
    if $debugReviewAlarmLog {
        puts stderr "[llength $dataFileList] files found:"
        puts stderr [join $dataFileList \n]
    }

    set fileList ""
    foreach file $dataFileList {
        lappend fileList $dataDir/$file
    }

    if [llength $fileList]>1 {
        SetStatusText "Combining [llength $fileList] files..."
        set dataDir /tmp
        set dataFile [APSTmpString]
        APSAddToTempFileList $dataDir/$dataFile
        eval exec sddscombine $dataFileList $dataDir/$dataFile 
    } else {
        set dataFile [lindex $fileList 0]
        set dataDir [file dirname $dataFile]
        set dataFile [file tail $dataFile]
    }
    # this is the combined file
    set lastDataFile $dataDir/$dataFile
    if $debugReviewAlarmLog { puts stderr "dataFile : $dataFile   dataDir : $dataDir" }

    set dataRootname [file rootname $dataFile]
    set dataExtension [file extension $dataFile]
    set derefExtension .deref${dataExtension}1
    if [catch {APSConvertTimeToHours $hourToPlot0} result] {
        SetStatusText "Bad hours value for starting hour: $hourToPlot0: $result"
        return -code error
    }
    set timeFilterMin \
      [exec timeconvert \
         -breakdown=year=$yearToPlot0,day=$dayToPlot0,month=$monthToPlot0,hour=$result]
    if [catch {APSConvertTimeToHours $hourToPlot1} result] {
        SetStatusText "Bad hours value for ending hour: $hourToPlot1: $result"
        return
    }
    set timeFilterMax \
      [exec timeconvert \
         -breakdown=year=$yearToPlot0,day=$dayToPlot0,month=$monthToPlot0,hour=$result]

    if [file exists /tmp/${apsScriptUser}${dataRootname}${derefExtension}] {
        set tderef [file mtime /tmp/${apsScriptUser}${dataRootname}${derefExtension}]
        set tdata  [file mtime $dataDir/$dataFile]
        if $debugReviewAlarmLog {
            puts stderr "Old deref file exists from $tderef"
            puts stderr "Source file last changed at $tdata"
            puts stderr "Old time filter: $lastTimeFilterMin, $lastTimeFilterMax"
            puts stderr "New time filter: $timeFilterMin, $timeFilterMax"
        }
        if {$tdata>=$tderef || $timeFilterMin!=$lastTimeFilterMin || $timeFilterMax!=$lastTimeFilterMax} {
            if $debugReviewAlarmLog { 
                puts stderr "removing file /tmp/${apsScriptUser}${dataRootname}${derefExtension}" 
                puts stderr "  $tdata>=$tderef or"
                puts stderr "  $timeFilterMin != $lastTimeFilterMin or"
                puts stderr "  $timeFilterMax != $lastTimeFilterMax"
            }
            file delete /tmp/${apsScriptUser}${dataRootname}${derefExtension}
        }
    }
    if $debugReviewAlarmLog { puts stderr "About to dereference."}

    if ![file exists /tmp/${apsScriptUser}${dataRootname}${derefExtension}] {
        SetStatusText "Dereferencing..."
        set lastTimeFilterMin $timeFilterMin
        set lastTimeFilterMax $timeFilterMax
        if [catch {DereferenceAlarmLoggerData \
                     -fileName $dataDir/$dataFile \
                     -timeMin $timeFilterMin -timeMax $timeFilterMax \
                     -newFile /tmp/${apsScriptUser}${dataRootname}${derefExtension}} result] {
            SetStatusText "Error: $result"
            return -code error
        }
        if [catch {exec sddsprocess /tmp/${apsScriptUser}${dataRootname}${derefExtension} \
                     -noWarning \
                     -match=col,ControlName=SRFB:?RMSmotion30HzAlarmM 
            file delete /tmp/${apsScriptUser}${dataRootname}${derefExtension}~ \
                 } result] {
            SetStatusText "Error: $result"
            return -code error
        }
        if ![file exists /tmp/${apsScriptUser}${dataRootname}${derefExtension}] {
            exec ln -s $dataDir/$dataFile /tmp/${apsScriptUser}${dataRootname}${derefExtension}
        } else {
            APSAddToTempFileList /tmp/${apsScriptUser}${dataRootname}${derefExtension}
        }
    }

    set chargeDataFile [MakeChargeFile]

    # rootName is used for rootname in creating split and index files
    # dataFile is either a link to original data file (if it was already dereferenced) or
    # the dereferenced temporary file
    # This is a different use for variable dataFile from the original
    # procedure which is a little confusing.
    # Previously set to the file tail of the returned list of alarm files.
    set rootName /tmp/${dataRootname}.$env(USER)$dataExtension
    set dataFile /tmp/${apsScriptUser}${dataRootname}${derefExtension} 

    # create an interpolated time file from $dataFile
    if [catch {exec sdds2stream -rows $dataFile} rows] {
        return -code error "DoAlarmLogProcessing: $rows"
    }
    if {[lindex $rows 0]==0} {
        return -code error "DoAlarmLogProcessing: There is no alarm data for the date selected."
    }
    if [catch {exec sddsinterp $chargeDataFile ${chargeDataFile}.interp \
                 -col=Time,S35DCCT,SRModifiedDesiredMode,SRInjecting \
                 -fileValues=$dataFile,column=Time \
             } result] {
        return -code error "DoAlarmLogProcessing: $result"
    }

    # create new cause file or modify existing one.
    set causeFile $causeDir/srRMSorbit-$dataRootname
    if ![file exists $causeFile] {
        # create cause file from new.
        if [catch {exec sddsconvert $dataFile -pipe=out \
                     -retain=col,ControlName,Time \
                     -delete=array,* \
                     -delete=para,* \
                     | sddsxref -pipe \
                     ${chargeDataFile}.interp \
                     -equate=Time \
                     -take=S35DCCT,SRModifiedDesiredMode,SRInjecting \
                     | sddsprocess -pipe -noWarning \
                     -filter=col,SRModifiedDesiredMode,1,2 \
                     -filter=col,SRInjecting,0,0 \
                     | sddstimeconvert -pipe \
                     -breakdown=col,Time,text=TimeText \
                     | sddsconvert -pipe \
                     -dele=col,Time \
                     | sddsprocess -pipe=in $causeFile \
                     "-print=col,Cause,                 ,description=Cause for each rms motion event"
            file attributes $causeFile -permissions 00664 \
                 } result] {
            return -code error "DoAlarmLogProcessing: $result"
        }
    } else {
        # use data from existing cause file.
        if [catch {exec sddsconvert $dataFile -pipe=out \
                     -retain=col,ControlName,Time \
                     -delete=array,* \
                     -delete=para,* \
                     | sddsxref -pipe \
                     ${chargeDataFile}.interp \
                     -equate=Time \
                     -take=S35DCCT,SRModifiedDesiredMode,SRInjecting \
                     | sddsprocess -pipe -noWarning \
                     -filter=col,SRModifiedDesiredMode,1,2 \
                     -filter=col,SRInjecting,0,0 \
                     | sddstimeconvert -pipe \
                     -breakdown=col,Time,text=TimeText \
                     | sddsconvert -pipe \
                     -dele=col,Time,SRModifiedDesiredMode,SRInjecting \
                     | sddsxref -pipe=in $causeFile $causeFile.new \
                     -noWarning -take=Cause -match=TimeText -fillIn
            APSArchiveGenerationedCopy -name $causeFile -remove 1
            file rename -force -- $causeFile.new $causeFile
            file attributes $causeFile -permissions 00664 \
                 } result] {
            return -code error "DoAlarmLogProcessing: $result"
        }
    }        
    
    SetStatusText "Processing done."
    return [list $dataFile $rootName $causeFile]
}

proc MakeChargeFile {args} {
    global dayToPlot0 monthToPlot0 yearToPlot0 hourToPlot0
    global dayToPlot1 monthToPlot1 yearToPlot1 hourToPlot1

    set Rootname ChargeFast
    set dataDir /home/helios/oagData/monitoring/Charge
    set dataFileList \
        [APSFindFilesBetweenDates -tailsOnly 0 \
           -rootname ${Rootname}- -directory $dataDir \
           -startDateList [APSFormatDate -year $yearToPlot0 \
                             -month $monthToPlot0 -day $dayToPlot0 -dateFormat list] \
           -endDateList [APSFormatDate -year $yearToPlot0 \
                             -month $monthToPlot0 -day $dayToPlot0 -dateFormat list] \
           ]
    if ![llength $dataFileList] {
        return -code error "MakeChargeFile: Found no files."
    }
    set dataFile /tmp/[APSTmpString].charge
    if [catch {eval exec sddscombine $dataFileList -pipe=out \
                 | sddsconvert -pipe=in $dataFile \
                 -delete=para,* \
                 -retain=col,Time,S35DCCT,SRModifiedDesiredMode,SRInjecting \
             } result] {
        return -code error  "MakeChargeFile: $result"
    }
    return $dataFile

}
proc ReviewCauses {args} {
    global causeDir
    global dayToPlot0 monthToPlot0 yearToPlot0 hourToPlot0
    global dayToPlot1 monthToPlot1 yearToPlot1 hourToPlot1

    if [catch {DoAlarmLogProcessing} names] {
        SetStatusText "ReviewCauses: $names"
        return
    }
    set causeFile [lindex $names 2]
    set topline "$yearToPlot0/$monthToPlot0/$dayToPlot0"
    set title "sr orbit motion alarms"

    if [catch {exec sdds2stream -rows $causeFile} rows] {
        return -code error "DoAlarmLogProcessing: $rows"
    }
    if {[lindex $rows 0]==0} {
        SetStatusText "There is no alarm data for the date selected and for the conditions requested (user beam and non-injecting)."
    }

    set tempfile /tmp/[APSTmpString]
    if [catch {exec sddsprintout $causeFile $tempfile.txt \
                 -col=ControlName,format=%28s -col=TimeText,format=%28s \
                 -col=S35DCCT,format=%7.2f \
                 -col=Cause,format=%32s  \
             } result] {
        SetStatusText $result
        return  -code error
    }
    APSFileDisplayWindow [APSUniqueName .] -fileName $tempfile.txt \
      -deleteOnClose 1 -width 160 -height 40 -contextHelp \
      "SR Orbit 30 Hz BW RMS Alarm printout with causes" \
      -comment "$title\n$topline" -font -adobe-courier-medium-r-normal-*-12-*-*-*-*-*-*-* \
      -printCommand "enscript -r"

}

proc EditCauses {args} {
    global causeDir

    if [catch {DoAlarmLogProcessing} names] {
        SetStatusText "EditCauses: $names"
        return
    }
    set causeFile [lindex $names 2]
    if [catch {exec sdds2stream -rows $causeFile} rows] {
        return -code error "DoAlarmLogProcessing: $rows"
    }
    if {[lindex $rows 0]==0} {
        SetStatusText "There is no alarm data for the date selected and for the conditions requested (user beam and non-injecting)."
        return
    }
    exec sddsedit -fileName $causeFile &

}
proc DoAlarmLogPrintout {args} {
    global doMajor doMinor doInvalid doNoAlarm
    global dayToPlot0 monthToPlot0 yearToPlot0 hourToPlot0
    global dayToPlot1 monthToPlot1 yearToPlot1 hourToPlot1

    if [catch {DoAlarmLogProcessing} names] {
        SetStatusText "DoAlarmLogPrintout: $names"
        return
    }
    set dataFile [lindex $names 0]
    set rootName [lindex $names 1]
    set topline "$yearToPlot0/$monthToPlot0/$dayToPlot0"
    set title "sr orbit motion alarms"
    # do only 30Hz alarms for now.
    # create an interpolated time file from $dataFile
    if [catch {exec sdds2stream -rows $dataFile} rows] {
        return -code error "DoAlarmLogProcessing: $rows"
    }
    if {[lindex $rows 0]==0} {
        SetStatusText "There is no alarm data for the date selected."
        return -code ok
    }
    if [catch {PrintAlarmLog -dataFile $dataFile -outputFile $rootName.txt \
                 -sortBy TimeOfDay \
                 -title $title \
                 -topline $topline \
                 -major $doMajor -minor $doMinor -invalid $doInvalid -noAlarm $doNoAlarm} result] {
        SetStatusText "$result"
        return 
    }
    APSFileDisplayWindow [APSUniqueName .] -fileName $rootName.txt \
      -deleteOnClose 1 -width 160 -height 40 -contextHelp \
      "Alarm log printout: $title" \
      -comment "$title\n$topline" -font -adobe-courier-medium-r-normal-*-12-*-*-*-*-*-*-* \
      -printCommand "enscript -r"
}

AlarmReviewSetup
set doMajor   1
set doMinor   0
set doInvalid 0
set doNoAlarm 0
set systemChoice SR
set systemRootname SR
set debugReviewAlarmLog 1
set dataDir /home/helios/oagData/Alarms/sr
set causeDir /home/helios/oagData/Alarms/srRMSorbit
set timeFilterMin 0
set timeFilterMax 0
set lastTimeFilterMin 0
set lastTimeFilterMax 0
set lastFileList ""
set lastDataFile ""

MakeWidgetFrame .dateTime -parent .userFrame
MakePrintoutButtons .print -parent .userFrame
