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

if [info exists env(OAG_TOP_DIR)] {
    set auto_path [linsert $auto_path 0 $env(OAG_TOP_DIR)/oag/apps/lib/$env(HOST_ARCH)]
} else {
    set auto_path [linsert $auto_path 0 /usr/local/oag/apps/lib/$env(HOST_ARCH)]
}

APSStandardSetup

set usage "plotTwiss {-fileRoot <root> | -rootname <root>} \[-plotOptions\] \[-morePlotOptions\] \n\
      \[-printer <printer>\] \[-psFile <file>\] \[-pngFile <file>\] \[-largePng {0|1}\] \[-separate {0|1}\] \n\
      \[-display <displayName>\] \[-noDisplay  {0|1} \[-showCommand {0|1}\]\n\
     \[-thick {0|1}\] \[-dispersion {etax|etay|both}\] \[-logbeta {0|1}\]"

set args $argv
set rootname ""
set fileRoot ""
set plotOptions ""
set morePlotOptions ""
set display ""
set noDisplay 0
set psFile ""
set printer ""
set pngFile ""
set thick 0
set largePng 0
set noDispersion 0
set dispersion etax
set logbeta 0
set separate 0
set showCommand 0
APSParseArguments {rootname largePng fileRoot noDispersion plotOptions morePlotOptions thick \
                     display noDisplay psFile logbeta \
                     pngFile printer dispersion separate showCommand}
set mainArgs $args

if ![string length $fileRoot] {
    set fileRoot $rootname
}
if ![string length $fileRoot] {
    puts $usage
    exit
}
if ![file readable $fileRoot.twi] {
    if ![file readable $fileRoot] {
        puts "$argv0 in [pwd]: problem with file $fileRoot.twi."
        exit
    }
    puts "$argv0 in [pwd]: Problem with file $fileRoot.twi. Trying file $fileRoot ..."
    set file $fileRoot
    set fileRoot [file rootname $file]
} else {
    set file $fileRoot.twi
}

if ![file readable $fileRoot.mag] {
    puts "$argv0 in [pwd]: problem with file $fileRoot.mag"
    exit
}
if {$dispersion!="etax" && $dispersion!="etay" && $dispersion!="both" && $dispersion!="neither"} {
    puts "$argv0: dispersion has to be etax, etay, both, or neither."
    exit
}

set tmpFile /tmp/[APSTmpString].twi
set coupling 0.01

#check if radiation integrals are present
set integralsPresent 0
if {-1 < [lsearch [exec sddsquery -para $file] ex0]} {
    set integralsPresent 1
}
set effectiveEmittancePresent 0
if {-1 < [lsearch [exec sddsquery -para $file] EffectiveEmittancePresent]} {
    set effectiveEmittancePresent 1
}

if {$integralsPresent && !$effectiveEmittancePresent} {
    # if effective emittance and other columns are already present then we 
    # don't have to do the sddsprocess command.
    if [catch {exec sddsprocess $file $tmpFile -nowarning \
                 "-def=para,emitx,ex0,units=\$gp\$rm" \
                 "-def=para,emity,ex0 $coupling *,units=\$gp\$rm" \
                 "-def=col,gammax,alphax sqr 1 + betax /,units=1/m" \
                 "-def=col,gammay,alphay sqr 1 + betay /,units=1/m" \
                 "-def=col,Sigmax,emitx betax * etax Sdelta0 * sqr + sqrt 1e6 *,units=um" \
                 "-def=col,Sigmaxp,emitx gammax * etaxp Sdelta0 * sqr + sqrt 1e6 *,units=urad" \
                 "-def=col,Sxxp,Sdelta0 sqr etax * etaxp * alphax emitx * - 1e12 *,units=um-urad" \
                 "-def=col,Sigmay,emity betay * etay Sdelta0 * sqr + sqrt 1e6 *,units=um" \
                 "-def=col,Sigmayp,emity gammay * etayp Sdelta0 * sqr + sqrt 1e6 *,units=urad" \
                 "-def=col,EffectiveEmittance,Sigmax Sigmaxp * sqr Sxxp sqr - sqrt 1e3 /,units=nm-rad" \
                 -process=EffectiveEmittance,first,%s \
                 "-print=para,tuneString,\$gn\$r\$bx\$n: %7.5g  \$gn\$r\$by\$n: %7.5g,nux,nuy" \
                 -def=para,EffectiveEmittancePresent,1,type=long \
             } result ] {
        puts "$argv0 in [pwd]: $result"
    }
} else {
    if [catch {exec sddsprocess $file $tmpFile -nowarning \
                 "-redef=col,gammax,alphax sqr 1 + betax /,units=1/m" \
                 "-redef=col,gammay,alphay sqr 1 + betay /,units=1/m" \
                 "-reprint=para,tuneString,\$gn\$r\$bx\$n %7.5g  \$gn\$r\$by\$n: %7.5g,nux,nuy" \
             } result ] {
        puts "$argv0 in [pwd]: $result"
    }
}
if [string length $display] {
    set displayOption "-display $display"
} else {
    set displayOption ""
}

#create file of average values
if $integralsPresent {
    if {$dispersion=="etax"} {
        set itemList "betax betay etax gammax Sigmax Sigmaxp"
    } else {
        set itemList "betax betay etay gammay Sigmay Sigmayp"
    }
    if [catch {exec averageOverElements -input $tmpFile \
                 -output ${tmpFile}.ave \
                 -itemList "$itemList" \
             } result] {
        puts stderr "$argv0 in [pwd]: averageOverElements: $result"
        exit
    }
} else {
    if {$dispersion=="etax"} {
        set itemList "betax betay etax gammax"
    } elseif {$dispersion=="etay"} {
        set itemList "betax betay etay gammay"
    } else {
        set itemList "betax betay etax gammax etay gammay"
    }
    if [catch {exec averageOverElements -input $tmpFile \
                 -output ${tmpFile}.ave \
                 -itemList "$itemList" \
             } result] {
        puts stderr "$argv0 in [pwd]: averageOverElements: $result"
        exit
    }
}

# combine average values with end-point values
if $integralsPresent {
    exec sddsconvert ${tmpFile}.ave -pipe=out \
      -dele=col,s,[join $itemList ,] \
      | sddsconvert -pipe=in ${tmpFile}.ave.1 \
      -edit=col,*Average,%/Average//
} else {
    exec sddsconvert ${tmpFile}.ave -pipe=out \
      -dele=col,s,[join $itemList ,] \
      | sddsconvert -pipe=in ${tmpFile}.ave.1 \
      -edit=col,*Average,%/Average//
}
# APSAddToTempFileList $tmpFile.ave.1
exec sddscombine ${tmpFile} ${tmpFile}.ave.1 -pipe=out \
    -merge \
    | sddssort -pipe=in ${tmpFile}.1 -col=s 
file delete ${tmpFile}.ave~ 

if {$noDispersion || $dispersion=="neither"} {
    set dispersionOption ""
} else {
    if {$dispersion=="etax" || $dispersion=="etay"} {
        set dispersionOption  "-column=s,$dispersion  ${tmpFile}.1 -legend=ysymbol -unsup=y -yscale=id=eta -ylabel=sca=1.4d "
    } else {
	set dispersionOption "-column=s,etax  ${tmpFile}.1 -legend=ysymbol -unsup=y -yscale=id=eta -ylabel=sca=1.4d"
	if $separate {
	    append dispersionOption " -end"
	}
	append dispersionOption " -column=s,etay  ${tmpFile}.1 -legend=ysymbol -unsup=y -yscale=id=eta -ylabel=sca=1.4d " 
    }
}

proc makePlot {args} {
    set type motif
    set output ""
    APSStrictParseArguments {type output}
    global fileRoot plotOptions largePng noDispersion dispersion tmpFile integralsPresent displayOption dispersion thick plotOptions morePlotOptions showCommand
    global dispersionOption mainArgs separate logbeta

    if $logbeta {
        set betaMode -mode=linlog
    } else {
        set betaMode -mode=linlin
    }
    if $separate {
	set optList1 "-layout=1,3"
    } else {
	set optList1 "-layout=1,1"
    }
    lappend optList1 -split=pages -sep=pages -same -axes=x
    lappend optList1 "-title=Twiss parameters for $fileRoot"
    lappend optList1 -alignZero=yfactor 
    if [llength $plotOptions] {
	eval lappend optList1 $plotOptions
    }
    if [llength $morePlotOptions] {
	eval lappend optList1 $morePlotOptions
    }
    switch $type {
	motif {
	    if [llength $displayOption] {
		lappend optList1 $displayOption
	    }
	    lappend optList1 -graph=line,vary
	}
	ceps {
	    lappend optList1 -device=ceps -output=$output -thick=[expr $thick?3:2] -graph=line,vary,thick=[expr $thick?3:2]
	}
	png {
	    if $largePng {
		lappend optList1 -device=lpng 
	    } else {
		lappend optList1 -device=png
	    }
	    lappend optList1 -output=$output -thick=[expr $thick?3:2] -graph=line,vary,thick=[expr $thick?3:2]
	}
    }
    if [llength $mainArgs] {
	eval lappend optList1 $mainArgs
    }

    eval lappend optList2 -column=s,betax $betaMode ${tmpFile}.1 -legend=ysymbol -unsup=y -yscale=id=beta -ylabel=sca=1.4 -topline=@tuneString 
    if $separate {
	lappend optList2 -end
    }
    eval lappend optList2 -column=s,betay $betaMode ${tmpFile}.1 -legend=ysymbol -unsup=y -yscale=id=beta -ylabel=sca=1.4 -topline=@tuneString 
    if $separate {
	eval lappend optList2 -end $dispersionOption ${tmpFile}.1 -legend=ysymbol -unsup=y -ylabel=sca=1.4 -end 
    } else {
	eval lappend optList2 $dispersionOption -end
    }

    if [string compare $type motif]==0 {
	if $integralsPresent {
	    lappend optList2 -column=s,EffectiveEmittance  ${tmpFile}.1 -unsup=y
	    lappend optList2 "-topline=@EffectiveEmittance,edit=i/Effective emittance: /ei/ nm/"
	    lappend optList2 -ylabel=sca=1.2 -end
	}
#	lappend optList2 -col=s,yAperture ${tmpFile}.1 -unsup=y -limit=ymax=1 -end 
	#lappend optList2 -col=s,xAperture ${tmpFile}.1 -unsup=y -limit=ymax=1 -end 
        lappend optList2 -col=s,yAperture ${tmpFile}.1  -end
        lappend optList2 -col=s,xAperture ${tmpFile}.1  -end
    }
        
    if $integralsPresent {
        if [catch {eval exec sddsplot \
                      $optList1 $optList2 \
		       -col=s,Profile $fileRoot.mag -overlay=xmode=normal,yfactor=0.075 \
                     -omnipresent \
                     & } result ] {
            puts stderr "$result"
	}
	if $showCommand {
	    puts " sddsplot \
                     $optList1 $optList2 \
    	       -col=s,Profile $fileRoot.mag -overlay=xmode=normal,yfactor=0.075 \
                     -omnipresent"
	}
    } else {
        if [catch {eval exec sddsplot \
                      $optList1 $optList2 \
                     -col=s,Profile $fileRoot.mag   -overlay=xmode=normal,yfactor=0.075 \
                     -omnipresent \
                      & } result ] {
            puts stderr "$result"
        }
	if $showCommand {
	    puts "sddsplot \
                      $optList1 $optList2 \
                     -col=s,Profile $fileRoot.mag   -overlay=xmode=normal,yfactor=0.075 \
                     -omnipresent"
	}
    }
}

if {!$noDisplay} makePlot

if [string length $pngFile] {
    makePlot -output $pngFile -type png
}
if [string length $psFile] {
    makePlot -output $psFile -type ceps
}

exit

