Changeset 1185


Ignore:
Timestamp:
Jan 23, 2012 5:41:45 PM (9 years ago)
Author:
toby
Message:

liveplot: plottitle opts, bkgedit: match to liveplot, add update after adding points

Location:
branches/sandbox
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/sandbox/bkgedit

    r990 r1185  
    77# (delete here and above)
    88#!/usr/bin/wish
    9 # $Id: liveplot,v 1.45 2008/04/15 17:25:56 toby Exp toby $
    10 set Revision {$Revision: 1.45 $ $Date: 2008/04/15 17:25:56 $}
     9# $Id: liveplot 1183 2011-12-07 19:05:54Z toby $
     10set Revision {$Revision: 1183 $ $Date: 2011-12-07 13:05:54 -0600 (Wed, 07 Dec 2011) $}
    1111
    1212package require Tk
     
    1414# process command line arguments
    1515set exitstat 0
    16 set expnam [lindex $argv 0]
    17 if {$expnam == ""} {catch {puts "error -- no experiment name"}; set exitstat 1}
     16set expnam [file root [lindex $argv 0]]
     17#if {$expnam == ""} {catch {puts "error -- no experiment name"}; set exitstat 1}
    1818if $exitstat {
    1919    catch {puts "usage: $argv0 expnam \[hist #\] \[legend\]"}
    2020    exit
    2121}
    22 
     22# work in .EXP directory (in case files will be exported).
     23catch {
     24    cd [file dirname $expnam]
     25}
    2326# get name of script
    2427set expgui(script) [info script]
     
    4245    set graph(legend) [lindex $argv 2]
    4346}
     47set plot_title "(None)"
    4448
    4549set graph(backsub) 0
     
    6569set graph(yunits) 0
    6670set graph(autoraise) 1
     71set graph(setfiletitle) 0
    6772set graph(color_diff) blue
    6873set graph(color_chi2) magenta
     
    7984set expgui(fadetime) 10
    8085set expgui(hklbox) 1
    81 set expgui(autotick) 0
     86set expgui(autotick) 1
     87set expgui(phaselabel) 0
    8288set expgui(pixelregion) 5
    8389# location for web pages, if not found locally
     
    102108}
    103109set expgui(RadiiList) {}
     110set ::expmap(phaselist) {}
    104111
    105112proc waitmsg {message} {
     
    134141    color1 magenta
    135142    color2 cyan
    136     color3 yellow
     143    color3 black
    137144    color4 sienna
    138145    color5 orange
     
    173180source [file join $expgui(scriptdir) readexp.tcl]
    174181source [file join $expgui(scriptdir) opts.tcl]
     182#----------------------------------------------------------------
     183# use EXPGUI directory for packages
     184lappend auto_path $expgui(scriptdir)
    175185
    176186if {$program == "bkgedit"}  {
     
    244254    global expgui modtime expnam
    245255    if [catch {
    246         set modtime [file mtime $expnam.EXP]
    247256        set loadtime [time {
    248             if {$expgui(tcldump) == ""} {
     257        set modtime 0
     258            if {$::topasfile != ""} {
     259                set p "TOPAS import"
     260                readdata_topas $box
     261            } elseif {$expgui(tcldump) == ""} {
     262                set modtime [file mtime $expnam.EXP]
    249263                set p HSTDMP
    250264                readdata_hst $box
    251265            } else {
     266                set modtime [file mtime $expnam.EXP]
    252267                set p TCLDUMP
    253268                readdata_tcl $box
     
    349364    calcvec set $calclist
    350365    bckvec set $bcklist
    351     diffvec set [obsvec - calcvec]
    352     foreach vec {obsvec calcvec diffvec} {
     366    #diffvec set [obsvec - calcvec]
     367    foreach vec {obsvec calcvec} {
    353368        # probably not needed with recent versions of BLT:
    354369        global $vec
     
    356371        catch {$vec variable $vec}
    357372    }
    358     set maxdiff  [set diffvec(max)]
    359     set cmin [set calcvec(min)]
    360     set omin [set obsvec(min)]
    361     set cmax [set calcvec(max)]
    362     set omax [set obsvec(max)]
    363     set expgui(min) [expr {$omin < $cmin ? $omin : $cmin}]
    364     set expgui(max) [expr {$omax > $cmax ? $omax : $cmax}]
    365     set ymin1 [expr {$cmin - 1.1*$maxdiff}]
    366     set ymin2 [expr {$omin - 1.1*$maxdiff}]
    367     if {$ymin1 < $ymin2} {
    368         diffvec set [diffvec + $ymin1]
    369     } {
    370         diffvec set [diffvec + $ymin2]
    371     }
     373    ApplyMag
    372374    plotdata
    373375}
     
    440442        wifdvec set $sumlist
    441443        wifdvec set [wifdvec / [wifdvec length]]
    442     }
    443     if {$graph(OmCoS)} {
     444    } elseif {$graph(OmCoS)} {
    444445        wifdvec set $WGT
    445446        wifdvec expr sqrt(wifdvec)
    446447        wifdvec set [wifdvec * diffvec]
     448    } else {
     449        wifdvec length 0
    447450    }
    448451    if $graph(backsub) {
     
    450453        calcvec set [calcvec - bckvec]
    451454    }
    452     global obsvec calcvec diffvec
    453     set maxdiff  [set diffvec(max)]
    454     set cmin [set calcvec(min)]
    455     set omin [set obsvec(min)]
    456     set cmax [set calcvec(max)]
    457     set omax [set obsvec(max)]
    458     set expgui(min) [expr {$omin < $cmin ? $omin : $cmin}]
    459     set expgui(max) [expr {$omax > $cmax ? $omax : $cmax}]
    460     set ymin1 [expr {$cmin - 1.1*$maxdiff}]
    461     set ymin2 [expr {$omin - 1.1*$maxdiff}]
    462     if {$ymin1 < $ymin2} {
    463         diffvec set [diffvec + $ymin1]
    464     } {
    465         diffvec set [diffvec + $ymin2]
    466     }
    467    
     455    ApplyMag
     456    plotdata
     457}
     458
     459set ::topasfile ""
     460proc get_topas_file {} {
     461    set ::topasfile [tk_getOpenFile -title "Select Topas File" -parent . \
     462                         -defaultextension .ascii \
     463                         -filetypes {
     464                             {"Topas ascii export" ".ascii"}
     465                             {"all files" "*"}
     466                         }]
     467    if {$::topasfile == ""} return
     468    if {[catch {set input [open $::topasfile r]} errmsg]} {
     469        MyMessageBox -parent . -title "Open Error" \
     470            -message "An error occured trying to open file $::topasfile: $errmsg" \
     471            -icon error -type Ignore -default ignore
     472        set ::topasfile ""
     473        return
     474    }
     475    close $input
     476    readdata .g
     477}
     478
     479proc readdata_topas {box} {
     480    global expgui expnam reflns graph
     481    global lasthst
     482    global hst peakinfo xunits weightlist
     483    #set file "liveplot_output.ascii"
     484    if {$::topasfile == ""} return
     485    if {[catch {set input [open $::topasfile r]} errmsg]} {
     486        MyMessageBox -parent . -title "Open Error" \
     487            -message "An error occured trying to open file $::topasfile: $errmsg" \
     488            -icon error -type Ignore -default ignore
     489        return
     490    }
     491
     492    $box config -title "(TOPAS import in progress)"
     493    update
     494    # parse the output of a file
     495    set lasthst $hst
     496    # initalize arrays
     497    set num -1
     498    set xlist {}
     499    set obslist {}
     500    set calclist {}
     501    set bcklist {}
     502    set xunits {}
     503    set weightlist {}
     504    global refhkllist refphaselist refpos
     505    set refhkllist {}
     506    set refphaselist {}
     507    set refpos {}
     508    # define a list of reflection positions for each phase
     509    for {set i 1} {$i < 10} {incr i} {
     510        set reflns($i) {}
     511    }
     512    set i 0
     513    while {[gets $input line] >= 0} {
     514        incr i
     515        if {[string first ":" $line] != -1} continue
     516        # run update every 50th line
     517        if {$i > 50} {set i 0; update}
     518        if {[llength $line] == 5} {
     519            scan $line %e%e%e%e%e X d Iobs Icalc Isig
     520            if {$Isig > 0} {
     521                if {$graph(xunits) == 0} {
     522                    lappend xlist $X
     523                } elseif {$graph(xunits) == 1} {
     524                    lappend xlist $d
     525                } else {
     526                    lappend xlist [expr {6.283185307179586 / $d}]
     527                }
     528                lappend obslist $Iobs
     529                lappend calclist $Icalc
     530                #lappend bcklist 0
     531                lappend weightlist [expr {1./($Isig * $Isig)}]
     532            }
     533        } elseif {[llength $line] == 7} {
     534            scan $line %e%e%e%e%e%e%d h k l m d tt ph
     535            if {$graph(xunits) == 0} {
     536                set x $tt
     537            } elseif {$graph(xunits) == 1} {
     538                set x $d
     539            } else {
     540                set x [expr {6.283185307179586 / $d}]
     541            }
     542            set ph [expr {int($ph)}]
     543            lappend reflns($ph) $x
     544            lappend refhkllist "$h,$k,$l"
     545            lappend refphaselist $ph
     546            lappend refpos $x
     547        } elseif {[llength $line] == 3} {
     548            scan $line %e%e%e x d b
     549            lappend bcklist $b
     550        } else {
     551            puts "unexpected input: $line"
     552        }
     553    }
     554    close $input
     555
     556    if {$graph(xunits) == 0} {
     557        set xunits "2-Theta"
     558    } elseif {$graph(xunits) == 1} {
     559        set xunits "d"
     560    } else {
     561        set xunits "Q"
     562    }
     563    foreach elem [$box element names] {
     564        eval $box element config $elem $graph(ElementShowOption)
     565    }
     566    xvec set $xlist
     567    obsvec set $obslist
     568    calcvec set $calclist
     569    bckvec set $bcklist
     570    #diffvec set [obsvec - calcvec]
     571    refposvec set $refpos
     572    set ::expmap(phaselist) [lsort -unique $refphaselist]
     573    RegisterPhases $::expmap(phaselist)
     574    if {$expgui(autotick)} {
     575        foreach i $::expmap(phaselist) {
     576            set peakinfo(flag$i) 1
     577        }
     578    }
     579    #wifdvec length 0
     580    # if {$graph(chi2)} {
     581    #     wifdvec set $WGT
     582    #     wifdvec set [wifdvec * diffvec]
     583    #     wifdvec set [wifdvec * diffvec]
     584    #     # now do a running sum
     585    #     set sum 0
     586    #     set sumlist {}
     587    #     foreach n [wifdvec range 0 end] {
     588    #         set sum [expr {$sum + $n}]
     589    #         lappend sumlist $sum
     590    #     }
     591    #     wifdvec set $sumlist
     592    #     wifdvec set [wifdvec / [wifdvec length]]
     593    # } elseif {$graph(OmCoS)} {
     594    #     wifdvec set $WGT
     595    #     wifdvec expr sqrt(wifdvec)
     596    #     wifdvec set [wifdvec * diffvec]
     597    # }
     598    if $graph(backsub) {
     599        obsvec set [obsvec - bckvec]
     600        calcvec set [calcvec - bckvec]
     601    }
     602    foreach vec {obsvec calcvec} {
     603        # probably not needed with recent versions of BLT:
     604        global $vec
     605        # sometimes needed for latest version of BLT (2.4z)
     606        catch {$vec variable $vec}
     607    }
     608    ApplyMag
     609    plotdata
     610}
     611
     612proc SetTitle {} {
     613    set bx .title
     614    toplevel $bx
     615    wm title $bx "Edit plot title"
     616    wm iconname $bx "Edit plot title"
     617    grid [label $bx.txt -text "Enter plot title below"] -row 1 -column 1
     618    grid [entry $bx.title -width 70] -row 2 -column 1
     619    grid [frame $bx.a] -row 3 -column 1
     620    grid [button $bx.a.save -text "Save" \
     621              -command "set plot_title \"\[$bx.title get\]\"; destroy $bx" \
     622             ] -row 1 -column 1
     623    grid [button $bx.a.quit -text "Quit" \
     624              -command "destroy $bx" \
     625             ] -row 1 -column 2
     626    putontop $bx
     627    tkwait window $bx
     628    afterputontop
    468629    plotdata
    469630}
     
    571732    global expnam hst peakinfo xunits yunits cycle reflns modtime
    572733    global lasthst graph expgui box
    573 
     734    global obsvec calcvec diffvec bckvec
     735
     736    if {$graph(yunits) == 0} {
     737        diffvec set [obsvec - calcvec]
     738        $box element config 1 -label bckgr -line 1 -hide 0
     739        $box element config 4 -label diff  -line 1 -hide 0
     740    } elseif {$graph(yunits) == 1} {
     741        diffvec set [obsvec - calcvec]
     742        $box element config 1 -label bckgr -line 1 -hide 0
     743        $box element config 4 -label diff  -line 1 -hide 0
     744    } elseif {$graph(yunits) == 2} {
     745        set yunits {Intensity/sigma(I)}
     746        wifdvec set $::weightlist
     747        wifdvec expr sqrt(wifdvec)
     748        obsvec set [obsvec * wifdvec]
     749        calcvec set [calcvec * wifdvec]
     750        bckvec set {}
     751        diffvec set [obsvec - calcvec]
     752        wifdvec set {}
     753        $box element config 1 -label {} -line 0 -hide 1
     754        $box element config 4 -label diff  -line 1 -hide 0
     755    } elseif {$graph(yunits) == 3} {
     756        bckvec expr 0*bckvec
     757        set msg {}
     758        if {[set calcvec(min)] <= 0} {
     759            if {$msg != ""} {append msg ", "}
     760            append msg "calculated"
     761        }
     762        if {[set obsvec(min)] <= 0} {
     763            if {$msg != ""} {append msg " & "}
     764            append msg "observed"
     765        }
     766        if {$msg != ""} {
     767            MyMessageBox -parent . -title "Invalid Range" \
     768                -message "Log computation impossible due to zero or negative $msg intensity values" \
     769                -icon warning -type Continue -default continue
     770        } else {
     771            set yunits {log(Intensity)}
     772            obsvec expr log10(obsvec)
     773            calcvec expr log10(calcvec)
     774            if {[set bckvec(min)] <= 0} {
     775                bckvec set {}
     776                $box element config 1 -label {} -line 0 -hide 1
     777            } else {
     778                bckvec expr log10(bckvec)
     779                $box element config 1 -label bckgr -line 1 -hide 0
     780            }
     781            diffvec set {}
     782            $box element config 4 -label {} -line 0 -hide 1
     783        }
     784    } else {
     785        $box element config 1 -label bckgr -line 1 -hide 0
     786        $box element config 4 -label diff  -line 1 -hide 0
     787    }
     788
     789    set cmin [set calcvec(min)]
     790    set omin [set obsvec(min)]
     791    set cmax [set calcvec(max)]
     792    set omax [set obsvec(max)]
     793    set expgui(min) [expr {$omin < $cmin ? $omin : $cmin}]
     794    set expgui(max) [expr {$omax > $cmax ? $omax : $cmax}]
     795
     796    foreach p $::expmap(phaselist) {
     797        if {$expgui(phaselabel)} {
     798            # 20 characters, max
     799            set graph(label$p) [string range [phaseinfo $p name] 0 19]
     800           
     801        } else {
     802            set graph(label$p) Phase$p
     803        }
     804    }
    574805    # is there a new histogram to load?
    575806    if {$hst != $lasthst} {
     
    582813        return
    583814    }
    584     $box config -title "$expnam cycle $cycle Hist $hst"
     815    if {$::graph(setfiletitle) && $::topasfile != ""} {
     816        $box config -title "TOPAS import $::topasfile"
     817    } elseif {$::graph(setfiletitle)} {
     818        $box config -title "$expnam [histinfo $::hst file] cycle $cycle"
     819    } elseif {$::plot_title == "(None)"} {
     820        $box config -title "$expnam cycle $cycle Hist $hst"
     821    } else {
     822        $box config -title $::plot_title
     823    }
    585824    $box xaxis config -title $xunits
    586825    $box yaxis config -title $yunits
     
    612851    calcvec notify now
    613852    bckvec notify now
    614     diffvec notify now
    615853    wifdvec notify now
    616854    # now deal with peaks
    617     for {set i 1} {$i < 10} {incr i} {
    618         if {$expgui(autotick)} {
    619             set div [expr {( $expgui(max) - $expgui(min) )/40.}]
    620             set ymin [expr {$expgui(min) - ($i+1) * $div}]
    621             set ymax [expr {$expgui(min) - $i * $div}]
    622         } else {
    623             set ymin $peakinfo(min$i)
    624             set ymax $peakinfo(max$i)
    625         }
    626         set j 0
    627         if [set peakinfo(flag$i)] {
    628             foreach X $reflns($i) {
    629                 incr j
    630                 catch {
    631                     $box marker create line -name peaks${i}_$j
    632                 }
    633                 $box marker config peaks${i}_$j  -under 1 \
    634                         -coords "$X $ymin $X $ymax"
    635                 catch {
    636                     $box marker config peaks${i}_$j \
    637                             $graph(MarkerColorOpt) [list $peakinfo(color$i)]
    638                     if $peakinfo(dashes$i) {
    639                         $box marker config peaks${i}_$j -dashes "5 5"
    640                     }
    641                 }
     855    #for {set i 1} {$i < 10} {incr i}
     856    set k 0
     857    set cmin $expgui(min)
     858    foreach i $::expmap(phaselist) {
     859        if {[set peakinfo(flag$i)]} {
     860            incr k
     861            if {$expgui(autotick)} {
     862                set div [expr {( $expgui(max) - $expgui(min) )/40.}]
     863                set ymin [expr {$expgui(min) - ($k+1) * $div}]
     864                set ymax [expr {$expgui(min) - $k * $div}]
     865                if {$cmin > $ymin} {set cmin $ymin}
     866            } else {
     867                set ymin $peakinfo(min$i)
     868                set ymax $peakinfo(max$i)
     869            }
     870            set j 0
     871            foreach X $reflns($i) {
     872                incr j
     873                catch {
     874                    $box marker create line -name peaks${i}_$j
     875                }
     876                $box marker config peaks${i}_$j  -under 1 \
     877                    -coords "$X $ymin $X $ymax"
     878                catch {
     879                    $box marker config peaks${i}_$j \
     880                        $graph(MarkerColorOpt) [list $peakinfo(color$i)]
     881                    if {$peakinfo(dashes$i) && ! $expgui(autotick)} {
     882                        $box marker config peaks${i}_$j -dashes "5 5"
     883                    }
     884                }
    642885            }
    643886            catch {$box element create phase$i}
    644887            catch {
    645888                $box element config phase$i -color $peakinfo(color$i) \
    646                         -label $graph(label$i)
     889                    -label $graph(label$i)
    647890            }
    648891        } else {
     
    650893            eval $box element delete [$box element names phase$i]
    651894        }
     895    }
     896    catch {
     897        # offset the difference pattern
     898        set maxdiff  [set diffvec(max)]
     899        if {$expgui(autotick)} {
     900            diffvec set [diffvec + [expr {$cmin - $maxdiff}]]
     901        } else {
     902            diffvec set [diffvec + [expr {$cmin - 1.1*$maxdiff}]]
     903        }
     904        diffvec notify now
    652905    }
    653906    # force an update of the plot as BLT may not
     
    9921245    }
    9931246    puts $fp "# LIVEPLOT saved options from [clock format [clock seconds]]"
    994     foreach v {printout legend outname outcmd autoraise chi2 xunits yunits OmCoS} {
     1247    foreach v {
     1248        printout legend outname outcmd autoraise
     1249        chi2 xunits yunits OmCoS setfiletitle} {
    9951250        puts $fp "set graph($v) [list $graph($v)]"
    9961251    }
     
    9981253        puts $fp "set graph(color_$v) [list $graph(color_$v)]"
    9991254    }
    1000     foreach v {font lblfontsize fadetime hklbox pixelregion autotick} {
     1255    foreach v {font lblfontsize fadetime hklbox pixelregion autotick phaselabel} {
    10011256        puts $fp "set expgui($v) [list $expgui($v)]"
    10021257    }
     
    11121367        eval $box y2axis config $graph(ElementHideOption)
    11131368        $box element config 0 -label ""
     1369        # clear the vector
     1370        wifdvec set {}
     1371        wifdvec notify now
    11141372    }
    11151373}
     
    11901448    close $fp
    11911449    .g element config 12 -data $l
     1450    # force a replot
     1451    .g elem show [.g elem show]
    11921452    if {[set l [llength $bkglist]] > 3} {
    11931453        .bkg.f.fit1 config -state normal
     
    20362296setlegend $box $graph(legend)
    20372297
     2298set ps2pdfcmd {}
     2299set gnuplotpath {}
     2300# find gnuplot
     2301if {$::tcl_platform(platform) == "windows"} {
     2302    set gnuplotpath [file join $::expgui(gsasexe) "gnuplot/gnuplot.exe"]
     2303    if {![file exists $gnuplotpath]} {
     2304        set gnuplotpath [auto_execok gnuplot.exe]
     2305    }
     2306} else {
     2307    set ::env(PATH) "${::expgui(gsasexe)}:${::env(PATH)}"
     2308    auto_reset
     2309    set gnuplotpath [auto_execok gnuplot]
     2310}
     2311# find postscript conversion routine
     2312if {$::tcl_platform(platform) == "windows"} {
     2313    set gspath [file join $::expgui(gsasexe) "gs/bin/gswin32c.exe"]
     2314    if {![file exists $gspath]} {
     2315        set gspath [auto_execok gswin32c.exe]
     2316    }
     2317    if {[file exists $gspath]} {
     2318        set ps2pdfcmd "$gspath -q -P- -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=\$pdfoutname -c save pop -f \$psoutname"
     2319    }
     2320} else {
     2321    # look for ghostscript
     2322    set gspath [auto_execok gs]
     2323    if {[file exists $gspath]} {
     2324        set ps2pdfcmd "$gspath -q -P- -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=\$pdfoutname -c save pop -f \$psoutname"
     2325    } else {
     2326        set gspath [auto_execok pstopdf]; # this is on Mac only
     2327        if {[file exists $gspath]} {
     2328            set ps2pdfcmd "$gspath \$psoutname -o \$pdfoutname"
     2329        }
     2330    }
     2331}
     2332set gnuplotexport {}
     2333catch {
     2334    source [file join $expgui(scriptdir) gnuplot.tcl]
     2335}
     2336
     2337#======================================================================
     2338# make menus
    20382339frame .a -bd 3 -relief groove
    20392340pack [menubutton .a.file -text File -underline 0 -menu .a.file.menu] -side left
     
    20442345.a.file.menu add command -label "Update Plot" \
    20452346        -command {set cycle [getcycle];readdata .g}
     2347.a.file.menu add command -label "Set Plot Title" \
     2348        -command SetTitle
     2349.a.file.menu add checkbutton -label "Set Plot Title to data file" \
     2350    -variable graph(setfiletitle) \
     2351    -command {set cycle [getcycle];readdata .g}
     2352
    20462353.a.file.menu add cascade -label "Export plot" -menu .a.file.menu.export
    20472354menu .a.file.menu.export
     
    20512358    source [file join $expgui(scriptdir) graceexport.tcl]
    20522359    .a.file.menu.export add command -label "to Grace" -command exportgrace
     2360}
     2361if {$gnuplotpath == {}} {
     2362    .a.file.menu.export add cascade -label "gnuplot program not found"
     2363} elseif {$gnuplotexport == ""} {
     2364    .a.file.menu.export add cascade -label "file gnuplot.tcl not found"
     2365} elseif {$ps2pdfcmd == ""} {
     2366    .a.file.menu.export add cascade -label "gs or pstopdf program not found"
     2367} else {
     2368    .a.file.menu.export add command -label "to PDF" -command ExportPDF
     2369}
     2370
     2371if {$program == "liveplot"} {
     2372    .a.file.menu add command -label "Import from Topas" \
     2373        -command {get_topas_file}
    20532374}
    20542375.a.file.menu add command -label Quit -command "destroy ."
     
    20732394        -value 1 -variable expgui(autotick) -command plotdata
    20742395.a.options.menu.tick add separator
    2075 .a.options.menu.tick add command -label "Label by name" \
    2076         -command {
    2077     foreach p $expmap(phaselist) {
    2078         # 20 characters, max
    2079         set graph(label$p) [string range [phaseinfo $p name] 0 19]
    2080         plotdata
    2081     }
    2082 }
     2396.a.options.menu.tick add radiobutton -label "Label by phase number" \
     2397    -value 0 -variable expgui(phaselabel) -command plotdata
     2398.a.options.menu.tick add radiobutton -label "Label by phase name" \
     2399    -value 1 -variable expgui(phaselabel) -command plotdata
    20832400.a.options.menu.tick add separator
    20842401
    20852402if {$program == "liveplot"} {
     2403    pack [menubutton .a.mag -text Magnification -underline 0 -menu .a.mag.menu] \
     2404        -side left
     2405    menu .a.mag.menu
     2406}
     2407set maglist {}
     2408set mag0 1.0
     2409# display magnification routines
     2410proc ShowMag {} {
     2411    global blt_version tcl_platform peakinfo expgui
     2412    set bx .opt
     2413    catch {destroy $bx}
     2414    toplevel $bx
     2415    putontop $bx
     2416    wm iconname $bx "Mag Regs"
     2417    wm title $bx "Plot Magnification Regions"
     2418    pack [label $bx.0 -text "Magnification Regions:"] -side top
     2419    if {[llength $::maglist] == 0} {
     2420        set lbl "None"
     2421    } else {
     2422        set lbl ""
     2423        set xm $::xvec(min)
     2424        set ym $::mag0
     2425        set ::maglist [lsort -real -index 0 $::maglist]
     2426        foreach pair $::maglist {
     2427            foreach {xh ymh} $pair {}
     2428            append lbl "\tfrom $xm to $xh: times $ym\n"
     2429            set xm $xh
     2430            set ym $ymh
     2431        }
     2432        set xh $::xvec(max)
     2433        append lbl "\tfrom $xm to $xh: times $ym"
     2434    }
     2435    pack [label $bx.1 -text $lbl -justify left] -side top
     2436    pack [button $bx.2 -text "Close" -command "destroy $bx"] -side top
     2437    tkwait window $bx
     2438    afterputontop
     2439}
     2440
     2441# edit magnification regions
     2442proc EditMag {} {
     2443    set ::multrow 1
     2444    set bx .opt
     2445    catch {destroy $bx}
     2446    toplevel $bx
     2447    putontop $bx
     2448    wm iconname $bx "Mag Regs"
     2449    wm title $bx "Edit Magnification Regions"
     2450    pack [label $bx.0 -text "Vertical Magnification Regions:"] -side top
     2451    if {[llength $::maglist] == 0} {
     2452        set lbl "None"
     2453        pack [label $bx.1 -text $lbl -justify left] -side top
     2454        pack [button $bx.2 -text "Close" -command "destroy $bx"] -side top
     2455        tkwait window $bx
     2456        afterputontop
     2457        return
     2458    } else {
     2459        pack [frame $bx.1] -side top
     2460        set ::maglist [lsort -real -index 0 $::maglist]
     2461        set row 0
     2462        foreach pair $::maglist {
     2463            foreach {xh ymh} $pair {}
     2464            set row1 [expr {$row + 1}]
     2465            set ::xmag($row1) $xh
     2466            set ::mag($row1) $ymh
     2467            if {$row == 0} {
     2468                grid [label $bx.1.a$row -text "From "] -column 1 -row $row
     2469                grid [label $bx.1.b$row -text $::xvec(min)] -column 2 -row $row
     2470                grid [label $bx.1.c$row -text " to "] -column 3 -row $row
     2471                grid [entry $bx.1.d$row -textvariable xmag(1) -width 6] -column 4 -row $row
     2472                grid [label $bx.1.e$row -text " times "] -column 5 -row $row
     2473                grid [entry $bx.1.f$row -textvariable mag0 -width 4] -column 6 -row $row
     2474            } else {
     2475                grid [label $bx.1.a$row -text "From "] -column 1 -row $row
     2476                grid [entry $bx.1.b$row -textvariable xmag($row) -width 6] -column 2 -row $row
     2477                grid [label $bx.1.c$row -text " to "] -column 3 -row $row
     2478                grid [entry $bx.1.d$row -textvariable xmag($row1) -width 6] -column 4 -row $row
     2479                grid [label $bx.1.e$row -text " times "] -column 5 -row $row
     2480                grid [entry $bx.1.f$row -textvariable mag($row) -width 4] -column 6 -row $row
     2481            }
     2482            incr row
     2483        }
     2484        grid [label $bx.1.a$row -text "From "] -column 1 -row $row
     2485        grid [entry $bx.1.b$row -textvariable xmag($row) -width 6] -column 2 -row $row
     2486        grid [label $bx.1.c$row -text " to "] -column 3 -row $row
     2487        grid [label $bx.1.d$row -text $::xvec(max)] -column 4 -row $row
     2488        grid [label $bx.1.e$row -text " times "] -column 5 -row $row
     2489        grid [entry $bx.1.f$row -textvariable mag($row) -width 4] -column 6 -row $row
     2490        set ::multrow $row
     2491    }
     2492    pack [label $bx.l -text "\nSet the multiplier to zero to delete a region"] -side top
     2493    pack [frame $bx.2] -side top
     2494    pack [button $bx.2.a -text "Edit" -command "destroy $bx"] -side left
     2495    pack [button $bx.2.b -text "Cancel" -command "set multrow 0; destroy $bx"] -side left
     2496    tkwait window $bx
     2497    afterputontop
     2498    if {$::multrow == 0} return
     2499    set newmaglist {}
     2500    set xp $::xvec(min)
     2501    for {set i 1} {$i <= $::multrow} {incr i} {
     2502        if {$::mag($i) > 0} {
     2503            lappend newmaglist [list $::xmag($i) $::mag($i)]
     2504        }
     2505        set xp $::xmag($i)
     2506    }
     2507    set ::maglist $newmaglist
     2508    readdata .g
     2509}
     2510
     2511# show a menu to add a magnification region
     2512proc AddMag {} {
     2513    set bx .opt
     2514    catch {destroy $bx}
     2515    toplevel $bx
     2516    putontop $bx
     2517    wm iconname $bx "Add Regs"
     2518    wm title $bx "Add Plot Magnification Region"
     2519    pack [frame $bx.0] -side top
     2520    pack [label $bx.0.a -text "Magnify from "] -side left
     2521    pack [entry $bx.0.b -textvariable xmin -width 6] -side left
     2522    pack [label $bx.0.c -text " to next region. Multiply by "] -side left
     2523    pack [entry $bx.0.d -textvariable mult -width 4] -side left
     2524    pack [frame $bx.2] -side top
     2525    pack [button $bx.2.a -text "Add" -command "destroy $bx"] -side left
     2526    pack [button $bx.2.b -text "Cancel" -command "set mult {}; destroy $bx"] -side left
     2527    if {[catch {expr $::mult}]} {set ::mult 1.0}
     2528    if {$::mult <= 0} {set ::mult 1.0}
     2529    tkwait window $bx
     2530    afterputontop
     2531    catch {
     2532        if {$::xmin < $::xvec(min)} {set ::xmin $::xvec(min)}
     2533        if {$::xmin > $::xvec(max)} {set ::xmin $::xvec(max)}
     2534        if {$::mult > 0} {
     2535            lappend ::maglist [list $::xmin $::mult]
     2536            readdata .g
     2537        } else {
     2538            MyMessageBox -parent . -title "Invalid" \
     2539                -message "Invalid input, try again" \
     2540                -icon error -type Continue -default continue
     2541        }
     2542    }
     2543}
     2544proc AddCursorMag {p m} {
     2545    set x [.g xaxis invtransform $p]
     2546    if {$x < $::xvec(min) || $x > $::xvec(max) } {
     2547        bell
     2548        return
     2549    }
     2550    lappend ::maglist [list $x $m]
     2551    readdata .g
     2552}
     2553
     2554# scale the data with magnification regions
     2555proc ApplyMag {} {
     2556    foreach mrk [.g marker names mag*] {
     2557        .g marker delete $mrk
     2558    }
     2559    if {[llength $::maglist] == 0} return
     2560    global xvec
     2561    vector create ymult([xvec length])
     2562    set xl $xvec(min)
     2563    set ym $::mag0
     2564    set i 0
     2565    set ::maglist [lsort -real -index 0 $::maglist]
     2566    foreach pair $::maglist {
     2567        foreach {xh ymh} $pair {}
     2568        set xr [xvec search $xl $xh]
     2569        #puts "$xl $xh [lindex $xr 0]:[lindex $xr end] $ym"
     2570        if {[lindex $xr 0] != [lindex $xr end]} {
     2571            set ymult([lindex $xr 0]:[lindex $xr end]) $ym
     2572            if {$xl != $xvec(min)} {
     2573                .g marker create line -coords "$xl -Inf $xl Inf" -name mag[incr i]
     2574            }
     2575            .g marker create text -coords "$xl Inf" -name mag[incr i] -text "x$ym" -anchor w
     2576        }
     2577        set xl $xh
     2578        set ym $ymh
     2579    }
     2580    set xh $xvec(max)
     2581    set xr [xvec search $xl $xh]
     2582    set ymult([lindex $xr 0]:[lindex $xr end]) $ym
     2583    #puts "$xl $xh [lindex $xr 0]:[lindex $xr end] $ym"
     2584    .g marker create line -coords "$xl -Inf $xl Inf" -name mag[incr i]
     2585    .g marker create text -coords "$xl Inf" -name mag[incr i] -text "x$ym" -anchor w
     2586    foreach vec {obsvec calcvec bckvec} {
     2587        global $vec
     2588        $vec expr {$vec * ymult}
     2589    }
     2590}
     2591
     2592# create a PDF using GNUPLOT & GhostScript
     2593proc ExportPDF {} {
     2594    set msg {}
     2595    if {$::gnuplotpath == {}} {
     2596        append msg "\n\tThe gnuplot program was not found"
     2597    }
     2598    if {$::gnuplotexport == ""} {
     2599        append msg "\n\tfile gnuplot.tcl not found in $::expgui(scriptdir)"
     2600    }
     2601    if {$::ps2pdfcmd == ""} {
     2602        append msg "\n\tNo PDF conversion routine (ghostscript or pstopdf on Mac was found"
     2603    }
     2604    if {$msg != ""} {
     2605        MyMessageBox -parent . -title "Gnuplot/GS Error" \
     2606                -message $msg \
     2607                -icon error -type OK -default OK
     2608        return 0
     2609    }
     2610
     2611    set pdfoutname [tk_getSaveFile -title "Select output file" -parent . \
     2612                        -defaultextension ".pdf" \
     2613                        -initialdir [pwd] \
     2614                        -initialfile "[file rootname $::expnam].pdf"]
     2615    if { $pdfoutname == "" } { return }
     2616    cd [file dirname $pdfoutname]
     2617    set pdfoutname [regsub -all " " [file tail $pdfoutname] "_"]
     2618    set rootname [file root $pdfoutname]
     2619    set csvoutname "$rootname.csv"
     2620    set gplotname "$rootname.gplot"
     2621    set psoutname "$rootname.ps"
     2622    foreach filename [list $pdfoutname $csvoutname $gplotname $psoutname] {
     2623        catch {file -force delete $filename}
     2624    }
     2625    waitmsg "running gnuplot, Please wait"
     2626    Graph2Gnuplot .g $gplotname $psoutname $csvoutname
     2627    if {![file exists $gplotname]} {
     2628        set msg "\n  Output file for gnuplot not created! ($gplotname)"
     2629    }
     2630    if {![file exists $csvoutname]} {
     2631        append msg "\n   Output file for gnuplot not created! ($csvoutname)"
     2632    }
     2633    if {$msg == ""} {
     2634        if {[catch { exec $::gnuplotpath $gplotname } err]} {
     2635            if {[string first "Warning" $err] == -1} {
     2636                append msg "Error in running gnuplot: $err"
     2637            }
     2638        }
     2639        if {![file exists $psoutname]} {
     2640            append msg "\n   Output file from gnuplot not created! ($psoutname)"
     2641        }
     2642    }
     2643    if {$msg == ""} {
     2644        if {[catch { eval exec [subst $::ps2pdfcmd]} err]} {
     2645            append msg "Error in PDF conversion: $err"
     2646        }
     2647        if {![file exists $pdfoutname]} {
     2648            append msg "\n   PDF file not created! ($pdfoutname)"
     2649        }
     2650    }
     2651    donewaitmsg
     2652    if {$msg == ""} {
     2653        # clean up
     2654        foreach filename [list $csvoutname $gplotname $psoutname] {
     2655            catch {file -force delete $filename}
     2656        }
     2657        MyMessageBox -parent . -title "PDF created" \
     2658            -message "Success: PDF file created ($pdfoutname)" \
     2659            -type OK -default OK
     2660        return 1
     2661    } else {
     2662        # something failed
     2663        MyMessageBox -parent . -title "Gnuplot/GS Error" \
     2664                -message "Error: $msg" \
     2665                -icon error -type OK -default OK
     2666        return 0
     2667    }
     2668}
     2669
     2670# resize graph font only
     2671proc ResizeGraphFont {graph font} {
     2672    foreach w {legend xaxis yaxis xaxis yaxis \
     2673                   x2axis y2axis x2axis y2axis} \
     2674        o {-font -tickfont -tickfont -titlefont -titlefont \
     2675               -tickfont -tickfont -titlefont -titlefont} {
     2676                   catch {
     2677                       $graph $w configure $o $font
     2678                   }
     2679               }
     2680    catch {
     2681        set curfont [$graph cget -font]
     2682        if {[string tolower [lindex $curfont 0]] == "symbol"} {
     2683            $graph configure -font "Symbol [lrange $font 1 end]"
     2684        } else {
     2685            $graph configure -font $font
     2686        }
     2687    }
     2688}
     2689
     2690if {$program == "liveplot"} {
     2691    .a.mag.menu add command -label "Add region" -command "AddMag"
     2692    .a.mag.menu add command -label "Edit Regions" -command "EditMag"
     2693    .a.mag.menu add separator
     2694    .a.mag.menu add command -label "Clear" \
     2695        -command "set maglist {}; readdata .g"
    20862696    .a.options.menu add command -label "Obs symbol" -command getsymopts
     2697    foreach i {1 2 3 4 5 6 7 8 9} {
     2698        bind . <Control-Key-$i> "AddCursorMag %x $i"
     2699    }
    20872700} else {
    20882701    .a.options.menu add cascade -label "Symbol Type" -menu .a.options.menu.sym
     
    21252738            -variable graph(yunits) -value 1 \
    21262739            -command {set cycle [getcycle];readdata .g}
     2740    .a.options.menu.yunits add radiobutton -label "I/Sigma(I)" \
     2741            -variable graph(yunits) -value 2 \
     2742            -command {set cycle [getcycle];readdata .g}
     2743    .a.options.menu.yunits add radiobutton -label "log(I)" \
     2744            -variable graph(yunits) -value 3 \
     2745            -command {set cycle [getcycle];readdata .g}
    21272746    .a.options.menu add command -label "HKL labeling" -command setlblopts
    21282747    .a.options.menu add checkbutton -label "Subtract background" \
     
    21492768}
    21502769if {$program == "liveplot"} {
     2770    .a.options.menu add cascade -menu  .a.options.menu.gfont \
     2771        -label "Graph font"
     2772    menu .a.options.menu.gfont
     2773    foreach f {12 14 16 18 20 22 24 26 28 32 36 40} {
     2774        .a.options.menu.gfont add radiobutton \
     2775            -command "ResizeGraphFont .g \[list Helvetica -$f\]" \
     2776            -label $f -font "Helvetica -$f"
     2777    }
    21512778    .a.options.menu add checkbutton -label "Raise on update" \
    21522779            -variable graph(autoraise)
     
    23062933}
    23072934
    2308 expload $expnam.EXP
    2309 mapexp
     2935if {$expnam != ""} {
     2936    expload $expnam.EXP
     2937    mapexp
     2938    if {$expgui(autotick)} {
     2939        foreach i $::expmap(phaselist) {
     2940            set peakinfo(flag$i) 1
     2941        }
     2942    }
     2943} else {
     2944    mapexp
     2945}
    23102946
    23112947# fill the histogram menu
     
    23592995}
    23602996
    2361 foreach num $expmap(phaselist) {
    2362     .a.file.menu.tick add checkbutton -label "Phase $num" \
     2997proc RegisterPhases {phaselist } {
     2998    foreach num $phaselist {
     2999        .a.file.menu.tick add checkbutton -label "Phase $num" \
    23633000            -variable  peakinfo(flag$num) \
    23643001            -command plotdata
    2365     if {$program != "bkgedit"}  {
    2366         bind . <Key-$num> ".a.file.menu.tick invoke [.a.file.menu.tick index end]"
    2367     }
    2368     .a.options.menu.tick add command -label "Phase $num opts" \
     3002        if {$::program != "bkgedit"}  {
     3003            bind . <Key-$num> ".a.file.menu.tick invoke [.a.file.menu.tick index end]"
     3004        }
     3005        .a.options.menu.tick add command -label "Phase $num opts" \
    23693006            -command "minioptionsbox $num"
    2370 }
     3007    }
     3008}
     3009RegisterPhases $expmap(phaselist)
    23713010
    23723011# N = load next histogram
  • branches/sandbox/liveplot

    r1183 r1185  
    14481448    close $fp
    14491449    .g element config 12 -data $l
     1450    # force a replot
     1451    .g elem show [.g elem show]
    14501452    if {[set l [llength $bkglist]] > 3} {
    14511453        .bkg.f.fit1 config -state normal
     
    23672369}
    23682370
    2369 .a.file.menu add command -label "Import from Topas" \
    2370     -command {get_topas_file}
    2371 
     2371if {$program == "liveplot"} {
     2372    .a.file.menu add command -label "Import from Topas" \
     2373        -command {get_topas_file}
     2374}
    23722375.a.file.menu add command -label Quit -command "destroy ."
    23732376.a.file.menu.export add command -label "as .csv file" \
     
    23922395.a.options.menu.tick add separator
    23932396.a.options.menu.tick add radiobutton -label "Label by phase number" \
    2394         -value 0 -variable expgui(phaselabel) -command plotdata
     2397    -value 0 -variable expgui(phaselabel) -command plotdata
    23952398.a.options.menu.tick add radiobutton -label "Label by phase name" \
    2396         -value 1 -variable expgui(phaselabel) -command plotdata
     2399    -value 1 -variable expgui(phaselabel) -command plotdata
    23972400.a.options.menu.tick add separator
    23982401
    2399 pack [menubutton .a.mag -text Magnification -underline 0 -menu .a.mag.menu] \
     2402if {$program == "liveplot"} {
     2403    pack [menubutton .a.mag -text Magnification -underline 0 -menu .a.mag.menu] \
    24002404        -side left
    2401 menu .a.mag.menu
     2405    menu .a.mag.menu
     2406}
    24022407set maglist {}
    24032408set mag0 1.0
Note: See TracChangeset for help on using the changeset viewer.