#!/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

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

set outputDir [APSGoToDailyDirectory -subdirectory injection]

set status ""
set abort 0
set dryRun 1
set single 0
set args $argv

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



set index 0
proc TakeData {args} {
    global outputDir dryRun index RFphase softID rootname steps RFphaseStart RFphaseStop initPhase abort single
    global varList
    eval global $varList
    
    cd $outputDir
   # if ![string length $softID] {
    #    if [catch {StartPcas} softID] {
     #       SetStatus "Error starting pcas: $softID"
      #      set softID ""
      #      return
       # }
   # }
    if ![file exist efficiency.mon] {
        if [catch {exec sddsmakedataset -col=ControlName,type=string \
                     -data=BTS:CM:q,Mt:Ddg3chan0.GATE,Mt:Ddg3chan1.GATE,Mt:Ddg3chan4.GATE,RFphaseTS,S-DCCT:CurrentM,S4:cerenkov:CountAI,S:RM:ID4:NRateAi,SRInjEffic,BRF:S:PS1:Ch0 efficiency.mon} result] {
            return -code error "Error create monitor file: $result"
        }             
    }
    exec sddscasr -save efficiency.mon efficiency.init -pend=30
    set stepSize [expr ($RFphaseStop - $RFphaseStart)/$steps]
    
    catch {TogglePulsedMagnetEnables -location GuntoBoosterExt}
    if $single {
        set steps 1
        set RFphaseStart $RFphase
        set stepSize 0
    }
    for {set index 0} {$index<=$steps} {incr index} {
        if $abort {
            set abort 1
            SetStatus "aborted."
            return
        }
                 
        set outputFile ${rootname}-[clock format [clock seconds] -format %Y-%j-%m%d].[format %04d $index]
        if [file exist $outputFile] {
            if ![APSYesNoPopUp "$outputFile already exist, overwrit?"] {
                return
            }
        }
        set RFphaseTS [expr $RFphaseStart + $index * $stepSize]
        
        SetStatus "Change RF phase by $RFphase ..."
        pv putw RFphaseTS
        
        if {!$dryRun && !$single} {
            set BRFphase [expr $RFphase + initPhase]
            pv putw BRFphase
        }
        if !$dryRun {
            SetStatus "enabling injectors..."
            if [catch { exec cavput -list=Mt:Ddg3chan0,Mt:Ddg3chan1,Mt:Ddg3chan4 -list=.GATE=Enabled } result] {
                return -code error "Error enabling injectors: $result"
            }
            SetStatus "Wait for 3 seconds..."
            after 3000
        }
        
        SetStatus "Collecting data..."
        if [catch {exec sddsmonitor efficiency.mon $outputFile -erase -step=10 -inter=0.5 } result] {
            return -code error "Error collecting data: $result"
        }
        if !$dryRun {
            exec cavput -list=Mt:Ddg3chan0,Mt:Ddg3chan1,Mt:Ddg3chan4 -list=.GATE=Disabled   
        }
        
        SetStatus "Process data..."
        if [catch {ProcessData -filename $outputFile} result] {
            return -code error "Error processing data: $result"
        }
    }
    catch {SetPulsedMagnetEnables -location  GuntoBoosterExt -state 0}
    SetStatus "done."
    #exec sddscasr -restore  efficiency.init
    if {!$dryRun && !single} {
        set BRFphase $initPhase
        pv putw BRFphase
        #if [catch {exec cavput -list=BRF:S:PS1:Ch0=$initPhase  -pend=10 } result] {
        #    return -code error "Error changing RF phase: $result"
        #}
    }
    incr index
}


proc ProcessDataAll {args} {
    global outputDir rootname 
    set files [glob -nocomplain ${rootname}-*.????]
    if ![llength $files] {
        SetStatus "No files found."
        return
    }
    set procList ""
    foreach file $files {
        if [regexp ".proc" $file] {
            continue
        }
        SetStatus "process $file..."
        ProcessData -filename $file
        lappend procList $file.proc
    }
    catch {exec rm results.eps results.png}
    if [catch {eval exec sddscombine $procList results -collapse -over } result] {
        return -code error "Error processing results: $result"
    }
    exec sddsplot3 results results  -col=RFphaseTS,Efficiency -grap=sym,vary=sub,sca=3,fil -leg &
}

proc ProcessData {args} {
    set filename ""
    APSParseArguments {filename}
    global SRInjEffic RFphaseTS
    
    if ![file exist $filename] {
        return
    }
    
    if [catch {exec sddsprocess $filename $filename.proc \
                 -proc=S-DCCT:CurrentM,sum,%sSum \
                 -proc=BTS:CM:q,sum,%sSum \
                 -proc,RFphaseTS,first,RFphaseTS \
                 "-def=para,Efficiency,S-DCCT:CurrentMSum BTS:CM:qSum 1e-9 + / 3.68 * 100 *,units=%" } result] {
        return -code error "Error processing $filename"
    }
    
    set RFphaseTS [format %.2f [exec sdds2stream -par=RFphaseTS $filename.proc]]
    set SRInjEffic [format %.4f [exec sdds2stream -par=Efficiency $filename.proc]]
    pv putw RFphaseTS
    pv putw SRInjEffic

    #if [catch {exec cavput -list=SRInjEffic=$effic,RFphaseTS=$phase -pend=10} result] {
     #   return -code error "Error setting phase and inj effic: $result"
    #}
    
}

proc getSRampParams {args} {
    global outputDir 
    set number 100
    set interval 0.6
    set rootname StartRampParams
    
    set filename $outputDir/${rootname}_[clock format [clock seconds] -format %m-%d-%Y]_[clock format $systemTime -format %H:%M:%S]
    
    SetStatus "Acquiring data and computing statistics..."
    SetStatus "Taking ${number} data samples every ${interval} seconds..."
    exec cavget -list=It:Bs:StartRamp2BsIp.VAL,PTB:CM:qTotalAI.VAL,B:diag1:rms:A:region3,BTS:CM:q,PTB2BTSEfficiencyM \
      -statistics=number=${number},pause=${interval},format=SDDS,file=${fileName}.sdds
    SetStatus "Done"

}

proc StartStrip {args} {
    global outputDir
    cd $outputDir
    if ![file exist SRinj.stp] {
        exec cp /home/helios/SR/daily/2021/03/18/2/TimingSyncStudies/SRinj.stp .
    }
    exec StripTool SRinj.stp &
}

set softID ""
proc StartPcas {args} {
    global outputDir softID softPVrunControl
    if ![file exist $outputDir/rfPhaseSoft.sdds] {
        exec cp /home/helios/oagData/sr/optimizeConfig/DAOptimization/rfPhaseSoft.sdds $outputDir/.
    }
    cd $outputDir
    set runcontrolPV APS:RunControlSlot0RC
    if [catch {exec cavget -list=$runcontrolPV.RUN -pend=10} running] {
        return -code error "Error checking runcontrol:$ running"
    }
    if $running {
        SetStatus "aborting pcas..."
        if [catch {exec cavput -list=$runcontrolPV.ABRT=1 -pend=10} result] {
            return -code error "Error abort pcas: $result"
        }
        after 5000
    }
    if [catch {exec cavput -list=$runcontrolPV.CLR=1 } result] {
        return -code error "Error clearing $runcontrolPV: $result"
    }
    if [catch { exec sddspcas -standalone rfPhaseSoft.sdds \
                  -runControlPV=string=APS:RunControlSlot0RC,ping=4  \
                  "-runControlDescription=string=SRInjEfficMeas" & } softID] {
        return -code error "Error starting sdddspcas: $softID"
    }
    after 1000
    if [catch {exec cavget -list=$runcontrolPV.RUN -pend=10} running] {
        return -code error "Error checking runcontrol:$ running"
    }
    if !$running {
        return -code error "pcas not started, please start it again."
    }
    SetStatus "sddspcas started."
}

set rootname phaseScan
set steps 5
set RFphaseStart -45
set RFphaseStop 45
set RFphase ""
set abort 0
set SRInjEffic 0

set varList {BRFphase SRInjEffic RFphaseTS}
set pvList {BRF:S:PS1:Ch0 SRInjEffic RFphaseTS}

StartPcas

pv linkw $varList $pvList
pv getw $varList
set initPhase $BRFphase

APSParseArguments {single}

set index 0
APSApplication . -name MeasureSRInjEfficiency -version $CVSRevisionAuthor \
    -overview {BTS orbit measurement }

APSScrolledStatus .status -parent .userFrame -width 100 -textVariable status
APSLabeledEntry .dir -parent .userFrame -label "Output Directory" -textVariable outputDir -width 80
APSLabeledEntry .rootname -parent .userFrame -label "Rootname:" -textVariable rootname -width 50
if !$single {
    APSLabeledEntry .steps -parent .userFrame -label "Scan steps:" -textVariable steps -width 50
    APSLabeledEntryFrame .rf -parent .userFrame -label "RF freq change start/end" -variableList {RFphaseStart RFphaseStop} -width 20 \
      -orientation horizontal
}
APSLabeledEntry .index -parent .userFrame -label "Index:" -textVariable index -width 50 -numberButtons 1
APSLabeledEntry .phase -parent .userFrame -label "Delta RF phase (RFphaseTS):" -textVariable RFphaseTS -width 50
APSLabeledOutput .bphase -parent .userFrame -label "Booster to SR phase:" -textVariable BRFphase -width 50
APSLabeledOutput .bphase1 -parent .userFrame -label "SR Injection efficiency:" -textVariable BRInjEffic -width 50

APSRadioButtonFrame .dryrun -parent .userFrame -label "Dry run mode?" -buttonList {Yes No} -variable dryRun -valueList {1 0} \
  -orientation horizontal
APSButton .start1 -parent .userFrame -text "start pcas" -command "StartPcas"
APSButton .strip -parent .userFrame -text "Start StripTool" -command "StartStrip"

APSButton .single -parent .userFrame -text "Setup Single Shot" -command "exec /home/helios/SR/bin/setupSingleShot"
APSButton .start -parent .userFrame -text "TakeData" -command "TakeData"
APSButton .proc -parent .userFrame -text "Process" -command "ProcessDataAll"
APSButton .info -parent .userFrame -text "pcas Info" -command "exec medm -x -attach -macro RCPV=APS:RunControlSlot0RC ./sr/psApp/APSRunControlSingle.adl &"

if !$single {
    APSButton .abort -parent .userFrame -text "Abort" -command "set abort 1"
}
