#!/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)]
APSStandardSetup

# $Log: FPGABpmTurnHistory,v $
# Revision 1.14 2012/07/27  16:33:30 shang
# added status message for converting data.
#
# Revision 1.13 2012/07/27  16:26:01 shang
# added converting turn history data into headless position data, so that it is much easier and faster for matlab to load
# bpm position history data.
#
# Revision 1.11  2012/05/08 20:33:55  shang
# added ControlRamMode and TriggerMode parameters to output file.
#
# Revision 1.10  2012/04/16 14:35:54  shang
# fixed a spelling error and modified to load RAM only for selected bpms instead of all.
#
# Revision 1.9  2011/10/06 18:59:43  shang
# added missing $ before {bpm}/
#
# Revision 1.8  2011/09/22 14:56:00  shang
# added FPGA filter to obtain the FPGA bpm list, since S37H (narrowband) also locates in accelerator system now.
#
# Revision 1.7  2011/08/25 22:31:29  shang
# corrected the check button variable names since SR sector buttons are used.
#
# Revision 1.6  2011/08/25 22:14:48  shang
# changed the FPGA bpm selection widget to SR sector buttons which looks better and condenser.
#
# Revision 1.5  2011/05/31 23:18:54  shang
# added mps dump trigger selection.S
#
# Revision 1.4  2011/05/27 15:22:50  shang
# added option of collecting short or long turn history data and increased the GUI size so that all buttons can be seen.
#
# Revision 1.3  2011/03/01 21:02:23  shang
# added entry for post-trigger so that use can change it as needed.
#
# Revision 1.2  2010/12/14 22:56:05  shang
# fixed the bug that file index did not increase automatically.
#
# Revision 1.1  2010/12/01 17:39:49  shang
# for collecting FPGA turn history data.
#

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

proc SetStatus {text} {
    global fpgaBPMConfigStatus
    set fpgaBPMConfigStatus "[clock format [clock seconds] -format %H:%M:%S]  $text"
    update
}

proc GetSelectedIOCList {args} {
    global iocList outputDir X Y TmpRoot status processData selectedIOCList sectorList itemList lab
    eval global $iocList
    
    set selectedIOCList ""
    foreach ioc $iocList {
        if [set $ioc] {
            lappend  selectedIOCList $ioc
        }
    }
    
    return
}
set TmpRoot /tmp/[APSTmpString]
set oldSelectedIOCList ""
set fileIndex 0
set first 1
proc CollectTurnHistory {args} {
    global iocList outputDir X Y TmpRoot status processData triggerValue selectedIOCList FPGABpmTurnHistory
    global triggerSetup showPlots oldSelectedIOCList fileIndex first shortLong configuration trigger
    eval global $iocList
    if ![string length $triggerValue] {
        SetStatus "Please select the trigger type first."
        return
    }
   
    SetStatus "Checking arm status..."
    GetSelectedIOCList
    if ![llength $selectedIOCList] {
        SetStatus "Please select bpm/ioc first."
        return
    }
     if {!$X && !$Y} {
        SetStatus "No plane selected for collecting."
        return
    }
    if {!$triggerSetup || $selectedIOCList!=$oldSelectedIOCList} {
        if [catch {SetupTrigger} result] {
            return -code error $result
        }
    }
    
    SetPostTrigger
    if [catch {APScavget -list=[join $selectedIOCList ,] -list=:TurnHistoryTrigTimeSI -pend=30 } prevTrigList] {
       
        return -code error $prevTrigList
    }
    if {$triggerValue=="soft"} {
        if [catch {APScavput -list=[join $selectedIOCList ,] -list=:turn:gtr:arm=1 } result] {
           
            return -code error $result
        }
        after 1000
        if [catch {APScavget -list=[join $selectedIOCList ,] -list=:TurnHistoryTrigTimeSI -pend=30 } prevTrigList] {
          
            return -code error $prevTrigList
        }
        if [catch {APScavput -list=[join $selectedIOCList ,] -list=:turn:gtr:softTrigger=1} result] {
           
            return -code error $result
        }
       
    } elseif {$triggerValue=="injection"} {
        if [catch {APScavget -list=Mt:TopUpAutoEnableC.VAL -num } topup] {
           
            return -code error $topup
        }
        if !$topup {
            if [catch {ChangeTriggerEvent -value 45} result1] {
                return -code error $result1
            }
            SetStatus "Can not trigger in injection mode in non topup!"
            return
        }
        SetStatus "Waiting for injection..."
        while {1} {
            if [catch {APScavget -list=Mt:TopUpTime2Inject.VAL } count] {
               
                return -code error $count
            }
            if $count {
                after 1000
            } else {
                break
            }
        }
    } else {
	#arm bpms
	if [catch {APScavput -list=[join $selectedIOCList ,] -list=:turn:gtr:arm=1 } result] {
            
            return -code error $result
        }
        after 2000
    }
    #wait for the turn history to be update
    if [catch {exec cavget -list=A014-IETS:BTC:SRSetFreqM -float=%0.9e -pend=20} rfFreq] {
       
        return -code error "Error reading rf freq: $rfFreq"
    }
    if {$rfFreq=="?"} {
        set rfFreq 0
    }
    while {1} {
        if [catch {APScavget -list=[join $selectedIOCList ,] -list=:TurnHistoryIsArmed -num -pend=30 } armList] {
           
            return -code error $armList
        }
        set armed 0
        foreach val $armList {
            if $val {
                set armed 1
                break
            }
        }
        if !$armed {
            break
        } else {
            after 1000
            update
            #check again until all bpms are being updated.
        }
    }
   
    #for soft trigger, check if the trigger time changes
    set fileList ""
    set bpmList ""
    set planeList ""
    if !$first {
	incr fileIndex
    }
    set first 0
    foreach ioc $selectedIOCList prev $prevTrigList {
        while {1} {
            set time [APScavget -list=${ioc}:TurnHistoryTrigTimeSI -pendIO=10]
            # set timestr [string trim [join [split $time " "] -] '"']
            
            if {$time=="?"} {
                after 500
                continue
            } else {
                if {$triggerValue=="soft"} {
                    if [string compare $time $prev]==0 {
                        after 500
                        continue
                    } else {
                        break
                    }
                } else {
                    break
                }
            }
        }
        if ![file exist $TmpRoot.$ioc] {
            if [catch {exec sddsmakedataset $TmpRoot.$ioc -col=ControlName,type=string \
                         -data=${ioc}:TurnHistoryTrigTimeSI,${ioc}:TurnHistoryTrigTurnLI } result] {
              
                return -code error $result
            }
        }
        set pvList ""
        set fileRoot $outputDir/${ioc}-[format %03d $fileIndex]
        global ${ioc}bpmList
        foreach bpm [set ${ioc}bpmList] {
            foreach plane {X Y} {
                if [set $plane] {
                    switch $shortLong {
                        long {
                            lappend pvList ${bpm}:turnHistory:${plane}position
                        }
                        short {
                            lappend pvList ${bpm}:turnHistorySmall:${plane}position
                        }
                    }
                }
            }
        } 
        
        SetStatus "collecting data for $ioc ..."
        exec sddswmonitor -pvnames=[join $pvList ,] $fileRoot.sdds -steps=1 -scalars=$TmpRoot.$ioc -pendIOTime=100 -erase &
        lappend fileList $fileRoot.sdds
    }
    SetStatus "Data is collecting, please wait..."
    for {set i 0} {$i<5} {incr i} {
        after 1000
        update
    }
    set done 0
    set tries 1
    while {!$done} {
        set done 1
        set missingFiles ""
        foreach file $fileList {
            if ![file exist $file] {
                append missingFiles $file
                set done 0
            } else {
                set rows [exec sdds2stream -rows=bar $file]
                if !$rows {
                    append missingFiles $file
                    set done 0
                }
            }
        }
        if !$done {
	    incr tries
            if {$tries > 60} {
                SetStatus "Unable to locate output files: $missingFiles"
	        bell
                return
            }
            after 1000
            update
        }
    }
    set lattice [file root [file readlink /home/helios/oagData/sr/orbitControllaw/lattices/default]]
    SetStatus "waiting for file to be written..."
    foreach file $fileList {
        set rows [exec sdds2stream -rows=bar $file]
        if !$rows {
            after 5000
            continue
        }
    }
    
  
    foreach file $fileList {
        exec cp $file $file.1
        if [catch {exec sddsprocess $file.1 $file -nowarnings "-reprint=par,TriggerMode,$trigger" \
                     "-redefine=par,RFFreq,$rfFreq,units=Hz" \
                     "-redefine=col,Time,Index 3.682547610987599e-06 *,units=s" \
                     "-reprint=par,Lattice,$lattice" } result] {
            SetStatus "Error in define TriggerMode and ControlRamMode for $file: $result"
        }
        exec rm $file.1
    }
    
    SetStatus "done."
    if [llength $fileList]==1 {
        ProcessBPMHistory -filename $fileList -showPlots 1
    }
}

set showPlots 0
proc ProcessTurnHistory {args} {
    global outputDir iocList status X Y selectedIOCList fileSelection showPlots fileIndex
    eval global $iocList
    GetSelectedIOCList
    if ![llength $selectedIOCList] {
        SetStatus "No bpms selected."
        return
    }
    set oldDir [pwd]
    cd $outputDir
    foreach ioc $selectedIOCList {
        set file ${ioc}-[format %03d $fileIndex].sdds
        if ![file exist $file] {
            SetStatus "No data found for $ioc."
            continue
        }
        
        SetStatus "Processing data for $ioc ..."
        catch {exec rm [file root $file].fft}
        if [catch {ProcessBPMHistory -filename $file -showPlots 0} result] {
            SetStatus "Error in processing $file  data: $result"
        }
    }
    cd $oldDir
    SetStatus "done."
}

proc ProcessBPMHistory {args} {
    set filename ""
    set showPlots 0
    APSParseArguments {filename showPlots }
    
    set fileRoot [file root $filename]
    if ![file exist $fileRoot.fft] {
        if [catch {exec sddsfft $filename $fileRoot.fft \
                     -col=Time,S*position -suppressAverage -psdOutput,integrated } result] {
            return -code error "Error1: unable to process  $filename history data: $result"
        }
    }
    if $showPlots {
        PlotBPMHistory -filename $filename
    }
}

proc PlotRawData {args} {
    global outputDir iocList status X Y selectedIOCList fileSelection showPlots fileIndex
    eval global $iocList
    GetSelectedIOCList
    set plot 0
    foreach ioc $selectedIOCList {
        set files [glob -nocomplain ${ioc}*.sdds]
        if ![llength $files] {
            continue
        }
        foreach file $files {
            PlotBPMHistory -filename $file
        }
        set plot 1
    }
    if !$plot {
	SetStatus "No bpms selected for plotting."
	return
    }
}

proc PlotBPMHistory {args} {
    set filename ""
    APSParseArguments {bpm plane filename}
    
    set fileRoot [file root $filename]
    set ioc [lindex [split [file tail $fileRoot] -] 0]
    set cols [exec sddsquery -col $filename]
    
    if ![file exist $fileRoot.fft] {
        SetStatus "$fileRoot.fft does not exist, processing ..."
        ProcessBPMHistory -filename $filename 
    }
    exec sddsplot -sep -title=@${ioc}:TurnHistoryTrigTimeSI -topTitle \
      ${fileRoot}.sdds -col=Time,S* -ylabel=use=name,edit=%/:turnHistory//%/position//%/Small//   &

    exec  sddsplot -sep -unsupp=y -topline=@${ioc}:TurnHistoryTrigTimeSI \
      -ylabel=use=name,edit=%/:turnHistory//%/position//%/Small//%/FFT//%/SqrtIntegPSD// \
      -col=f,FFT* "-title=FFT" \
      ${fileRoot}.fft -filter=col,f,0,200  \
      -col=f,SqrtIntegPSD* "-title=Integrated PSD" \
      ${fileRoot}.fft -filter=col,f,0,200  \
      -col=f,FFT* "-title=FFT"  \
      ${fileRoot}.fft -filter=col,f,0,5000  \
      -col=f,SqrtIntegPSD* "-title=Integrated PSD" \
      ${fileRoot}.fft -filter=col,f,0,5000  \
      -col=f,FFT*  "-title=FFT"  \
      ${fileRoot}.fft -filter=col,f,0,67887.7849\
      -col=f,SqrtIntegPSD* "-title=Integrated PSD" \
      ${fileRoot}.fft -filter=col,f,0,67887.7849 \
      -col=f,FFT* "-title=FFT" \
      ${fileRoot}.fft -filter=col,f,0,135775.570   \
      -col=f,SqrtIntegPSD* "-title=Integrated PSD" \
      ${fileRoot}.fft -filter=col,f,0,135775.570 &
}

proc PlotTurnHistory {args} {
    global outputDir iocList status X Y selectedIOCList fileIndex
    eval global $iocList
    
    set XplotOpt ""
    set YplotOpt ""
    GetSelectedIOCList
    cd $outputDir
    if ![llength $selectedIOCList] {
        SetStatus "No BPMs selected."
        return
    }
    cd $outputDir
    foreach ioc $selectedIOCList {
        set file ${ioc}-[format %03d $fileIndex].sdds
        if [file exist $file] {
            PlotBPMHistory -filename $file
        }
    }
}

if [catch {exec sddsprocess /home/helios/oagData/SCR/requestFiles/SBPMWaveform.config -match=par,Location=Lab -pipe=out \
             | sdds2stream -pipe -par=IOCName } iocList] {
    return -code error $result
}
set iocList [join $iocList]
foreach ioc $iocList {
    set $ioc 0
    set ${ioc}bpmList [join [exec sddsprocess  /home/helios/oagData/SCR/requestFiles/SBPMWaveform.config -pipe=out -match=par,IOCName=$ioc \
                               | sdds2stream -pipe -col=BPM]]
}
set outputDir [APSGoToDailyDirectory -subdirectory fpgaLab]


set X 1
set Y 1
set fpgaBPMConfigStatus ""
APSApplication . -name "FPGALabTurnHistory" \
  -version $CVSRevisionAuthor \
  -overview "FPGA lab bpm turn history collection and reviewer."
APSScrolledStatus .status -parent .userFrame -textVariable fpgaBPMConfigStatus -width 70 \
    -height 8 -packOption "-fill both -expand true"

proc UpdatePostTrigger {args} {
    global shortLong postTrigger
    switch $shortLong {
	short {
	    set postTrigger 260144 
	}
	long {
	    set postTrigger 131072
	}
    }
}


proc MakeCollectionWidget {args} {
    set parent ""
    APSParseArguments {parent}
    global iocList X Y showPlots fileIndex postTrigger shortLong  lab
    eval global $iocList
    APSFrame .f1 -parent $parent -packOption "-side top"
    set shortLong long
    set postTrigger 131072
    APSLabeledEntry .dir -parent $parent -label "Output directory:" -textVariable outputDir -width 70 \
        -contextHelp "directory for writing files to or processing, viewing files from." \
        -fileSelectDirectory 1 -fileSelectButton 1 
    APSFrameGrid .grid1 -parent $parent -xList {x1 x2}
    set w1 $parent.grid1.x1
    set w2 $parent.grid1.x2
    APSLabeledEntry .index -parent $w1 -label "File index:" -textVariable fileIndex -width 40 \
	-contextHelp "the filename will be named by file index, and it increases by 1 after each data collection"
    APSRadioButtonFrame .plot -parent $w2 -label "Show plots" -buttonList {Yes No} \
      -valueList {1 0} -variable showPlots -orientation horizontal \
      -contextHelp "choose whether to show plots when process turn history button is clicked."
    APSRadioButtonFrame .short -parent $w1 -label "Short or long waveform?" -valueList {short long} \
	-buttonList {Short Long} -variable shortLong -orientation horizontal \
	-contextHelp "choose to collect either long or short waveforms." \
	-commandList {UpdatePostTrigger UpdatePostTrigger}
    APSLabeledEntry .trig -parent $w2 -label "Post trigger:" -textVariable postTrigger -width 40 \
	-contextHelp "provide the post trigger of FPGA bpms."
    bind $w2.trig.entry <Return> "SetPostTrigger"
   
    APSCheckButtonFrame .plane -parent $w1 -label "Plane:" -buttonList {X Y} -variableList {X Y} \
        -allNone 1 -contextHelp "Select bpm plane." -orientation horizontal
    global sectorList itemList itemLabelList
    
    APSCheckButtonFrame .ioc -parent $parent.f1.frame -label "" -buttonList $iocList -variableList $iocList \
      -orientation horizontal -limitPerRow 7 -allNone 1
    
    APSFrame .f -parent $parent -packOption "-side top"
    $parent.f.frame configure -bd 0
    set parent $parent.f.frame
    APSButton .col -parent $parent -text "Collect turn History" -command "CollectTurnHistory"
    APSButton .proc -parent $parent -text "Process turn History" -command "ProcessTurnHistory"
    APSButton .view -parent $parent -text "Plot turn History" -command "PlotTurnHistory"
    APSButton .plot1 -parent $parent -text "Plot Raw Data" -command "PlotRawData"
}

if [catch {sdds load /home/helios/oagData/SCR/preferredChoices/SBPMWaveform.sdds refData} result] {
    puts stderr $result
    exit 1
}
set referenceList [lindex $refData(Column.ChoiceName) 0]
set suffixList [lindex $refData(Column.Suffix) 0]
set SCRdir /home/helios/oagData/SCR/snapshots/SBPMWaveform

proc LoadRAM {args} {
    global SCRdir configuration postTrigger selectedIOCList FPGABpmTurnHistory
    GetSelectedIOCList
    if ![llength $selectedIOCList] {
	SetStatus "No bpms selected."
	return
    }
    set refFile $FPGABpmTurnHistory(ShortFilename)
    SetStatus "loading $FPGABpmTurnHistory(Description) ..."
    if [catch {APSSCRLogAction -file $refFile -action restore-start} result] {
        SetStatus "$result"
    }
    set logFile /tmp/[APSTmpString]
    set filename $SCRdir/$refFile
    set restoreError 0
    set option1 ""
    set opption2 ""
    foreach ioc $selectedIOCList {
	if ![string length $option1] {
	    set option1 -match=col,ControlName=${ioc}*
	    set option2 -match=par,WaveformPV=${ioc}*
	} else {
	    append option1 ,ControlName=${ioc}*,|
	    append option2 ,WaveformPV=${ioc}*,|
	}
    }
    if [catch {exec sddsprocess $filename $logFile.pv $option1 "-match=col,ControlName=*WF,!" 
	exec sddsprocess [file root $filename].waveform.gz $logFile.waveform $option2} result] {
	return -code error ":Error in sddsprocess: $result"
    }
    if [catch {exec sddscasr $logFile.pv -restore -pend=60
	exec sddswput $logFile.waveform -pend=60 } result] {
	return -code error "Error in restoring RAM: $result"
    }
    SetStatus "done."
    return
    if [catch {exec sddscasr $filename -restore -logFile=$logFile -pendIOTime=100 \
                 -waveform=directory=$SCRdir,onefile,rootname=[file rootname [file tail $filename]],extension=.waveform.gz } result] {
        SetStatus "Error in loading $refFile to iocs: $result"
        set restoreError 1
    }
   
    set fd [open $logFile "r"]
    while {![eof $fd]} {
        set text [gets $fd]
        if {[string match -nocase "*error*" $text]} {
            set restoreError 1
            break
        }
    }
    close $fd
    if $restoreError {
        APSFileDisplayWindow [APSUniqueName .fileDisp] -fileName $logFile \
          -comment "Error output from burtwb" -deleteOnClose 1 \
          -printCommand "enscript -r"
    } else {
        SetStatus "done."
    }
}

set FPGABpmTurnHistory(ShortFilename) ""
proc MakeControlWidget {args} {
    set parent ""
    APSParseArguments {parent}
    global FPGABpmTurnHistory
   
    APSAddSCRDialog .scr -parent $parent -system SBPMWaveform \
              -arrayName FPGABpmTurnHistory \
              -defaultFile ""
  #  APSButton .load -parent $parent -text "Load RAM" -command "LoadRAM" -contextHelp "load the selected SCR config into IOCs."
}

proc SelectTrigger {args} {
    set index ""
    APSParseArguments {index}
    global triggerChoiceList triggerValueList trigger triggerValue
    set index [lsearch -exact $triggerChoiceList $trigger]
    set triggerValue [lindex $triggerValueList $index]
  #  SetupTrigger
}

set triggerChoiceList {"10 seconds trigger" "injection only (topup, 2 minutes)" "soft" "mps dump"}
set triggerValueList {continuous injection soft mpsDump}
set triggerValue soft
proc MakeTriggerWidget {args} {
    set parent ""
    APSParseArguments {parent}
    global triggerChoiceList triggerValueList trigger
    
    
    set width 70
    APSComboboxFrame .preset -parent $parent -label "Trigger:" \
      -packOption "-fill x" \
      -textVariable trigger \
      -itemList $triggerChoiceList \
      -width $width \
      -editable 0 \
      -callback "SelectTrigger -index" \
      -contextHelp "Select event trigger for triggering FPGA bpms."
    APSButton .load -parent $parent -text "Setup Trigger" -command "SetupTrigger" -contextHelp "Setup FPGA bpm event triggers."
   # APSButton .restore -parent $parent -text "Restore all triggers to UBOP" -command "RestoreTrigger" \
   #   -contextHelp "restore all triggers to UBOP."
   # APSButton .arm -parent $parent -text "ReArm All" -command "ReArmAll" \
   #   -contextHelp "re-arm all FPGA bpms."
    
}

proc RestoreTrigger {args} {
    global iocList
    set reference /home/helios/oagData/SCR/snapshots/SBPMs/SBPMs-Preferred.gz
    set option ""
    foreach ioc $iocList {
        if [string length $option] {
            append option ,ControlName=${ioc}:clientEvent*,|
        } else {
            set option -match=col,ControlName=${ioc}:clientEvent*
        }
    }
    set tmpFile /tmp/[APSTmpString]
    if [catch {exec sddsprocess $reference $option $tmpFile.restore} result] {
        return -code error $result
    }
    if [catch {exec sddscasr -restore $tmpFile.restore -pend=60} result] {
        return -code error $result
    }
}

proc ReArmAll {args} {
    global iocList
    if [catch {exec cavput -list=[join $iocList ,] \
                 -list=:turn:gtr:trigger=event,:turn:gtr:arm=1 -pend=30} result] {
        return -code error "ReArmAll: $result"    
    }
}

set triggerSetup 0
proc SetupTrigger {args} {
    global selectedIOCList triggerValue triggerSetup oldSelectedIOCList postTrigger
    GetSelectedIOCList
    if ![llength $selectedIOCList] {
	SetStatus "No bpms selected."
	return
    }
    set oldSelectedIOCList $selectedIOCList
    #first put trigger to event
    SetStatus "Setup trigger for [join $selectedIOCList ,] ..."
    if [catch {exec cavput -list=[join $selectedIOCList ,] \
                 -list=:turn:gtr:trigger=event,:turn:gtr:arm=1 -pend=30} result] {
        return -code error "SetupTrigger(error1): $result"    
    }
    if [catch {exec cavput -list=[join $selectedIOCList ,] -list=:clientEvent2d.OUT4=Disabled,:clientEvent2d.OUT5=Disabled,:clientEvent33.OUT4=Disabled -pend=30} result] {
        return -code error "SetupTrigger(error1a): $result"
    }
    
    if {$triggerValue=="soft"} {
       # SetStatus "When \"soft\" trigger is chosen, FPGA will be triggered manually before collecting data."
        SetStatus "done."
        set triggerSetup 1
        return
    }
    switch $triggerValue {
        continuous {
            set suffix :clientEvent2d.OUT4
        }
        injection {
            set suffix :clientEvent2d.OUT5
        }
	mpsDump {
	    set suffix :clientEvent33.OUT4
	}
    }
    if [catch {exec cavput -list=[join $selectedIOCList ,] \
                 -list=$suffix=1 -pend=30 } result] {
        return -code error "SetupTrigger(error2): $result" 
    }
    SetStatus "set post-trigger ..."
    if [catch {exec cavput -list=[join $selectedIOCList ,] -list=:turn:gtr:numberPTS=$postTrigger -pend=30} result] {
	return -code error "SetupTrigger(error3): $result" 
    }
    set triggerSetup 1
    SetStatus "done."
}

proc SetPostTrigger {args} {
    global postTrigger  selectedIOCList 
    GetSelectedIOCList
    if ![llength $selectedIOCList] {
	SetStatus "No bpms selected."
	return
    }
    if [catch {exec cavput -list=[join $selectedIOCList ,] -list=:turn:gtr:numberPTS=$postTrigger -pend=30} result] {
	return -code error "SetPostTrigger: $result" 
    }
}


set env(EPICS_CA_MAX_ARRAY_BYTES)  "3000000"

set widgetList [APSTabFrame .tab -parent .userFrame -label ""  \
    -labelList {Acquisition Trigger} -width  950 -height 550]

MakeCollectionWidget -parent [lindex $widgetList 0]

#MakeControlWidget -parent [lindex $widgetList 1]

MakeTriggerWidget -parent [lindex $widgetList 1]

