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

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

Add count rate to bottom of display

  • Property svn:executable set to *
File size: 15.9 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 ratevar
369        global valMarkElem
370
371        global graph
372
373        set elem [lindex [array get pointVals name] 1]
374        set vecindex [lindex [array get pointVals index] 1] 
375        set xval [lindex [array get pointVals x] 1]
376        set yval [lindex [array get pointVals y] 1]
377
378        set valMarkElem $elem
379
380        if { [string length $elem] != 0 } {
381        set num4var [lindex [[ join "$elem _cvec" ""] range $vecindex $vecindex] 0]
382        set transvar [lindex [[ join "$elem _transvec" ""] range $vecindex $vecindex] 0]
383        set sumvar [lindex [[ join "$elem _countvec" ""] range $vecindex $vecindex] 0]
384        set monvar [lindex [[ join "$elem _monvec" ""] range $vecindex $vecindex] 0]
385        set ratevar [lindex [[ join "$elem _countratevec" ""] range $vecindex $vecindex] 0]
386
387        if { [$graph element exists valMarker] == 1} {         
388                $graph element configure valMarker -data "$xval $yval"
389        } else {
390                $graph element create valMarker -data "$xval $yval" -symbol circle
391        }
392        }
393}
394
395proc clearValMarks {} {
396        uplevel #0 {
397                set num4var "";
398                set transvar "";
399                set sumvar "";
400                set monvar "";
401                set ratevar "";
402                set valMarkElem "";
403                if { [$graph element exists valMarker] == 1} {
404                        $graph element delete valMarker
405                }
406        }
407
408}
409
410#Create menu frame
411set mf [frame .mf]
412
413# Create File menu
414menubutton $mf.filemb -text File -menu $mf.filemb.fileMenu
415set fm [menu $mf.filemb.fileMenu -tearoff 0]
416$fm add command -label "Set Data Dir" -command selectDirectory
417
418#Create Plot menu
419menubutton $mf.plotmb -text Plot -menu $mf.plotmb.plotMenu
420set pm [menu $mf.plotmb.plotMenu -tearoff 0]
421$pm add cascade -label "Type" -menu $pm.type
422$pm add cascade -label "X-Axis" -menu $pm.xaxis
423$pm add cascade -label "Y-Axis" -menu $pm.yaxis
424$pm add cascade -label "Settings" -menu $pm.settings
425#Create sub menus
426set xam [menu $pm.xaxis -tearoff 0]
427$xam add radio -label "Lin" -variable loglinX -value "no" -command {changeLogLinX}
428$xam add radio -label "Log" -variable loglinX -value "yes" -command {changeLogLinX}
429
430set yam [menu $pm.yaxis -tearoff 0]
431$yam add radio -label "Lin" -variable loglinY -value "no" -command {changeLogLinY}
432$yam add radio -label "Log" -variable loglinY -value "yes" -command {changeLogLinY}
433
434set ptm [menu $pm.type -tearoff 0]
435$ptm add radio  -label "Counts" -variable plotType -value "count" -command {foreach elem [$graph element show] { changePlotType $elem  }}
436$ptm add radio -label "Count Rate" -variable plotType -value "countrate" -command {foreach elem [$graph element show] { changePlotType $elem  }}
437$ptm add radio -label "Trans" -variable plotType -value "trans" -command {foreach elem [$graph element show] { changePlotType $elem  }}
438$ptm add radio -label "Mon" -variable plotType -value "mon" -command {foreach elem [$graph element show] { changePlotType $elem  }}
439$ptm add radio -label "Central" -variable plotType -value "central" -command {foreach elem [$graph element show] { changePlotType $elem  }}
440$ptm add radio -label "Back Left" -variable plotType -value "backl" -command {foreach elem [$graph element show] { changePlotType $elem  }}
441$ptm add radio -label "Back Right" -variable plotType -value "backr" -command {foreach elem [$graph element show] { changePlotType $elem  }}
442$ptm add radio -label "Front Left" -variable plotType -value "frontl" -command {foreach elem [$graph element show] { changePlotType $elem  }}
443$ptm add radio -label "Front Right" -variable plotType -value "frontr" -command {foreach elem [$graph element show] { changePlotType $elem  }}
444
445set psm [menu $pm.settings -tearoff 0]
446$psm add check -label "Use Colors" -variable useColors -offvalue 0 -onvalue 1
447
448#Set defaults
449set loglinX "no"
450set loglinY "no"
451set plotType "count"
452set useColors 0
453
454#pack menubuttons into menu
455pack $mf.filemb -side left
456pack $mf.plotmb -side left
457
458# Create tree
459blt::tree create .tree
460catch { LoadTree .tree 0 [pwd] } result
461
462# Create view+plot frame
463frame .vp
464# Create treeview frame
465set tvf [frame .vp.tvf]
466
467set tv [blt::treeview $tvf.t -tree .tree -scrollmode listbox \
468                                        -xscrollcommand "$tvf.xscroll set" \
469                                        -yscrollcommand "$tvf.yscroll set" \
470                                        -activeicons "$images(normal) $images(normal)" \
471                                        -icons "$images(normal) $images(normal)"]
472#$tvf.t column insert end Plot
473scrollbar $tvf.xscroll -orient horizontal -command "$tvf.t xview"
474scrollbar $tvf.yscroll -orient vertical -command "$tvf.t yview"
475
476#$tvf.t bind all <ButtonPress-1> {puts stdout [.tree label [%W curselection]]}
477$tvf.t bind all <ButtonPress-1> {addremovePlot [%W curselection]}
478
479pack $tvf.xscroll -side bottom -fill x
480pack $tvf.yscroll -side right -fill y
481pack $tvf.t -side left -fill both -expand true
482pack $tvf -side left -fill y -anchor w
483
484# Create graph
485set graph [blt::graph .vp.g -halo 30]
486pack $graph -fill both -expand true -side left -anchor w
487
488# Create filter frame
489frame .filter
490label .filter.filterLabel -text "Filter: "
491entry .filter.filterEntry
492bind .filter.filterEntry <Return> {filterTree [%W get]}
493
494pack .filter.filterLabel -side left
495pack .filter.filterEntry -side left
496
497#Plot controls
498set pcf [frame .filter.pc]
499#Clear plot button
500button $pcf.filterReset -text "Clear Plot" -command {resetGraph}
501
502pack $pcf.filterReset -side right -padx 25
503pack $pcf -side right
504
505
506#Data Value Display
507set dvdf [frame .filter.dvd -padx 25]
508pack [label $dvdf.num4lbl -text "#4: "] -side left
509pack [label $dvdf.num4 -textvariable num4var] -side left
510pack [label $dvdf.translbl -text "Trans: "] -side left
511pack [label $dvdf.trans -textvariable transvar] -side left
512pack [label $dvdf.sumlbl -text "Sum: "] -side left
513pack [label $dvdf.sum -textvariable sumvar] -side left
514pack [label $dvdf.monlbl -text "Mon: "] -side left
515pack [label $dvdf.mon -textvariable monvar] -side left
516pack [label $dvdf.ratelbl -text "Rate: "] -side left
517pack [label $dvdf.rate -textvariable ratevar] -side left
518pack $dvdf -side right -anchor s
519
520
521# Pack  widgets
522pack $mf -side top -anchor w
523pack .vp -fill both -expand true -anchor w
524pack .filter -side bottom -fill x -anchor sw
525
526#Blt_ZoomStack $graph
527
528bind $graph <ButtonPress-1> {
529%W element closest %x %y pointVals
530getDataVals
531#puts [array get pointVals name]
532}
533
534
535
536
Note: See TracBrowser for help on using the repository browser.