#!/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 usage {Usage: fmap2sdds -input <filename> -output <filename> [-insert <param-name>,<value>,<units>[,...]] }

set args $argv
set input ""
set output ""
set insert ""
APSStrictParseArguments {input output insert}
if {([llength $input] != 1) || ([llength $output] != 1)} {
    return -code error "$usage"
}

if [string length $insert] {
    set insertList [split $insert ,]
    if [expr [llength $insertList]%3]!=0 {
        return -code error "$usage"
    }
    for {set index 0} {$index<[llength $insertList]} {incr index} {
        set name [lindex $insertList $index]
        incr index
        set value [lindex $insertList $index]
        incr index
        set units [lindex $insertList $index]
        lappend sddsdata(ParameterNames) $name
        set sddsdata(ParameterInfo.$name) "type SDDS_DOUBLE units $units"
        set sddsdata(Parameter.$name) [list $value]
    }
}

set fid [open $input r]
set data [read $fid]
close $fid

set lines [split $data \n]

set mode 1
foreach line $lines {
    set line [string trim $line]
    if {$mode == 1} {
        if {$line == "Position(mm), Field(T)"} {
            set sddsdata(ColumnNames) "Position Field"
            set sddsdata(ColumnInfo.Position) "type SDDS_DOUBLE units mm"
            set sddsdata(ColumnInfo.Field) "type SDDS_DOUBLE units T"
            set mode 2
        } else {
            set pairList [split $line \;]
            foreach pair $pairList {
                set pair [split [string trim $pair] :]
                set units ""
                set name [join [lindex $pair 0] _]
                set i [string first \( $name]
                if {$i != -1} {
                    set units [string range $name [expr $i + 1] end-1]
                    set name [string range $name 0 [expr $i - 1]]
                }
                set value [string trim [join [lrange $pair 1 end] :]]
                if {[string range $name 0 4] == "TEMP_"} {
                    set num [string range $value 0 end-1]
                    set unit [string range $value end end]
                    if {([string is double $num]) && ([string is alpha $unit])} {
                        set value $num
                        set units $unit
                    }
                }
                set name [join [split $name \#] ""]
                set name [join [split $name ,] ""]
                set name [join [split $name .] ""]
                if {$name == "MAGNETC_MEASUREMENT_LAB_APS_ANL_START_TIME"} {
                    set name "START_TIME"
                }
                lappend sddsdata(ParameterNames) $name
                if {[string is double $value]} {
                    set sddsdata(ParameterInfo.$name) "type SDDS_DOUBLE"
                } else {
                    set sddsdata(ParameterInfo.$name) "type SDDS_STRING"
                }
                if {[llength $units]} {
                    append sddsdata(ParameterInfo.$name) " units $units"
                }
                set sddsdata(Parameter.$name) [list $value]
            }
        }
    } elseif {$mode == 2} {
        set line [split $line ,]
        if {[llength $line] == 2} {
            append Position "[lindex $line 0] "
            append Field "[lindex $line 1] "
        }
    }
}

set sddsdata(Column.Position) [list $Position]
set sddsdata(Column.Field) [list $Field]
set sddsdata(Layout.DataMode.Mode) binary


if {[catch {sdds save $output sddsdata} results]} {
    puts "Error: $results"
    exit
}

