#!/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)]
#
#$Log: not supported by cvs2svn $

APSStandardSetup

set lattice x13.75-y5.80-0015-DC
set outDir ""
set sector B1C0
set plane H
set amplitude ""
set load 0
set sign 1
set args $argv
APSParseArguments {sector amplitude lattice load plane outDir sign}

set bumpDir /home/helios/oagData/booster/ramps/correctors/lattices/$lattice
set env(EPICS_CA_MAX_ARRAY_BYTES) 140000000
if [regexp {H} $sector] {
    set pl H
    set sector1 $sector
} elseif [regexp {V} $sector] {
    set sector1 $sector
    set pl V
} else {
    set pl [string toupper $plane]
    set sector1 ${sector}$pl
}

set ampPV B:${sector1}:CorrectionAI

set tmpRoot /tmp/[APSTmpString]

if ![string length $amplitude] {
    #read it from a place holder, B:BconLockoutAO (not in use now, use it for BPM amplitude value)
    if [catch {exec cavget -list=$ampPV -pend=10 -printErrors} amplitude] {
	puts stderr $amplitude
	exit 1
    }
} else {
    if [catch {exec cavput -list=$ampPV=$amplitude -pend=10 } result] {
	puts stderr $result
	exit 1
    }
}

set amplitude [expr $amplitude * $sign]

set rampFile $bumpDir/ramp.sdds
set currentTable /home/helios/oagData/booster/ramps/correctors/lattices/$lattice/HVCorr.ramp
set corr ${sector1}

if [catch {exec sddsprocess $rampFile $tmpRoot.$corr.1 \
             "-redefine=col,RampSetpointDelta,RampSetpoint $amplitude *" } result] {
    puts stderr "Error2: $result"
    exit 1
}

if [catch {exec sddsprocess $currentTable -match=par,CorrName=$corr $tmpRoot.$corr.2} result] {
    puts stderr "Error3: $result"
    exit 1
}

if [catch {exec sddsinterp $tmpRoot.$corr.1 $tmpRoot.$corr.3 \
             -col=RampTime,RampSetpointDelta -fileValues=$tmpRoot.$corr.2,col=RampTime } result] {
    puts stderr "Error4: $result"
    exit 1
}

if ![string length $outDir] {
    set outFile /tmp/${sector1}-[clock format [clock seconds] -format %Y%m%d:%H%M%S].ramp
} else {
    set outFile $outDir/${sector1}.ramp
}

if [catch {exec sddsconvert $tmpRoot.$corr.2 -del=col,*Delta* -pipe=out \
             | sddsxref -pipe $tmpRoot.$corr.3 -take=RampSetpointDelta  \
             | sddsprocess -pipe=in $outFile "-redefine=col,OriginalRampSetpoint,RampSetpoint" \
             "-redefine=col,RampSetpoint,RampSetpoint RampSetpointDelta +" \
             "-reprint=par,Sector,${sector1}" \
             "-redefine=par,Amplitude,$amplitude" } result] {
    puts stderr "Error5: $result"
    exit 1
}


#check the ramp setpoint, should be less than 1.0, otherwise give erros and do not load
if [catch {exec sddsprocess $outFile -pipe=out \
    -process=RampSetpoint,max,MaxSetpoint \
    | sddscollapse -pipe \
    | sddsprocess -pipe -process=MaxSetpoint,max,MaxSetpoint1 \
    | sdds2stream -pipe -par=MaxSetpoint1} maxSetpoint] {
    puts stderr "Error6: chec the maximum setpoint: $maxSetpoint"
    exit 1
}
set files [glob $tmpRoot.*]
#eval file delete -force $files
if {$maxSetpoint>=0.5} {
    puts stderr "Error: the calculated setpoint is too big (>=1.0), ramp is invalid."
    exit 1
}

if $load {
    set command "ramploadnew $outFile"
    if [catch {eval exec $command} result] {
	puts stderr "Error in loading ramp - $outFile: $result"
	exit 1
    }
}

exit 0
