#!/bin/sh
# \
exec oagtclsh "$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 ampThreshold 0.5
set fwhmThreshold 2.0e-7
#timingThreshold for IK1, IK2, and IK3
set timingThreshold 2.0e-7
set IK4timingThreshold 2.0e-7
set args $argv
set startDate ""
set endDate ""
set startHour 0
set endHour 1
set cronjob 0
set usage "KickerAnalysis \[-startDate <month/day/year>\] \[-startHour <integer>\] \[-endDate <month/day/year>\] \[-endHour <integer>\] \
    \[-ampThreshold <value>\] \[-fwhmThreshold <value>\] \[-timingThreshold <value>\] \[-IK4timingThreshold <value>\] -cronJob <0|1>"

if ![string length $args] {
    puts stderr $usage
    exit 0
}
APSParseArguments {ampThreshold fwhmThreshold timingThreshold IK4timingThreshold startDate endDate startHour endHour cronjob}


proc AnalysisKickerParameters {args} {
    set plotSuffix ""
    set time0 ""
    set time1 ""
    APSParseArguments {plotSuffix time0 time1}
    global IK1file IK2file IK3file IK4file mainDir plotDir ampThreshold timingThreshold fwhmThreshold IK4timingThreshold
    
    set tmpRoot /tmp/[APSTmpString]
    set date0 [clock format $time0 -format %Y-%m%d]
    set date1 [clock format $time1 -format %Y-%m%d]
    set hour0 [clock format $time0 -format %H]
    set hour1 [clock format $time1 -format %H]
    set IK1timingThreshold $timingThreshold
    set IK2timingThreshold $timingThreshold
    set IK3timingThreshold $timingThreshold
    foreach kicker {IK1 IK2 IK3 IK4} {
        puts "[set ${kicker}file]"
        if [catch {exec sddsprocess [set ${kicker}file] -filter=col,Time,$time0,$time1 -pipe=out \
                       | sddsprocess -pipe=in $tmpRoot.$kicker \
                       -proc=Timing,spread,%sSpread \
                       -proc=Amplitude,spread,%sSpread \
                       -proc=FWHM,spread,%sSpread } result] {
            puts stderr "Error in processing kicker file ([set ${kicker}file]): $result"
           # set tmpFile /tmp/[APSTmpString]
           # set fd [open $tmpFile w]
           # puts $fd "Error in processing kicker file -- $kicker (from $time0 to $time1): $result"
           # close $fd
           # exec mail shang@aps.anl.gov < $tmpFile
            continue
        }
        set ampSpread [exec sdds2stream $tmpRoot.$kicker -par=AmplitudeSpread]
        set fwhmSpread [exec sdds2stream $tmpRoot.$kicker -par=FWHMSpread]
        set posSpread [exec sdds2stream $tmpRoot.$kicker -par=TimingSpread]
        catch {exec sddsplot -layout=1,3 -filter=col,Time,$time0,$time1 -tick=xtime  "-title=$kicker $date0:$hour0 to $date1:$hour1"\
                   -grap=sym,conn=sub,vary=sub -legend -output=$plotDir/SRTopUp${kicker}${plotSuffix}.png -device=lpng  \
                   $tmpRoot.$kicker   \
                   -col=Time,*Timing "-topline=Maximum position pread is [format %.2e $posSpread] (seconds)" -endp\
                   -col=Time,*FWHM  "-topline=FWHM spread is [format %.2e $fwhmSpread] (seconds)" -endp  \
                   -col=Time,*Amplitude "-topline=Amplitude spread is [format %.2e $ampSpread] (voltage)"  -endp }
        catch {exec sddsplot -layout=1,3 -filter=col,Time,$time0,$time1 -tick=xtime  "-title=$kicker $date0:$hour0 to $date1:$hour1"\
                   -grap=sym,conn=sub,vary=sub -legend -output=$plotDir/SRTopUp${kicker}${plotSuffix}-thumb.png -device=mpng  \
                   $tmpRoot.$kicker   \
                   -col=Time,*Timing "-topline=Maximum position pread is [format %.2e $posSpread] (seconds)" -endp\
                   -col=Time,*FWHM  "-topline=FWHM spread is [format %.2e $fwhmSpread] (seconds)" -endp  \
                   -col=Time,*Amplitude "-topline=Amplitude spread is [format %.2e $ampSpread] (voltage)"  -endp }
        set fd [open $tmpRoot.$kicker.txt "w"]
        puts $fd "from $date0:$hour0 to $date1:$hour1 $kicker spread exceeds the threshold"
        puts $fd "amplitude spread: [format %.2e $ampSpread] (threshold $ampThreshold)"
        puts $fd "fwhm spread: [format %.2e $fwhmSpread] (threshold $fwhmThreshold)"
        puts $fd "timing spread: [format %.2e $posSpread] (threshold [set ${kicker}timingThreshold])"
        close $fd
        if {$ampSpread>$ampThreshold || $fwhmSpread>$fwhmThreshold || $posSpread>[set ${kicker}timingThreshold]} {
            exec mpack -s "$date0:$hour0 -- $date1:$hour1 $kicker spread exceeds the threshold" -d $tmpRoot.$kicker.txt \
                -c application/octet-stream \
                $plotDir/SRTopUp${kicker}${plotSuffix}.png schroedr@aps.anl.gov
        }
    }
    set fileList [glob $tmpRoot.*]
    eval file delete -force $fileList
}

 
if !$cronjob {
    if {![string length $startDate] && ![string length $endDate]} {
        puts stderr "The start date and/or end date has to be provided."
    }
    if ![string length $startDate] {
        set startDate $endDate
    }
    if ![string length $endDate] {
        set endDate $startDate
    } 
    set time0 [expr [clock scan $startDate] + 3600*$startHour] 
    set time1 [expr [clock scan $endDate] + 3600*$endHour] 
    if {$time0>=$time1} {
        puts stderr "Either the start date is later than the end date, or the end hour is less than the start hour if in the same day."
        exit 1
    }
    set hour $endHour 
} else {
    set time1 [clock seconds]
    set date [clock format $time1 -format %m/%d]
    set time0 [expr $time1 - 3600]
    set startHour [clock format $time0 -format %H]
    set endHour [clock format $time1 -format %H]
}
set endDate [clock format $time1 -format %Y-%j-%m%d] 
set startDate [clock format $time0 -format %Y-%j-%m%d]
set date $endDate

if $cronjob {
    set plotSuffix ""
} else {
    set plotSuffix -range
}

set mainDir /home/helios/oagData/monitoring
set plotDir /net/epics-ops/web_roots/ops/AutoSavedPlots/TopUpKickers

set tmpRoot /tmp/[APSTmpString]
if [string compare $endDate $startDate]==0 {
    foreach kicker {IK1 IK2 IK3 IK4} {
        set ${kicker}file $mainDir/TopUp${kicker}/TopUp${kicker}-${startDate}.sdds.gz
        #puts [set ${kicker}file]
        if ![file exist [set ${kicker}file]] {
            if {$cronjob == 0} {
                puts stderr "parameters file [set ${kicker}file]  does not exist!"
                exit 1
            } else {
                exit
            }
        }
        set count 0
        while {1} {
            if {$count>=20} {
                #wait for 20 seconds for file to be written
                break
            }
            if {[exec sddscheck [set ${kicker}file]]!="ok"} {
                after 1000
                incr count
            } else {
                break
            }
        }
    }
} else {
    set date [clock format $time1 -format %Y-%j-%m%d]
    set startYear [clock format $time0 -format %Y]
    set startJday [clock format $time0 -format %j]
    set startMonth [clock format $time0 -format %m]
    set startDay [clock format $time0 -format %d]
    set endYear [clock format $time0 -format %Y]
    set endJday [clock format $time0 -format %j]
    set endMonth [clock format $time0 -format %m]
    set endDay [clock format $time0 -format %d]
    if {$startYear!=$endYear} {
        puts stderr "Can not do analysis for different years."
        exit 1
    }
    foreach kicker {IK1 IK2 IK3 IK4} {
        set files ""
        for {set jday [string trimleft $startJday 0]} {$jday<=[string trimleft $endJday 0]} {incr jday} {
            set files1 [glob -nocomplain $mainDir/TopUp${kicker}/TopUp${kicker}-${startYear}-[format %03d ${jday}]-????.sdds.gz]
            if [llength $files1] {
                set files [concat $files $files1]
            }
        }
        if [llength $files] {
            if [catch {eval exec sddscombine $files -merge -pipe=out \
                           | sddssort -pipe=in -col=Time $tmpRoot.$kicker} result] {
                puts stderr "unable to combine files: $result"
                exit 1
            }
            set ${kicker}file $tmpRoot.$kicker
        } else {
            if !$cronjob {
                puts stderr "No files found for $kicker in interested dates."
            }
            exit 1
        }
    }
}

catch {exec sddsplot -layout=2,2 -filter=col,Time,$time0,$time1 -tick=xtime \
           -yscalesgroup=namestring \
           -grap=sym,conn=sub,vary=sub -legend -output=$plotDir/SRTopUpKicker${plotSuffix}.png -device=lpng  \
           -col=Time,Timing -col=Time,Amplitude -col=Time,*FWHM [set IK1file] "-title=IK1 $date:$hour" -endp \
           -col=Time,Timing -col=Time,Amplitude -col=Time,*FWHM [set IK2file] "-title=IK2 $date:$hour" -endp \
           -col=Time,Timing -col=Time,Amplitude -col=Time,*FWHM [set IK3file]  "-title=IK3 $date:$hour" -endp \
           -col=Time,Timing -col=Time,Amplitude -col=Time,*FWHM [set IK4file] "-title=IK4 $date:$hour" -endp }

catch {exec sddsplot -layout=2,2 -filter=col,Time,$time0,$time1 -tick=xtime \
           -yscalesgroup=namestring \
           -grap=sym,conn=sub,vary=sub -legend -output=$plotDir/SRTopUpKicker${plotSuffix}-thumb.png -device=mpng  \
           -col=Time,Timing -col=Time,Amplitude -col=Time,*FWHM [set IK1file] "-title=IK1 $date:$hour" -endp \
           -col=Time,Timing -col=Time,Amplitude -col=Time,*FWHM [set IK2file] "-title=IK2 $date:$hour" -endp \
           -col=Time,Timing -col=Time,Amplitude -col=Time,*FWHM [set IK3file]  "-title=IK3 $date:$hour" -endp \
           -col=Time,Timing -col=Time,Amplitude -col=Time,*FWHM [set IK4file] "-title=IK4 $date:$hour" -endp }

AnalysisKickerParameters -time0 $time0 -time1 $time1 -plotSuffix $plotSuffix

set fileList [glob $tmpRoot.*]
eval file delete -force $fileList

exit 0
