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

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

Fixed removal of marker and reset of values for clicked on point.

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