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

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

Added extraction of values from plotted datasets (#4, trans, sum and monitor)

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