#!/bin/sh  
# \
  exec oagtclsh "$0" "$@"

# input files: /home/helios/oagData/deviceConfig/magnets.sdds
# 
#
# output files: BTSPS.mon
#               

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

if {[catch {APSGetMagnetPVNamesAndInfo -arrayName magnetPVs -beamline BTS} btsMagnets]} {
    puts "Error: $btsMagnets"
    exit
}
if {[catch {APSGetMagnetPVNamesAndInfo -arrayName magnetPVs -beamline Booster -type kicker} kickers]} {
    puts "Error: $kickers"
    exit
}
if {[catch {APSGetMagnetPVNamesAndInfo -arrayName magnetPVs -beamline Booster -type septum} septums]} {
    puts "Error: $septums"
    exit
}
if {[catch {APSGetMagnetPVNamesAndInfo -arrayName magnetPVs -beamline SR -type kicker} SRkickers]} {
    puts "Error: $SRkickers"
    exit
}
if {[catch {APSGetMagnetPVNamesAndInfo -arrayName magnetPVs -beamline SR -type septum} SRseptums]} {
    puts "Error: $SRseptums"
    exit
}

set magnets "$btsMagnets $kickers $septums $SRkickers $SRseptums"

set root BTSPS

set data(ParameterNames) "InstallLocation"
set data(ColumnNames) "ControlName ReadbackName Provider ExpectNumeric ExpectFieldType ExpectElements"
set data(ParameterInfo.InstallLocation) "type SDDS_STRING"
set data(ColumnInfo.ControlName) "type SDDS_STRING"
set data(ColumnInfo.ReadbackName) "type SDDS_STRING"
set data(ColumnInfo.Provider) "type SDDS_STRING"
set data(ColumnInfo.ExpectNumeric) "type SDDS_CHARACTER"
set data(ColumnInfo.ExpectFieldType) "type SDDS_STRING"
set data(ColumnInfo.ExpectElements) "type SDDS_LONG"

set data(Parameter.InstallLocation) "/home/helios/oagData/monitoring/BTSPS/${root}.mon"

foreach magnet $magnets {
    lappend data(Column.ControlName) $magnetPVs(${magnet}.readCurrentPV)
    lappend data(Column.ReadbackName) $magnetPVs(${magnet}.readCurrentPV)
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1

    lappend data(Column.ControlName) $magnetPVs(${magnet}.setCurrentPV)
    lappend data(Column.ReadbackName) $magnetPVs(${magnet}.setCurrentPV)
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1

    lappend data(Column.ControlName) $magnetPVs(${magnet}.readDCCTCurrentPV)
    lappend data(Column.ReadbackName) $magnetPVs(${magnet}.readDCCTCurrentPV)
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1

    lappend data(Column.ControlName) $magnetPVs(${magnet}.readDacCurrentPV)
    lappend data(Column.ReadbackName) $magnetPVs(${magnet}.readDacCurrentPV)
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1

    lappend data(Column.ControlName) $magnetPVs(${magnet}.readDCCTSlowCurrentPV)
    lappend data(Column.ReadbackName) $magnetPVs(${magnet}.readDCCTSlowCurrentPV)
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1

    lappend data(Column.ControlName) $magnetPVs(${magnet}.readVoltagePV)
    lappend data(Column.ReadbackName) $magnetPVs(${magnet}.readVoltagePV)
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1

    lappend data(Column.ControlName) $magnetPVs(${magnet}.setVoltagePV)
    lappend data(Column.ReadbackName) $magnetPVs(${magnet}.setVoltagePV)
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1

    lappend data(Column.ControlName) [string range $magnetPVs(${magnet}.setVoltagePV) 0 end-1]M
    lappend data(Column.ReadbackName) [string range $magnetPVs(${magnet}.setVoltagePV) 0 end-1]M
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1

    lappend data(Column.ControlName) $magnetPVs(${magnet}.readDacVoltagePV)
    lappend data(Column.ReadbackName) $magnetPVs(${magnet}.readDacVoltagePV)
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1

    lappend data(Column.ControlName) $magnetPVs(${magnet}.readTempPV)
    lappend data(Column.ReadbackName) $magnetPVs(${magnet}.readTempPV)
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1


    lappend data(Column.ControlName) "${magnet}:TemperatureM"
    lappend data(Column.ReadbackName) "${magnet}:TemperatureM"
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1   

    lappend data(Column.ControlName) "${magnet}:PS:TemperatureM"
    lappend data(Column.ReadbackName) "${magnet}:PS:TemperatureM"
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1   

    lappend data(Column.ControlName) "${magnet}:PS:AmbientTempM"
    lappend data(Column.ReadbackName) "${magnet}:PS:AmbientTempM"
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1   

    lappend data(Column.ControlName) "${magnet}:PS:HeatSinkTempM"
    lappend data(Column.ReadbackName) "${magnet}:PS:HeatSinkTempM"
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1   

    lappend data(Column.ControlName) "${magnet}:PS:DampResTempM"
    lappend data(Column.ReadbackName) "${magnet}:PS:DampResTempM"
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1   

    lappend data(Column.ControlName) "${magnet}:PS:BuckTempM"
    lappend data(Column.ReadbackName) "${magnet}:PS:BuckTempM"
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1   

    lappend data(Column.ControlName) "${magnet}:PS:AdcTempM"
    lappend data(Column.ReadbackName) "${magnet}:PS:AdcTempM"
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1   

    lappend data(Column.ControlName) "${magnet}:PS:CarrierTempM"
    lappend data(Column.ReadbackName) "${magnet}:PS:CarrierTempM"
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1   
    
    lappend data(Column.ControlName) "${magnet}:CapTempM"
    lappend data(Column.ReadbackName) "${magnet}:CapTempM"
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1   
    
    lappend data(Column.ControlName) "${magnet}:IGBT1TempM"
    lappend data(Column.ReadbackName) "${magnet}:IGBT1TempM"
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1   
    
    lappend data(Column.ControlName) "${magnet}:IGBT2TempM"
    lappend data(Column.ReadbackName) "${magnet}:IGBT2TempM"
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1   
    
    lappend data(Column.ControlName) $magnetPVs(${magnet}.rateDividerPV)
    lappend data(Column.ReadbackName) $magnetPVs(${magnet}.rateDividerPV)
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1

    lappend data(Column.ControlName) $magnetPVs(${magnet}.resistancePV)
    lappend data(Column.ReadbackName) $magnetPVs(${magnet}.resistancePV)
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1

    set names "BoardTempM
CapOT_M
CapacitorTempM
DCCTTripM
DampResOT_M
DampResTempM
FanSpeed1M
FanSpeed2M
FanWarningM
FaultsStatusM
HeatSinkOT_M
HeatSinkTempM
MagOT_MPEOB_M
MeasCurrentM
MeasDacCurrentM
NVolt15M
OCTripM
RateDividerC
ResistanceC
SetDacCurrentC
SetVoltageC
TemperatureM
VoltageM
Volt3_3M
Volt5M
Volt15M
CurrentPeakM"
    
    foreach name $names {
        lappend data(Column.ControlName) ${magnet}:$name
        lappend data(Column.ReadbackName) ${magnet}:$name
        lappend data(Column.Provider) ca
        lappend data(Column.ExpectNumeric) y
        lappend data(Column.ExpectFieldType) scalar
        lappend data(Column.ExpectElements) 1
    }


}

set extraPVs "BTS:ControlLawXRC.RUN BTS:ControlLawYRC.RUN BTS:DC1:PS:SetCurrentM BTS:DC2:PS:SetCurrentM"

foreach pv $extraPVs {
    lappend data(Column.ControlName) $pv
    lappend data(Column.ReadbackName) $pv
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1
}
for {set j 1} {$j <= 9} {incr j} {
    lappend data(Column.ControlName) BTS:UPSC${j}:ADC_PID_CurrTempRB_M
    lappend data(Column.ReadbackName) BTS:UPSC${j}:ADC_PID_CurrTempRB_M
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1

    lappend data(Column.ControlName) BTS:UPSC${j}:BRB_PID_CurrTempRB_M
    lappend data(Column.ReadbackName) BTS:UPSC${j}:BRB_PID_CurrTempRB_M
    lappend data(Column.Provider) ca
    lappend data(Column.ExpectNumeric) y
    lappend data(Column.ExpectFieldType) scalar
    lappend data(Column.ExpectElements) 1
}

set data(Column.ControlName) [list $data(Column.ControlName)]
set data(Column.ReadbackName) [list $data(Column.ReadbackName)]
set data(Column.Provider) [list $data(Column.Provider)]
set data(Column.ExpectNumeric) [list $data(Column.ExpectNumeric)]
set data(Column.ExpectFieldType) [list $data(Column.ExpectFieldType)]
set data(Column.ExpectElements) [list $data(Column.ExpectElements)]

sdds save ../DataLogging/${root}.mon.new data

exec sddssort ../DataLogging/${root}.mon.new -col=ControlName -num -nowarn -unique

puts "Comparing against master PV list"
exec sddsprocess  ../DataLogging/${root}.mon.new -pipe=out \
  -edit=column,SimpleControlName,ControlName,S?/./K | \
  sddsselect -pipe /home/helios/oagData/pvdata/iocRecNamesOAG.sdds \
  -match=SimpleControlName=rec_name -nowarning -reuse | \
  sddsconvert -pipe=in ./../DataLogging/${root}.mon -delete=column,SimpleControlName

file delete ../DataLogging/${root}.mon.new ../DataLogging/${root}.mon.new~


