#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"
#
# (c) hajo drescher  drescher at th physik th uni-frankfurt de 
# LICENSE:  GPL 
#
# 2.6  2005/7/26
#    some basic save and load option for data points    
#
# new in 2.5 2005/5/13
#    cross hair positioning with center of mass calculation  
#
# new in 2.4 
#    import command from ImageMagick allows to take picture 
#    from the screen with the mouse ("grab")
# 

frame .barra -relief groove -borderwidth 2 -bg green
pack .barra -side top -fill x -pady 1m -padx 2m 
label .barra.label -text "scah - tcl/tk Version 2.5  (c) Hajo " -relief sunken 
pack .barra.label -side top -expand true -fill x 
set points [list ]
set width 1
set height 1 
 
proc Init {i} {
    global  xmin Xmin_x Xmin_y xmax Xmax_x Xmax_y ymin Ymin_x Ymin_y ymax Ymax_x Ymax_y logX logY      
    global Y1pnt Y2pnt X1pnt X2pnt
    set xmin($i) 0
    set xmax($i) 1
    set ymin($i) 0
    set ymax($i) 1
    set e11($i) 0
    set e12($i) 0
    set e21($i) 0
    set e22($i) 0
    set Xmin_x($i) 0
    set Xmin_y($i) 0
    set Xmax_x($i) 0
    set Xmax_y($i) 0
    set Ymin_x($i) 0
    set Ymin_y($i) 0
    set Ymax_x($i) 0
    set Ymax_y($i) 0
    set logX($i)   0
    set logY($i)   0
    set X1pnt($i)  [list ]
    set X2pnt($i)  [list ]
    set Y1pnt($i)  [list ]
    set Y2pnt($i)  [list ]
}

proc putyPoints { ih } {
    global Y1pnt Y2pnt X1pnt X2pnt
    global  xmin Xmin_x Xmin_y xmax Xmax_x Xmax_y ymin Ymin_x Ymin_y ymax Ymax_x Ymax_y logX logY 
    foreach el $X1pnt($ih) {.uno.lb1 delete $el} 
    set X1pnt($ih) [list ]
    foreach el $X2pnt($ih) {.uno.lb1 delete $el} 
    set X2pnt($ih) [list ]
    foreach el $Y1pnt($ih) {.uno.lb1 delete $el} 
    set Y1pnt($ih) [list ]
    foreach el $Y2pnt($ih) {.uno.lb1 delete $el} 
    set Y2pnt($ih) [list ]
    set S 5
    set X1pnt($ih)   [ list [.uno.lb1 create rect \
				 [expr $Xmin_x($ih)-1] [expr $Xmin_y($ih)-$S] \
				 [expr $Xmin_x($ih)+1] [expr $Xmin_y($ih)+0] \
				 -fill green ] \
			   [.uno.lb1 create rect \
				[expr $Xmin_x($ih)-$S] [expr $Xmin_y($ih)-1] \
				[expr $Xmin_x($ih)+$S] [expr $Xmin_y($ih)+1] \
				-fill green ]  \
			   [.uno.lb1 create line \
				 [expr $Xmin_x($ih)] [expr $Xmin_y($ih)-2] \
				 [expr $Xmin_x($ih)] [expr $Xmin_y($ih)  ] \
				 -fill green ]
		      ]
    set X2pnt($ih)   [ list [.uno.lb1 create rect \
				 [expr $Xmax_x($ih)-1] [expr $Xmax_y($ih)-$S] \
				 [expr $Xmax_x($ih)+1] [expr $Xmax_y($ih)+0] \
				 -fill green ] \
			   [.uno.lb1 create rect \
				[expr $Xmax_x($ih)-$S] [expr $Xmax_y($ih)-1] \
				[expr $Xmax_x($ih)+$S] [expr $Xmax_y($ih)+1] \
				-fill green ] \
			   [.uno.lb1 create line \
				 [expr $Xmax_x($ih)] [expr $Xmax_y($ih)-2] \
				 [expr $Xmax_x($ih)] [expr $Xmax_y($ih)  ] \
				 -fill green ]
		      ]
    
    set Y1pnt($ih)   [ list [.uno.lb1 create rect \
				 [expr $Ymin_x($ih)-1] [expr $Ymin_y($ih)-1] \
				 [expr $Ymin_x($ih)+$S] [expr $Ymin_y($ih)+1] \
				 -fill green ] \
			   [.uno.lb1 create rect \
				[expr $Ymin_x($ih)-1] [expr $Ymin_y($ih)-$S] \
				[expr $Ymin_x($ih)+1] [expr $Ymin_y($ih)+$S] \
				-fill green ] \
			   [.uno.lb1 create line \
				 [expr $Ymin_x($ih)] [expr $Ymin_y($ih)] \
				 [expr $Ymin_x($ih)+2] [expr $Ymin_y($ih)  ] \
				 -fill green ]
		      ]
    set Y2pnt($ih)   [ list [.uno.lb1 create rect \
				 [expr $Ymax_x($ih)-1] [expr $Ymax_y($ih)-1] \
				 [expr $Ymax_x($ih)+$S] [expr $Ymax_y($ih)+1] \
				 -fill green ] \
			   [.uno.lb1 create rect \
				[expr $Ymax_x($ih)-1] [expr $Ymax_y($ih)-$S] \
				[expr $Ymax_x($ih)+1] [expr $Ymax_y($ih)+$S] \
				-fill green ] \
			   [.uno.lb1 create line \
				 [expr $Ymax_x($ih)] [expr $Ymax_y($ih)] \
				 [expr $Ymax_x($ih)+2] [expr $Ymax_y($ih)  ] \
				 -fill green ]
		      ]
}

Init 1;
set factor 10
set ih 1 
set nh 1 
set v 1.2

frame .uno
frame .dos -width 100
pack .uno -side left -fill both -expand true 
pack .dos -side left -fill both


# cannvas with image and scroll bars ###########################

canvas .uno.lb1 -xscrollcommand ".uno.scrollx set" -yscrollcommand ".uno.scrolly set"
pack .uno.lb1 -side top -fill both -expand true 

scrollbar .uno.scrollx -command ".uno.lb1 xview" -orient h
scrollbar .uno.scrolly -command ".uno.lb1 yview" -orient v

############## size change of image canvas #####################
bind .uno.lb1 <Configure> {
    global width,height
    if { [lsearch [image names] "myGif"] >= 0 } {
	set width [image width myGif]
	set height [image height myGif]
	if { %w > $width } {
	    pack forget .uno.scrollx
	} else {
	    pack .uno.scrollx -before .uno.lb1 -side bottom -fill x
	}
	if { %h > $height } {
	    pack forget .uno.scrolly
	} else {
	    pack .uno.scrolly -before .uno.lb1 -side right -fill y
	}
    }
}

set XYcoor " \n "
frame .dos.bottom -relief groove 
pack .dos.bottom -side bottom -fill x
button .dos.bottom.ck1 -height 1 -text "QUIT" -command { destroy .}
pack .dos.bottom.ck1 -side right -fill x
label  .dos.bottom.xycoor -font fixed -textvar XYcoor -justify left
pack   .dos.bottom.xycoor -side left -fill x

############ button open file #########################################
frame .dos.hola1
pack .dos.hola1 -side top -fill x 

button .dos.hola1.b1 -text "Open File" -command {
    global filename
    set types {
	{{GIF Files}        {.gif}         }
	{{GIF Files}        {}        GIFF }
    }
    set filename [tk_getOpenFile -filetypes $types ]
    set filename2 [file tail $filename]
    if { [lsearch [image names] "myGif"] >= 0 } {
	 image delete myGif
     }
     image create photo myGif -file $filename
    .uno.lb1 create image 0 0   -image myGif -anchor nw
    puts [list 0 0 [image width myGif] [image height myGif] ]
    .uno.lb1 configure -scrollregion [list 0 0 [image width myGif] [image height myGif] ]
    event generate .uno.lb1 <Configure>
     ReadData
}

pack .dos.hola1.b1  -side left -fill x
button .dos.hola1.b2 -text "grab" -command {
    global filename
    set filename "/tmp/scah.gif"
    set filename2 $filename
    wm iconify .
    if [ catch {
	exec import "/tmp/scah.jpg"
	exec convert  "/tmp/scah.jpg" $filename
    } ] {
	set mensaje "no ImageMagick found"
	wm deiconify .
    }
    wm deiconify .
    image create photo myGif -file $filename
    .uno.lb1 create image 0 0   -image myGif -anchor nw
    .uno.lb1 configure -scrollregion [list 0 0 [image width myGif] [image height myGif] ]
    event generate .uno.lb1 <Configure>
    
}
pack .dos.hola1.b2  -side left -fill x
button .dos.hola1.b3 -text "Save as" -command {
    global filename
    set types {
	{{GIF Files}        {.gif}         }
	{{GIF Files}        {}        GIFF }
    }
    set filename [tk_getSaveFile -filetypes $types ]
    set filename2 [file tail $filename]
    myGif write $filename -format gif    
}

pack .dos.hola1.b3  -side left -fill x

frame .dos.hola2
pack .dos.hola2 -side top -fill x 

button .dos.hola2.b1 -text "Save values" -command {
    set types {
	{{any}        {*}         }
	{{txt}        {.txt}         }
	{{dat}        {.dat}         }
    }
    set file [tk_getSaveFile -filetypes $types ]
    puts [list $file];
    set xfile [catch {set fid [open $file w]}]
    foreach i [ .dos.fliste.liste get 0 end ] {
	if { $i != "-----------" } { 
	    puts $fid "$i"
	} else { 
	    puts $fid "" 
	}
    }
    close $fid
}
pack .dos.hola2.b1  -side left -fill x

button .dos.hola2.b2 -text "Load values" -command {
    set types {
	{{any}        {*}         }
	{{txt}        {.txt}         }
	{{dat}        {.dat}         }
    }
    set file [tk_getOpenFile -filetypes $types ]
    set x1file [catch {set fid [open $file r]}]
    set x2file [catch {set data [read $fid]}]
    if { ! $x1file && ! $x2file } {
	close $fid
	set data [split $data "\n"]
	set data [lreplace $data end end ] 
	foreach line $data {
	    if { ! [regexp -line {^\s*$} $line]  } { 
		set x1 [lindex $line 0]
		set x2 [lindex $line 1]
		set x3 [lindex $line 2]
		set res  [XtoPix $x1 $x2]
		set res2 [XtoPix $x1 [expr $x2+$x3]]
		set x  [lindex $res  0]
		set y  [lindex $res  1]
		set dy [lindex $res2 1]
		event generate .uno.lb1 <ButtonPress-1>  -x $x -y $y 
		event generate .uno.lb1 <ButtonRelease-1> -x $x -y $dy 
	    } else {
		NewSet
	    }
	}
    } else {
	tk_messageBox -parent . -icon info \
	    -message "something is wrong"
    }
}
pack .dos.hola2.b2  -side left -fill x

################## info2 widget #################################### 
set info2 ""
label .dos.info2 -textvar filename2
pack .dos.info2 -side top -anchor w

####################################################################
# liste 
frame .dos.fliste
pack .dos.fliste -side top -fill x 
listbox .dos.fliste.liste -height 6  -width 30  -selectmode extended -yscrollcommand ".dos.fliste.scroll set"
scrollbar .dos.fliste.scroll -command ".dos.fliste.liste yview"
pack .dos.fliste.liste -side left
pack .dos.fliste.scroll -side left -fill y

button .dos.fliste.b1  -text "delete" -command {
    foreach i  [lsort -integer -decreasing [ .dos.fliste.liste curselection ] ] {
	.dos.fliste.liste delete $i 	
	.uno.lb1 delete [ lindex $points $i ]
	set points [ lreplace $points $i $i ]
    }
}
pack .dos.fliste.b1 -side top -anchor e

############ new histo #############################################
button .dos.fliste.b2 -text "new" -command NewSet

proc NewSet { } {
    global points
    set cs [ .dos.fliste.liste curselection]
    if { $cs =="" } {
	set res "end"
    } else {
	set res [ lindex $cs 0 ]
    }
    .dos.fliste.liste insert $res "-----------"
    set points [ linsert $points $res '' ]
    .dos.fliste.liste see $res
}
pack .dos.fliste.b2 -side top -anchor e
.uno.lb1 configure -cursor target
########### cursors menu ###########################################
menubutton .dos.fliste.b3  -text "cursors" -menu ".dos.fliste.b3.menu" 
menu .dos.fliste.b3.menu 
.dos.fliste.b3.menu add command -label "left_ptr" -command {
	.uno.lb1 configure -cursor left_ptr }
.dos.fliste.b3.menu add command -label "right_ptr" -command {
	.uno.lb1 configure -cursor right_ptr }
.dos.fliste.b3.menu add command -label "center_ptr" -command {
	.uno.lb1 configure -cursor center_ptr }
.dos.fliste.b3.menu add command -label "crosshair" -command {
	.uno.lb1 configure -cursor crosshair }
.dos.fliste.b3.menu add command -label "dotbox" -command {
	.uno.lb1 configure -cursor dotbox }
.dos.fliste.b3.menu add command -label "star" -command {
	.uno.lb1 configure -cursor star }
.dos.fliste.b3.menu add command -label "target" -command {
	.uno.lb1 configure -cursor target }
# .dos.fliste.b3.menu add command -label "cur.xbm" -command {
#   .uno.lb1 configure -cursor [list @cur.xbm cur_mask.xbm black white] }
pack .dos.fliste.b3 -side top -anchor e

######################################################################
# Help
button .dos.fliste.help -text "Help" -command {
    catch {destroy .help}
    toplevel .help
    button .help.quit -text "OK" -command {destroy .help}
    pack .help.quit -side bottom
    text .help.txt -yscrollcommand ".help.scroll set" -height 30 -width 60
    scrollbar .help.scroll -command ".help.txt yview"
    pack .help.scroll -side right -fill y -expand yes
    pack .help.txt  -expand yes -fill y
    .help.txt tag configure bold -font {Courier 14 bold}
    .help.txt insert end {
   Welcome to the tcl/tk version of scah
    } bold 
    .help.txt insert end {
1. First open a gif-file with "Open File"
   or take one from the screen with "grab" 
   (this requires the ImageMagick package)
2. Click on "grab x-axis", mark two arbitrary 
   points on the X-axis
3. ditto for the Y-axis
4. Fill  the real values of the marked points 
   on the axis in the text fields
5. check log if an axis has log-scale

   - Click on data-points to get the values.
   - Click and drag to the end of an error bar
     to get Values with y-errors.

The values appear in the value box. 
Marked Values can be deleted (Mark with mouse).
Any new value will be added before the first marked value 
A value will be added to the end of the list if no Value 
is marked. (Unmark by clicking Control-Button1
on the last marked value)

The new button helps to keep track of several histograms
in the value box. 

The Load/Save buttons store the values of the axises
(not the data !! ) in the ~/.scah2 directory. 
This spares dumb clicking if you work frequently with 
the same gif-file.

Finally produce some nice output with one 
of the output-format buttons.

The new histo button defines a new histogram region.

Use fine-tuning with cursor-keys:
  
  use cursor keys for moving the cross hair
         cursor keys :     1 pixel
         shift-cursor:    10 pixel
  press enter instead of clicking

  fine-tune
         control-cursor: sub-pixel moving
         control-enter : place cross hair at mouse pointer
	 shift-enter   : snap to grid with width given 
                         in GridX and GridY 
	                 (zero deactivates this)  

  Center of mass positioning
  --------------------------
  Place cross hair by calculating the center of mass 
  of the region in the rectangle.
  <a>,<s>  shift to center of mass in x-direction
  <w>,<z>  shift to center of mass in y-direction
  The center of mass in x-direction is calculated by 
  (\int x*rho(x)dx)/(\int rho(x)dx) where rho(x,y)
  is the weight in terms of grayscale.
  The size of the rectangle region can be adjusted with 
  Shift-<a,s,z,w>. 

    }
    .help.txt configure -state disabled -padx 10
}
pack .dos.fliste.help -side bottom -anchor e


#button .dos.fliste.b2 -text "SORT" -command {
#}
#pack .dos.fliste.b2 -side top -anchor e

frame .dos.bbar2
pack .dos.bbar2 -side top 

#######################################################################
########## output buttons #############################################
button .dos.bbar2.b2 -width 10 -text "list" -command {
    foreach i [ .dos.fliste.liste get 0 end ] {
	if { $i != "-----------" } { 
	    puts "$i" 
	} else { 
	    puts "" 
	}   
    }
    puts ""
}

# histo 
pack   .dos.bbar2.b2 -side left
button .dos.bbar2.b3 -text "histo" -command {
    puts "openhisto"
    puts "xrange $xmin($ih) $xmax($ih)"
    if {$logX($ih)} {puts "xmod log"}
    if {$logY($ih)} {puts "ymod log"}
    puts "name +"
    puts "array 3"
    foreach i [ .dos.fliste.liste get 0 end ] {
	if { $i=="-----------"} {
	    puts "endarray"
	    puts "closehisto plot 0\n"
	    puts "openhisto"
	    puts "xrange $xmin($ih) $xmax($ih)"
	    if {$logX($ih)} {puts "xmod log"}
	    if {$logY($ih)} {puts "ymod log"}
	    puts "name +"
	    puts "array 3"
	} else {
	    puts "$i"
	}
    }
    puts "endarray"
    puts "closehisto plot 0"
    puts ""
}
pack   .dos.bbar2.b3 -side left -anchor e

###### root / kumac #########

button .dos.bbar2.b4 -text "root" -command { RootKumac 1 }
pack   .dos.bbar2.b4 -side left -anchor e
button .dos.bbar2.b5 -text "kumac" -command { RootKumac 0 }
pack   .dos.bbar2.b5 -side left -anchor e

proc RootKumac {RK} {
    set start 1;
    set end 0;
    set index 0;
    set n 0;
    set l [.dos.fliste.liste size ];
    foreach i [ .dos.fliste.liste get 0 end ] {
    	set index [expr $index + 1 ];
	if { $start == 1 } {
	    set xval ""
	    set yval ""
	    set yerr ""
	    set start 0 ;
	    set n 0;
	}
	if { $index == $l } {
	    set end 1
	}
	if { $i=="-----------"} {
	    set end 1 
	    set start 1
	} else {
	    set tmp [concat $i]
	    append xval [lindex $tmp 0]
	    append yval [lindex $tmp 1]
	    append yerr [lindex $tmp 2]
	    set n [expr $n+1]
	}
	if { $end==1 }  {
	    if { $RK == 1} {
		puts "Double_t xval\[\]=\{$xval\};"
		puts "Double_t yval\[\]=\{$yval\};"
		puts "Double_t yerr\[\]=\{$yerr\};"
	    } else {
		puts "ve/create X($n) R $xval "
		puts "ve/create Y($n) R $yval "
		puts "ve/create YERR($n) R $yerr "
	    }
	    puts ""
	    set end 0 ;
	} else {
	    if { [lindex [.dos.fliste.liste get 0 end] [expr $index] ] !=   "-----------" } {
		if { $RK == 1} {
		    append xval ","
		    append yval ","
		    append yerr ","
		} else {
		    append xval " "
		    append yval " "
		    append yerr " "
		}
	    }
	}
    }
}

#######

frame .dos.rwb -borderwidth 1
pack .dos.rwb -side top -fill x -pady 2m -padx 2m 

set mag [image create photo -width 200 -height 200]
canvas .dos.rwb.mag 
.dos.rwb.mag configure -width 200 -height 200
.dos.rwb.mag create image 100 100 -image $mag 
pack .dos.rwb.mag -side left -anchor n
set lm1 [ .dos.rwb.mag create line 0 100 200 100 ]
set lm2 [ .dos.rwb.mag create line 100 0 100 200 ]
set lc1 [ .dos.rwb.mag create oval 90 90 110 110 -outline red ]

#####  here is the square 
set qx 20
set qy 20
proc DrawQuadrado {} {
    global qy qx lq1 lq2 lq3 lq4 
    catch {.dos.rwb.mag delete $lq1; .dos.rwb.mag delete $lq2;}    
    set lq1 [ .dos.rwb.mag create line [expr 100 - $qx] [expr 100 - $qy]  \
	                               [expr 100 - $qx] [expr 100 + $qy] ]

    set lq2 [ .dos.rwb.mag create line [expr 100 - $qx] [expr 100 - $qy]  \
	                               [expr 100 + $qx] [expr 100 - $qy] ]

    catch {.dos.rwb.mag delete $lq3; .dos.rwb.mag delete $lq4;}
    set lq3 [ .dos.rwb.mag create line [expr 100 + $qx] [expr 100 + $qy]  \
	                               [expr 100 + $qx] [expr 100 - $qy] ]

    set lq4 [ .dos.rwb.mag create line [expr 100 + $qx] [expr 100 + $qy]  \
	                               [expr 100 - $qx] [expr 100 + $qy] ]
}

DrawQuadrado

proc CheckWeight {  } {
    global qx qy mag
    set ixmin [expr 100 - $qx ]
    set ixmax [expr 100 + $qx ]
    set iymin [expr 100 - $qy ]
    set iymax [expr 100 + $qy ]
    set weight 0.0 
    set xweight 0.0 
    set yweight 0.0
    for {set ix $ixmin} {$ix<=$ixmax} {incr ix} {
	for {set iy $iymin} {$iy<=$iymax} {incr iy} {
	    set xl [ $mag get $ix $iy ]
#	    if { $iy == 100 } {puts "$ix $xl" }
	    set w [expr [lindex $xl 0 ] + [lindex $xl 1 ] + [lindex $xl 2 ] ]
	    set w [expr pow(1.0-$w/765.0,1.0)]
	    set weight [expr $weight + $w ]
	    set xweight [expr $xweight + $w*($ix-100) ]
	    set yweight [expr $yweight + $w*($iy-100) ]
	}
    }
#    puts "$ix $iy $xl $weight $xweight $yweight"
    set yweight [expr $yweight/$weight ]
    set xweight [expr $xweight/$weight ]
#    puts "$ix $iy $xl $weight $xweight $yweight"
    return [list $xweight $yweight]
#    return [list 0 0 ]
}


button .dos.rwb.b1 -text "Load\naxis-data" -command { ReadData }
pack   .dos.rwb.b1 -side top -anchor n
button .dos.rwb.b2 -text "Save\naxis-data" -command { SaveData }
pack   .dos.rwb.b2 -side top -anchor n
button .dos.rwb.b3 -text "New Histo" -command { NewHisto }
pack   .dos.rwb.b3 -side top -anchor n


set nh 1
set ih $nh


proc NewHisto {} {
  global nh ih  xmin Xmin_x Xmin_y xmax Xmax_x Xmax_y ymin Ymin_x Ymin_y ymax Ymax_x Ymax_y logX logY  
    set nh [expr $nh+1];
    #SaveHisto $nh
    Init $nh
    set ih $nh
    set logX($nh) 0
    set logX($nh) 0
 .dos.rb.logx configure  -text "logX" -variable logX($nh)
 .dos.rb.logy configure  -text "logY" -variable logY($nh)
 .dos.rb.xmin configure -width 10 -textvariable xmin($nh)
 .dos.rb.xmax configure -width 10 -textvariable xmax($nh)
 .dos.rb.ymin configure -width 10 -textvariable ymin($nh)
 .dos.rb.ymax configure -width 10 -textvariable ymax($nh)
}

proc SaveHisto { nn } {
    global nh ih  xmin Xmin_x Xmin_y xmax Xmax_x Xmax_y ymin Ymin_x Ymin_y ymax Ymax_x Ymax_y logX logY;
    set xmin($nn)   $xmin($ih)
    set Xmin_x($nn) $Xmin_x($ih)
    set Xmin_y($nn) $Xmin_y($ih)
    set xmax($nn)   $xmax($ih)
    set Xmax_x($nn) $Xmax_x($ih)
    set Xmax_y($nn) $Xmax_y($ih)
    set ymin($nn)   $ymin($ih)
    set Ymin_x($nn) $Ymin_x($ih)
    set Ymin_y($nn) $Ymin_y($ih)
    set ymax($nn)   $ymax($ih)
    set Ymax_x($nn) $Ymax_x($ih)
    set Ymax_y($nn) $Ymax_y($ih)
    set logX($nn)   $logX($ih)
    set logY($nn)   $logY($ih)
    puts "hallo $nn saved"

}

proc SaveData { } {
    global filename env xmin Xmin_x Xmin_y xmax Xmax_x Xmax_y ymin Ymin_x Ymin_y ymax Ymax_x Ymax_y logX logY nh ih
    set fname [exec md5sum $filename]
    if { [regexp .*/.* $fname ] } {
	regexp (.*?)\ \ .* $fname dummy a
	regexp .*/(.*) $fname dummy b
	set fname "$a  $b"
    }
    set dir "$env(HOME)/.scah2/"
    if {[file exists $dir] ==0 } {
	puts "creating directory $dir"
	exec mkdir -p "$dir"
    }
    puts "saving axis-data to file \"$fname\""
    set fp [open "$env(HOME)/.scah2/$fname" w]    
    puts $fp $nh
    for {set ih 1} {$ih<=$nh} {incr ih} {
	puts $fp $xmin($ih)
	puts $fp $Xmin_x($ih)
	puts $fp $Xmin_y($ih)
	puts $fp $xmax($ih)
	puts $fp $Xmax_x($ih)
	puts $fp $Xmax_y($ih)
	puts $fp $ymin($ih)
	puts $fp $Ymin_x($ih)
	puts $fp $Ymin_y($ih)
	puts $fp $ymax($ih)
	puts $fp $Ymax_x($ih)
	puts $fp $Ymax_y($ih)
	puts $fp $logX($ih)
	puts $fp $logY($ih)
    }
    close $fp   
}

proc ReadData { } { 
    global filename env xmin Xmin_x Xmin_y xmax Xmax_x Xmax_y ymin Ymin_x Ymin_y ymax Ymax_x Ymax_y logX logY e11 e12 e21 e22 ih nh
    set fname [exec md5sum $filename]
    if { [regexp .*/.* $fname ] } {
	regexp (.*?)\ \ .* $fname dummy a
	regexp .*/(.*) $fname dummy b
	set fname "$a  $b"
    }
    if { ! [file exists "$env(HOME)/.scah2/$fname"] } {
	return
    }
    set fp [open "$env(HOME)/.scah2/$fname" r]    
    set nh [gets $fp]
    for {set ih 1} {$ih<=$nh} {incr ih} {
	set  xmin($ih)    [gets $fp]
	set  Xmin_x($ih)  [gets $fp]
	set  Xmin_y($ih)  [gets $fp]
	set  xmax($ih)    [gets $fp]
	set  Xmax_x($ih)  [gets $fp]
	set  Xmax_y($ih)  [gets $fp]
	set  ymin($ih)    [gets $fp]
	set  Ymin_x($ih)  [gets $fp]
	set  Ymin_y($ih)  [gets $fp]
	set  ymax($ih)    [gets $fp]
	set  Ymax_x($ih)  [gets $fp]
	set  Ymax_y($ih)  [gets $fp]
	set  logX($ih)    [gets $fp]
	set  logY($ih)    [gets $fp]
	set e11($ih) [expr ($Xmax_x($ih)-$Xmin_x($ih))/sqrt(($Xmax_x($ih)-$Xmin_x($ih))*($Xmax_x($ih)-$Xmin_x($ih))+($Xmax_y($ih)-$Xmin_y($ih))*($Xmax_y($ih)-$Xmin_y($ih)))];
	set e12($ih) [expr ($Xmax_y($ih)-$Xmin_y($ih))/sqrt(($Xmax_x($ih)-$Xmin_x($ih))*($Xmax_x($ih)-$Xmin_x($ih))+($Xmax_y($ih)-$Xmin_y($ih))*($Xmax_y($ih)-$Xmin_y($ih)))];
	set e21($ih) [expr ($Ymax_x($ih)-$Ymin_x($ih))/sqrt(($Ymax_x($ih)-$Ymin_x($ih))*($Ymax_x($ih)-$Ymin_x($ih))+($Ymax_y($ih)-$Ymin_y($ih))*($Ymax_y($ih)-$Ymin_y($ih)))];
	set e22($ih) [expr ($Ymax_y($ih)-$Ymin_y($ih))/sqrt(($Ymax_x($ih)-$Ymin_x($ih))*($Ymax_x($ih)-$Ymin_x($ih))+($Ymax_y($ih)-$Ymin_y($ih))*($Ymax_y($ih)-$Ymin_y($ih)))];

	putyPoints $ih
    }
    close $fp   
    global rb1
    set rb1 "GrabValues"
    global GrabValues
    set GrabValues 1;
}


set mensaje ""
frame .dos.barra -borderwidth 1
pack .dos.barra -side bottom -fill x -pady 2m -padx 2m 
label .dos.barra.label -textvar mensaje -relief sunken
pack .dos.barra.label -side top -expand true -fill x 

######### grab buttons ###################

frame .dos.rb
pack .dos.rb -side bottom -fill x

frame .dos.rwb.rb4
pack  .dos.rwb.rb4 -side top
entry .dos.rwb.rb4.b -textvar ih -relief sunken -width 2
pack  .dos.rwb.rb4.b -side right
label .dos.rwb.rb4.a -text "Histo:"
pack  .dos.rwb.rb4.a -side right


set igridx 0.5

set igridy 0

frame .dos.rwb.rb5
pack  .dos.rwb.rb5 -side top
entry .dos.rwb.rb5.b -textvar igridx -relief sunken -width 5
pack  .dos.rwb.rb5.b -side right
label .dos.rwb.rb5.a -text "GridX"
pack  .dos.rwb.rb5.a -side right

frame .dos.rwb.rb6
pack  .dos.rwb.rb6 -side top
entry .dos.rwb.rb6.b -textvar igridy -relief sunken -width 5
pack  .dos.rwb.rb6.b -side right
label .dos.rwb.rb6.a -text "GridY"
pack  .dos.rwb.rb6.a -side right

frame .dos.rwb.rb8
pack  .dos.rwb.rb8 -side top
entry .dos.rwb.rb8.b -textvar factor -relief sunken -width 3
pack  .dos.rwb.rb8.b -side right
label .dos.rwb.rb8.a -text "Zoom:"
pack  .dos.rwb.rb8.a -side right



bind .dos.rwb.rb4 <KeyRelease> {
    if { $ih > $nh } { set ih $nh;}  
    if { $ih > 0 } {  
	.dos.rb.logx configure  -text "logX" -variable logX($ih)
	.dos.rb.logy configure  -text "logY" -variable logY($ih)
	.dos.rb.xmin configure -width 10 -textvariable xmin($ih)
	.dos.rb.xmax configure -width 10 -textvariable xmax($ih)
	.dos.rb.ymin configure -width 10 -textvariable ymin($ih)
	.dos.rb.ymax configure -width 10 -textvariable ymax($ih)
    }
}

radiobutton .dos.rb.rb1 -text "grab xaxis:" -variable rb1 -value GrabXmin -command {set mensaje "click the lower X-axis" }
radiobutton .dos.rb.rb2 -text "grab yaxis:" -variable rb1 -value GrabYmin -command {set mensaje "click the lower Y-axis" }
radiobutton .dos.rb.rb3 -text "grab values" -variable rb1 -value GrabValues -command {set mensaje "click to get values, drag for error" }
checkbutton .dos.rb.logx -text "logX" -variable logX($ih)
checkbutton .dos.rb.logy -text "logY" -variable logY($ih)

entry .dos.rb.xmin -width 10 -textvariable xmin($ih)
entry .dos.rb.xmax -width 10 -textvariable xmax($ih)
entry .dos.rb.ymin -width 10 -textvariable ymin($ih)
entry .dos.rb.ymax -width 10 -textvariable ymax($ih)

grid .dos.rb.rb1  -column 0 -row 0
grid .dos.rb.xmin -column 1 -row 0
grid .dos.rb.xmax -column 2 -row 0
grid .dos.rb.rb2  -column 0 -row 1
grid .dos.rb.ymin -column 1 -row 1
grid .dos.rb.ymax -column 2 -row 1
grid .dos.rb.rb3  -column 0 -row 2 
grid .dos.rb.logx -column 1 -row 2 
grid .dos.rb.logy -column 2 -row 2 


bind .uno.lb1 <Button-1> {
    if { $rb1 == "GrabXmin" } {
	set Xmin_x($ih) [XX %x]
	set Xmin_y($ih) [YY %y]
	putyPoints $ih 
	set rb1 "GrabXmax"
	set mensaje "click the higher X-axis"
    } elseif { $rb1 == "GrabXmax" } {
	set Xmax_x($ih) [XX %x]
	set Xmax_y($ih) [YY %y]
	putyPoints $ih
	set rb1 "GrabYmin"
	set e11($nh) [expr ($Xmax_x($nh)-$Xmin_x($nh))/sqrt(($Xmax_x($nh)-$Xmin_x($nh))*($Xmax_x($nh)-$Xmin_x($nh))+($Xmax_y($nh)-$Xmin_y($nh))*($Xmax_y($nh)-$Xmin_y($nh)))];
	set e12($nh) [expr ($Xmax_y($nh)-$Xmin_y($nh))/sqrt(($Xmax_x($nh)-$Xmin_x($nh))*($Xmax_x($nh)-$Xmin_x($nh))+($Xmax_y($nh)-$Xmin_y($nh))*($Xmax_y($nh)-$Xmin_y($nh)))];
	set mensaje "click the lower Y-axis"
    } elseif { $rb1 == "GrabYmin" } {
	set Ymin_x($ih) [XX %x]
	set Ymin_y($ih) [YY %y]
	putyPoints $ih 
	set rb1 "GrabYmax"
	set mensaje "click the higher Y-axis"
    } elseif { $rb1 == "GrabYmax" } {
	set Ymax_x($ih) [XX %x]
	set Ymax_y($ih) [YY %y]
	putyPoints $ih
	set rb1 "GrabSoonValues"
	set e21($nh) [expr ($Ymax_x($nh)-$Ymin_x($nh))/sqrt(($Ymax_x($nh)-$Ymin_x($nh))*($Ymax_x($nh)-$Ymin_x($nh))+($Ymax_y($nh)-$Ymin_y($nh))*($Ymax_y($nh)-$Ymin_y($nh)))];
	set e22($nh) [expr ($Ymax_y($nh)-$Ymin_y($nh))/sqrt(($Ymax_x($nh)-$Ymin_x($nh))*($Ymax_x($nh)-$Ymin_x($nh))+($Ymax_y($nh)-$Ymin_y($nh))*($Ymax_y($nh)-$Ymin_y($nh)))];
	set mensaje "click to get values, drag for error"
   } elseif  { $rb1 =="GrabValues" } {
       set Xval [XX %x]
       set Yval [YY %y]
   }
}


bind .uno.lb1 <Enter> {
    focus .uno.lb1
}

bind .uno.lb1 <Leave> {
}

bind .uno.lb1 <Motion> {
    global width height
    set x [XX %x];
    set y [YY %y];
    set xww [.uno.lb1 xview];
    set xw0 [expr $width*[lindex $xww 0]]
    set xw1 [expr $width*[lindex $xww 1]]
    if { [expr %x+$idx] > [expr ($xw1-$xw0)] } {
	.uno.lb1 xview moveto [expr ($xw0+($xw1-$xw0)/2)/$width]	
	set xww [.uno.lb1 xview];
	set xw0new [expr $width*[lindex $xww 0]]
	set idx [expr $idx-($xw0new-$xw0)]
    }
    if { [expr %x+$idx] < 0 } {
	.uno.lb1 xview moveto [expr ($xw0-($xw1-$xw0)/2)/$width]	
	set xww [.uno.lb1 xview];
	set xw0new [expr $width*[lindex $xww 0]]
	set idx [expr $idx-($xw0new-$xw0)]	
    }

# y range-check
    set yww [.uno.lb1 yview];
    set yw0 [expr $height*[lindex $yww 0]]
    set yw1 [expr $height*[lindex $yww 1]]
    if { [expr %y+$idy] > [expr ($yw1-$yw0)] } {
	.uno.lb1 yview moveto [expr ($yw0+($yw1-$yw0)/2)/$height]	
	set yww [.uno.lb1 yview];
	set yw0new [expr $height*[lindex $yww 0]]
	set idy [expr $idy-($yw0new-$yw0)]	
    }
    if { [expr %y+$idy] < 0 } {
	.uno.lb1 yview moveto [expr ($yw0-($yw1-$yw0)/2)/$height]	
	set yww [.uno.lb1 yview];
	set yw0new [expr $height*[lindex $yww 0]]
	set idy [expr $idy-($yw0new-$yw0)]	
    }

    magnify %W $x $y
    catch {.uno.lb1 delete $l1;.uno.lb1 delete $l2};    
    set l1 [.uno.lb1 create line [expr $x-1000] $y [expr $x+1000] $y];
    set l2 [.uno.lb1 create line $x [expr $y-1000] $x [expr $y+1000] ];
    if  { $rb1 =="GrabValues" } {

	set distmin 111111;
	set hmin 1;
	for {set i 1} {$i<=$nh} {incr i} {
	    set dist [expr sqrt(($x-$Xmin_x($i))*($x-$Xmin_x($i))+(($y-$Xmin_y($i))*($y-$Xmin_y($i))))]
	    if { $dist < $distmin } {
		set distmin $dist
		set ihis $i 
	    }
	    set dist [expr sqrt(($x-$Xmax_x($i))*($x-$Xmax_x($i))+(($y-$Xmax_y($i))*($y-$Xmax_y($i))))]
	    if { $dist < $distmin } {
		set distmin $dist
		set ihis $i 
	    }

	    set dist [expr sqrt(($x-$Ymin_x($i))*($x-$Ymin_x($i))+(($y-$Ymin_y($i))*($y-$Ymin_y($i))))]
	    if { $dist < $distmin } {
		set distmin $dist
		set ihis $i 
	    }
	    set dist [expr sqrt(($x-$Ymax_x($i))*($x-$Ymax_x($i))+(($y-$Ymax_y($i))*($y-$Ymax_y($i))))]
	    if { $dist < $distmin } {
		set distmin $dist
		set ihis $i 
	    }
	    set dist [expr sqrt(($x-$Xmax_x($i))*($x-$Xmax_x($i))+(($y-$Ymax_y($i))*($y-$Ymax_y($i))))]
	    if { $dist < $distmin } {
		set distmin $dist
		set ihis $i 
	    }
	}

	set ih $ihis;

 .dos.rb.logx configure  -text "logX" -variable logX($ih)
 .dos.rb.logy configure  -text "logY" -variable logY($ih)
 .dos.rb.xmin configure -width 10 -textvariable xmin($ih)
 .dos.rb.xmax configure -width 10 -textvariable xmax($ih)
 .dos.rb.ymin configure -width 10 -textvariable ymin($ih)
 .dos.rb.ymax configure -width 10 -textvariable ymax($ih)

	set det [expr $e11($ih)*$e22($ih)-$e12($ih)*$e21($ih)];
	set xtot [expr (+ ($Xmax_x($ih)-$Xmin_x($ih)) * $e22($ih) -($Xmax_y($ih)-$Xmin_y($ih)) * $e21($ih) )/$det];
	set ytot [expr ( -($Ymax_x($ih)-$Ymin_x($ih)) * $e12($ih) +($Ymax_y($ih)-$Ymin_y($ih)) * $e11($ih) )/$det];
	set xx [expr (+ ($x-$Xmin_x($ih)) * $e22($ih) -($y-$Xmin_y($ih)) * $e21($ih))/$det ];
	set yy [expr ( -($x-$Ymin_x($ih)) * $e12($ih) +($y-$Ymin_y($ih)) * $e11($ih))/$det ];
	if { ! $logX($ih) } {
	    set xxx [expr $xmin($ih)+$xx/$xtot*($xmax($ih)-$xmin($ih)) ];
	} else {
	    set xxx [expr exp($xx/$xtot*(log(1.0*$xmax($ih)/$xmin($ih))))*$xmin($ih)] ;
	}
	if { ! $logY($ih) } {
	    set yyy [expr $ymin($ih)+$yy/$ytot*($ymax($ih)-$ymin($ih)) ];
	} else {
	    set yyy [expr exp($yy/$ytot*(log(1.0*$ymax($ih)/$ymin($ih))))*$ymin($ih)] ;
	}
    } else {
	set xxx 0;
	set yyy 0;
    }
   set XYcoor [format "X:%% 4g Y:%% 4g     "  [XX %x]  [YY %y] ];
   set XYcoor2 [format "(%% 6.4g,%% 6.4g)" $xxx $yyy];
   append XYcoor [format "\n%%s" $XYcoor2];
} 

set idx 0.0
set idy 0.0
bind .uno.lb1 <Down> {
    set idy [expr $idy + 1]
    event generate .uno.lb1 <Motion> -x %x -y %y
}
bind .uno.lb1 <Shift-Down> {
    set idy [expr $idy + 10]
    event generate .uno.lb1 <Motion> -x %x -y %y
}
bind .uno.lb1 <Shift-Up> {
    set idy [expr $idy - 10]
    event generate .uno.lb1 <Motion> -x %x -y %y
}
bind .uno.lb1 <Up> {
    set idy [expr $idy - 1]
    event generate .uno.lb1 <Motion> -x %x -y %y
}
bind .uno.lb1 <Right> {
    set idx [expr $idx + 1]
    event generate .uno.lb1 <Motion> -x %x -y %y
}
bind .uno.lb1 <Left> {
    set idx [expr $idx - 1]
    event generate .uno.lb1 <Motion> -x %x -y %y
}
bind .uno.lb1 <Shift-Right> {
    set idx [expr $idx + 10]
    event generate .uno.lb1 <Motion> -x %x -y %y
}
bind .uno.lb1 <Shift-Left> {
    set idx [expr $idx - 10]
    event generate .uno.lb1 <Motion> -x %x -y %y
}
bind .uno.lb1 <Control-Right> {
    set idx [expr $idx +  1.0/$factor ]
    event generate .uno.lb1 <Motion> -x %x -y %y
}
bind .uno.lb1 <Shift-Return> {
    global width,height
    set idx 0
    set idy 0 
    if { $igridx != 0 } {
      if { ! $logX($ih) } {
        set xxx [expr $igridx*round($xxx/$igridx) ]
        set xx [expr ($xxx-$xmin($ih))/(($xmax($ih)-$xmin($ih)))*$xtot]
      } else {
        set xxx [expr pow(10.0,$igridx*round(log10($xxx)/$igridx)) ]
        set xx [expr log($xxx/$xmin($ih))/(log(1.0*$xmax($ih)/$xmin($ih)))*$xtot]
      }
    }
    if { $igridy != 0 } {
      if { ! $logY($ih) } {
        set yyy [expr $igridy*round($yyy/$igridy) ]
        set yy [expr ($yyy-$ymin($ih))/(($ymax($ih)-$ymin($ih)))*$ytot]
      } else {
        set yyy [expr pow(10.0,$igridy*round(log10($yyy)/$igridy)) ]
        set yy [expr log($yyy/$ymin($ih))/(log(1.0*$ymax($ih)/$ymin($ih)))*$ytot]
      }
    }
 set x [expr -(-$yy*$det*$e21($ih)+$e12($ih)*$Ymin_x($ih)*$e21($ih)-$e11($ih)*$xx*$det-$e11($ih)*$e22($ih)*$Xmin_x($ih)+$e11($ih)*$e21($ih)*$Xmin_y($ih)-$e11($ih)*$Ymin_y($ih)*$e21($ih))/($e22($ih)*$e11($ih)-$e21($ih)*$e12($ih))]


 set y [expr ($xx*$det*$e12($ih)+$e22($ih)*$yy*$det-$e22($ih)*$e12($ih)*$Ymin_x($ih)+$e22($ih)*$e11($ih)*$Ymin_y($ih)+$e22($ih)*$Xmin_x($ih)*$e12($ih)-$e21($ih)*$Xmin_y($ih)*$e12($ih))/($e22($ih)*$e11($ih)-$e21($ih)*$e12($ih))]

    set sx [expr $x-$idx-[lindex [.uno.lb1 xview] 0 ]*$width ]
    set sy [expr $y-$idy-[lindex [.uno.lb1 yview] 0 ]*$height ]
    set idx [expr $sx-%x]
    set idy [expr $sy-%y]
    event generate .uno.lb1 <Motion> -x %x -y %y
}

bind .uno.lb1 <Control-Left> {
    set idx [expr $idx -  1.0/$factor ]
    event generate .uno.lb1 <Motion> -x %x -y %y
}
bind .uno.lb1 <Control-Up> {
    set idy [expr $idy -  1.0/$factor ]
    event generate .uno.lb1 <Motion> -x %x -y %y
}
bind .uno.lb1 <Control-Down> {
    set idy [expr $idy + 1.0/$factor]
    event generate .uno.lb1 <Motion> -x %x -y %y
}

bind .uno.lb1 <Control-Return> {
    set idx 0.0	
    set idy 0.0	
    event generate .uno.lb1 <Motion> -x %x -y %y
}

bind .uno.lb1 <KeyPress-Return> {
    event generate .uno.lb1 <ButtonPress-1>  -x %x -y %y 
}
bind .uno.lb1 <KeyRelease-Return> {
     if { [expr %s & 15] != 4 && [expr %s & 15 ] != 1 } { 
       event generate .uno.lb1 <ButtonRelease-1> -x %x -y %y 
    }
}

bind .uno.lb1 <a> {
    set ixy [CheckWeight]
    set dx [lindex $ixy 0]
    set dy [lindex $ixy 1]
    set idx [expr $idx +  1.0*ceil($dx-0.5)/$factor ]
    set val [expr ($dx)/$factor  ]
#    puts "$idx $dx $dy ---$factor $val"
    set mensaje " shifted by "
    append mensaje [format "dx=%%6.4g" $dx ]
    event generate .uno.lb1 <Motion> -x %x -y %y
}
bind .uno.lb1 <w> {
    set ixy [CheckWeight]
    set dx [lindex $ixy 0]
    set dy [lindex $ixy 1]
    set idy [expr $idy +  1.0*floor($dy+0.5)/$factor ]
    set mensaje " shifted by "
    append mensaje [format "dy=%%6.4g" $dy ]
    event generate .uno.lb1 <Motion> -x %x -y %y
}
bind .uno.lb1 <x> {
    if { $rb1 == "GrabXmin" } { 
	set rb1  "GrabXmax" 
	set mensaje "click the higher X-axis"
    } else { 
	set rb1  "GrabXmin" 
	set mensaje "click the lower X-axis"
    }
}
bind .uno.lb1 <y> {
    if { $rb1 == "GrabYmin" } { 
	set rb1  "GrabYmax" 
	set mensaje "click the higher Y-axis"
    } else { 
	set rb1  "GrabYmin" 
	set mensaje "click the lower Y-axis"
    }
}

bind .uno.lb1 <g> {
    set rb1  "GrabValues" 
    set mensaje "click to get values, drag for error"
}

bind .uno.lb1 <s> {
    event generate .uno.lb1 <KeyPress-a>  -x %x -y %y
}

bind .uno.lb1 <z> {
    event generate .uno.lb1 <KeyPress-w>  -x %x -y %y
}

###### Quadrado controls #######################
bind .uno.lb1 <Shift-A> {
    set qx [expr $qx-1]
    set mensaje " ${qx}x${qy}"
    DrawQuadrado
}
bind .uno.lb1 <Shift-S> {
    set qx [expr $qx+1]
    set mensaje " ${qx}x${qy}"
    DrawQuadrado
}
bind .uno.lb1 <Shift-W> {
    set qy [expr $qy+1]
    set mensaje " ${qx}x${qy}"
    DrawQuadrado
}
bind .uno.lb1 <Shift-Z> {
    set qy [expr $qy-1]
    set mensaje " ${qx}x${qy}"
    DrawQuadrado
}

proc XX {a} {
    global idx idy width height
    set x [ expr {  ( $a+[lindex [.uno.lb1 xview] 0 ]*$width + $idx ) }  ];
    return $x;
}

proc YY {a} {
    global idx idy width height
    set y [ expr { ( $a + [ lindex [ .uno.lb1 yview ] 0 ] * $height+$idy)}];
    return $y
}


bind .uno.lb1 <ButtonRelease-1> {
    if  { $rb1 =="GrabValues" } {
	set info2 "Values:"
	set Xerr [XX %x];
	set Yerr [YY %y];

	set xb $Xerr;
	set yb $Yerr;

	set x $Xval;
	set y $Yval;
	set det [expr $e11($ih)*$e22($ih)-$e12($ih)*$e21($ih)];
	set xtot [expr (+ ($Xmax_x($ih)-$Xmin_x($ih)) * $e22($ih) -($Xmax_y($ih)-$Xmin_y($ih)) * $e21($ih) )/$det];
	set ytot [expr ( -($Ymax_x($ih)-$Ymin_x($ih)) * $e12($ih) +($Ymax_y($ih)-$Ymin_y($ih)) * $e11($ih) )/$det];
	set xx [expr (+ ($x-$Xmin_x($ih)) * $e22($ih) -($y-$Xmin_y($ih)) * $e21($ih))/$det ];
	set yy [expr ( -($x-$Ymin_x($ih)) * $e12($ih) +($y-$Ymin_y($ih)) * $e11($ih))/$det ];

	set yyerr [expr ( -($xb-$Ymin_x($ih)) * $e12($ih) +($yb-$Ymin_y($ih)) * $e11($ih))/$det];

	if { ! $logX($ih) } {
	    set xxx [expr $xmin($ih)+$xx/$xtot*($xmax($ih)-$xmin($ih)) ];
	} else {
	    set xxx [expr exp($xx/$xtot*(log(1.0*$xmax($ih)/$xmin($ih))))*$xmin($ih)] ;
	}
	if { ! $logY($ih) } {
	    set yyy [expr $ymin($ih)+$yy/$ytot*($ymax($ih)-$ymin($ih)) ];
	    set yyerr [expr $ymin($ih)+$yyerr/$ytot*($ymax($ih)-$ymin($ih)) ];
	} else {
	    set yyy [expr exp($yy/$ytot*(log(1.0*$ymax($ih)/$ymin($ih))))*$ymin($ih)] ;	    
	    set yyerr [expr exp($yyerr/$ytot*(log(1.0*$ymax($ih)/$ymin($ih))))*$ymin($ih)] ;	    
	}
	set dy [expr abs($yyerr-$yyy) ]
	set cs [ .dos.fliste.liste curselection]
	if { $cs =="" } {
	    set res "end"	
	    set l [.dos.fliste.liste size ]	
	} else {
	    set res [ lindex $cs 0 ]
	    set l $cs	
	}
	set xxx [format "%%6.4g" $xxx]
	set yyy [format "%%6.4g" $yyy]
	set dy  [format "%%6.4g" $dy]
	.dos.fliste.liste insert $res "$xxx  $yyy  $dy"
	.dos.fliste.liste see $res
	set pnt [.uno.lb1 create oval \
	[ expr $x-2] [expr $y-2] [expr $x+2] [expr $y+2] -fill red ];
	set points [ linsert $points $res $pnt  ]
	#focus .dos.fliste.liste
    } elseif { $rb1 =="GrabSoonValues"} {
	set rb1 "GrabValues"
    }
}

############## arguments #######################################
if { $argc > 0 } {    
    global filename width
	 set arg  [ lindex $argv 0 ]
    if { $arg == "-z" }  { 
	    set argv [ lreplace  $argv 0 0 ];
		 set factor [  lindex $argv 0 ] 
	    set argv [ lreplace  $argv 0 0 ];
	 }
    set filename [ lindex $argv 0 ]
    set filename2 [file tail $filename]
    image create photo tmp -file $filename 
    image create photo myGif
    myGif copy tmp -shrink -subsample 1
    rename tmp {}
    set width [image width myGif]
    set height [image height myGif]
    .uno.lb1 create image 0 0 -image myGif -anchor nw
    .uno.lb1 configure -scrollregion [list 0 0 $width $height ]
    ReadData
}

proc magnify { w x y } {
    global myGif factor width height
    if { $width == 0 } {
	return
    }
    variable mag
    set d1 [expr 200/$factor/2]
    set dh [expr 100-$factor/2]

    set xfrom0 [expr  int(round($x-$d1))+1 ]
    if { $xfrom0 < 0 } { set xfrom0 0 }
    set yfrom0 [expr  int(round($y-$d1))+1 ]
    if { $yfrom0 < 0 } { set yfrom0 0 }
    set xfrom1 [expr int(ceil($x+$d1)) +1 ]
    if { $xfrom1 > $width } { set xfrom1 $width }
    set yfrom1 [expr int(ceil($y+$d1)) +1 ]
    if { $yfrom1 > $height } { set yfrom1 $height }

    set xto0 [expr  int(round($dh+($xfrom0 - $x )*$factor))]
    set yto0 [expr  int(round($dh+($yfrom0 - $y )*$factor))]
##    set xto1 [expr  int(round($dh+($xfrom1 - $x )*$factor))]
##    set yto1 [expr  int(round($dh+($yfrom1 - $y )*$factor))]

    if { $xfrom1 < 0 || $yfrom1 < 0  } {return } 

    if { $yfrom0 < $height && $xfrom0 < $width}  {
	$mag copy myGif \
	    -from $xfrom0 $yfrom0 $xfrom1 $yfrom1  \
	    -to $xto0 $yto0 200 200 \
	    -zoom $factor
    }
}


proc XtoPix { xxx yyy } {
    global idx idy width height
    global xmin Xmin_x Xmin_y xmax Xmax_x Xmax_y logX
    global ymin Ymin_x Ymin_y ymax Ymax_x Ymax_y logY      
    global Y1pnt Y2pnt X1pnt X2pnt
    global ih det e21 e12 e11 e22

    set det [expr $e11($ih)*$e22($ih)-$e12($ih)*$e21($ih)];
    set xtot [expr (+ ($Xmax_x($ih)-$Xmin_x($ih)) * $e22($ih) -($Xmax_y($ih)-$Xmin_y($ih)) * $e21($ih) )/$det];
    set ytot [expr ( -($Ymax_x($ih)-$Ymin_x($ih)) * $e12($ih) +($Ymax_y($ih)-$Ymin_y($ih)) * $e11($ih) )/$det];

    if { ! $logX($ih) } {
        set xx [expr (1.0*$xxx-$xmin($ih))/(($xmax($ih)-$xmin($ih)))*$xtot]
    } else {
        set xx [expr log(1.0*$xxx/$xmin($ih))/(log(1.0*$xmax($ih)/$xmin($ih)))*$xtot]
    }
    
    if { ! $logY($ih) } {
        set yy [expr (1.0*$yyy-$ymin($ih))/(($ymax($ih)-$ymin($ih)))*$ytot]
    } else {
        set yy [expr log(1.0*$yyy/$ymin($ih))/(log(1.0*$ymax($ih)/$ymin($ih)))*$ytot]
    }

    set x [expr -(-$yy*$det*$e21($ih)+$e12($ih)*$Ymin_x($ih)*$e21($ih)-$e11($ih)*$xx*$det-$e11($ih)*$e22($ih)*$Xmin_x($ih)+$e11($ih)*$e21($ih)*$Xmin_y($ih)-$e11($ih)*$Ymin_y($ih)*$e21($ih))/($e22($ih)*$e11($ih)-$e21($ih)*$e12($ih))]

    set y [expr ($xx*$det*$e12($ih)+$e22($ih)*$yy*$det-$e22($ih)*$e12($ih)*$Ymin_x($ih)+$e22($ih)*$e11($ih)*$Ymin_y($ih)+$e22($ih)*$Xmin_x($ih)*$e12($ih)-$e21($ih)*$Xmin_y($ih)*$e12($ih))/($e22($ih)*$e11($ih)-$e21($ih)*$e12($ih))]

    set sx [expr $x- [lindex [.uno.lb1 xview] 0 ]*$width ]
    set sy [expr $y- [lindex [.uno.lb1 yview] 0 ]*$height ]
    set idx [expr -int($sx)+$sx ]
    set idy [expr -int($sy)+$sy ]
    set sx [expr int($sx)]
    set sy [expr int($sy)]
    return [list $sx $sy]
}

