navigation map

  1: Introduction
  2: Simple example
  3: Invocation
  4: Finer Control
  5: X-Y Plots
  6: Contour Plots
  7: Image Plots
  8: Examples
  9: Gri Commands
  10: Programming
  11: Environment
  12: Emacs Mode
  13: History
  14: Installation
  15: Gri Bugs
  16: Test Suite
  17: Gri in Press
  18: Acknowledgments
  19: License

index.html#Top Programming.html#Programming Gri: making a newcommand change its arguments Gri: Debugging Gri programs index.html#Top Gri: Debugging Gri programs

10.12: Hints for Gri Programming

Here are some hints for good Gri programs:

  • Whenever working with grids (for contouring) or images, make use of the `show grid' or `show image' commands. They will give you useful information about the statistics (min/max/histogram) of the items.
  • Use the operating system, not Gri, to manipulate your data. For example, if you have a file whose first column is x times 100, and third is the arcsin of y, you could do:

    open "gawk '{print $1/100, sin($3)}' |"
    read columns x y

    If you have x and y in a non-decimal geographical format (e.g. hour.minute-second format), use the operating system to convert for you (see Open).

  • Use the `pstack' operator liberally in your rpn expressions to see what is going on (see rpn Mathematics).
  • While developing programs, put a `show columns statistics' command after every `read column' command, to check that the data have been read correctly.
  • Development time can be minimized by limiting the number of data being processed. For example, in a multi-panel plot, it is often necessary to try various alternatives before aesthetic scales and page layout is achieved. The process can be speeded up by limiting the number of data being processed, as shown below. (If Gri finds fewer data in the file than specified, it will simply use the data that it found; so when the program works, just change `.n.' into something large.)

    .n. = 100 # 10000 for later
    # Panel 1
    read columns .n. x y
    # Panel 2
    read columns .n. x y

  • Create new commands to do repetitive work.
  • Use `draw time stamp' on all plots except for publication versions:

    if !..publication..
      draw time stamp
    end if

  • For multiple panels on one page, do `delete x scale' or `delete y scale' before each new panel, so you will start afresh. Clearly identify code for particular panels with comments. This reduces errors you might get if you shuffle things later.
  • Use the `..num_col_data..' built-in variable to see how many data have passed the `set input data window' data window in the last `read columns' command. The following example shows how to avoid drawing an unwanted curve:

    open \f
    read columns x y
    if ..num_col_data..
      draw curve
      draw label "\f" at \
          {rpn ..xlast.. xusertocm 0.5} \
          {rpn ..ylast.. yusertocm 0.2} cm
    end if

  • Use synonyms and `query' for filenames. This makes programs much more flexible. Note that you can string synonyms together:

    \dir = "~/EOS/iso0/"
    query \file "Give file in directory \dir" ("1.dat")
    open \dir/\file

    It is also a good idea to give a restrictive list of possibilities in your `query' command, to avoid complicated `if' commands later (see Query).

  • Use multiple `draw title' commands:

    draw title "Atlantic water entering Arctic Ocean"
    draw title "\.command_file. \.time."

  • Use the `query' command to interact with the user (see Query). The results can be stored in variables and synonyms.

navigation map