#!/bin/sh  
# \
exec oagwish "$0" "$@"
#
# $Log: not supported by cvs2svn $
# Revision 1.4  2011/01/27 17:19:53  shang
# fixed problem in post-process and added "PostProcess" button to do post processing for
# scanned data.
#
# Revision 1.3  2010/06/29 17:17:50  shang
# removed scanType variable since it is not needed.
#
# Revision 1.2  2010/05/26 17:25:16  shang
# removed high voltage scan per Stan's request.
#
# Revision 1.1  2010/05/25 19:07:00  shang
# first version, scan par kicker timing and voltage to setup the best timing and voltage
#

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)]
APSStandardSetup


set CVSRevisionAuthor "\$Revision: 1.5 $ \$Author: shang $"

proc SetStatus {text} {
    global status
    set status $text
    update
}

proc StartScan {args} {
    global outputDir rootname steps pauseAfterChange readbackPause numToAve P1IKStart P1IKEnd
    global P2IKStart P2IKEnd P4EKStart P4EKEnd P1EKVolStart P1EKVolEnd P2IKVolStart P2IKVolEnd
    global P1IKVolStart P1IKVolEnd P4EKVolStart P4EKVolEnd P1EKStart P1EKEnd
    global scanResult

    if [catch {exec cavget -list=P:bpmSum:ChargeM,LTP:FCM:qTotalAI -pend=10 -printErrors} valList] {
	return -code error $valList
    }
    set PARcharge [lindex $valList 0]
    set LTPcharge [lindex $valList 1]
    if {$PARcharge<0.5} {
	SetStatus "Par charge is too low ($PARcharge <0.5nC), scan not started."
	return
    }
    if {$LTPcharge<0.5} {
	SetStatus "LTP charge is too low ($LTPcharge <0.5nC), scan not started."
	return
    }
    set timestr [clock format [clock seconds] -format %Y-%m%d:%H%M%S]
  
    set typeList {P1IK P2IK P1EK P4EK}
    set pvList {It:P1IKtrig2ParIpAO It:P2IKtrig2ParIpAO It:Par:P1IK:Discharge2BsIpAO.VAL  It:Par:P4EK:Discharge2BsIpAO.VAL}   
    set relative 1
    
    foreach type $typeList pv $pvList {
	global $type scanResult$type
	if [set $type] {
	    if [APSYesNoPopUp "Scan $type  now?"] {
                if {$type=="P1EK" || $type=="P4EK"} {
                    SetStatus "suspend PTB controllaw for $type scan (because PTB controllaw changes $type kicker)..."
                    if [catch {exec cavput -list=PTB:ControlLaw -list=X,Y -list=RC.SUSP=1 -pend=10} result] {
                        return -code error "Error suspending PTB controllaw: $result"
                    }
                }
		SetStatus "Scan $type..."
		set expFile $outputDir/${type}-${timestr}.exp
		set outputFile $outputDir/${type}-${timestr}.sdds
		set start [set ${type}Start]
		set end [set ${type}End]
		if [catch {exec replaceText /home/helios/oagData/par/kickerTimingSetup/inputFiles/parKickerTiming.template.exp \
			       -orig=<pv_name>,<col_name>,<initial_value>,<final_value>,<steps>,<numToAve>,<pause_after_change>,<readback_pause>,<relative>  \
			       -repl=$pv,$type,$start,$end,$steps,$numToAve,$pauseAfterChange,$readbackPause,$relative \
			       $expFile } result] {
                    if {$type=="P1EK" || $type=="P4EK"} {
                        SetStatus "resume PTB controllaw..."
                        if [catch {exec cavput -list=PTB:ControlLaw -list=X,Y -list=RC.SUSP=0 -pend=10} result] {
                            return -code error "Error suspending PTB controllaw: $result"
                        }
                    }
		    return -code error "StartScan(1): $result"
		}
		set scanResult$type 0
                if [catch {TogglePulsedMagnetEnables -location PAR  } result] {
                    if {$type=="P1EK" || $type=="P4EK"} {
                        SetStatus "resume PTB controllaw..."
                        if [catch {exec cavput -list=PTB:ControlLaw -list=X,Y -list=RC.SUSP=0 -pend=10} result] {
                            return -code error "Error suspending PTB controllaw: $result"
                        }
                    }
                    SetStatus "Error turning on par beam: $result"
                    return
                }
		APSExecLog .ik$type -name "$type  scan" -width 100 \
		    -unixCommand "sddsexperiment $expFile $outputFile -verbose" \
		    -callback "PostProcessScan -filename $outputFile -type $type -pv $pv -steps $steps;set scanResult$type done" \
		    -abortCallback "set scanResult$type aborted" -cancelCallback "set scanResult$type canceled"
                
		tkwait variable scanResult$type
		
		if [string compare [set scanResult$type] "done"]!=0 {
                    if {$type=="P1EK" || $type=="P4EK"} {
                        SetStatus "resume PTB controllaw..."
                        if [catch {exec cavput -list=PTB:ControlLaw -list=X,Y -list=RC.SUSP=0 -pend=10} result] {
                            return -code error "Error suspending PTB controllaw: $result"
                        }
                    }
		    SetStatus "StartScan(2): $type scan was [set scanResult$type]"
                    return
		}
                if {$type=="P1EK" || $type=="P4EK"} {
                    SetStatus "resume PTB controllaw..."
                    if [catch {exec cavput -list=PTB:ControlLaw -list=X,Y -list=RC.SUSP=0 -pend=10} result] {
                        return -code error "Error suspending PTB controllaw: $result"
                    }
                }
		SetStatus "$type scan done."
	    }
	}
    }
}

proc PostProcess {args} {
    global outputDir rootname P1IK P2IK P1EK P4EK selectFile
    set typeList {P1IK P2IK P1EK P4EK}
    set pvList {It:P1IKtrig2ParIpAO It:P2IKtrig2ParIpAO It:Par:P1IK:Discharge2BsIpAO.VAL  It:Par:P4EK:Discharge2BsIpAO.VAL} 
    foreach type $typeList pv $pvList {
	if [set $type] {
	    set pv 
	    set files [glob -nocomplain $outputDir/${type}*.sdds]
	    if ![llength $files] {
		return -code error "No files found."
	    }
	    APSScrolledListWindow .select -name "Select File" -label "Select File" \
		-itemList $files -selectionVar selectFile
	    tkwait variable selectFile
	    if [catch {PostProcessScan -filename $selectFile -type $type -pv $pv} result] {
		return -code error $result
	    }
	}
    }
}

proc PostProcessScan {args} {
    set filename ""
    set type ""
    set pv ""
    set steps 1
    APSParseArguments {filename type pv steps}
    
    set rows [exec sdds2stream -rows=bar $filename]
    if {0} {
    if {$rows<$steps} {
	set tmpFile /tmp/[APSTmpString]
	if [catch {exec sddscasr -save /home/helios/oagData/par/kickerTimingSetup/inputFiles/parKicker.mon -num -pipe=out \
		       | sddsprocess -pipe=in  -scan=col,Value,ValueString,%lf -nowarnings \
		       "-test=col,Value LowerLimit < Value UpperLimit > ||" $tmpFile} result] {
	    return -code error "PostProcessScan1: $result"
	}
	set pvs [exec sdds2stream -col=ControlName $tmpFile]
	return -code error "PostProcessScan2: $type scan was aborted due to test failure of [join $pvs ,]."
    }
    }
   # exec sddsplot -col=${type},PTB:CM:qTotalAI $filename &
    if [catch {exec sddssmooth $filename -pipe=out \
		   -col=PTB:CM:qTotalAI -despike \
		   | sddsprocess -pipe=in ${filename}.proc \
		   -process=PTB:CM:qTotalAI,max,Position,functionOf=$type,position } result] {
	return -code error "Postprocess(2a): $result"
    }
    exec sddsplot -grap=line,vary -col=${type},PTB:CM:qTotalAI $filename -leg=spec=raw_data \
	-col=${type},PTB:CM:qTotalAI -leg=spec=smoothed_data \
	$filename.proc &
    set value [exec sdds2stream -par=Position $filename.proc]
    
    if [APSYesNoPopUp "Confirm, set $pv to $value?"] {
        if [catch {exec cavput -list=$pv=$value -pendIO=20} result] {
            return -code error "unable to set $pv: $result"
        }
    }
}

set outputDir [APSGoToDailyDirectory -subdirectory parKickerScan]
APSApplication . -name "ParKickerTimingSetup" -version $CVSRevisionAuthor \
  -overview "scan par kickers and setup par kicker timing."

set status "Ready."
set rootname parKickerScan
set steps 31
set pauseAfterChange 2.0
set readbackPause 0.5
set numToAve 5
set P1EKStart -0.1
set P1EKEnd 0.1
set P1IKStart -0.1
set P1IKEnd 0.1
set P2IKStart -0.1
set P2IKEnd 0.1
set P4EKStart -0.1
set P4EKEnd 0.1

foreach type {P1EK P1IK P2IK P4EK P1EKVol P2IKVol P4EKVol P1IKVol} {
    set $type 1
}

APSScrolledStatus .status -parent .userFrame -textVariable status \
    -width 70 -height 8


APSLabeledEntry .dir -parent .userFrame -width 70 \
  -label "Output dir: " -textVariable outputDir \
  -contextHelp \
  "Enter a directory in which the output files will be written."
APSButton .dialy -parent .userFrame.dir -text "daily" -size small \
  -command {set outputDir [APSGoToDailyDirectory -subdirectory parKickerScan]} \
  -packOption "-side right" \
  -contextHelp "Set the output dir to APS daily directory"
APSLabeledEntry .rootname -parent .userFrame -width 70 \
  -label "Output rootname: " -textVariable rootname \
  -contextHelp \
  "Enter a rootname for generation of the output filenames."
APSFrameGrid .grid -parent .userFrame -xList {x1 x2}
set w1 .userFrame.grid.x1
set w2 .userFrame.grid.x2

set width 21

APSLabeledEntry .steps -parent $w2 -width $width -label "Experiment Steps:" -textVariable steps
APSLabeledEntry .pause -parent $w1 -width $width -label "Pause (s) after change control:" -textVariable pauseAfterChange \
  -contextHelp "The waiting time after each control pv change"
APSLabeledEntry .read -parent $w2 -width $width -label "Pause (s) between two readings:" -textVariable readbackPause \
  -contextHelp "The waiting time between two readbacks for reading the monitoring PVs in each experiment (scan) step."
APSLabeledEntry .ave -parent $w1 -width $width -textVariable numToAve -label "Average number:" \
  -contextHelp "The average number of reading the monitor pvs at each experiment (scan) step"

APSLabeledEntryFrame .ik1 -parent $w1 -label "P1IK scan range relative(start/end):" -width 10 -orientation horizontal \
    -variableList {P1IKStart P1IKEnd} -contextHelp "provide the scan range of It:P1IKtrig2ParIpAO"
APSLabeledEntryFrame .ik2 -parent $w2 -label "P2IK scan range relative(start/end):" -width 10 -orientation horizontal \
    -variableList {P2IKStart P2IKEnd} -contextHelp "provide the scan range of It:P2IKtrig2ParIpAO"
APSLabeledEntryFrame .ik -parent $w1 -label "PAR P1IK discharge scan range relative(start/end):" -width 10 -orientation horizontal \
    -variableList {P1EKStart P1EKEnd} -contextHelp "provide the scan range of It:Par:P1IK:Discharge2BsIpAO.VAL"
APSLabeledEntryFrame .ek4 -parent $w2 -label "P4EK scan range relative(start/end)" -width 10 -orientation horizontal \
    -variableList {P4EKStart P4EKEnd} -contextHelp "provide the scan range of It:Par:P4EK:Discharge2BsIpAO.VAL"


set timingList {P1IK P2IK P1EK P4EK}
APSCheckButtonFrame .check -parent .userFrame -label "Select kicker to scan: " -buttonList $timingList  \
    -variableList $timingList -allNone 1 -orientation horizontal


APSButton .start -parent .userFrame -text "Start Timing Scan" -command "StartScan"
APSButton .post -parent .userFrame -text "Post Process" -command "PostProcess"



