source: sans/utils/bt5/bt5plot/bt5plot @ 209

Last change on this file since 209 was 209, checked in by ajj, 15 years ago

Adding rudimentary coloring of plots

  • Property svn:executable set to *
File size: 15.4 KB
Line 
1#!/usr/bin/wish
2
3package require BLT
4
5#set images(normal) [image create photo -format gif -data {
6#    R0lGODlhEAANAMIAAAAAAH9/f///////AL+/vwAA/wAAAAAAACH5BAEAAAUALAAAAAAQAA0A
7#    AAM1WBrM+rAEMigJ8c3Kb3OSII6kGABhp1JnaK1VGwjwKwtvHqNzzd263M3H4n2OH1QBwGw6
8#    nQkAOw==
9#} ]
10
11#Red dot image
12set images(normal) [image create photo -format gif -data {
13R0lGODlhDAAMANUAAPUAAO0EBOsFBeYICOQJCeIKCtwNDdoODsIaGsAbG74cHLoeHrgfH7YgILQh
14IbAjI25FRWhISGRKSmJLS2BMTF1OTvv7+/n5+ff39/X19e3t7enp6ePj47a2trKysrCwsKysrKqq
15qqioqH19fXt7e3l5eXNzc3FxcW9vb21tbWtra2lpaWdnZ11dXVlZWVVVVVNTU////wAAAAAAAAAA
16AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAADEALAAAAAAMAAwAAAZjwFgs
17A1rBYKkPRhjjsI5QmGozNEoUhMKCAkNdRDCIAEAGDCIwjxFRLjNgpmOgTS7AXC/YmG5vnWAJdAAN
18MCQhMBEDbQUTMB0YKjAUDgYHDxUwJxYxG5FRmRpMFx8lRyMdmzFBADs=
19} ]
20
21#set images(active) [image create photo -format gif -data {
22#    R0lGODlhEAANAMIAAAAAAH9/f/////+/AL+/vwAA/wAAAAAAACH5BAEAAAUALAAAAAAQAA0A
23#    AAM8WBrM+rAEQWmIb5KxiWjNInCkV32AJHRlGQBgDA7vdN4vUa8tC78qlrCWmvRKsJTquHkp
24#    ZTKAsiCtWq0JADs=
25#} ]
26
27#Green dot image
28set images(active) [image create photo -format gif -data {
29R0lGODlhDAAMANUAAADIAATCBAXBBQi9CAm8CQq6Cg22DQ61DhqjGhuhGxygHB6dHh+cHyCbICGZ
30ISOWI0VmRUhiSEpfSkteS0xdTE5aTvv7+/n5+ff39/X19e3t7enp6ePj47a2trKysrCwsKysrKqq
31qqioqH19fXt7e3l5eXNzc3FxcW9vb21tbWtra2lpaWdnZ11dXVlZWVVVVVNTU////wAAAAAAAAAA
32AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAADEALAAAAAAMAAwAAAZjwFgs
33A1rBYKkPRhjjsI5QmGozNEoUhMKCAkNdRDCIAEAGDCIwjxFRLjNgpmOgTS7AXC/YmG5vnWAJdAAN
34MCQhMBEDbQUTMB0YKjAUDgYHDxUwJxYxG5FRmRpMFx8lRyMdmzFBADs=
35} ]
36
37set plotcolors [list darkblue darkred darkgreen darkorange darkmagenta darkcyan darkgrey black blue red green orange magenta cyan grey]
38set plotcolor 0
39
40proc loadBT5File  {fileName x c cr t m cn br bl fr fl} {
41        global datasets
42        global $x $c $cr $t $m $cn $br $bl $fr $fl
43
44        #puts "In load proc: $x $c $cr $t $m $cn $br $bl $fr $fl"
45
46        set lc 0
47        set mon(0) 0
48        set det1(0) 0
49        set det2(0) 0
50        set det3(0) 0
51        set det4(0) 0
52        set det5(0) 0
53        set xvar(0) 0
54        set trans(0) 0
55
56        if [catch {open $fileName r} fileId] {
57
58                puts stderr "Cannot open file for reading: $fileId"
59
60        } else {
61                for {set lc 0} {$lc < 13} {incr lc} {
62                        gets $fileId line
63                        if { $lc == 0 } {
64                                regexp {^\'.+?\' \'.+?\' \'.+?\'.+?(\d+)\..+} $line match counttime
65                        }
66                }       
67
68                set lc 0
69                while true {
70                        if {[gets $fileId line] < 0} {
71                                break
72                        } else {
73                                regexp {^ +([^ ]+).*} $line match xvar($lc)
74                        }
75
76                        gets $fileId line
77                        regexp {^ (.+?),(.+?),(.+?),(.+?),(.+?),(.+?),(.+?),.*} $line match mon($lc) \
78                                        det2($lc) det1($lc) trans($lc) det3($lc) det4($lc) det5($lc)
79                        incr lc
80                }
81
82                close $fileId
83        }
84
85        foreach index [lsort -integer [array names xvar]] {
86            $x append {$xvar($index)}
87            $c append {$det1($index)+$det2($index)+$det3($index)+$det4($index)+$det5($index)}
88            $cr append [expr [$c index $index] / $counttime]
89            $t append {$trans($index)}
90            $m append {$mon($index)}
91            $cn append {$det2($index)}
92            $bl append {$det1($index)}
93            $br append {$det3($index)}
94            $fl append {$det4($index)}
95            $fr append {$det5($index)}
96
97        }
98
99}
100
101proc resetGraph { } {
102        global graph
103        global tv
104        global images
105        global plotcolor
106
107        set plotcolor 0
108
109        foreach elem [ $graph element show] {
110            $graph element delete $elem
111
112            set xvec [join "$elem _xvec" ""]
113            set countratevec [join "$elem _countratevec" ""]
114            set countvec [join "$elem _countvec" ""]
115            set transvec [join "$elem _transvec" ""]
116            set monvec [join "$elem _monvec" ""]
117            set cvec [join "$elem _cvec" ""]
118            set brvec [join "$elem _brvec" ""]
119            set blvec [join "$elem _blvec" ""]
120            set frvec [join "$elem _frvec" ""]
121            set flvec [join "$elem _flvec" ""]
122       
123            global $xvec $countvec $countratevec $transvec $monvec
124            global $cvec $brvec $blvec $frvec $flvec
125           
126            blt::vector destroy $xvec
127            blt::vector destroy $countratevec
128            blt::vector destroy $countvec
129            blt::vector destroy $transvec
130            blt::vector destroy $monvec
131            blt::vector destroy $cvec
132            blt::vector destroy $brvec
133            blt::vector destroy $blvec
134            blt::vector destroy $frvec
135            blt::vector destroy $flvec
136        }
137       
138        $tv entry configure all -activeicons "$images(normal) $images(normal)"
139        $tv entry configure all -icons "$images(normal) $images(normal)"
140}
141
142#foreach fileName $argv {
143proc addremovePlot { nodeID } {
144        global graph
145        global tv
146        global images
147        global .tree
148        global plotType
149        global plotcolors
150        global plotcolor
151        global useColors
152       
153        set fileName [.tree label $nodeID]     
154        #puts "$nodeID $fileName"       
155        set filebase [string trimright $fileName .bt5]
156
157        if { ! [$graph element exists $filebase] } {
158
159                $tv entry configure $nodeID -activeicons "$images(active) $images(active)"
160                $tv entry configure $nodeID -icons "$images(active) $images(active)"
161
162                set xvec [join "$filebase _xvec" ""]
163                set countratevec [join "$filebase _countratevec" ""]
164                set countvec [join "$filebase _countvec" ""]
165                set transvec [join "$filebase _transvec" ""]
166                set monvec [join "$filebase _monvec" ""]
167                set cvec [join "$filebase _cvec" ""]
168                set brvec [join "$filebase _brvec" ""]
169                set blvec [join "$filebase _blvec" ""]
170                set frvec [join "$filebase _frvec" ""]
171                set flvec [join "$filebase _flvec" ""]
172       
173                global $xvec $countvec $countratevec $transvec $monvec
174                global $cvec $brvec $blvec $frvec $flvec
175       
176                blt::vector create $xvec
177                blt::vector create $countratevec
178                blt::vector create $countvec
179                blt::vector create $transvec
180                blt::vector create $monvec
181                blt::vector create $cvec
182                blt::vector create $brvec
183                blt::vector create $blvec
184                blt::vector create $frvec
185                blt::vector create $flvec
186
187
188                loadBT5File $fileName $xvec $countvec $countratevec $transvec $monvec $cvec $brvec $blvec $frvec $flvec
189
190
191
192                $graph element create $filebase -symbol scross \
193                        -xdata $xvec  \
194                        -ydata $countvec
195
196                if {$useColors} {
197                        set pcol [lindex $plotcolors $plotcolor]
198                       
199                        $graph element configure $filebase -outline $pcol -color $pcol
200               
201                        incr plotcolor
202                        if { $plotcolor >= [llength $plotcolors] } { set plotcolor 0}
203                }
204
205                switch -exact $plotType {
206                    count { $graph element configure $filebase -ydata $countvec}
207                    countrate { $graph element configure $filebase -ydata $countratevec}
208                    trans { $graph element configure $filebase -ydata $transvec}
209                    mon { $graph element configure $filebase -ydata  $monvec}
210                    central { $graph element configure $filebase -ydata  $cvec}
211                    backl {$graph element configure $filebase -ydata $blvec}
212                    backr {$graph element configure $filebase -ydata $brvec}
213                    frontl {$graph element configure $filebase -ydata $flvec}
214                    frontr {$graph element configure $filebase -ydata $frvec}
215                }
216
217        } else {
218            $tv entry configure $nodeID -activeicons "$images(normal) $images(normal)"
219            $tv entry configure $nodeID -icons "$images(normal) $images(normal)"               
220       
221            $graph element delete $filebase
222       
223            set xvec [join "$filebase _xvec" ""]
224            set countratevec [join "$filebase _countratevec" ""]
225            set countvec [join "$filebase _countvec" ""]
226            set transvec [join "$filebase _transvec" ""]
227            set monvec [join "$filebase _monvec" ""]
228            set cvec [join "$filebase _cvec" ""]
229            set brvec [join "$filebase _brvec" ""]
230            set blvec [join "$filebase _blvec" ""]
231            set frvec [join "$filebase _frvec" ""]
232            set flvec [join "$filebase _flvec" ""]
233       
234            global $xvec $countvec $transvec $monvec
235            global $cvec $brvec $blvec $frvec $flvec
236       
237                blt::vector destroy $xvec
238                blt::vector destroy $countratevec
239                blt::vector destroy $countvec
240                blt::vector destroy $transvec
241                blt::vector destroy $monvec
242                blt::vector destroy $cvec
243                blt::vector destroy $brvec
244                blt::vector destroy $blvec
245                blt::vector destroy $frvec
246                blt::vector destroy $flvec     
247       
248        }
249}
250
251proc changePlotType {elem} {
252        global graph
253        global plotType
254
255    set xvec [join "$elem _xvec" ""]
256    set countratevec [join "$elem _countratevec" ""]
257    set countvec [join "$elem _countvec" ""]
258    set transvec [join "$elem _transvec" ""]
259    set monvec [join "$elem _monvec" ""]
260    set cvec [join "$elem _cvec" ""]
261    set brvec [join "$elem _brvec" ""]
262    set blvec [join "$elem _blvec" ""]
263    set frvec [join "$elem _frvec" ""]
264    set flvec [join "$elem _flvec" ""]
265
266        global $xvec $countvec $transvec $monvec
267    global $cvec $brvec $blvec $frvec $flvec
268       
269        switch -exact $plotType {
270                        count { $graph element configure $elem -ydata $countvec}
271                        countrate { $graph element configure $elem -ydata $countratevec}
272                        trans { $graph element configure $elem -ydata $transvec}
273                        mon { $graph element configure $elem -ydata  $monvec}
274                    central { $graph element configure $elem -ydata  $cvec}
275                    backl {$graph element configure $elem -ydata $blvec}
276                    backr {$graph element configure $elem -ydata $brvec}
277                    frontl {$graph element configure $elem -ydata $flvec}
278                    frontr {$graph element configure $elem -ydata $frvec}
279        }
280}
281
282proc changeLogLinY {} {
283        global graph
284        global loglinY
285
286        $graph axis configure y -logscale $loglinY
287}       
288
289proc changeLogLinX {} {
290        global graph
291        global loglinX
292
293        $graph axis configure x -logscale $loglinX
294}       
295
296proc LoadTree { tree parentNode dir } {
297        cd $dir
298        foreach f [lsort [glob *.bt5]] {
299                set e [$tree insert $parentNode -label $f -data "Plot 0"]
300        }
301}
302
303proc EmptyTree { tree } {
304        $tree delete 0
305}
306
307proc selectDirectory {} {
308       
309        global .tree
310       
311        set dir [tk_chooseDirectory -title "Set Data Directory"]
312
313        if {$dir ne ""} {
314                EmptyTree .tree
315                catch { LoadTree .tree 0 $dir } result
316                cd $dir
317        }       
318}
319
320proc resetTree { } {
321
322        global .tree
323
324        EmptyTree .tree
325        LoadTree .tree 0 [pwd]
326}
327
328
329proc filterTree { filterString } {
330       
331        global .tree
332
333        resetTree
334       
335        if {$filterString ne ""} {
336                set filterlist [.tree find 0 -glob $filterString -invert -depth 1]
337                foreach node $filterlist {
338                        if { $node != 0 } {
339                                .tree delete $node
340                        }
341                }
342        }       
343       
344}
345
346#Create menu frame
347set mf [frame .mf]
348
349# Create File menu
350menubutton $mf.filemb -text File -menu $mf.filemb.fileMenu
351set fm [menu $mf.filemb.fileMenu -tearoff 0]
352$fm add command -label "Set Data Dir" -command selectDirectory
353
354#Create Plot menu
355menubutton $mf.plotmb -text Plot -menu $mf.plotmb.plotMenu
356set pm [menu $mf.plotmb.plotMenu -tearoff 0]
357$pm add cascade -label "Type" -menu $pm.type
358$pm add cascade -label "X-Axis" -menu $pm.xaxis
359$pm add cascade -label "Y-Axis" -menu $pm.yaxis
360$pm add cascade -label "Settings" -menu $pm.settings
361#Create sub menus
362set xam [menu $pm.xaxis -tearoff 0]
363$xam add radio -label "Lin" -variable loglinX -value "no" -command {changeLogLinX}
364$xam add radio -label "Log" -variable loglinX -value "yes" -command {changeLogLinX}
365
366set yam [menu $pm.yaxis -tearoff 0]
367$yam add radio -label "Lin" -variable loglinY -value "no" -command {changeLogLinY}
368$yam add radio -label "Log" -variable loglinY -value "yes" -command {changeLogLinY}
369
370set ptm [menu $pm.type -tearoff 0]
371$ptm add radio  -label "Counts" -variable plotType -value "count" -command {foreach elem [$graph element show] { changePlotType $elem  }}
372$ptm add radio -label "Count Rate" -variable plotType -value "countrate" -command {foreach elem [$graph element show] { changePlotType $elem  }}
373$ptm add radio -label "Trans" -variable plotType -value "trans" -command {foreach elem [$graph element show] { changePlotType $elem  }}
374$ptm add radio -label "Mon" -variable plotType -value "mon" -command {foreach elem [$graph element show] { changePlotType $elem  }}
375$ptm add radio -label "Central" -variable plotType -value "central" -command {foreach elem [$graph element show] { changePlotType $elem  }}
376$ptm add radio -label "Back Left" -variable plotType -value "backl" -command {foreach elem [$graph element show] { changePlotType $elem  }}
377$ptm add radio -label "Back Right" -variable plotType -value "backr" -command {foreach elem [$graph element show] { changePlotType $elem  }}
378$ptm add radio -label "Front Left" -variable plotType -value "frontl" -command {foreach elem [$graph element show] { changePlotType $elem  }}
379$ptm add radio -label "Front Right" -variable plotType -value "frontr" -command {foreach elem [$graph element show] { changePlotType $elem  }}
380
381set psm [menu $pm.settings -tearoff 0]
382$psm add check -label "Use Colors" -variable useColors -offvalue 0 -onvalue 1
383
384#Set defaults
385set loglinX "no"
386set loglinY "no"
387set plotType "count"
388set useColors 0
389
390#pack menubuttons into menu
391pack $mf.filemb -side left
392pack $mf.plotmb -side left
393
394# Create tree
395blt::tree create .tree
396catch { LoadTree .tree 0 [pwd] } result
397
398# Create view+plot frame
399frame .vp
400# Create treeview frame
401set tvf [frame .vp.tvf]
402
403set tv [blt::treeview $tvf.t -tree .tree -scrollmode listbox \
404                                        -xscrollcommand "$tvf.xscroll set" \
405                                        -yscrollcommand "$tvf.yscroll set" \
406                                        -activeicons "$images(normal) $images(normal)" \
407                                        -icons "$images(normal) $images(normal)"]
408#$tvf.t column insert end Plot
409scrollbar $tvf.xscroll -orient horizontal -command "$tvf.t xview"
410scrollbar $tvf.yscroll -orient vertical -command "$tvf.t yview"
411
412#$tvf.t bind all <ButtonPress-1> {puts stdout [.tree label [%W curselection]]}
413$tvf.t bind all <ButtonPress-1> {addremovePlot [%W curselection]}
414
415pack $tvf.xscroll -side bottom -fill x
416pack $tvf.yscroll -side right -fill y
417pack $tvf.t -side left -fill both -expand true
418pack $tvf -side left -fill y -anchor w
419
420# Create graph
421set graph [blt::graph .vp.g]
422pack $graph -fill both -expand true -side left -anchor w
423
424# Create filter frame
425frame .filter
426label .filter.filterLabel -text "Filter: "
427entry .filter.filterEntry
428bind .filter.filterEntry <Return> {filterTree [%W get]}
429
430#button .filter.filterButton -text "Filter" -command {filterTree [.filter.filterEntry get]}
431pack .filter.filterLabel -side left
432pack .filter.filterEntry -side left
433#pack .filter.filterButton -side left
434#pack .filter.filterReset -side right -padx 25
435
436#Plot controls
437set pcf [frame .filter.pc]
438#Clear plot button
439button $pcf.filterReset -text "Clear Plot" -command {resetGraph}
440
441##Frame for radiobutton set to control plot type
442#set ptf [frame .filter.pc.pt -borderwidth 1 -relief raised]
443#radiobutton $ptf.c -text "Counts" -variable plotType -value "count" -command {foreach elem [$graph element show] { changePlotType $elem  }}
444#radiobutton $ptf.cr -text "Count Rate" -variable plotType -value "countrate" -command {foreach elem [$graph element show] { changePlotType $elem  }}
445#radiobutton $ptf.t -text "Trans" -variable plotType -value "trans" -command {foreach elem [$graph element show] { changePlotType $elem  }}
446#radiobutton $ptf.m -text "Mon" -variable plotType -value "mon" -command {foreach elem [$graph element show] { changePlotType $elem  }}
447#$ptf.c select
448#pack $ptf.m -side right
449#pack $ptf.t -side right
450#pack $ptf.cr -side right
451#pack $ptf.c -side right
452
453##Frame for y-axis log/lin choice
454#set logfy [frame .filter.pc.logy -borderwidth 1 -relief raised]
455##Log/lin radiobutton set
456#radiobutton $logfy.log -text "Log Y" -variable loglinY -value "yes" -command { changeLogLinY }
457#radiobutton $logfy.lin -text "Lin Y" -variable loglinY -value "no" -command { changeLogLinY }
458#$logfy.lin select
459#pack $logfy.log -side right
460#pack $logfy.lin -side right
461
462##Frame for y-axis log/lin choice
463#set logfx [frame .filter.pc.logx -borderwidth 1 -relief raised]
464##Log/lin radiobutton set
465#radiobutton $logfx.log -text "Log X" -variable loglinX -value "yes" -command { changeLogLinX }
466#radiobutton $logfx.lin -text "Lin X" -variable loglinX -value "no" -command { changeLogLinX }
467#$logfx.lin select
468#pack $logfx.log -side right
469#pack $logfx.lin -side right
470
471pack $pcf.filterReset -side right -padx 25
472#pack $logfy -side right
473#pack $logfx -side right
474#pack $ptf -side right
475pack $pcf -side right
476
477
478# Pack  widgets
479pack $mf -side top -anchor w
480pack .vp -fill both -expand true -anchor w
481pack .filter -side bottom -fill x -anchor sw
482
483Blt_ZoomStack $graph
484
485
486
487
Note: See TracBrowser for help on using the repository browser.