#!/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/IDBM.req.template
#         ../requestFiles/IDBM.other.req
#         ../requestFiles/IDBM.req.sr
#         /home/helios/oagData/sr/BPMStatus/config.sdds
#         ../requestFiles/SROrbitSetPt.IDXrayOffset.template
#         ../requestFiles/SROrbitSetPt.req.sr
#         ../requestFiles/SR.req.set1
#         ../requestFiles/SR.req.set2.template
#         ../requestFiles/SR.req.set3
#         ../requestFiles/SR.req.set5 #S-DCCT:LifetimePoints2AveC and S-DCCT:LifetimePoints2FitC no longer exist, this set should
#              not be included, 02/10/2025 Shang
#         ../requestFiles/SR.req.set10
#         ../requestFiles/SR.req.set11
#         ../requestFiles/SR.req.set13
#         ../requestFiles/SR.req.steering.template
#         ../requestFiles/SR.req.set15.template
#
#Output   ../requestFiles/SR.req

APSStandardSetup
set recordFile /home/helios/oagData/pvdata/iocRecNamesOAG.sdds
set rootname SR
set output ../requestFiles/SR.req

# make Steering Accumulator request file
proc makeSteeringAccumulatorFile {args} {
    set output ""
    APSParseArguments {output}
    set tmpfile /tmp/[APSTmpString]
    set recordFile /home/helios/oagData/pvdata/iocRecNamesOAG.sdds
    for {set sector 1} {$sector < 36} {incr sector} {
	set ssector [format %02d $sector]
	#for ID
	foreach steer {X Xp Y Yp} {
	    if [catch {exec replaceText ../requestFiles/SR.req.steering.template \
			   $tmpfile.sector$sector.ID.$steer \
			   -orig=<sector>,<IDBM>,<steer> -replace=$ssector,ID,$steer} result] {
		return -code error "makeSteeringAccumulatorFile: $result"
	    }
	    lappend fileList $tmpfile.sector$sector.ID.$steer
	}
	#for BM
	if [catch {exec replaceText ../requestFiles/SR.req.steering.template \
		       $tmpfile.sector$sector.BM.Yp \
		       -orig=<sector>,<IDBM>,<steer> -replace=$ssector,BM,Yp} result] {
	    return -code error "makeSteeringAccumulatorFile: $result"
	}
        lappend fileList $tmpfile.sector$sector.BM.Yp
    }
    if [catch {eval exec sddscombine $fileList -merge -pipe=out \
                 | sddsprocess -pipe  \
                 -edit=col,rec_name,ControlName,S?/./D \
                 | sddssort -column=rec_name -pipe \
                 | sddsxref -reuse -nowarnings -pipe $recordFile -match=rec_name \
                 | sddsconvert -pipe -ascii -delete=col,rec_name,ioc_name \
                 | sddssort -pipe=in -column=ControlName -numeric -unique $output} result] {
        return -code error "makeSteeringAccumulatorFile: $result"
    }
    eval file delete $fileList
    return
}

proc makePSFile {args} {
    set output ""
    APSParseArguments {output}
    set tmpfile /tmp/[APSTmpString]
    set recordFile /home/helios/oagData/pvdata/iocRecNamesOAG.sdds
    for {set sector 1} {$sector <= 40} {incr sector} {
        set ssector [format %02d $sector]
        if [catch {exec replaceText ../requestFiles/SR.req.set15.template $tmpfile.sector$sector \
                     -orig=<sector> -replace=$ssector} result] {
            return -code error "makePSFile: $result"
        }
        lappend fileList $tmpfile.sector$sector
    }
    if [catch {eval exec sddscombine $fileList -merge -pipe=out \
                 | sddsprocess -pipe  \
                 -edit=col,rec_name,ControlName,S?/./D \
                 | sddssort -column=rec_name -pipe \
                 | sddsxref -reuse -nowarnings -pipe $recordFile -match=rec_name \
                 | sddsconvert -pipe -ascii -delete=col,rec_name,ioc_name \
                 | sddssort -pipe=in -column=ControlName -numeric -unique $output} result] {
        return -code error "makePSFile: $result"
    }
    eval file delete $fileList
    return
}

proc makeBPMsFile {args} {
    set output ""
    APSParseArguments {output}
    set tmpfile /tmp/[APSTmpString]
    set recordFile /home/helios/oagData/pvdata/iocRecNamesOAG.sdds
    
    set index 0
    if {[catch {exec sdds2stream /home/helios/oagData/sr/BPMStatus/config.sdds -col=NonexistentH,DeviceName} results]} {
        return -code error "makeBPMsFile: $results"
    }
    set plane x
    foreach "missing device" $results {
        if {!$missing} {
            incr index
            if [catch {exec replaceText ../requestFiles/SR.req.set2.template $tmpfile.$index \
                         -orig=<device>,<plane> -replace=${device},x} result] {
                return -code error "makeBPMsFile: $result"
            }
            lappend fileList $tmpfile.$index
        }
    }
    if {[catch {exec sdds2stream /home/helios/oagData/sr/BPMStatus/config.sdds -col=NonexistentV,DeviceName} results]} {
        return -code error "makeBPMsFile: $results"
    }
    set plane y
    foreach "missing device" $results {
        if {!$missing} {
            incr index
            if [catch {exec replaceText ../requestFiles/SR.req.set2.template $tmpfile.$index \
                         -orig=<device>,<plane> -replace=${device},y} result] {
                return -code error "makeBPMsFile: $result"
            }
            lappend fileList $tmpfile.$index
        }
    }

    if [catch {eval exec sddscombine $fileList -merge -pipe=out \
                 | sddsprocess -pipe  \
                 -edit=col,rec_name,ControlName,S?/./D \
                 | sddssort -column=rec_name -pipe \
                 | sddsxref -reuse -nowarnings -pipe $recordFile -match=rec_name \
                 | sddsconvert -pipe -ascii -delete=col,rec_name,ioc_name \
                 | sddssort -pipe=in -column=ControlName -numeric -unique $output} result] {
        return -code error "makeBPMsFile: $result"
    }
    eval file delete $fileList
    return
}

#NOT USED
proc makeCerenkovFile {args} {
    set output ""
    APSParseArguments {output}
    set tmpfile /tmp/[APSTmpString]
    set sectorList [exec sdds2stream -col=Sector \
                      /home/helios/oagData/sr/cerenkov/sectors.sdds]
    set recordFile /home/helios/oagData/pvdata/iocRecNamesOAG.sdds
    foreach sector $sectorList {
        if [catch {exec replaceText SR.req.set9.template $tmpfile.sector$sector \
                     -orig=<sector> -replace=$sector \
                 } result] {
            return -code error "makeCerenkovFile: $result"
        }
        lappend fileList $tmpfile.sector$sector
    }
    if [catch {eval exec sddscombine $fileList -merge -pipe=out \
                 | sddsprocess -pipe  \
                 -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 -column=ControlName -numeric -unique $output \
             } result] {
        return -code error "makeCerenkovFile: $result"
    }
    eval file delete $fileList
    return
}

set tmpfile /tmp/[APSTmpString]

# make a new IDBM request file 
if [catch {exec ./makeIDBMreqFile} result] {
    puts stderr "Error1 for $argv0 in [pwd]: $result"
    exit 1
}
set IDBM ../requestFiles/IDBM.req.sr

# make a new SROrbitSetPt.req file
if [catch {exec ./makeOrbitSetPtReqFile} result] {
    puts stderr "Error2 for $argv0 in [pwd]: $result"
    exit 1
}
set orbitSetPt ../requestFiles/SROrbitSetPt.req.sr


if [catch {makeSteeringAccumulatorFile -output ../requestFiles/SR.req.set14} result] {
    puts stderr "Error4 for $argv0 in [pwd]: $result"
    exit 1
}

if [catch {makePSFile -output ../requestFiles/SR.req.set15} result] {
    puts stderr "Error5 for $argv0 in [pwd]: $result"
    exit 1
}

if [catch {makeBPMsFile -output ../requestFiles/SR.req.set2} result] {
    puts stderr "Error6 for $argv0 in [pwd]: $result"
    exit 1
}

# files            content
# SR.req.set1      timing, rf brief, scrapers, some diagnostics but no corrector setpoints
# SR.req.set2      BPM
# SR.req.set3      Collimator 
# SR.req.set5      beam lifetime calculated and chromaticity based on sextupoles and lattice model
#                  the beam lifetime PVs are being delete, this set should not be included, 02/10/2025, Shang   
# SR.req.set10     Video (image) data  [removed from list because no PVs connect. LEm 09/13/24]
# SR.req.set11     Include in RMS bpms  [removed from list because no PVs connect. LEm 09/13/24]
# SR.req.set13     S35 Pinhole Camera [removed from list because no PVs connect. LEm 09/13/24]
# SR.req.set14     Steering accumulator PVs FIXME
# SR.req.set15     SteeringPS, MainPS, MachineMode, RunControl

if [catch {eval exec sddscombine -merge -overWrite \
             ../requestFiles/SR.req.set15 ../requestFiles/SR.req.set2 \
             ../requestFiles/SR.req.set3 \
             ../requestFiles/SR.req.set1 \
             ../requestFiles/SR.req.set14 \
             $IDBM $orbitSetPt \
             $output.tmp } result] {
    puts stderr "Error7 for $argv0 in [pwd]: $result"
    exit 1
}

file delete ../requestFiles/SR.req.set2 ../requestFiles/SR.req.set14 ../requestFiles/SR.req.set15

#  Make sure there is only one instance of each name
# I don't know what the the column Row is used for.
if [catch {exec sddsprocess $output.tmp -pipe=out \
             -edit=col,rec_name,ControlName,S?/./D \
             -print=parameter,InstallLocation,/home/helios/oagData/SCR/requestFiles/SR.req \
             | sddssort -pipe -col=rec_name \
             | sddsxref -reuse -nowarnings -pipe $recordFile -match=rec_name \
             | sddsconvert -ascii -pipe -delete=col,rec_name,ioc_name -delete=parameter,NumberCombined \
             | sddssort -pipe=in $output -unique \
             -col=Category -column=ControlName -numericHigh} result] {
    puts stderr "Error8 for $argv0 in [pwd]: $result"
    exit 1
}
file delete $output.tmp

# I would like to elimate most of the read-only. Perhaps keep the
# power supplies' CurrentM VoltageM
# steering RunAccumM
# for comparisons.

if [catch {exec sddsprocess $output $output.readonly \
                -match=col,IsReadOnly=y \
                -match=col,ControlName=*CurrentM,ControlName=*VoltageM,|,ControlName=*RunAccumM,|,ControlName=*DeviceM,|,ControlName=*DeviceTypeM,|
          } result] {
    puts stderr "Error8a for $argv0 in [pwd]: $result"
    exit 1
}

if [catch {exec sddsprocess $output $output.writable \
                -match=col,IsReadOnly=n \
          } result] {
    puts stderr "Error8b for $argv0 in [pwd]: $result"
    exit 1
}

if [catch {exec sddscombine $output.readonly $output.writable -pipe=out -merge | \
             sddsconvert -pipe=in $output -ascii  \
           } result] {
    puts stderr "Error8c for $argv0 in [pwd]: $result"
    exit 1
}

file delete $output.readonly $output.writable


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

