IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changes between Version 1 and Version 2 of Opihi_Shell_Language


Ignore:
Timestamp:
Aug 9, 2009, 10:39:29 PM (17 years ago)
Author:
Sebastian Jester
Comment:

Reformat for trac

Legend:

Unmodified
Added
Removed
Modified
  • Opihi_Shell_Language

    v1 v2  
    77The command-line interaction is based on the readline libraries and behaves like tcsh. Arrows can be used for editing. There is both command and file completion with the TAB key. You can also use emacs-like commands such as ctrl-a to reach the beginning of the line and ctrl-e to reach the end. It is also possible to type just a fraction of a command, as long as it is unique. An ambiguous command will list the possible alternatives. For example:
    88
     9{{{
    910 opihi: c
    1011 ambiguous command: c ( catalog cgrid clear create cursor )
    11  
    12 
     12}}}
    1313Multiple commands can generally be placed on one line with semi-colons as separators.
    1414
     
    1919Scalar variables in Opihi are prepended with a dollar sign ($). A variable may be created and the value assigned by a line which looks like:
    2020
     21{{{
    2122 $var = (expression)
    22 
    23 where (expression) is some math expression. The math expression may consist of the standard math operators (+,-,*,/) as well as any already-defined variables and the functions log(), ln(), sqrt(), exp(), ten() (10x), sin(), cos(), etc. Other special operators are the carret (^) for exponetiation (eg, 2^3 is 8) and the @ symbol as a binary arc-tangent (eg, 1@3 is 18.43 degrees). In addition, the operator << returns the minimum of the two surrounding values, and >> returns the maximum. Variables can be numeric or character strings. If the shell does not understand the syntax of the line as a math expression, it is assumed to be a string. local variables
    24 
    25 If there is a pair of curly brackets {} anywhere on a command line, whatever is inside is assumed to be a math expression and evaluated before the line is executed. This later feature allows functions of variables to be passed as arguments to Opihi functions. (see also the discussion below about temporary vectors and images). For example:
    26 
     23}}}
     24where (expression) is some math expression. The math expression may consist of the standard math operators `(+,-,*,/)` as well as any already-defined variables and the functions `log(), ln(), sqrt(), exp(), ten() (10x), sin(), cos(),` etc. Other special operators are the carret (`^`) for exponetiation (eg, `2^3` is 8) and the `@` symbol as a binary arc-tangent (eg, `1@3` is 18.43 degrees). In addition, the operator `<<` returns the minimum of the two surrounding values, and `>>` returns the maximum. Variables can be numeric or character strings. If the shell does not understand the syntax of the line as a math expression, it is assumed to be a string. local variables
     25
     26If there is a pair of curly brackets `{}` anywhere on a command line, whatever is inside is assumed to be a math expression and evaluated before the line is executed. This later feature allows functions of variables to be passed as arguments to Opihi functions. (see also the discussion below about temporary vectors and images). For example:
     27
     28{{{
    2729 echo {$fred*dcos(45)}
    28 
    29 would give the response 7.07107 if $fred had the value of 10.0. There are math functions cos, sin, and tan, which operate on radian expressions, and also dcos, dsin, dtan, which operate on degree expressions. There are also the equivalent inverse functions: eg., asin and dasin return radians and degrees, respectively. The help section on Math defines all of the available math functions.
     30}}}
     31would give the response 7.07107 if `$fred` had the value of 10.0. There are math functions `cos, sin,` and `tan`, which operate on radian expressions, and also `dcos, dsin, dtan,` which operate on degree expressions. There are also the equivalent inverse functions: eg., `asin` and `dasin` return radians and degrees, respectively. The help section on Math defines all of the available math functions.
    3032
    3133=== Vectors ===
     
    3335The Opihi language supports 1D numerical vectors as a native data type.  Vector names are ''not'' prepended with an special characters (ie, no dollar sign unlike for scalars).  There are a few rules governing valid vector names: they may not start with a number (''why not?''); they may only use the following characters: letters, numbers (expect the first), underscore, (NOTE: finish this list and validate).
    3436
    35 NOTE: as of 2009.01.17, the Opihi parser allows the creation of vectors with invalid characters such as "-" (the minus sign!).  Be careful until this bug is fixed. 
     37'''NOTE:''' as of 2009.01.17, the Opihi parser allows the creation of vectors with invalid characters such as "-" (the minus sign!).  Be careful until this bug is fixed. 
    3638
    3739==== Vector Manipulation Functions ====
    3840
     41{{{
    3942 create                    -- create a new vector
    4043 hist                      -- create histogram from a vector
     
    7679 
    7780
     81}}}
     82
    7883=== Images ===
    7984
     
    8287=== Lists ===
    8388
    84 Opihi lists are grouped sets of scalar variables (which may be strings). A list consists of N variables with names of the form name:i, where the value of i ranges from 0 to N-1. In addition, the list length is defined as the value name:n. Since these are just informally grouped, a list may be defined by hand (ie, by defining each element and the length). There is also the command list which builds a list from the following lines until reaching a line consisting of the single word end:
    85 
     89Opihi lists are grouped sets of scalar variables (which may be strings). A list consists of N variables with names of the form `name:i`, where the value of i ranges from 0 to N-1. In addition, the list length is defined as the value `name:n`. Since these are just informally grouped, a list may be defined by hand (ie, by defining each element and the length). There is also the command list which builds a list from the following lines until reaching a line consisting of the single word end:
     90
     91{{{
    8692 list sample
    8793  value 0
     
    8995  test line
    9096 end
    91 
    92 will define the variables $sample:0 - $sample:2, and $sample:n, with value of 3.
     97}}}
     98will define the variables `$sample:0` - `$sample:2`, and `$sample:n`, with value of 3.
    9399
    94100The list command may also construct a list from the output of a UNIX command:
    95101
     102{{{
    96103 list sample -x "ls /tmp"
    97 
     104}}}
    98105will result in a list consisting of one entry for each file in the listing.
    99106
    100107The list command may also be used to split a string by whitespace:
    101108
     109{{{
    102110 list sample -split this is a test
    103 
     111}}}
    104112will result in a list with 4 elements, one for each word.
    105113
    106114=== Queues ===
    107115
     116{{{
    108117 queuelist                 -- list existing queues
    109118 queuesize                 -- return the length of the given queue
     
    112121 queuepush                 -- add an item to the end of the queue
    113122 queuepop                  -- remove and return the first item in the queue
    114 
     123}}}
    115124A queue is a data construct consisting of a sequence of lines from which simple selections can be made. Data items are added and removed from the queue with queuepush and queuepop commands which push entries on the end of the queue and pop them off the beginning. The available queues may be obtained with the command queuelist, and the length of a specific queue may be determined with the queuesize command. The contents of a queue may be printed with queueprint. Pushing data onto a non-existent queue will create the queue. An empty queue may be created with the command queueinit and a queue may be deleted with queuedelete.
    116125
    117 The queuepush commands allows for additional options which modify how the data is pushed on the queue. The -uniq flag specifies that the queue should be search for an existing match and not add the new data item if a matching item already exists. The -replace flag is similar to the -uniq flag, but instead the new item will replace the existing match, if a match is found. These two options have identical results if the match is made based on the entire line. However, they may be more usefully distinguished by specifying a restriction on the match with the -key flag. This flag specified which whitespace-separated element of the line to use for the match, with the first element being element 0.
     126The queuepush commands allows for additional options which modify how the data is pushed on the queue. The `-uniq` flag specifies that the queue should be search for an existing match and not add the new data item if a matching item already exists. The `-replace` flag is similar to the `-uniq` flag, but instead the new item will replace the existing match, if a match is found. These two options have identical results if the match is made based on the entire line. However, they may be more usefully distinguished by specifying a restriction on the match with the `-key` flag. This flag specified which whitespace-separated element of the line to use for the match, with the first element being element 0.
    118127
    119128Numerical vectors and images (matrices) are discussed later in this document.
    120 Opihi Shell Programing and Flow-control
    121 
     129
     130== Opihi Shell Programming and Flow-control ==
     131
     132{{{
    122133 input                     -- read command lines from a file
    123134 macro                     -- deal with the macros
     
    127138 break                     -- escape from function
    128139 continue                  -- next loop iteration
    129  
    130 
    131 There are several options for programming in the opihi shell. First, a file which contains a series of commands can be executed with input (filename). When an opihi-based program is started, it loads a file from the user's home directory, with a name of the form ~/.programrc. This resource file may contain any commands, and allows a user to customize his or her environment.
    132 
    133 It is also possible to define macros which will behave much like regular commands. A macro is defined by typing macro name or macro create name followed by the commands. Arguments to the macro are assigned to the variables $1 .. $N and the number of arguments is given by $0. Macros may be defined in input files. The following is a sample macro:
    134 
     140}}}
     141
     142There are several options for programming in the opihi shell. First, a file which contains a series of commands can be executed with input (filename). When an opihi-based program (e.g. dvo) is started, it loads a file from the user's home directory, with a name of the form `~/.programrc` (e.g. `~/.dvorc`). This resource file may contain any commands, and allows a user to customize his or her environment.
     143
     144It is also possible to define macros which will behave much like regular commands. A macro is defined by typing macro name or macro create name followed by the commands. Arguments to the macro are assigned to the variables `$1 .. $N` and the number of arguments is given by $0. Macros may be defined in input files. The following is a sample macro:
     145
     146{{{
    135147 macro test
    136148  echo "this is a macro"
     
    141153  end
    142154 end
    143  
    144 == Flow Control ==
    145 
    146 Opihi has several types of flow-control features. These include for-loops, while-loops, if-else blocks. These blocks are defined by the corresponding command (for, while, if) and are terminated with by a line with the single word end.
    147 
    148 === For loops ===
    149 
    150 The for-loop syntax is simplistic. The for command specifies the loop variable, the starting value, the ending value, and optionally the delta for each loop. The implicit loop test is always to check if the loop variable is still less than the end value (or greater than if the delta value is negative). The definitions of this loop syntax and the value of the list length ($list:n) and the vector length (vector[]) make for natural loops over all elements of a list or vector. Below are a few examples:
    151 
     155}}}
     156=== Flow Control ===
     157
     158Opihi has several types of flow-control features. These include for-loops, while-loops, if-else blocks. These blocks are defined by the corresponding command (`for, while, if`) and are terminated with by a line with the single word `end`.
     159
     160==== For loops ===
     161
     162The for-loop syntax is simplistic. The for command specifies the loop variable, the starting value, the ending value, and optionally the delta for each loop. The implicit loop test is always to check if the loop variable is still less than the end value (or greater than if the delta value is negative). The definitions of this loop syntax and the value of the list length (`$list:n`) and the vector length (`vector[]`) make for natural loops over all elements of a list or vector. Below are a few examples:
     163
     164{{{
    152165 for i 1 10 0.1
    153166  echo $i
    154167 end
    155  
    156 
     168}}}
    157169This runs the loop with the variable $i running from 1.0, 1.1, up to 9.9 (inclusive).
    158170
     171{{{
    159172 for i 0 $list:n
    160173  echo $list:$i
    161174 end
    162  
    163 
     175}}}
    164176This would print all the elements of the list.
    165177
     178{{{
    166179 for i 0 vector[]
    167180  echo vector[$i]
    168  end
    169  
    170 
     181 end
     182}}}
    171183This would print all the elements of the vector.
    172184
    173 === While loops ===
     185==== While loops ====
    174186
    175187The while loop begins with a line of the form while (condition) and ends with a single end. The conditions follow the same rules as the if conditional statements. continue, break, auto-break concepts
    176188
    177 === If blocks ===
     189==== If blocks ====
    178190
    179191The if-block begins with a line of the form: if (condition) and ends with a single end. A line with a single else specifies the optional else portion of the block. The conditional expression is a valid math inequality with approximately C-syntax:
    180192
     193{{{
    181194 (($i < 10) && ($i > 4))
    182  
    183 
     195}}}
    184196The elements of the inequality may also be string comparisons. The only valid string comparisons are == and !=.
    185197
    186 === Other Flow Control ===
     198==== Other Flow Control ====
    187199
    188200Additional control commands: return (from within a macro), break, continue, last (yes?)
    189201
    190 == Miscellaneous Commands ==
    191 
     202=== Miscellaneous Commands ===
     203
     204{{{
    192205 !                         -- system call
    193206 ?                         -- list commands
     
    210223 memory                    -- long listing of the allocated memory
    211224 version                   -- list version information
    212  
    213 
    214 Most of these commands should be clear from the simple descriptions above, or from the online help. The command ?? prints the system variables. The help command will provide help on a single command or, without any arguments, will list all available help files (this includes general help not associated with a specific command).
    215 
    216 == String Manipulation and other data commands ==
    217 
     225}}}
     226Most of these commands should be clear from the simple descriptions above, or from the online help. The command `??` prints the system variables. The help command will provide help on a single command or, without any arguments, will list all available help files (this includes general help not associated with a specific command).
     227
     228=== String Manipulation and other data commands ===
     229
     230{{{
    218231 local                     -- define local variables
    219232 output                    -- redirect output to file
     
    224237 strlen                    -- string length
    225238 substr                    -- substring
    226  
    227 
    228 These commands provide a few tools to manipulate data in opihi variables. The #local/# command specifies that the given variable is local to its macro. The #output/# command changes the default output destination for functions which print results to the screen. This function does not zero the file length; new output is appended to the file. The command #scan/# reads specific lines from a file, an optionally places them in an opihi variable (EOF is returned at the end of a file). The group of commands #getchr/#, #strlen/#, and #substr/# provide the ability to manipulate the elements of a string. Finally, #sprintf/# and #fprintf/# perform formatted output to a variable and to the screen, respectively.
    229 
    230 == Graphing and the Kapa Display ==
    231 
     239}}}
     240These commands provide a few tools to manipulate data in opihi variables. The `local/` command specifies that the given variable is local to its macro. The `output/` command changes the default output destination for functions which print results to the screen. This function does not zero the file length; new output is appended to the file. The command `scan/` reads specific lines from a file, an optionally places them in an opihi variable (EOF is returned at the end of a file). The group of commands `getchr/`, `strlen/`, and `substr/` provide the ability to manipulate the elements of a string. Finally, `sprintf/` and `fprintf/` perform formatted output to a variable and to the screen, respectively.
     241
     242== Math, Graphing and the Kapa Display ==
     243
     244{{{
    232245 box                       -- draw a box on the plot
    233246 clear                     -- erase plot
     
    248261 textline                  -- write text line on graph
    249262 zplot                     -- plot x y with size scaled by z
     263}}}
    250264 
    251 == Math and Statistical Functions ==
     265=== Math and Statistical Functions ===
    252266
    253267Opihi has a variety of commands to manipulate 1-D data (vectors). Vectors can be loaded from a data file or created with uniform spacing. New vectors can be defined as the arithmetical combinations of other vectors. For example, we could create a sine wave with the following two lines:
    254268
    255 A vector can be created based on a number sequence with the command create name Nelements start delta. The resulting vector has #Nelements/# entries, starting at a value of #start/# and running until #start + delta*Nelements/#. If #delta/# is 0.0, all elements will have the value of #start/#. A histogram of a vector may be made with the command hist, which creates a new vector containing the histogram of the first vector. The data range and bin size of the histogram are defined in same way as with create. This makes it easy to create the index vector that goes with a histogram vector:
    256 
     269A vector can be created based on a number sequence with the command create name Nelements start delta. The resulting vector has `Nelements/` entries, starting at a value of `start/` and running until `start + delta*Nelements/`. If `delta/` is 0.0, all elements will have the value of `start/`. A histogram of a vector may be made with the command hist, which creates a new vector containing the histogram of the first vector. The data range and bin size of the histogram are defined in same way as with create. This makes it easy to create the index vector that goes with a histogram vector:
     270
     271{{{
    257272 hist y Ny 1 100 0.1
    258273 create dx 1 100 0.1
    259  
    260 
    261 The above will create a histogram of y in Ny and the index in dx. Plotting this with plot dx Ny will show the histogram.
    262 
    263 Vector math is performed with a command of the form set new = (expression). The expression is some math function employing vectors and scalars. A complete listing of the math operators available in set can be found in the help for set.
    264 
    265 Once vectors are defined, they may be plotted. A pair of vectors can be plotted against each other if they have the same number of entries. The plotting is performed on the graphics window, Kapa. There are actually several graphics windows available to status, any of which may be used to plot at any time. Some of the more complex operations default to either graphics window 0 or 1, depending on the context. Except for those functions with a pre-defined window, all plotting functions apply to the current graphics window unless an option -n N is given to specify a different window. The plotting style is determined by the command style which can set the line width, the line type (solid, dashed, dotted, etc), the point type (box, cross, etc), the point size, the color, and whether a pair of vectors is plotted as a sequence of points, a set of connected lines, or a histogram. Some functions which make plots use their own styles, as discussed below. The function limits lets the user set the range of the plot axes, or check the current setting. The command plot will plot a pair of vectors on the current graphics window using the current plotting style for that window. The command zplot will plot a pair of vectors with the point size scaled by a third vector, with maximum and minimum point sizes representing specified values. The cursor command goes the other way: this command puts the Kapa window in cursor mode and waits for input from Kapa. The user can then type any alphanumeric key on the graphics windows and will be told both the pointer location (in the graphics coordinates) and will have the coordinates stored in status variables. For example, by typing ``1'' in the sky display window, the RA and DEC of the pointer are stored in the variables $R1 and $D1. This command can be used to let the user define locations or regions of interest on the Kapa window. (Future addition: button, which does the same with the mouse buttons).
    266 
     274}}}
     275The above will create a histogram of y in Ny and the index in dx. Plotting this with `plot dx Ny` will show the histogram.
     276
     277Vector math is performed with a command of the form `set new = (expression)`. The expression is some math function employing vectors and scalars. A complete listing of the math operators available in set can be found in the help for set.
     278
     279=== Plotting ===
     280
     281Once vectors are defined, they may be plotted. A pair of vectors can be plotted against each other if they have the same number of entries. The plotting is performed on the graphics window, Kapa. There are actually several graphics windows available to status, any of which may be used to plot at any time. Some of the more complex operations default to either graphics window 0 or 1, depending on the context. Except for those functions with a pre-defined window, all plotting functions apply to the current graphics window unless an option `-n N` is given to specify a different window.
     282
     283The plotting style is determined by the command style which can set the line width, the line type (solid, dashed, dotted, etc), the point type (box, cross, etc), the point size, the color, and whether a pair of vectors is plotted as a sequence of points, a set of connected lines, or a histogram. Some functions which make plots use their own styles, as discussed below. The function limits lets the user set the range of the plot axes, or check the current setting.
     284* The command `plot` will plot a pair of vectors on the current graphics window using the current plotting style for that window.
     285* The command `zplot` will plot a pair of vectors with the point size scaled by a third vector, with maximum and minimum point sizes representing specified values.
     286* The `cursor` command goes the other way: this command puts the Kapa window in cursor mode and waits for input from Kapa. The user can then type any alphanumeric key on the graphics windows and will be told both the pointer location (in the graphics coordinates) and will have the coordinates stored in status variables. For example, by typing `1` in the sky display window, the RA and DEC of the pointer are stored in the variables `$R1` and `$D1`. This command can be used to let the user define locations or regions of interest on the Kapa window. (Future addition: button, which does the same with the mouse buttons).
     287
     288{{{
    267289 create x 1 20 0.01
    268290 set y = sin(x)
    269 
     291}}}
    270292
    271293We can plot this pair of vectors on the Kapa graphing window:
    272294
     295{{{
    273296 limit x y
    274297 plot x y
    275298 box
    276  
    277 
     299}}}
    278300The Kapa window has a variety of style options to change the plotting type (line, histogram, point), point type, line color, weight and style, and the errorbar style (if errorbars are plotted).
    279301
    280 == 2D Data and the Image Displays ==
    281 
    282 Opihi has many commands to manipulate 2-D data (images). Images can be loaded from FITS files and mathematical operations applied to them. Various other operations, such as rebinning, shifting, rotating, and so forth are also available. Images can be displayed using the Kii image window. In an 8-bit visual, the image window has a dynamic colormap to allow the user to change the relationship between pixel value and the displayed color. There are three colormaps which can be selected by pressing the middle three buttons on the bottom row. The PS button produces a PostScript file from the image. The user can change the magnification and the position of the image with the mouse (left - recenter at cursor; middle - zoom out; right - zoom in). There are four color overlays which the user can draw objects of different shapes (circles, boxes, lines) or draw a contour. The four buttons labeled R, G, B, Y turn on or off the display of the red, green, blue, and yellow overlays.
    283 Image Manipulation Functions
    284 
     302=== 2D Data and the Image Displays ===
     303
     304Opihi has many commands to manipulate 2-D data (images). Images can be loaded from FITS files and mathematical operations applied to them. Various other operations, such as rebinning, shifting, rotating, and so forth are also available. Images can be displayed using the Kii image window. In an 8-bit visual, the image window has a dynamic colormap to allow the user to change the relationship between pixel value and the displayed color.
     305* There are three colormaps which can be selected by pressing the middle three buttons on the bottom row. The PS button produces a PostScript file from the image.
     306* The user can change the magnification and the position of the image with the mouse (left - recenter at cursor; middle - zoom out; right - zoom in).
     307* There are four color overlays which the user can draw objects of different shapes (circles, boxes, lines) or draw a contour. The four buttons labeled R, G, B, Y turn on or off the display of the red, green, blue, and yellow overlays.
     308
     309=== Image Manipulation Functions ===
     310
     311{{{
    285312 clip                      -- clip values in a buffer to be within a range
    286313 contour                   -- create contour from image
     
    312339 wd                        -- write an image to a file
    313340 zap                       -- delete pixels
    314  
     341}}}
    315342
    316343=== Image Display Functions ===
    317344
     345{{{
    318346 ps                        -- define labels for plot
    319347 center                    -- center image on coords
     
    328356 tvcontour                 -- send contour to overlay
    329357 tvgrid                    -- wait until return is typed
    330  
    331 
    332 Other data functions
    333 
     358}}}
     359
     360=== Other data functions ===
     361
     362{{{
    334363 gaussj                    -- solve Ax = B (N-D)
    335364 gridify                   -- convert vector triplet to buffer
     
    341370 svd                       -- singular value decomposition of a matrix
    342371 swapbytes                 -- byte swap thing
    343  
    344 
    345 Programming Considerations
     372}}}
     373
     374=== Programming Considerations ===
    346375
    347376The programming structure of the Opihi front-end makes it very easy to add commands to the package.