Here is the Tcl source code for the macro described in the preceding message. Enjoy! -James. # Tcl script. Etymology: dosource_random -> dsrand # dsrand assumes we're already slewed to the source. # Basic idea: do 'on-off' pairs of exposures, choosing offsets randomly # within a centerd square box (on) or offset sqare boxes (off); # finish with an extra off frame. # By allowing arbitrarily many pairs to be requested, one can start a # virtual 'long integration', which should reduce the babysitting needed. # # There are 7 arguments: # $1, x offset (arcsec) of "field center" # $2, y offset # $3 maximum x and y offsets for on-source (differential, rel to $1,$2) # Note, we will now use a random number generator to get rand. # integers up to this limit for offsets. # $4 minimum x and y offsets for off-source frames. # $5 maximum x and y offsets for off-source (differential) # $6 number of off-on pairs to do # $7 exposure time. # For point sources, setting arguments 3 & 5 equal and $4 to 0 will make 'on' # and 'off' frames indistinguishable. proc dsrand { off0x off0y off1max off2min off2max nexp tim } { # initialize global variables: message id, offsets, exposure time array global MID RID REPLY goff0x goff0y goff1x goff2n goff2x gnexp gtt iii set goff0x $off0x set goff0y $off0y set goff1x $off1max set goff2n $off2min set goff2x $off2max set gnexp $nexp set gtt $tim # start the expose-offset # daisy chain of subroutines. set iii 0 sendhub $MID 0 do_oo "time" } proc do_oo {args} { global MID RID REPLY goff0x goff0y goff1x goff2n goff2x gnexp gtt iii if { [cindex $args 1] == ":" } { echo $args incr MID if {$gnexp > 0} { incr iii if { $iii == 1 } { sendhub $MID 0 do_off "time" } elseif {$iii == 2} { sendhub $MID 0 do_on "time" } else { set iii 0 incr gnexp -1 sendhub $MID 0 do_oo "time" } } else { sendhub $MID 0 do_off "time" # echo Done with random position dosource macro... # set MID 10 } } else { echo $args } } proc do_off {args} { global MID RID REPLY goff0x goff0y goff1x goff2n goff2x gnexp gtt iii if { [cindex $args 1] == ":" } { echo $args incr MID set offsignx [expr 2 * [random 2] - 1] set offsigny [expr 2 * [random 2] - 1] set xoff [ expr $goff0x + $offsignx * ( [ random [expr $goff2x - $goff2n ] ] + $goff2n ) ] set yoff [ expr $goff0y + $offsigny * ( [ random [expr $goff2x - $goff2n ] ] + $goff2n ) ] sendhub $MID 0 snap_one "offset $xoff $yoff abs inst nocompute" } else { echo $args } } proc do_on {args} { global MID RID REPLY goff0x goff0y goff1x goff2n goff2x gnexp gtt iii if { [cindex $args 1] == ":" } { echo $args incr MID set xoff [ expr $goff0x + [ random [expr 2 * $goff1x ] ] - $goff1x ] set yoff [ expr $goff0y + [ random [expr 2 * $goff1x ] ] - $goff1x ] sendhub $MID 0 snap_one "offset $xoff $yoff abs inst nocompute" } else { echo $args } } proc snap_one {args} { global MID RID REPLY goff0x goff0y goff1x goff2x gnexp gtt iii if { [cindex $args 1] == ":" } { echo $args incr MID if {$gnexp > 0} { sendhub $MID 0 do_oo "nexpose it=$gtt inst=grim n=1" } else { sendhub $MID 0 dsrand_end "nexpose it=$gtt inst=grim n=1" } } else { echo $args } } proc dsrand_end {args} { global MID RID REPLY goff0x goff0y goff1x goff2x gnexp gtt iii if { [cindex $args 1] == ":" } { echo $args echo Done with random position dosource macro... } else { echo $args } } echo Loaded dsrand script. APO APO APO APO APO Apache Point Observatory 3.5m APO APO APO APO APO This is message 12 in the apo35-grim archive. You can find APO the archive on http://astro.princeton.edu:82/apo35-grim/INDEX.html APO To join/leave the list, send mail to apo35-request@astro.princeton.edu APO To post a message, mail it to apo35-grim@astro.princeton.edu APO APO APO APO APO APO APO APO APO APO APO APO APO APO APO APO APO