#!/bin/sh  
# \
exec oagwish "$0" "$@"

set CVSRevisionAuthor "\$Revision: 1.15 $ \$Author: shang $"
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

proc AcquireLinacICTWaveform {args} {
    set subDir ""
    APSParseArguments {subDir}
    global archiveDir xstart xend scalarsFile
    set dir /home/helios/oagData/$subDir
    if [catch {exec cavget -list=L1:RFG:RF:SW2:positionMI -printErrors -pend=30} gun] {
	return -code error "Error in reading RG gun type: $gun"
    }
    switch $gun {
	RG2 {
	    set gun 2
	}
	RG1 {
	    set gun 1
	}
    }
    set ext [clock format [clock seconds] -format %Y-%j-%m%d-%H%M%S]
    set file $dir/RG${gun}-${ext}.sdds
    if [catch {exec sddswmonitor $file \
		   -scalars=$scalarsFile \
		   -PVnames=L1:SCOPE1:scaledTimeAxisWF,L1:SCOPE1:chan4ScaledWaveWF \
		   -steps=1  } result] {
        return -code error "AcqureLiancICTWaveform2: error in sddswmonitor: $result"
    }
    
    if [catch {exec sddsprocess $file $file.proc -define=col,Time,L1:SCOPE1:scaledTimeAxisWF,units=\$gm\$rs \
		   -define=col,ICTcurrent,L1:SCOPE1:chan4ScaledWaveWF,units=Amps \
		   "-print=par,PowerString,RG$gun power = %0.2f %s,L1:RG${gun}:HTR:VoltageAO,L1:RG${gun}:HTR:VoltageAO.units" \
		   "-print=par,ICTpeakCurrentString,RG$gun peak current = %0.2f %s,RG${gun}PeakCurrent,RG${gun}PeakCurrent.units" } result] {
	return -code error "AcqureLiancICTWaveform3: error in processing data: $result"
    }
    exec sddsplot -col=Time,ICTcurrent -topline=@ICTpeakCurrentString $file.proc -string=@PowerString,p=0.1,q=0.85,scale=1.5 &
}

proc AcquireLinacGunRFWaveform {args} {
    set subDir ""
    APSParseArguments {subDir}
    if [catch {exec cavget -list=L1:RFG:RF:SW2:positionMI -printErrors -pend=30} gun] {
	return -code error "Error in reading RG gun type: $gun"
    }
    
    global archiveDir xstart xend scalarsFile
    set dir /home/helios/oagData/$subDir
    SetStatus "Collecting linac RF waveform..."
    if {0} {
    if [catch {exec  cavput -list=LTS:PT3:DC1ARF.SPD=On,LTS:PT3:DC1BRF.SPD=On,LTS:PT3:DC1ARF.AQWF=Scan,LTS:PT3:DC1BRF.AQWF=Scan \
                 -pend=30} result] {
        return -code error "AcqureLinacGunRFWaveform1: unable to setup LTS: $result"
    }
    set endTime [expr [clock seconds] + 10000]
    SetStatus "waiting for waveform to settle..."
    exec cawait -waitFor=LTS:PT3:DC1BRF.SPD,sameAs=Off -interval=1 -timeLimit=10
    exec cawait -waitFor=LTS:PT3:DC1ARF.SPD,sameAs=Off -interval=1 -timeLimit=10
    }
    #while {1} {
    #    after 1000
    #    update
    #}
    switch $gun {
	RG2 {
	    set gun 2
	}
	RG1 {
	    set gun 1
	}
    }
    set ext [clock format [clock seconds] -format %Y-%j-%m%d-%H%M%S]
    set file $dir/RG${gun}${ext}.sdds
    if [catch {exec sddswmonitor $file \
                 -scalars=$scalarsFile \
                 -PVnames=LI:MON:chan1ScaledWaveWF,LI:MON:chan2ScaledWaveWF,LI:MON:scaledTimeAxisWF \
                 -steps=1  } result] {
        return -code error "AcqureLinacGunRFWaveform2: error in sddswmonitor: $result"
    }
    if [catch {exec sddsprocess $file -pipe=out -process=LI:MON:chan1ScaledWaveWF,max,PeakPower \
		   | sdds2stream -pipe -par=PeakPower} peakPower] {
	return -code error "AcqureLinacGunRFWaveform2: error in sddsprocess: $result"
    }
    if {$peakPower<=0} {
	SetStatus "Error: the Linac RF waveform has no signal (all zeros or negative), please contact control personnel to check the Linace RF scope."
	return
    }
    if [catch {exec sddsprocess $file -nowarnings -pipe=out \
		   -process=LI:MON:chan1ScaledWaveWF,max,PeakPower \
		   "-redefine=col,Time,LI:MON:scaledTimeAxisWF,symbol=Time,units=\$gm\$rs" \
		   "-redefine=param,LinacRFGFwdPwr,LinacRFGFwdPwr 1.0e6 /,units=MW" \
		   "-reprint=param,RFGFPWRString,Linac RG RF Gun Peak FWD Power = %0.2f %s,LinacRFGFwdPwr,LinacRFGFwdPwr.units" \
		   "-reprint=param,RFGHTRPWRString,RF Heater Power = %0.2f %s,RG${gun}HeaterPower,RG${gun}HeaterPower.units" \
		   "-reprint=param,RFGSupplyTempString,RG${gun} H2O Supply Temp = %0.2f %s,RG${gun}WaterSupplyTemp,RG${gun}WaterSupplyTemp.units" \
		   "-reprint=param,RFGReturnTempString,RG${gun} H2O Return Temp = %0.2f %s,RG${gun}WaterReturnTemp,RG${gun}WaterReturnTemp.units" \
		   | sddsprocess -pipe=in $file.proc \
		   "-redefine=col,ForwardPower,LI:MON:chan1ScaledWaveWF PeakPower / LinacRFGFwdPwr *,symbol=FWD Power,units=MW" \
		   "-redefine=col,ReflectPower,LI:MON:chan2ScaledWaveWF PeakPower / LinacRFGFwdPwr *,symbol=REF Power,units=MW" } result] {
        return -code error "AcqureLinacGunRFWaveform4: error in sddsprocess: $result"
    }
    SetStatus "done."
    exec sddsplot -limits=xminimum=$xstart,xmaximum=$xend -leg \
	-scale=$xstart,$xend,0,0 \
      -subticksettings=xdivisions=5,ydivisions=5 \
      -title=@TimeStamp,scale=0.6 \
      $file.proc  \
      -topline=@RFGFPWRString,scale=0.5 \
      -string=@RFGHTRPWRString,p=0.1,q=0.90 \
      -string=@RFGSupplyTempString,p=0.1,q=0.85 \
      -string=@RFGReturnTempString,p=0.1,q=0.80 \
      "-col=Time,*Power" -graph=line,vary \&
   return 
}


proc AcquireLinacPCGunRFWaveform {args} {
    set subDir ""
    APSParseArguments {subDir}
    
    global archiveDir xstart xend
    set scalarsFile /home/helios/oagData/ITS/ITS_LinacRFGun_scalars.mon
    set dir /home/helios/oagData/$subDir
    SetStatus "Collecting linac PC gun waveform..."
    
    set ext [clock format [clock seconds] -format %Y-%j-%m%d-%H%M%S]
    set file $dir/PCGun${ext}.sdds
    if [catch {exec sddswmonitor $file \
                 -scalars=$scalarsFile \
                 -PVnames=LI:MON:chan1ScaledWaveWF,LI:MON:chan2ScaledWaveWF,LI:MON:chan4ScaledWaveWF,LI:MON:scaledTimeAxisWF \
                 -steps=1  } result] {
        return -code error "AcqureLinacPCGunRFWaveform2: error in sddswmonitor: $result"
    }
    if [catch {exec sddsprocess $file -pipe=out -process=LI:MON:chan1ScaledWaveWF,max,PeakPower \
		   | sdds2stream -pipe -par=PeakPower} peakPower] {
	return -code error "AcqureLinacPCGunRFWaveform2: error in sddsprocess: $result"
    }
    if {$peakPower<=0} {
	SetStatus "Error: the Linac RF waveform has no signal (all zeros or negative), please contact control personnel to check the Linace RF scope."
	return
    }
   # puts $file
    if [catch {exec sddsprocess $file -nowarnings -pipe=out \
                 -process=LI:MON:chan1ScaledWaveWF,max,PeakPower \
                 "-redefine=col,Time,LI:MON:scaledTimeAxisWF,symbol=Time,units=\$gm\$rs" \
                 "-redefine=param,LinacPCGunFwdPwr,PCGunFwdPwr 1.0e6 /,units=MW" \
                 "-reprint=param,PCGUNFPWRString,Linac PC Gun Peak FWD Power = %0.2f %s,LinacPCGunFwdPwr,LinacPCGunFwdPwr.units" \
                 | sddsprocess -pipe=in $file.proc \
                 "-redefine=col,ForwardPower,LI:MON:chan1ScaledWaveWF PeakPower / LinacPCGunFwdPwr *,symbol=FWD Power,units=MW" \
                 "-redefine=col,CathodCellProbe,LI:MON:chan2ScaledWaveWF PeakPower / LinacPCGunFwdPwr *,units=MW" \
                 "-redefine=col,ReflectPower,LI:MON:chan4ScaledWaveWF PeakPower / LinacPCGunFwdPwr *,symbol=REF Power,units=MW" } result] {
        return -code error "AcqureLinacPCGunWaveform4: error in sddsprocess: $result"
    }
  #  SetStatus "done."
    exec sddsplot -limits=xminimum=$xstart,xmaximum=$xend -leg \
	-scale=$xstart,$xend,0,0 \
      -subticksettings=xdivisions=5,ydivisions=5 \
      -title=@TimeStamp,scale=0.6 \
      $file.proc  \
      -topline=@PCGUNFPWRString,scale=0.5 \
      "-col=Time,*Power" -graph=line,vary \
      -endp \
      -col=Time,CathodCellProbe -legend &
    SetStatus "done."
   return 
}

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

proc kickerPlotCallback {args} {
    eval PlotKickerFiles -files $args
}

proc PlotFile {args} {
    set files ""
    APSParseArguments {files}
    global EPS PNG xstart xend plotData 
    if ![llength $files] {
	return
    }
     if [llength $files]>1 {
	if [regexp {RF} $plotData] {
	    eval exec sddsplot $files -limits=xminimum=$xstart,xmaximum=$xend -leg=file,edit=%/.sdds.proc// -layout=1,2 \
		-scale=$xstart,$xend,0,0 \
		-subticksettings=xdivisions=5,ydivisions=5 \
		\"-title=Forward Power Waveforms\" \
		-col=Time,ForwardPower  -graph=line,vary \
		-endp  \
		-col=Time,ReflectPower \
		-graph=line,vary \
		\"-title=Reflect Power Waveforms\"
	} elseif [regexp {PCGun} $plotData] {
            eval exec sddsplot $files -limits=xminimum=$xstart,xmaximum=$xend -leg=file,edit=%/.sdds.proc// -layout=1,2 \
              -scale=$xstart,$xend,0,0 \
              -subticksettings=xdivisions=5,ydivisions=5 \
              \"-title=Forward Power Waveforms\" \
              -col=Time,ForwardPower  -graph=line,vary \
              -endp  \
              -col=Time,ReflectPower \
              -graph=line,vary \
              \"-title=Reflect Power Waveforms\"
        } else {
	    if [regexp {Kicker} $plotData] {
		eval exec sddsplot $files -grap=line,vary -leg=file,edit=%/.sdds//%/.proc// -layout=1,2 \
                  -scale=$xstart,$xend,0,0 \
                  -subticksettings=xdivisions=5,ydivisions=5 \
                  -col=AdjTime,RG1Kicker  -endp \
                  -col=AdjTime,RG2Kicker  -endp &
	    } else {
		eval exec sddsplot $files -grap=line,vary -leg=file,edit=%/.sdds//%/.proc// -col=Time,ICTcurrent &
	    }
	}
    } else {
	if [regexp {RF} $plotData] {
	    exec sddsplot -limits=xminimum=$xstart,xmaximum=$xend -leg \
		-scale=$xstart,$xend,0,0 \
		-subticksettings=xdivisions=5,ydivisions=5 \
		-title=@TimeStamp,scale=0.6 \
		$files  \
		-topline=@RFGFPWRString,scale=0.5 \
		-string=@RFGHTRPWRString,p=0.1,q=0.90 \
		-string=@RFGSupplyTempString,p=0.1,q=0.85 \
		-string=@RFGReturnTempString,p=0.1,q=0.80 \
		"-col=Time,*Power" -graph=line,vary &
	    
	} elseif [regexp {PCGun} $plotData] {
            exec sddsplot -limits=xminimum=$xstart,xmaximum=$xend -leg \
              -scale=$xstart,$xend,0,0 \
              -subticksettings=xdivisions=5,ydivisions=5 \
              -title=@TimeStamp,scale=0.6 \
              $files  \
              -topline=@PCGUNFPWRString,scale=0.5 \
              "-col=Time,*Power" -graph=line,vary -endp \
              -col=Time,CathodCellProbe -leg &
        } else {
	    if [regexp {Kicker} $plotData] {
                set pars [exec sddsquery -par [lindex $files 0]]
                if [lsearch -exact $pars KickerRateStr]<0 {
                    exec sddsplot $files -col=AdjTime,*Kicker -grap=line,vary -leg -title=$files,edit=%/.sdds// \
                      -scale=$xstart,$xend,0,0 \
                      -string=@RG1KickerStr,p=0.45,q=0.9,scale=0.9 \
                      -string=@RG2KickerStr,p=0.45,q=0.85,scale=0.9 \
                      -string=@TriggerStr,p=0.45,q=0.8,scale=0.9 &
                } else {
                    exec sddsplot $files -col=AdjTime,*Kicker -grap=line,vary -leg -title=$files,edit=%/.sdds// \
                      -scale=$xstart,$xend,0,0 \
                      -string=@RG1KickerStr,p=0.45,q=0.9,scale=0.9 \
                      -string=@RG2KickerStr,p=0.45,q=0.85,scale=0.9 \
                      -string=@TriggerStr,p=0.45,q=0.8,scale=0.9 \
                      -string=@KickerRateStr,p=0.45,q=0.75,scale=0.9 &
                }
	    } else {
		set pars [exec sddsquery -par $files]
		if [lsearch $pars PowerString]>=0 {
		    exec sddsplot $files -col=Time,ICTcurrent -topline=@ICTpeakCurrentString -string=@PowerString,p=0.1,q=0.85,scale=1.5 &
		} else {
		    exec sddsplot $files -col=Time,ICTcurrent -topline=@ICTpeakCurrentString  &
		}
	    }
	}
    }
}

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

proc ChangePlotRange {args} {
    global EPS PNG xstart xend plotData plotFiles figureDir
    switch $plotData {
	RG1_RF -
	RG2_RF {
            set xstart -3.0
            set xend 1.0
	}
	RG1_current -
	RG2_current {
            set xstart -0.5
            set xend 2.0
	}
	rfGunKicker {
            set xstart -0.1
            set xend 0.3
	}
        Linac_PCGun {
            set xstart -1.0
            set xend 3.5
        }
    }
}
proc PlotWaveform {args} {
    global EPS PNG xstart xend plotData plotFiles figureDir
    
    switch $plotData {
	RG1_RF -
	RG2_RF {
	    set dir /home/helios/oagData/linac/gunRF
	    set prefix [string range $plotData 0 2]
	    set suffix .proc
	}
	RG1_current -
	RG2_current {
	    set dir /home/helios/oagData/linac/cmData
	    set prefix [string range $plotData 0 2]
	    set suffix .proc
	}
	rfGunKicker {
	    set dir /home/helios/oagData/linac/rfGunKicker
	    set prefix ""
	    set suffix ""
	}
        Linac_PCGun {
            set dir /home/helios/oagData/linac/PCGun
            set prefix PCGun
            set suffix .proc
        }
    }
    cd $dir
    set files [lsort -decreasing [glob -nocomplain ${prefix}*.sdds$suffix]]
    if ![llength $files] {
        SetStatus "No data found for $plotData in $dir."
        return
    }
    set plotFiles ""
    APSScrolledListWindow .its -name "Select files for plot" \
	-label "Select Files for plot." -callback PlotCallback \
	-itemList $files  -selectionVar plotFiles
    APSDialogBoxAddButton .delete -parent .its -text "Delete" -command "DeleteFiles -dataDir $dir"
    tkwait variable plotFiles
    if ![llength $plotFiles] {
	SetStatus "No files chosen for plot."
	return
    }
   # PlotFile -files $plotFiles
    
}

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

proc SetupDMUscopeMux {args} {
    global dataType
    if [regexp {rfGunKicker} $dataType] {
	SetStatus "No need to switch DMU mux for current waveform."
	return
    }
    switch $dataType  {
	Linac_ICT -
        Linac_RF {
	    set chan1 3
	    set chan2 4
	    set pvList {L1:MTM:EDM2:chan1SelReqMO L1:MTM:EDM2:chan2SelReqMO}
	    if [catch {exec cavput -list=LI:MON:stopReadRunMO=2 -pend=10} result] {
		return -code error "Error setting LI:MON:stopReadRunMO to 2: $result"
	    }
	    set valList0 {3 4}
	}
	Linac_PCGun {
	    #L3:MTM:EDM1:chan1SelReqMO=PG1 Fwd
	    set chan1 5
	    #LTS:MTM:EDM1:chan2SelReqMO=PCG FP1
	    set chan2 7
	    #L3:MTM:EDM1:chan2SelReqMO=PG1 Refl"
	    set chan3 6
	    set pvList {L3:MTM:EDM1:chan1SelReqMO LTS:MTM:EDM1:chan2SelReqMO L3:MTM:EDM1:chan2SelReqMO}
	    set valList0 {5 7 6}
	}
    }
    
    if [catch {exec cavget -list=[join $pvList ,] -num -pend=10 -printErrors} valList] {
	rturn -code error "Error reading [join $pvList]: $valList"
    }
    set switchMux 0
    set putList ""
    foreach pv $pvList val $valList  val0 $valList0 {
	if {$val!=$val0} {
	    set switchMux 1
	    lappend putList $pv=$val0
	}
    }
    if !$switchMux {
	SetStatus "DMU mux is already at $dataType state, no need to change mux!"
	return
    }
    SetStatus "Switch DMU mux to $dataType..."
    if [catch {exec cavput -list=[join $putList ,] -pend=30 } result] {
	return -code error "Error setting mux: return"
    }
    after 4000
    return
    SetStatus "switching DMU mux to $dataType"
    if [catch {exec sddscasr -restore /home/helios/oagData/ITS/gun_initialize.sdds } result] {
	return -code error $result
    }
    after 2000
    switch $dataType {
        Linac_ICT -
        Linac_RF {
            exec cavput -list=L1:MTM:EDM2:chan1SelReqMO=3,L1:MTM:EDM2:chan2SelReqMO=4,LI:MON:stopReadRunMO=2
            # exec cavput -list=L1:MTM:EDM2:chan1SelReqMO=0,L1:MTM:EDM2:chan2SelReqMO=0
            # exec cavput -list=L1:MTM:EDM2:chan1SelReqMO=3,L1:MTM:EDM2:chan2SelReqMO=4
        }
        Linac_PCGun {
           # exec cavput -list=L1:MTM:EDM2:chan1SelReqMO=0,LTS:MTM:EDM1:chan2SelReqMO=0,L3:MTM:EDM1:chan2SelReqMO=0
            exec cavput "-list=L3:MTM:EDM1:chan1SelReqMO=PG1 Fwd"
            exec cavput "-list=LTS:MTM:EDM1:chan2SelReqMO=PCG FP1"
            exec cavput "-list=L3:MTM:EDM1:chan2SelReqMO=PG1 Refl"
        }
    }
    after 6000
    return
    if [regexp {ITS} $dataType] {
	exec cavput -list=LTS:MTM:EDM1:chan1SelReqMO=1,LTS:MTM:EDM1:chan2SelReqMO=2
	exec cavput -list=LTS:MTM:EDM1:chan1SelReqMO=0,LTS:MTM:EDM1:chan2SelReqMO=0
	exec cavput -list=LTS:MTM:EDM1:chan1SelReqMO=1,LTS:MTM:EDM1:chan2SelReqMO=2
    } elseif [regexp {Linac} $dataType] {
	exec cavput -list=L1:MTM:EDM2:chan1SelReqMO=3,L1:MTM:EDM2:chan2SelReqMO=4
	exec cavput -list=L1:MTM:EDM2:chan1SelReqMO=0,L1:MTM:EDM2:chan2SelReqMO=0
	exec cavput -list=L1:MTM:EDM2:chan1SelReqMO=3,L1:MTM:EDM2:chan2SelReqMO=4
        
    }
    after 5000
    SetStatus "done."
}


proc AcquireWaveform {args} {
    global archiveDir dataType scalarsFile subDir
    if {$dataType!="Linac_PCGun"} {
        if [catch {SetupDMUscopeMux} result] {
            SetStatus $result
            return   
        }
    }
    switch $dataType {
	Linac_ICT {
	    if [catch {AcquireLinacICTWaveform -subDir $subDir} result] {
		SetStatus "Error in collecting linac ICT waveform: $result"
		return
	    }
	}
	Linac_RF {
	    if [catch {AcquireLinacGunRFWaveform -subDir $subDir} result] {
		SetStatus "Error in collecting linac RF waveform: $result"
		return
	    }
	}
	rfGunKicker {
	    if [catch {AcquireRFGunKickerWaveform -subDir $subDir} result] {
		SetStatus "Error in collecting linac RF gun kicker waveform: $result"
		return
	    }
	}
        Linac_PCGun {
            if [catch {AcquireLinacPCGunRFWaveform -subDir $subDir} result] {
                SetStatus "Error in collecting linac PC gun RF waveform: $result"
                return
	    } 
        }
    }
    SetStatus "done."
}

proc AcquireRFGunKickerWaveform {args} {
    set subDir ""
    APSParseArguments {subDir}
    global archiveDir xstart xend 
    set monFile /home/helios/oagData/linac/archiveData/rfGunKicker.wmon
    set scalarsFile /home/helios/oagData/linac/archiveData/rfGunKicker.scalars
    
    set dir /home/helios/oagData/$subDir
    set dataTaken 0
    #if running topup, the longest wait time is 2 minutes
    set timeout [expr [clock seconds] + 120]
    set dataTaken 0
    set first 1

    if [catch {exec cavget -list=L1: -list=RG1,RG2 -list=:KIK:VoltSetSendAO -pend=20 -printErrors} pfnList] {
	    return -code error "Unable to read RG1/2 high voltage value: $result"
    }
    
    set rg1Setpoint [lindex $pfnList 0]
    set rg2Setpoint [lindex $pfnList 1]
    
    if [catch {exec cavput -list=L1: -list=RG1,RG2 -list=:KIK:VoltSetSendAO=15 -pend=2} result] {
	    return -code error "Unable to set RG1/2 high voltage value: $result"
    }
    
    # set error 0
    # set message ""
    # foreach gun {RG1 RG2} val $pfnList {
    # 	if {$val<21} {
    # 	    append message "\n$gun high voltage value ($val) is less than 21kV."
    # 	    incr error
    # 	}
    # }
    # if $error {
    # 	SetStatus $message
    # 	set answer  [APSMultipleChoice .warning -name "RF gun high voltage check failed" -width 80 -type reminder\
    #                       -question "$message, would you like to continue taking data or abort?" \
    #             -returnList {Continue Abort} -labelList {Continue Abort}]
    #         if {$answer=="Abort"} {
    # 	    SetStatus "Please set the RF gun high voltage to be at least 21kV before taking waveform snapshot."
    # 	    return
    # 	}
    # }
    
    while {[clock seconds]<$timeout} {
    	if [catch {APScavget -list=L1:RG1:KIK:chargeTrigC,L1:RG2:KIK:chargeTrigC -pend=2 -printErrors -num} triggers] {
    	    return -code error "Error in reading L1:RG1:KIK:chargeTrigC and/or L1:RG2:KIK:chargeTrigC: $triggers"
    	}
        
    	#if [catch {APScavget -list=L1:CM2:measCurrentCM -pend=10 -printErrors} current] {
    	#    return -code error "Error in reading L1:CM2:measCurrentCM: $current"
    	#}
    	set trigger1 [lindex $triggers 0]
    	set trigger2 [lindex $triggers 1]

        if {$trigger1 || $trigger2} {
    	    after 5000
    	    set ext [clock format [clock seconds] -format %Y-%j-%m%d-%H%M%S]
    	    set file $dir/${ext}.sdds
    	    if [catch {exec sddswmonitor $monFile $file -scalars=$scalarsFile -steps=1  } result] {
    		return -code error "AcqureLinacGunRFWaveform2: error in sddswmonitor: $result"
    	    }
    	    set dataTaken 1
    	    SetStatus "RF gun kicker waveform data taken."
    	    break
    	} else {
    	    if $first {
    		SetStatus "Waiting for kicker trigger being enabled..."
    		set first 0
    	    }
    	    after 1000
    	}
    }
    
    if [catch {exec cavput -list=L1:RG1:KIK:VoltSetSendAO=$rg1Setpoint -pend=2} result] {
	    return -code error "Unable to return RG1 high voltage value: $result"
    }
    if [catch {exec cavput -list=L1:RG2:KIK:VoltSetSendAO=$rg2Setpoint -pend=2} result] {
	    return -code error "Unable to return RG2 high voltage value: $result"
    }
   
    if !$dataTaken {
	SetStatus "RF gun kicker waveform data was not taken because of no trigger or too low current."
    } else {
        if {$trigger1} {
            if [catch {exec sddsprocess $file $file.1\
                         "-reprint=par,RG1KickerStr,RG1 kicker voltage setpoint %.1f KV,L1:RG1:KIK:VoltSetSendAO" \
                         "-redefine=col,Time,Time,units=\$gm\$rs" \
                         "-reprint=par,RG2KickerStr,RG2 Kicker voltage setpoint %.1f KV,L1:RG2:KIK:VoltSetSendAO" \
                         "-reprint=par,TriggerStr,Trigger time %.3f \$gm\$rs,L1:RG1:KIK:trigTimeAO" \
                         "-reprint=par,KickerRateStr,Kicker rate %.0f,KickerRate"} result] {
                return -code error $result
            }
        } else {
            if [catch {exec sddsprocess $file $file.1\
                         "-reprint=par,RG1KickerStr,RG1 kicker voltage setpoint %.1f KV,L1:RG1:KIK:VoltSetSendAO" \
                         "-redefine=col,Time,Time,units=\$gm\$rs" \
                         "-reprint=par,RG2KickerStr,RG2 Kicker voltage setpoint %.1f KV,L1:RG2:KIK:VoltSetSendAO" \
                         "-reprint=par,TriggerStr,Trigger time %.3f \$gm\$rs,L1:RG2:KIK:trigTimeAO" \
                         "-reprint=par,KickerRateStr,Kicker rate %.0f,KickerRate"} result] {
                return -code error $result
            }
        }
	exec mv $file.1 $file
    # adjust by 1.0422 to account for difference between tyratron trigger and output waveform (bring it near zero with falling side crossing x=0)
    if [catch {exec sddsprocess $file $file.1\
                     "-define=col,AdjTime,Time 1.0422 -,units=\$gm\$rs"} result] {
	    return -code error $result
	}
	exec mv $file.1 $file
    
	exec sddsplot $file -col=AdjTime,*Kicker -grap=line,vary -leg -title=$file,edit=%/.sdds// \
          -string=@RG1KickerStr,p=0.45,q=0.9,scale=0.9 \
          -string=@RG2KickerStr,p=0.45,q=0.85,scale=0.9 \
          -string=@TriggerStr,p=0.45,q=0.8,scale=0.9  \
          -string=@KickerRateStr,p=0.45,q=0.75,scale=0.9 &
    }
}

proc ChangeXStopAndSubDir {args} {
    set stop ""
    set start 0
    APSParseArguments {stop start}
    global xend subDir dataType xstart
    set xend $stop
    set xstart $start
    switch $dataType {
	Linac_ICT {
	    set subDir linac/cmData
	}
	Linac_RF {
	    set subDir linac/gunRF
	}
	rfGunKicker {
	    set subDir linac/rfGunKicker
	}
        Linac_PCGun {
            set subDir linac/PCGun
        }
    }
}

proc PlotKickerFiles {args} {
    set files ""
    APSParseArguments {files} 
    set dataDir /home/helios/oagData/par/scope/P:DO1:Data
    set oldDir [pwd]
    cd $dataDir
   # if [llength $files]>1 {
       eval exec sddsplot $files -leg=file -grap=line,vary -col=t,B:IK:CurrentScaled  \
           -scale=-2e-6,2e-6,-2,6 &
   # } else {
        
   # }

    cd $oldDir

}

proc PlotKickerWaveform {args} {
    set dataDir /home/helios/oagData/par/scope/P:DO1:Data
    set oldDir [pwd]
    cd $dataDir
    set files [glob *.sig]
    if ![llength $files] {
        return -code error "no signals found in $dataDir."
    }
    
    set tmpfile /tmp/[APSTmpString]
    if [catch {eval exec sddscombine $files -pipe=out -collapse \
                 | sddssort -pipe -col=Filename,decr \
                 | sddsprocess -pipe=in $tmpfile -match=col,Description=*B:IK* } result] {
        return -code error "No B:IK signals found. -- $result"
    }
    set files [exec sdds2stream -col=Filename $tmpfile]
    global kickerPlotFiles
    set kickerPlotFiles ""
      -string=@RFGHTRPWRString,p=0.1,q=0.90 \
      -string=@RFGSupplyTempString,p=0.1,q=0.85 \
      -string=@RFGReturnTempString,p=0.1,q=0.80 \
    APSScrolledListWindow .its -name "Select files for plot" \
	-label "Select Files for plot." -callback kickerPlotCallback \
      -itemList [join $files]  -selectionVar kickerPlotFiles
    
    tkwait variable kickerPlotFiles
    #if ![llength $kickerPlotFiles] {
#	SetStatus "No files chosen for plot."
	#return
    #}
    #PlotKickerFiles -files $kickerPlotFiles
    #cd $oldDir
}


set status ""
APSApplication . -name AcquireLinacWaveforms -version $CVSRevisionAuthor \
    -overview {This utility is for acquring and process ICTFC waveforms}
APSScrolledStatus .status  -parent .userFrame  -textVariable status -width 100 \
  -height 4 -withButtons 1 -packOption "-fill x"

set archiveDir /home/helios/oagData/ITS/
set ictScopeChannel Ch1
set fcScopeChannel Ch3
set ictTurns 10.0
set cableImpedance 50.0
set droopFactor 1.1
set plotOnly 0
set scalarsFile /home/helios/oagData/ITS/ITS_LinacRFGun_scalars.mon

set dataType  Linac_ICT
set subDir linac/cmData
APSRadioButtonFrame .sel -parent .userFrame -label "Collect data for?" -buttonList {Linac_ICT_VWf Linac_RFWf RFGun_Kicker Linac_PCGun} \
    -valueList {Linac_ICT Linac_RF rfGunKicker Linac_PCGun} -variable dataType -orientation horizontal \
    -commandList {"ChangeXStopAndSubDir -start -0.5 -stop 2.0" "ChangeXStopAndSubDir -start -3.0 -stop 1.0" "ChangeXStopAndSubDir -start -0.5 -stop 2.0" "ChangeXStopAndSubDir -start -0.5 -stop 7.0"}
set plotData RG1_current

set width 30
APSFrameGrid .grid -parent .userFrame -xList {x1 x2}
set w1 .userFrame.grid.x1
set w2 .userFrame.grid.x2
APSLabeledEntry .ictturns -parent $w1 -label "ICT turns:" -textVariable ictTurns \
  -width $width
APSLabeledEntry .cable -parent $w2 -label "Cable impedance:" -textVariable cableImpedance \
  -width $width
APSLabeledEntry .factor -parent $w1 -label "Droop factor:" -textVariable droopFactor \
  -width $width
#APSRadioButtonFrame .plot -parent $w2 -label "Plot only?" -buttonList {Yes No} \
#  -valueList {1 0} -variable plotOnly -orientation horizontal
#set EPS 0
#set PNG 0
#APSCheckButtonFrame .fig -parent $w2 -label "Creat EPS/PNG files?"  -buttonList {EPS PNG} \
#    -variableList {EPS PNG} -orientation horizontal

set xstart -0.5
set xend 2.0

APSLabeledEntry .xstart -parent $w1 -label "X-axis start:" -width $width -textVariable xstart
APSLabeledEntry .xend -parent $w2 -label "X-axis stop:" -width $width -textVariable xend

APSRadioButtonFrame .plot -parent .userFrame -label "Plot data for?" -buttonList {RG1_current RG2_current RG1_RF RG2_RF RFGun_Kicker Linac_PCGun} \
  -valueList {RG1_current RG2_current RG1_RF RG2_RF rfGunKicker Linac_PCGun} -variable plotData -orientation horizontal \
  -commandList {ChangePlotRange ChangePlotRange ChangePlotRange ChangePlotRange ChangePlotRange ChangePlotRange}

APSButton .acq1 -parent .userFrame -text "Acquire Waveform" -command "AcquireWaveform"
APSButton .plot1 -parent .userFrame -text "Plot" -command "PlotWaveform"
APSButton .setup -parent .userFrame -text "Setup Mux" -command "SetupDMUscopeMux"
APSButton .plot2 -parent .userFrame -text "Plot B:IK Waveform" -command "PlotKickerWaveform"

set figureDir $env(HOME)
if [catch {exec cavput -list=GUN:KICKER:GPIBenableBO=Remote -pend=10} result] {
    puts stderr "Error change RF gun scope to remote mode:$result"
    exit 1
}
