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

#Input  /home/helios/oagData/pvdata/iocRecNamesOAG.sdds
#       /home/helios/oagData/sr/BPMStatus/config.sdds
#       ../requestFiles/SROrbitSetPt.IDXrayOffset.template
#
#Output ../requestFiles/SROrbitSetPt.req

puts "Fix IDXrayOffset.req.template before APSU startup"

APSStandardSetup

set recordFile /home/helios/oagData/pvdata/iocRecNamesOAG.sdds
set output "../requestFiles/SROrbitSetPt.req"

# Use BPMStatus file
set bpmStatusConfig /home/helios/oagData/sr/BPMStatus/config.sdds
if [catch {exec sddsprocess $bpmStatusConfig ../requestFiles/xSetpoints \
             -filter=col,NonexistentH,0,0 \
             -print=col,Beamline,Setpoint \
             -print=col,Category,x \
             -define=col,Tolerance,0.0,type=double \
             "-print=col,Description,x setpoint of %s,DeviceName" \
             -print=col,IsProtected,n,type=character \
             -print=col,Units,um,type=string \
             -print=col,IsNumerical,y,type=character \
             -print=col,Provider,ca -print=col,ExpectNumeric,y,type=character \
             -print=col,ExpectFieldType,scalar -define=col,ExpectElements,1,type=long \
             -edit=column,ControlName,DeviceName,ei/:x:SetpointC/ } result] {
    puts stderr "Error1 for $argv0 in [pwd]: $result"
    exit 1
}
if [catch {exec sddsprocess ../requestFiles/xSetpoints ../requestFiles/xRFSetpoints \
             -match=col,DeviceName=S*\[ABC\]*:P? \
             -reprint=col,Beamline,Setpoint \
             -reprint=col,Category,xRF \
             "-reprint=col,Description,x RF-frequency setpoint of %s,DeviceName" \
             -reprint=column,ControlName,%s:x:RfSetpointC,DeviceName } result] {
    puts stderr "Error2 for $argv0 in [pwd]: $result"
    exit 1
}
if [catch {exec sddsprocess $bpmStatusConfig ../requestFiles/ySetpoints \
             -filter=col,NonexistentV,0,0 \
             -print=col,Beamline,Setpoint \
             -print=col,Category,y \
             -define=col,Tolerance,0.0,type=double \
             "-print=col,Description,y setpoint of %s,DeviceName" \
             -print=col,IsProtected,n,type=character \
             -print=col,IsNumerical,y,type=character \
             -print=col,Units,um,type=string \
             -print=col,Provider,ca -print=col,ExpectNumeric,y,type=character \
             -print=col,ExpectFieldType,scalar -define=col,ExpectElements,1,type=long \
             -edit=column,ControlName,DeviceName,ei/:y:SetpointC/  } result] {
    puts stderr "Error3 for $argv0 in [pwd]: $result"
    exit 1
}
if [catch {exec sddsprocess $bpmStatusConfig ../requestFiles/xOffsetsSpark.rf \
             -filter=col,NonexistentH,0,0 \
             -match=col,ElectronicsType=Spark-ERXR \
             -print=col,Beamline,Offset \
             -print=col,Category,x \
             -define=col,Tolerance,0.010,type=double \
             "-print=col,Description,x offset of %s,DeviceName" \
             -print=col,IsProtected,n,type=character \
             -print=col,Units,um,type=string \
             -print=col,IsNumerical,y,type=character \
             -print=col,Provider,ca -print=col,ExpectNumeric,y,type=character \
             -print=col,ExpectFieldType,scalar -define=col,ExpectElements,1,type=long \
             -edit=column,ControlName,DeviceName,ei/:x:OffsetC/  } result] {
    puts stderr "Error4 for $argv0 in [pwd]: $result"
    exit 1
}
if [catch {exec sddsprocess $bpmStatusConfig ../requestFiles/xOffsets.rf \
             -filter=col,NonexistentH,0,0 \
             -match=col,ElectronicsType=Xray*,! \
             -print=col,Beamline,Offset \
             -print=col,Category,x \
             -define=col,Tolerance,0.010,type=double \
             "-print=col,Description,x offset of %s,DeviceName" \
             -print=col,IsProtected,n,type=character \
             -print=col,Units,um,type=string \
             -print=col,IsNumerical,y,type=character \
             -print=col,Provider,ca -print=col,ExpectNumeric,y,type=character \
             -print=col,ExpectFieldType,scalar -define=col,ExpectElements,1,type=long \
             -edit=column,ControlName,DeviceName,ei/:x:BpmZeroOffsetC/  } result] {
    puts stderr "Error4 for $argv0 in [pwd]: $result"
    exit 1
}
if [catch {exec sddsprocess $bpmStatusConfig ../requestFiles/xOffsets2.rf \
             -filter=col,NonexistentH,0,0 \
             -match=col,ElectronicsType=Xray*,! \
             -print=col,Beamline,Offset \
             -print=col,Category,x \
             -define=col,Tolerance,0.010,type=double \
             "-print=col,Description,x offset of %s,DeviceName" \
             -print=col,IsProtected,n,type=character \
             -print=col,Units,,type=string \
             -print=col,IsNumerical,n,type=character \
             -print=col,Provider,ca -print=col,ExpectNumeric,n,type=character \
             -print=col,ExpectFieldType,scalar -define=col,ExpectElements,1,type=long \
             -edit=column,ControlName,DeviceName,ei/:x:IncludeBpmZeroOffsetC/  } result] {
    puts stderr "Error4 for $argv0 in [pwd]: $result"
    exit 1
}
if [catch {exec sddsprocess $bpmStatusConfig ../requestFiles/yOffsetsSpark.rf \
             -filter=col,NonexistentV,0,0 \
             -match=col,ElectronicsType=Spark-ERXR \
             -print=col,Beamline,Offset \
             -print=col,Category,y \
             -define=col,Tolerance,0.010,type=double \
             "-print=col,Description,y offset of %s,DeviceName" \
             -print=col,IsProtected,n,type=character \
             -print=col,Units,um,type=string \
             -print=col,IsNumerical,y,type=character \
             -print=col,Provider,ca -print=col,ExpectNumeric,y,type=character \
             -print=col,ExpectFieldType,scalar -define=col,ExpectElements,1,type=long \
             -edit=column,ControlName,DeviceName,ei/:y:OffsetC/  } result] {
    puts stderr "Error5 for $argv0 in [pwd]: $result"
    exit 1
}
if [catch {exec sddsprocess $bpmStatusConfig ../requestFiles/yOffsets.rf \
             -filter=col,NonexistentV,0,0 \
             -match=col,ElectronicsType=Xray*,! \
             -print=col,Beamline,Offset \
             -print=col,Category,y \
             -define=col,Tolerance,0.010,type=double \
             "-print=col,Description,y offset of %s,DeviceName" \
             -print=col,IsProtected,n,type=character \
             -print=col,Units,um,type=string \
             -print=col,IsNumerical,y,type=character \
             -print=col,Provider,ca -print=col,ExpectNumeric,y,type=character \
             -print=col,ExpectFieldType,scalar -define=col,ExpectElements,1,type=long \
             -edit=column,ControlName,DeviceName,ei/:y:BpmZeroOffsetC/  } result] {
    puts stderr "Error5 for $argv0 in [pwd]: $result"
    exit 1
}
if [catch {exec sddsprocess $bpmStatusConfig ../requestFiles/yOffsets2.rf \
             -filter=col,NonexistentV,0,0 \
             -match=col,ElectronicsType=Xray*,! \
             -print=col,Beamline,Offset \
             -print=col,Category,y \
             -define=col,Tolerance,0.010,type=double \
             "-print=col,Description,y offset of %s,DeviceName" \
             -print=col,IsProtected,n,type=character \
             -print=col,IsNumerical,n,type=character \
             -print=col,Units,,type=string \
             -print=col,Provider,ca -print=col,ExpectNumeric,n,type=character \
             -print=col,ExpectFieldType,scalar -define=col,ExpectElements,1,type=long \
             -edit=column,ControlName,DeviceName,ei/:y:IncludeBpmZeroOffsetC/  } result] {
    puts stderr "Error5 for $argv0 in [pwd]: $result"
    exit 1
}
#There are no Xray types listed for the APSU
if [catch {exec sddsprocess $bpmStatusConfig ../requestFiles/xOffsets.xray \
             -filter=col,NonexistentH,0,0 \
             -match=col,ElectronicsType=Xray* -nowarn \
             -print=col,Beamline,Offset \
             -print=col,Category,x \
             -define=col,Tolerance,0.010,type=double \
             "-print=col,Description,x offset of %s,DeviceName" \
             -print=col,Units,um,type=string \
             -print=col,IsNumerical,y,type=character \
             -print=col,IsProtected,y,type=character \
             -print=col,Provider,ca -print=col,ExpectNumeric,y,type=character \
             -print=col,ExpectFieldType,scalar -define=col,ExpectElements,1,type=long \
             -edit=column,ControlName,DeviceName,ei/:x:OffsetC/  } result] {
    puts stderr "Error6 for $argv0 in [pwd]: $result"
    exit 1
}
#There are no Xray types listed for the APSU
if [catch {exec sddsprocess $bpmStatusConfig ../requestFiles/yOffsets.xray \
             -filter=col,NonexistentV,0,0 \
             -match=col,ElectronicsType=Xray* -nowarn \
             -print=col,Beamline,Offset \
             -print=col,Category,y \
             -define=col,Tolerance,0.010,type=double \
             "-print=col,Description,y offset of %s,DeviceName" \
             -print=col,IsProtected,y,type=character \
             -print=col,IsNumerical,y,type=character \
             -print=col,Units,um,type=string \
             -print=col,Provider,ca -print=col,ExpectNumeric,y,type=character \
             -print=col,ExpectFieldType,scalar -define=col,ExpectElements,1,type=long \
             -edit=column,ControlName,DeviceName,ei/:y:OffsetC/  } result] {
    puts stderr "Error for $argv0 in [pwd]: $result"
    exit 1
}
if [catch {exec sddscombine ../requestFiles/xSetpoints ../requestFiles/ySetpoints \
             ../requestFiles/xOffsets.rf ../requestFiles/yOffsets.rf \
             ../requestFiles/xOffsets2.rf ../requestFiles/yOffsets2.rf \
             ../requestFiles/xOffsetsSpark.rf ../requestFiles/yOffsetsSpark.rf \
             ../requestFiles/xOffsets.xray ../requestFiles/yOffsets.xray \
             ../requestFiles/xRFSetpoints -pipe=out \
             -merge \
             | sddsconvert -pipe \
             -retain=col,ControlName,Beamline,Category,Description,Tolerance,IsProtected,Units,IsNumerical,Provider,ExpectNumeric,ExpectElements \
             | sddsprocess -pipe=in ../requestFiles/bpmSetpoints \
             -print=col,ControlType,pv \
             -print=col,OpsIntervention,n,type=character \
             -print=col,ExpectFieldType,scalar \
             -print=col,IsReadOnly,n,type=character} result] {
    puts stderr "Error7 for $argv0 in [pwd]: $result"
    exit 1
   }
   
file delete ../requestFiles/xSetpoints ../requestFiles/ySetpoints \
             ../requestFiles/xOffsets.rf ../requestFiles/yOffsets.rf \
             ../requestFiles/xOffsets2.rf ../requestFiles/yOffsets2.rf \
             ../requestFiles/xOffsetsSpark.rf ../requestFiles/yOffsetsSpark.rf \
             ../requestFiles/xOffsets.xray ../requestFiles/yOffsets.xray \
             ../requestFiles/xRFSetpoints

# Add Xray bpm blade offsets. 
set tmpXoffset /tmp/[APSTmpString]
set fileList ../requestFiles/bpmSetpoints

for {set i 1} {$i <= 40} {incr i} {
    lappend sectors [format %02d $i]
}
foreach sector $sectors {
    if [catch {exec sddsprocess ../requestFiles/SROrbitSetPt.IDXrayOffset.template \
                 $tmpXoffset.req.$sector \
                 -reedit=column,ControlName,%/<sector>/$sector/} result] {
        puts stderr "Error for $argv0 in [pwd]: $result"
        catch {eval file delete $fileList}
        exit 1
    }
    lappend fileList $tmpXoffset.req.$sector
}

set tmpOut /tmp/[APSTmpString]
if [catch {eval exec sddscombine $fileList -merge $output.1} result] {
    puts stderr "Error for $argv0 in [pwd]: $result"
    exit 1
}
eval file delete $fileList

# remove PVs that don't connect
if [catch {exec sddsprocess $output.1 -pipe=out \
             -edit=col,rec_name,ControlName,S?/./D \
             | sddssort -column=rec_name -pipe \
             | sddsxref -reuse -nowarnings -pipe $recordFile -match=rec_name \
             | sddsconvert -pipe -delete=col,rec_name,ioc_name \
             | sddssort -pipe=in -numericHigh -col=ControlName -unique $output \
         } result] {
    puts stderr "error: $result"
    exit 1
}
file delete $output.1

exec sddsconvert $output -pipe=out -ascii "-delete=para,*" | \
  sddsprocess -pipe=in $output -print=parameter,InstallLocation,/home/helios/oagData/SCR/requestFiles/SROrbitSetPt.req

exec sddsprocess $output ${output}.sr \
    -reprint=column,Category,BPM -reprint=column,Beamline,SR \
    "-delete=parameter,*" -match=col,ControlName=*RateP,! \
    -match=col,ControlName=*OffsetP,! \
    -match=col,ControlName=*FactorP,!

if [catch {APSMakeSCRCategoryFiles -input $output} result] {
    puts stderr "Error for $argv0 in $pwd: $result"
    exit 1
}
if {[catch {exec sddsconvert ${output}.categories -pipe=out -ascii | \
              sddsprocess -pipe=in ${output}.categories -nowarn -delete=parameter,NumberCombined \
              -reprint=parameter,InstallLocation,/home/helios/oagData/SCR/requestFiles/SROrbitSetPt.req.categories} result]} {
    puts stderr "error: $result"
    exit
}
if {[catch {exec sddsconvert ${output}.beamlines -pipe=out -ascii | \
              sddsprocess -pipe=in ${output}.beamlines -nowarn -delete=parameter,NumberCombined \
              -reprint=parameter,InstallLocation,/home/helios/oagData/SCR/requestFiles/SROrbitSetPt.req.beamlines} result]} {
    puts stderr "error: $result"
    exit
}
file delete ${output}.categories~ ${output}.beamlines~
