#!/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 newLattice ""
set refLattice nux36nuy19
set dcOrbitCorrection 1
APSStrictParseArguments {newLattice refLattice}

set mainDir   /home/helios/oagData/sr/orbitControllaw/lattices
set fofbDir  /home/helios/oagData/sr/fastOrbitFeedback/lattices
set rfDir   /home/helios/oagData/sr/rfOrbitControllaw/lattices

if ![string length $newLattice] {
    puts "Usage: CreateSRConfigForNewLattice -newLattice <lattice_name> -refLattice <reference_lattice>"
    exit 1
}

if ![file exist $mainDir/$refLattice] {
    puts stderr "Reference lattice - $refLattice does not exist!"
    exit 1
}

if ![file exist $mainDir/$newLattice] {
    puts stderr "Lattice - $newLattice does not exist yet.!"
    exit 1
}

if ![file isdirectory $mainDir/$newLattice] {
    puts stderr "New lattice is not a directory!"
    exit 1
}
if [catch {open $mainDir/$newLattice/tt.1 "w"} fd] {
    puts stderr "$env(USER) does not have write permission to $mainDir/$newLattice directory."
    close $fd
    exit 1
}
close $fd
file delete -force $mainDir/$newLattice/tt.1
if ![file exist $mainDir/$newLattice/refMatrices/h.default] {
    puts stderr "h plane reference matrix - $mainDir/$newLattice/refMatrices/h.default does exist!"
    exit 1
}
if ![file exist $mainDir/$newLattice/refMatrices/v.default] {
    puts stderr "v plane reference matrix - $mainDir/$newLattice/refMatrices/v.default does exist!"
    exit 1
}
 
set configList {default glennsSquareMatrix tenSingularValues bpmOffsetMeasurement BPLD-BMs LOCO.20 BXY_P1Square}

puts "Create fofb configs for $newLattice ..."
foreach plane {h v} {
    foreach config {default} {
        puts "Copy the fofb $plane.$config config of $refLattice to $newLattice ..."
        if [regexp {default} $config] {
            set newConfig [APSNextGenerationedName \
                               -directory $fofbDir/$newLattice \
                               -name ${plane}.[clock format [clock seconds] \
                                                   -format %Y-%m%d].00 -newFile 1 -separator .]
        } else {
            set newConfig $plane.$config
        }
        if ![file exist $newConfig] {
            if [catch {exec mkdir -p $fofbDir/$newLattice/$newConfig \
                       } result] {
                puts stderr "Cannot create $fofbDir/$newLattice/$newConfig : $result"
                exit 1
            }
        }
        
        puts "Copying $fofbDir/$refLattice/$plane.$config/config to $newLattice/$newConfig ..."
        set time [clock seconds]
        set timeStr [exec date]
        set timeStamp [clock format $time -format %Y/%m%d@%H:%M:%S]
        if [file exists $fofbDir/$refLattice/$plane.$config] {
            if [catch {exec sddsprocess  $fofbDir/$refLattice/$plane.$config/config \
                           -nowarnings \
                           "-redefine=par,CreationTime,$time,type=long" \
                           "-redefine=par,Time,$time,type=long" \
                           "-reprint=par,CreationDate,$timeStr" \
                           "-reprint=par,TimeStamp,$timeStamp" \
                           "-reprint=par,User,$env(USER)" \
                           "-reprint=par,Host,$env(HOSTNAME)" \
                           $fofbDir/$newLattice/$newConfig/config} result] {
                puts stderr "Unable to create $newLattice/$newConfig/config: $result"
                exit 1
            }
            puts "Generating irm for $newConfig ..."
            if [file exist $fofbDir/$refLattice/$plane.$config/irm] {
                if [catch {exec sdds2stream -par=NumberOfSingularValuesUsed \
                               -page=1 $fofbDir/$refLattice/$plane.$config/irm} singularValues] {
                    puts stderr "Warning: Problem with NumberOfSingularValuesUsed in file $fofbDir/$refLattice/$plane.$config/irm: $singularValues"
                    puts stderr "Using default value of 320"
                    set singularValues 320
                }
            } else {
                set singularValues 320
            }
            if [catch {APSSRGenerateOrbCorrFiles \
                           -rootname ${plane}config -generate 1 \
                           -configFile $fofbDir/$newLattice/$newConfig/config \
                           -plane $plane \
                           -referenceMatrix $fofbDir/$newLattice/refMatrices/${plane}.default \
                           -outputRoot $fofbDir/$newLattice/$newConfig/ \
                           -singularValues $singularValues} result] {
                puts stderr "$result"
            }
            cd $fofbDir/$newLattice
            if [regexp {default} $config] {
                if [file exist $plane.default] {
                    catch {exec rm -r $plane.default}
                }
                exec ln -s $newConfig $plane.default
            }
        } else {
            puts stderr "Can't find $fofbDir/$refLattice/$plane.$config. Skipping..."
        }
    }
}
puts "Done with fofb configs.\n"

foreach plane {h v} {
    foreach default $configList {
        if ![file exist $mainDir/$refLattice/${plane}.$default] {
            puts "$mainDir/$refLattice ${plane}.$default does not exist, skip."
            continue
        }
        
        if [regexp {default} $default] {
            set newConfig [APSNextGenerationedName \
                               -directory $mainDir/$newLattice \
                               -name ${plane}.[clock format [clock seconds] \
                                                   -format %Y-%m%d].00 -newFile 1 -separator .]
        } else {
            set newConfig ${plane}.$default
        }
        
        if ![file exist $mainDir/$newLattice/$newConfig] {
            if [catch {exec mkdir -p $mainDir/$newLattice/$newConfig \
                       } result] {
                puts stderr "Can not create $mainDir/$newLattice/$newConfig : $result"
                exit 1
            } 
        }
        puts "Copying $refLattice/${plane}.$default config to $newLattice/$newConfig ..."
        set time [clock seconds]
        set timeStr [exec date]
        set timeStamp [clock format $time -format %Y/%m%d@%H:%M:%S]
        if [catch {exec sddsprocess $mainDir/$refLattice/${plane}.$default/config \
                        -nowarnings \
                       "-redefine=par,CreationTime,$time,type=long" \
                       "-redefine=par,Time,$time,type=long" \
                       "-reprint=par,CreationDate,$timeStr" \
                       "-reprint=par,TimeStamp,$timeStamp" \
                       "-reprint=par,User,$env(USER)" \
                       "-reprint=par,Host,$env(HOSTNAME)" \
                       $mainDir/$newLattice/$newConfig/config} result] {
            puts stderr "Unable to create $newLattice/$newConfig/config: $result"
            exit 1
        }
        if [file exist $mainDir/$refLattice/${plane}.$default/irm] {
            set singularValues [exec sdds2stream -par=NumberOfSingularValuesUsed \
                                    -page=1  $mainDir/$refLattice/${plane}.$default/irm]
        } else {
            set singularValues 320
        }
        puts "Generating matrices for $newLattice/$newConfig ..."
        if [catch {APSSRGenerateOrbCorrFiles \
                       -rootname ${plane}config -generate 1 \
                       -configFile $mainDir/$newLattice/$newConfig/config \
                       -plane $plane \
                       -referenceMatrix $mainDir/$newLattice/refMatrices/${plane}.default \
                       -outputRoot $mainDir/$newLattice/$newConfig/ \
                       -singularValues $singularValues  \
                   } result] {
            puts stderr "$result"
            exit 1
        }
        if [regexp {default} $default] {
            puts "Making $plane.$default for $newLattice ..."
            cd $mainDir/$newLattice
            catch {exec rm -r $plane.$default}
            exec ln -s $newConfig $plane.$default
        }
        puts "\n"
    }
}
puts stderr "Done with main configs"
puts stderr "Doing $rfDir ..."
foreach plane {h} {
    foreach default $configList {
        if ![file exist $rfDir/$refLattice/${plane}.$default] {
            puts "$rfDir/$refLattice ${plane}.$default does not exist, skip."
            continue
        }
        
        if [regexp {default} $default] {
            set newConfig [APSNextGenerationedName \
                               -directory $rfDir/$newLattice \
                               -name ${plane}.[clock format [clock seconds] \
                                                   -format %Y-%m%d].00 -newFile 1 -separator .]
        } else {
            set newConfig ${plane}.$default
        }
        
        if ![file exist $rfDir/$newLattice/$newConfig] {
            if [catch {exec mkdir -p $rfDir/$newLattice/$newConfig \
                       } result] {
                puts stderr "Can not create $rfDir/$newLattice/$newConfig : $result"
                exit 1
            } 
        }
        puts "Copying $refLattice/${plane}.$default config to $newLattice/$newConfig ..."
        set time [clock seconds]
        set timeStr [exec date]
        set timeStamp [clock format $time -format %Y/%m%d@%H:%M:%S]
        if [catch {exec sddsprocess $rfDir/$refLattice/${plane}.$default/config \
                        -nowarnings \
                       "-redefine=par,CreationTime,$time,type=long" \
                       "-redefine=par,Time,$time,type=long" \
                       "-reprint=par,CreationDate,$timeStr" \
                       "-reprint=par,TimeStamp,$timeStamp" \
                       "-reprint=par,User,$env(USER)" \
                       "-reprint=par,Host,$env(HOSTNAME)" \
                       $rfDir/$newLattice/$newConfig/config} result] {
            puts stderr "Unable to create $newLattice/$newConfig/config: $result"
            exit 1
        }
        if [file exist $rfDir/$refLattice/${plane}.$default/irm] {
            set singularValues [exec sdds2stream -par=NumberOfSingularValuesUsed \
                                    -page=1  $rfDir/$refLattice/${plane}.$default/irm]
        } else {
            set singularValues 320
        }
        puts "Generating matrices for $newLattice/$newConfig ..."
        if [catch {APSSRFreqGenerateOrbCorrFiles \
                       -rootname ${plane}config -generate 1 \
                       -configFile $rfDir/$newLattice/$newConfig/config \
                       -plane $plane \
                       -referenceMatrix $rfDir/$newLattice/refMatrices/${plane}.default \
                       -outputRoot $rfDir/$newLattice/$newConfig/ \
                       -singularValues $singularValues  \
                   } result] {
            puts stderr "$result"
            exit 1
        }
        if [regexp {default} $default] {
            puts "Making $plane.$default for $newLattice ..."
            cd $rfDir/$newLattice
            catch {exec rm -r $plane.$default}
            exec ln -s $newConfig $plane.$default
        }
        puts "\n"
    }
}

puts "Done."
exit
