#!/bin/sh
# \
exec oagtclsh "$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 args $argv
set fitStart 0
set fitEnd 476
set filename ""
APSParseArguments {fitStart fitEnd filename}


proc GetBooRampCurrWF {args} {
    set filename ""
    APSParseArguments {filename}
    global msPerSample BMCurrentScale QDCurrentScale QFCurrentScale SFCurrentScale SDCurrentScale injTime SDUCurrentScale
    if [catch {exec sddswmonitor -erase ${filename}.1 \
                 -steps=1  -interval=1 \
                 -pvnames=B:BM:CurrentWF,B:QF:CurrentWF,B:QD:CurrentWF,B:SF:CurrentWF,B:SF-U:CurrentWF,B:SD:CurrentWF,B:SD-U:CurrentWF -scalars=/home/helios/oagData/booster/ramps/brampcurrentWF.scalars.sdu -pend=30 } result] {
        puts stderr "Error reading booster current waveform:$result"
        exit 1
    }
    if [catch {exec sddsprocess $filename.1  $filename \
                 "-redefine=par,InjectionTime,$injTime,units=ms" \
                 "-redefine=col,time,Index $msPerSample *,units=mS" \
                 "-redefine=col,BM-I,B:BM:CurrentWF BMDigScale * BMDigOffset + $BMCurrentScale *,units=A" \
                 "-redefine=col,QD-I,B:QD:CurrentWF QDDigScale * QDDigOffset + $QDCurrentScale *,units=A" \
                 "-redefine=col,QF-I,B:QF:CurrentWF QFDigScale * QFDigOffset + $QFCurrentScale *,units=A" \
                 "-redefine=col,SF-I,B:SF:CurrentWF SFDigScale * SFDigOffset + $SFCurrentScale *,units=A" \
                 "-redefine=col,SF-U-I,B:SF-U:CurrentWF SFDigScale * SFDigOffset + $SFCurrentScale *,units=A" \
                 "-redefine=col,SD-I,B:SD:CurrentWF SDDigScale * SDDigOffset + $SDCurrentScale *,units=A" \
                 "-redefine=col,SD-U-I,B:SD-U:CurrentWF SDDigScale * SDDigOffset + $SDUCurrentScale *,units=A" \
                 -now } result] {
        puts stderr "Error processing file: $result"
        exit 1
    }
    file delete -force ${filename}.1
}

set timePerPoint 0.11906605

set currRefFile /home/helios/oagData/booster/ramps/IRamp/current-IRamp/IRef
set BMCurrentScale 0.0152590
set QDCurrentScale $BMCurrentScale
set QFCurrentScale $BMCurrentScale
set SFCurrentScale 0.0022888
set SDCurrentScale $SFCurrentScale
set SDUCurrentScale $SDCurrentScale
set tmpRoot /tmp/[APSTmpString]

if [catch {exec cavget -list=B:SampleperiodAI -pend=10 -printErrors} sampleInterval] {
    put stderr "Error in reading sample interval: $sampleInterval"
    exit 1
}
set msPerSample [expr $sampleInterval/4000.0]


if [catch {exec cavget -list=B:PretriggerAI -pend=30 -printErrors} preTrig] {
    puts stderr "BRampWaveformMon: Error in reading B:PRETRIGGER: $preTrig"
    exit 1
}
if [catch {exec cavget -list=It:Bs:StartRamp2BsIp.VAL -pendIoTime=20 -printErrors} startRamp] {
    puts stderr "BRampWaveformMon: error in reading It:Bs:StartRamp2BsIp.VAL: $startRamp"
    exit 1
}

set injTime $startRamp

if [catch {GetBooRampCurrWF -filename $tmpRoot.1  
    exec GetBooRampVoltageWF -filename $tmpRoot.voltage } result] {
    puts stderr "BIRampWaveformMon1: Error reading booster ramp  waveforms: $result"
    exit 1
}
APSAddToTempFileList $tmpRoot.1 $tmpRoot.voltage

set pars [exec sddsquery -par $currRefFile]

if [lsearch -exact $pars "SD-UAfgGain"]<0 {
    set SD-UAfgGain 1.0
    set SD-UTriggerDelay 0.0
    if [catch {exec sddsprocess $currRefFile $tmpRoot.ref "-redefine=par,SD-UAfgGain,1.0" "-redefine=par,SD-UTriggerDelay,0.0" \
                 -redefine=col,B:SD-U:CurrentWF,B:SD:CurrentWF -redefine=col,SD-U-I,SD-I } result] {
        puts stderr "BIRampWaveformMon1a: Error defining SS-U  waveforms: $result"
        exit 1
    }
    set currRefFile $tmpRoot.ref
} 
if [lsearch -exact $pars "SF-UAfgGain"]<0 {
    set SF-UAfgGain 1.0
    set SF-UTriggerDelay 0.0
    if [catch {exec sddsprocess $currRefFile $tmpRoot.ref1 "-redefine=par,SF-UAfgGain,1.0" "-redefine=par,SF-UTriggerDelay,0.0" \
                 -redefine=col,B:SF-U:CurrentWF,B:SF:CurrentWF -redefine=col,SF-U-I,SF-I } result] {
        puts stderr "BIRampWaveformMon1b: Error defining SF-U  waveforms: $result"
        exit 1
    }
    set currRefFile $tmpRoot.ref1
} 


if [catch {exec sddsconvert $tmpRoot.1 -pipe=out \
             -edit=par,*Gain,ai/meas/ -edit=par,*Delay,ai/meas/ \
             -edit=col,*WF,ei/meas/ \
             | sddsxref -pipe $currRefFile -transfer=par,*Gain -transfer=par,*Delay \
             -take=*WF \
             | tee $tmpRoot.aa \
             | sddsconvert -pipe -edit=col,*WF,ei/ref/ \
             | sddsprocess -pipe \
             "-redefine=par,BMGain,measBMAfgGain BMAfgGain /" \
             "-redefine=par,BMdelay,measBMTriggerDelay BMTriggerDelay -" \
             "-redefine=par,QFGain,measQFAfgGain QFAfgGain /" \
             "-redefine=par,QFdelay,measQFTriggerDelay QFTriggerDelay -" \
             "-redefine=par,QDGain,measQDAfgGain QDAfgGain /" \
             "-redefine=par,QDdelay,measQDTriggerDelay QDTriggerDelay -" \
             "-redefine=par,SFGain,measSFAfgGain SFAfgGain /" \
             "-redefine=par,SFdelay,measSFTriggerDelay SFTriggerDelay -" \
             "-redefine=par,SF-UGain,measSF-UAfgGain SF-UAfgGain /" \
             "-redefine=par,SF-Udelay,measSF-UTriggerDelay SF-UTriggerDelay -" \
             "-redefine=par,SDGain,measSDAfgGain SDAfgGain /" \
             "-redefine=par,SDdelay,measSDTriggerDelay SDTriggerDelay -" \
             "-redefine=par,SD-UGain,measSD-UAfgGain SD-UAfgGain /" \
             "-redefine=par,SD-Udelay,measSD-UTriggerDelay SD-UTriggerDelay -" \
             | tee $tmpRoot.3 \
             | sddsprocess -pipe=in $tmpRoot.4 \
             "-redefine=col,B:BM:CurrentWFref,B:BM:CurrentWFref BMGain *" \
             "-redefine=col,B:QF:CurrentWFref,B:QF:CurrentWFref QFGain *" \
             "-redefine=col,B:QD:CurrentWFref,B:QD:CurrentWFref QDGain *" \
             "-redefine=col,B:SF:CurrentWFref,B:SF:CurrentWFref SFGain *" \
             "-redefine=col,B:SD:CurrenntWFref,B:SD:CurrentWFref SDGain *" \
             "-redefine=col,B:SD-U:CurrentWFref,B:SD-U:CurrentWFref SD-UGain *" \
             "-redefine=col,B:SF-U:CurrentWFref,B:SF-U:CurrentWFref SF-UGain *" \
         } result] {
    puts stderr "BIRampWaveformMon2: Error processing data: $result"
    exit 1
}
APSAddToTempFileList $tmpRoot.aa $tmpRoot.3 $tmpRoot.4

foreach magnet {BM QD QF SD SF SF-U SD-U} {
    if [catch {exec sddsprocess $tmpRoot.4 -pipe=out  \
                 "-redefine=col,time,time ${magnet}delay -" \
                 | sddsinterp -pipe -col=time,B:${magnet}:CurrentWFref -fileValues=$tmpRoot.3,col=time \
                 | sddsxref -pipe $tmpRoot.3 -take=*${magnet}*meas \
                 | sddsprocess -pipe=in $tmpRoot.$magnet \
                 "-define=col,${magnet}fitError,B:${magnet}:CurrentWFmeas B:${magnet}:CurrentWFref -" \
                 "-redefine=col,${magnet}deltaI/I,B:${magnet}:CurrentWFmeas B:${magnet}:CurrentWFref - B:${magnet}:CurrentWFref /" } result] {
        puts stderr "BIRampWaveformMon3: Error in computing RMS: $result"
        set error 1
        exit 1
    }
    APSAddToTempFileList ${tmpRoot}.$magnet
}


#interpolate QD, QD, SD, SF time to QF time because their timeshift are different
set magList {QD QF SD SF SF-U SD-U}
#set magList {QD QF SD SF SD-U}
foreach magnet $magList {
    if [catch {exec sddsinterp $tmpRoot.$magnet $tmpRoot.$magnet.1 -col=time,${magnet}* \
                 -fileValues=$tmpRoot.BM,col=time } result] {
        puts stderr "Error interpolate for $magnet: $result"
        exit 1
    }
    catch {exec rm $tmpRoot.$magnet}
    exec mv $tmpRoot.$magnet.1 $tmpRoot.$magnet
}
set fitstart [expr [exec sdds2stream -par=FitStart $tmpRoot.1]+20]
set fitend [expr [exec sdds2stream -par=FitEnd $tmpRoot.1]+20]

if [catch {exec sddsxref $tmpRoot.BM $tmpRoot.QF $tmpRoot.QD $tmpRoot.SF $tmpRoot.SF-U $tmpRoot.SD $tmpRoot.SD-U  \
             -take=*current -take=*fitError -take=*deltaI/I -pipe=out \
             | sddsxref -pipe $tmpRoot.voltage -take=*vout \
             | sddsprocess -pipe -process=*deltaI/I,rms,%sRMS,functionof=time,lower=$fitstart,upper=$fitend \
             | sddsprocess -pipe=in $filename \
             "-redefine=par,%s,%s 100 *,select=*RMS" \
             "-print=par,BMdI/I_rms,dI/I rms(%)=%.3f,BMdeltaI/IRMS" \
             "-print=par,QFdI/I_rms,dI/I rms(%)=%.3f,QFdeltaI/IRMS" \
             "-print=par,QDdI/I_rms,dI/I rms(%)=%.3f,QDdeltaI/IRMS" \
             "-print=par,SFdI/I_rms,dI/I rms(%)=%.3f,SFdeltaI/IRMS" \
             "-print=par,SF-UdI/I_rms,dI/I rms(%)=%.3f,SF-UdeltaI/IRMS" \
             "-print=par,SDdI/I_rms,dI/I rms(%)=%.3f,SDdeltaI/IRMS" \
             "-print=par,SD-UdI/I_rms,dI/I rms=%.3f,SD-UdeltaI/IRMS" \
             "-reprint=par,Description,IRamp" } result] {
    puts stderr "BIRampWaveformMon4: $result"
    exit 1
}

#set files [glob $tmpRoot.*]
#eval file delete -force $files
exit 0
