#!/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 "\$Author: shang $"
proc SetStatus {text} {
    global status
    set status "[exec date] $text"
    update
}

proc CollectAndCompute {args} {
    global outputDir monFile steps interval runDone scalarsFile
    
    cd $outputDir
    SetStatus "turn on laser shutter..."
    set datestring [clock format [clock seconds] -format %Y-%m%d-%H%M%S]
    if [catch {exec cavput -list=L:LR:shutter3C=1 -pend=10 } result] {
        return -code error "Error in opening laser shutter: $result"
    }
    SetStatus "collecting data ..."
    set runDone 0
    set filename1 ${datestring}-uvEnergy.sdds
    APSExecLog .itsqe -unixCommand "sddsmonitor $monFile $filename1 -steps=$steps -interval=$interval -verbose" -width 80\
      -cancelCallback "set runDone 2" \
      -abortCallback "set runDone 2" \
      -callback "ProcessFile -filename $filename1; set runDone 1"
    tkwait variable runDone
    if $runDone==2 {
        SetStatus "Collecting date was aborted."
        return
    }
    if ![file exist $filename1.proc] {
        return -code error "Error $filename was not processed."
    }
    SetStatus "close laser shutter..."
    if [catch {exec cavput -list=L:LR:shutter3C=0 -pend=10 } result] {
        return -code error "Error in opening laser shutter: $result"
    }
    SetStatus "collecting data ..."
    set runDone 0
    set filename2 ${datestring}-uvEnergyOff.sdds
    APSExecLog .itsqe -unixCommand "sddsmonitor $monFile $filename2 -steps=$steps -interval=$interval -verbose" -width 80 \
      -cancelCallback "set runDone 2" \
      -abortCallback "set runDone 2" \
      -callback "ProcessFile -filename $filename2; set runDone 1"
    tkwait variable runDone
    SetStatus "open laser shutter after measurement."
    if [catch {exec cavput -list=L:LR:shutter3C=1 -pend=10 } result] {
        return -code error "Error in opening laser shutter: $result"
    }
    if $runDone==2 {
        SetStatus "Collecting date was aborted."
        return
    }
    if ![file exist $filename1.proc] {
        return -code error "Error $filename2 was not processed."
    }
    SetStatus "Processing QE..."
    if [catch {ComputeQE -rootname ${datestring}- } result] {
        return -code error $result
    }
    SetStatus "$result"
    
}
proc ProcessFile {args} {
    global outputDir
    set filename ""
    APSParseArguments {filename}
    
    cd $outputDir
    if [catch {exec sddsconvert $filename -del=par,*  -pipe=out \
                 | sddsprocess -pipe=in $filename.proc \
                 -process=L1*,ave,%sAve \
                 -process=LTS:PT3:DC1ARF.VAL,ave,%sAve \
                 -process=L:LR:EM3:energyM.VAL,ave,EnergyAve \
                 -process=L:LR:EM3:energyM.VAL,standardDeviation,EnergyStd \
                 -process=LTS:CM1:measChargeCM,ave,ChargeAve \
                 -process=LTS:CM1:measChargeCM,standardDeviation,ChargeStd \
                 "-redefine=par,EnergyError,EnergyStd EnergyAve /" \
                 "-redefine=par,ChargeError,ChargeStd ChargeAve /" } result] {
        return -code error "Error in process file $filename: $result"
    }                 
}

proc ComputeQE {args} {
    global outputDir
    set rootname ""
    APSParseArguments {rootname}

    SetStatus "Processing QE..."
    if ![file exist ${rootname}uvEnergy.sdds.proc] {
        if [catch {ProcessFile -filename ${rootname}uvEnergy.sdds } result] {
            return -code error $result
        }
    }
    if ![file exist ${rootname}uvEnergyOff.sdds.proc] {
        if [catch {ProcessFile -filename  ${rootname}uvEnergyOff.sdds } result] {
            return -code error $result
        }
    }
    
    set filename ${rootname}QE.sdds
    if [catch {exec sddsconvert ${rootname}uvEnergyOff.sdds.proc -edit=par,*,ei/Off/ \
                 -edit=col,L*,ei/Off/ -pipe=out \
                 | sddsxref -pipe  ${rootname}uvEnergy.sdds.proc -transfer=par,* -take=L*  \
                 | sddsprocess -pipe=in $filename \
                 "-redefine=par,Energy,EnergyAve EnergyAveOff -,units=J" \
                 "-redefine=par,Charge,ChargeAve ChargeAveOff -,units=nC" \
                 "-redefine=par,ChargeErrCombine,ChargeError ChargeErrorOff +" \
                 "-redefine=par,EnergyErrCombine,EnergyError EnergyErrorOff +" \
                 "-redefine=par,QE,Charge Energy / 4.7e-9 *" \
                 "-redefine=par,QEerror,ChargeErrCombine EnergyErrCombine + QE *"  } result] {
        return -code error "Error in processing QE: $result"
    }
    if [catch {exec sddsprintout $filename $filename.printout \
                 -par=QE,format=%6.1e,endsline  \
                 -par=Energy,endsline -par=Charge,endsline \
                 -par=L1:LTS:GUN:VP:CO1Ave,endsline \
                 -par=L1:LTS:GUN:VP:CO2Ave,endsline \
                 -par=L1:AS1:CC:02Ave,endsline \
                 -par=L1:PC1:SM:PS:CurrentAIAve,endsline \
                 -par=LTS:PT3:DC1ARF.VALAve,endsline } result] {
        return -code error $result
    }
    APSFileDisplayWindow [APSUniqueName .] -fileName $filename.printout \
      -deleteOnClose 1 -width 100 -height 45 -printCommand "enscript -r"
    
    SetStatus "done."

}

proc DeleteFiles {args} {
    global outputDir
    cd $outputDir
    set list .its.userFrame.sl.listbox 
    set chosenList [$list curselection]
    if ![llength $chosenList] {
	return
    }
    foreach index $chosenList {
	set file [$list get $index]
	if [APSYesNoPopUp "Are you sure to delete file $file and related files?"] {
            set rootname [regsub "uvEnergy.sdds" $file ""]
	    set fileList [glob -nocomplain  ${rootname}*]
            SetStatus "deleting $file..."
            eval file delete -force $fileList
	    $list delete $index
	}
    }
    SetStatus "delete done."
}

proc PlotCallback {args} {
    eval PrintFile -files $args
}

proc PrintResult {args} {
    global outputDir fileSelect
    cd $outputDir
    set files [glob *-uvEnergy.sdds]
    if ![llength $files] {
        return -code error "No data found."
    }
    set fileSelect ""
    APSScrolledListWindow .itsqe1 -name "Select files" \
      -label "Select Files." -callback "PlotCallback"  \
      -itemList $files  -selectionVar fileSelect
    APSDialogBoxAddButton .delete -parent .itsqe1 -text "Delete" -command "DeleteFiles"
    
    tkwait variable fileSelect
    if ![llength $fileSelect] {
	SetStatus "no files chosen."
	return
    }
}

proc PrintFile {args} {
    set files ""
    APSParseArguments {files}

    foreach file $files {
        set rootname [regsub "uvEnergy.sdds" $file ""]
        if [catch {ComputeQE -rootname $rootname } result] {
            return -code error "Error in computing QE for $rootname: $result"
        }
    }

}

APSApplication . -name ITSQEMeasurement
set status ""
APSScrolledStatus .status -parent .userFrame -textVariable status -height 4 -width 60

set monFile /home/helios/oagData/ITS/ITSQEmeas.mon
set outputDir [APSGoToDailyDirectory]
set interval 1.0
set steps 100
APSLabeledEntry .dir -parent .userFrame -label "Output directory: " -textVariable outputDir -width 80
APSLabeledEntry .interval -parent .userFrame -label "Interval (seconds): " -textVariable interval -width 50
APSLabeledEntry .steps -parent .userFrame -label "Steps: " -textVariable steps -width 50

APSButton .run -parent .userFrame -text "Run" -command "CollectAndCompute"
APSButton .display -parent .userFrame -text "PrintResult" -command "PrintResult"
