summaryrefslogtreecommitdiffstats
path: root/ds9/library/graph.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'ds9/library/graph.tcl')
-rw-r--r--ds9/library/graph.tcl419
1 files changed, 419 insertions, 0 deletions
diff --git a/ds9/library/graph.tcl b/ds9/library/graph.tcl
new file mode 100644
index 0000000..4e42610
--- /dev/null
+++ b/ds9/library/graph.tcl
@@ -0,0 +1,419 @@
+# Copyright (C) 1999-2016
+# Smithsonian Astrophysical Observatory, Cambridge, MA, USA
+# For conditions of distribution and use, see copyright notice in "copyright"
+
+package provide DS9 1.0
+
+proc GraphDef {} {
+ global igraph
+ global pgraph
+
+ set igraph(horz,id) 0
+ set igraph(vert,id) 0
+
+ set igraph(size) 150
+ set igraph(gap,x) 50
+ set igraph(gap,y) 25
+
+ set igraph(x,min) 0
+ set igraph(x,max) 10
+ set igraph(y,min) 1
+ set igraph(y,max) 100
+
+ global graphHorzX graphHorzY
+ global graphVertX graphVertY
+ global histX histY
+
+ blt::vector create graphHorzX graphHorzY
+ blt::vector create graphVertX graphVertY
+ blt::vector create histX histY
+
+ # prefs only
+ set pgraph(horz,grid) 1
+ set pgraph(horz,log) false
+ set pgraph(vert,grid) 1
+ set pgraph(vert,log) false
+}
+
+proc CreateGraphs {} {
+ global igraph
+
+ global ds9
+ global canvas
+
+ # Horizontal Graph
+ set ds9(graph,horz) [blt::graph $ds9(main).horz \
+ -width $canvas(width) -height $igraph(size) \
+ -takefocus 0 \
+ -background $ds9(bg) \
+ -highlightthickness 0 \
+ -plotborderwidth 2 \
+ -plotrelief groove \
+ -plotbackground $ds9(bg) \
+ -font [font actual TkDefaultFont] \
+ ]
+ # we need to manually set the element foreground color, i.e. use graph fg
+ set fgcolor [$ds9(graph,horz) cget -foreground]
+
+ $ds9(graph,horz) legend configure -hide yes
+ $ds9(graph,horz) crosshairs configure -color green
+
+ $ds9(graph,horz) xaxis configure -hide no -showticks no -bg $ds9(bg)
+ $ds9(graph,horz) x2axis configure -hide yes
+ $ds9(graph,horz) yaxis configure -hide yes
+ $ds9(graph,horz) y2axis configure -hide no -bg $ds9(bg) \
+ -tickfont [font actual TkDefaultFont]
+
+ $ds9(graph,horz) element create line1 -xdata graphHorzX -ydata graphHorzY \
+ -color $fgcolor -symbol none
+
+ bind $ds9(graph,horz) <Enter> [list EnterGraph $ds9(graph,horz) 1]
+ bind $ds9(graph,horz) <Leave> [list LeaveGraph $ds9(graph,horz)]
+ bind $ds9(graph,horz) <Button-1> \
+ [list MotionGraph $ds9(graph,horz) %x %y 1]
+ bind $ds9(graph,horz) <B1-Motion> \
+ [list MotionGraph $ds9(graph,horz) %x %y 1]
+ bind $ds9(graph,horz) <Up> [list ArrowKeyGraph $ds9(graph,horz) 0 -1 1]
+ bind $ds9(graph,horz) <Down> [list ArrowKeyGraph $ds9(graph,horz) 0 1 1]
+ bind $ds9(graph,horz) <Left> [list ArrowKeyGraph $ds9(graph,horz) -1 0 1]
+ bind $ds9(graph,horz) <Right> [list ArrowKeyGraph $ds9(graph,horz) 1 0 1]
+
+ # Vertical Graph
+ set ds9(graph,vert) [blt::graph $ds9(main).vert \
+ -width $igraph(size) -height $canvas(height) \
+ -invertxy yes \
+ -takefocus 0 \
+ -background $ds9(bg) \
+ -highlightthickness 0 \
+ -plotrelief groove \
+ -plotborderwidth 2 \
+ -plotbackground $ds9(bg)
+ ]
+ $ds9(graph,vert) legend configure -hide yes
+ $ds9(graph,vert) crosshairs configure -color green
+
+ $ds9(graph,vert) xaxis configure -hide yes -descending yes
+ $ds9(graph,vert) x2axis configure -hide no -descending yes \
+ -showticks no -bg $ds9(bg)
+ $ds9(graph,vert) yaxis configure -hide no -descending yes \
+ -bg $ds9(bg) -tickfont [font actual TkDefaultFont]
+ $ds9(graph,vert) y2axis configure -hide yes -descending yes
+
+ $ds9(graph,vert) element create line1 -xdata graphVertX -ydata graphVertY \
+ -color $fgcolor -symbol none
+
+ bind $ds9(graph,vert) <Enter> [list EnterGraph $ds9(graph,vert) 0]
+ bind $ds9(graph,vert) <Leave> [list LeaveGraph $ds9(graph,vert)]
+ bind $ds9(graph,vert) <Button-1> \
+ [list MotionGraph $ds9(graph,vert) %x %y 0]
+ bind $ds9(graph,vert) <B1-Motion> \
+ [list MotionGraph $ds9(graph,vert) %x %y 0]
+ bind $ds9(graph,vert) <Up> [list ArrowKeyGraph $ds9(graph,vert) 0 -1 0]
+ bind $ds9(graph,vert) <Down> [list ArrowKeyGraph $ds9(graph,vert) 0 1 0]
+ bind $ds9(graph,vert) <Left> [list ArrowKeyGraph $ds9(graph,vert) -1 0 0]
+ bind $ds9(graph,vert) <Right> [list ArrowKeyGraph $ds9(graph,vert) 1 0 0]
+
+ UpdateGraphGrid
+}
+
+proc UpdateGraphFont {} {
+ global ds9
+
+ $ds9(graph,horz) y2axis configure -tickfont [font actual TkDefaultFont]
+ $ds9(graph,vert) yaxis configure -tickfont [font actual TkDefaultFont]
+}
+
+proc UpdateGraphGrid {} {
+ global pgraph
+ global ds9
+
+ $ds9(graph,horz) xaxis configure -grid $pgraph(horz,grid) -tickdefault 4
+ $ds9(graph,horz) y2axis configure -grid $pgraph(horz,grid)
+
+ $ds9(graph,vert) x2axis configure -grid $pgraph(vert,grid)
+ $ds9(graph,vert) yaxis configure -grid $pgraph(vert,grid) -tickdefault 4
+}
+
+proc UpdateGraphXAxis {which} {
+ global ds9
+ global view
+
+ global debug
+ if {$debug(tcl,update)} {
+ puts stderr "UpdateGraphXAxis"
+ }
+
+ if {$view(graph,horz)} {
+ UpdateGraphXAxisHV $which $ds9(graph,horz) graphHorzX graphHorzY 1
+ }
+
+ if {$view(graph,vert)} {
+ UpdateGraphXAxisHV $which $ds9(graph,vert) graphVertX graphVertY 0
+ }
+}
+
+proc UpdateGraphXAxisHV {which what vectorX vectorY cut} {
+ global igraph
+
+ global graphHorzX graphHorzY
+ global graphVertX graphVertY
+
+ if {$which != {}} {
+ set xMin [expr "$$vectorX\(min\)"]
+ set xMax [expr "$$vectorX\(max\)"]
+
+ $what xaxis configure -min $xMin -max $xMax
+ $what x2axis configure -min $xMin -max $xMax
+ } else {
+ $what xaxis configure -min $igraph(x,min) -max $igraph(x,max)
+ $what x2axis configure -min $igraph(x,min) -max $igraph(x,max)
+ }
+}
+
+proc UpdateGraphYAxis {which} {
+ global pgraph
+
+ global ds9
+ global view
+
+ global debug
+ if {$debug(tcl,update)} {
+ puts stderr "UpdateGraphYAxis"
+ }
+
+ if {$view(graph,horz)} {
+ UpdateGraphYAxisHV $which $ds9(graph,horz) $pgraph(horz,log)
+ }
+
+ if {$view(graph,vert)} {
+ UpdateGraphYAxisHV $which $ds9(graph,vert) $pgraph(vert,log)
+ }
+}
+
+proc UpdateGraphYAxisHV {which what log} {
+ global igraph
+
+ if {$which != {}} {
+ set minmax [$which get clip]
+ set yMin [lindex $minmax 0]
+ set yMax [lindex $minmax 1]
+
+ # must use .eq. since "nan" is a legal double value
+ if {$yMin eq "nan" || $yMax eq "nan"} {
+ set yMin 0
+ set yMax 1
+ }
+
+ if {$yMin >= $yMax} {
+ set yMax [expr $yMin + 1]
+ }
+
+ $what yaxis configure -min $yMin -max $yMax -logscale $log -tickdefault 4
+ $what y2axis configure -min $yMin -max $yMax -logscale $log -tickdefault 4
+ } else {
+ $what yaxis configure -min $igraph(y,min) -max $igraph(y,max) \
+ -logscale $log -tickdefault 4
+ $what y2axis configure -min $igraph(y,min) -max $igraph(y,max) \
+ -logscale $log -tickdefault 4
+ }
+}
+
+proc ShowGraphData {which} {
+ global ds9
+ global view
+
+ if {$view(graph,horz)} {
+ ShowGraphDataHV $which $ds9(graph,horz)
+ }
+ if {$view(graph,vert)} {
+ ShowGraphDataHV $which $ds9(graph,vert)
+ }
+}
+
+proc ShowGraphDataHV {which what} {
+ if {$which != {}} {
+ if {[$which has fits]} {
+ $what element configure line1 -hide no
+ } else {
+ $what element configure line1 -hide yes
+ }
+ } else {
+ $what element configure line1 -hide yes
+ }
+}
+
+proc ClearGraphData {} {
+ global ds9
+ global view
+
+ if {$view(graph,horz)} {
+ $ds9(graph,horz) element configure line1 -hide yes
+ }
+
+ if {$view(graph,vert)} {
+ $ds9(graph,vert) element configure line1 -hide yes
+ }
+}
+
+proc UpdateGraph {which x y sys} {
+ global ds9
+ global view
+
+ if {[$which has fits]} {
+ if {$view(graph,horz)} {
+ $which get horizontal cut graphHorzX graphHorzY $x $y $sys
+ $ds9(graph,horz) element configure line1 -hide no
+ }
+
+ if {$view(graph,vert)} {
+ $which get vertical cut graphVertX graphVertY $x $y $sys
+ $ds9(graph,vert) element configure line1 -hide no
+ }
+ }
+}
+
+proc EnterGraph {which horz} {
+ global current
+
+ focus $which
+ $which crosshairs on
+
+ if {$current(frame) != {}} {
+ switch $current(mode) {
+ crosshair -
+ analysis {
+
+ set x [$which crosshairs cget -x]
+ set y [$which crosshairs cget -y]
+
+ set coord [$current(frame) get crosshair canvas]
+ set X [lindex $coord 0]
+ set Y [lindex $coord 1]
+
+ if {$horz} {
+ EnterInfoBox $current(frame)
+ UpdateInfoBox $current(frame) $x $Y canvas
+ UpdatePixelTableDialog $current(frame) $x $Y canvas
+ } else {
+ EnterInfoBox $current(frame)
+ UpdateInfoBox $current(frame) $X $y canvas
+ UpdatePixelTableDialog $current(frame) $X $y canvas
+ }
+ }
+ }
+ }
+}
+
+proc LeaveGraph {which} {
+ focus {}
+ $which crosshairs off
+
+ LeaveInfoBox
+ PixelTableClearDialog
+}
+
+proc MotionGraph {which x y horz} {
+ global current
+
+ $which crosshairs configure -x $x -y $y
+
+ if {$current(frame) != {}} {
+ switch $current(mode) {
+ crosshair -
+ analysis {
+ set coord [$current(frame) get crosshair canvas]
+ set X [lindex $coord 0]
+ set Y [lindex $coord 1]
+
+ if {$horz} {
+ UpdateInfoBox $current(frame) $x $Y canvas
+ UpdatePixelTableDialog $current(frame) $x $Y canvas
+ } else {
+ UpdateInfoBox $current(frame) $X $y canvas
+ UpdatePixelTableDialog $current(frame) $X $y canvas
+ }
+ }
+ }
+ }
+}
+
+proc ArrowKeyGraph {which x y horz} {
+ set cx [$which crosshairs cget -x]
+ set cy [$which crosshairs cget -y]
+
+ set cx [expr $cx+$x]
+ set cy [expr $cy+$y]
+
+ MotionGraph $which $cx $cy $horz
+}
+
+proc LayoutGraphs {} {
+ global igraph
+
+ global ds9
+ global canvas
+ global view
+ global colorbar
+ global icolorbar
+
+ set cbh [expr $view(colorbar) && \
+ [string equal $colorbar(orientation) {horizontal}]]
+ set cbv [expr $view(colorbar) && \
+ [string equal $colorbar(orientation) {vertical}]]
+ set grh [expr $view(graph,horz)]
+ set grv [expr $view(graph,vert)]
+
+ if {$grh} {
+ set xx 0
+ set yy [expr $canvas(height) + $canvas(gap)]
+ if {$cbh} {
+ incr yy $icolorbar(horizontal,height)
+ }
+ if {$grv && !$cbh} {
+ incr yy $igraph(gap,y)
+ }
+
+ if {$igraph(horz,id) == 0} {
+ set igraph(horz,id) [$ds9(canvas) create window $xx $yy \
+ -window $ds9(graph,horz) -anchor nw]
+ } else {
+ $ds9(canvas) coords $igraph(horz,id) $xx $yy
+ }
+
+ set ww [expr $canvas(width)+$igraph(gap,x)]
+ $ds9(graph,horz) configure -width $ww
+
+ } else {
+ if {$igraph(horz,id)>0} {
+ $ds9(canvas) delete $igraph(horz,id)
+ set igraph(horz,id) 0
+ }
+ }
+
+ if {$grv} {
+ set yy 0
+ set xx [expr $canvas(width) + $canvas(gap)]
+ if {$cbv} {
+ incr xx $icolorbar(vertical,width)
+ }
+ if {$grh && !$cbv} {
+ incr xx $igraph(gap,x)
+ }
+
+ if {$igraph(vert,id) == 0} {
+ set igraph(vert,id) [$ds9(canvas) create window $xx $yy \
+ -window $ds9(graph,vert) -anchor nw]
+ } else {
+ $ds9(canvas) coords $igraph(vert,id) $xx $yy
+ }
+
+ set hh [expr $canvas(height)+$igraph(gap,y)]
+ $ds9(graph,vert) configure -height $hh
+
+ } else {
+ if {$igraph(vert,id)>0} {
+ $ds9(canvas) delete $igraph(vert,id)
+ set igraph(vert,id) 0
+ }
+ }
+}