770 likes | 877 Views
Statistics Function Implementation. Traditional Programming Approach. minimum.pro. function minimum, x n = n_elements(x) answer = x(0) for i=1 L , n-1 do begin if( answer gt x(i) ) then $ answer = x(i) endfor return, answer end. sum.pro. function sum, x
E N D
Statistics Function Implementation Traditional Programming Approach
minimum.pro function minimum, x n = n_elements(x) answer = x(0) for i=1L, n-1 do begin if( answergtx(i) ) then $ answer = x(i) endfor return, answer end
sum.pro function sum, x n = n_elements( x ) answer = 0 for i = 0, n-1 do begin answer = answer + x(i) endfor return, answer end
Overflow Problems • What if the array is an integer array? • Sums will have a maximum limit based on the number of bits specified by the integer type.
Corrected sum.pro function sum, x n = n_elements( x ) answer = 0.0D for i =0L, n-1 do begin answer = answer + x(i) endfor return, answer end
mean.pro function mean, x n = n_elements(x) answer = sum(x) / n return, answer end
Integer Problems IDL> b=9/5 IDL> print,b 1
Integer Problems IDL> b=9/double(5) IDL> print,b 1.8000000
Corrected mean.pro function mean, x n = n_elements(x) answer = sum(x) /double(n) return, answer end
sum_squares.pro function sum_squares, x squares = x^2.0 answer= sum( squares ) return, answer end
variance.pro function variance, x n = double(n_elements(x)) answer=(sum_squares(x)-(sum(x)^2.0/n))/ (n-1) return, answer end
sd.pro function sd, x answer = sqrt(variance(x)) return, answer end
UNIX Tip of the Day • Directory maneuvering commands pushd, popd, and, dirs % cd /usr/tmp % pwd /usr/tmp % pushd ~rvrpci % pwd /cis/staff/rvrpci
UNIX Tip of the Day % dirs /cis/staff/rvrpci /usr/tmp % pushd % pwd /usr/tmp % dirs /usr/tmp /cis/staff/rvrpci % pushd /usr/local/bin
UNIX Tip of the Day % dirs /usr/local/bin /usr/tmp /cis/staff/rvrpci % pwd /usr/local/bin % pushd % dirs /usr/tmp /usr/local/bin /cis/staff/rvrpci
UNIX Tip of the Day % dirs /usr/tmp /usr/local/bin /cis/staff/rvrpci % pwd /usr/tmp % pushd +2 % pwd /cis/staff/rvrpci
UNIX Tip of the Day % dirs /cis/staff/rvrpci /usr/tmp /usr/local/bin % popd % dirs /usr/tmp /usr/local/bin
IMPORTANT UNIX Concepts • Environment and Shell Variables • These allow you to customize your UNIX environment • They are different in terms of their SCOPE • SCOPE determines the visibility of a variable
Other IMPORTANT UNIX Concepts • Environment Variable • Examples are TERM and DISPLAY • Set a particular variable to a value by using the setenv command • You can print the value of a particular variable or all the environment variable using the printenv command
% Environment Variables % • Examples • To set environment variables % setenv TERM vt100 % setenv DOG Goofy • print out the terminal type % printenv TERM vt100 • print out all environment variables % printenv
Shell Variables • Shell variables are similar to Environment variables except they have a limited scope, i.e., they exist only in the shell which they are defined. • Environment variables on the other hand, exist in all its children shells • To illustrate this concept, let us look at the following example
Environment vs. Shell Variables % set prompt = "Parent Shell > " Parent Shell > setenv DOG Goofy Parent Shell > set mouse=Mickey Parent Shell > printenv DOG Goofy Parent Shell > echo $mouse Mickey Parent Shell > xterm & (YOU SHOULD NOW HAVE A NEW xterm WINDOW) THIS IS KNOWN AS “SPAWNING A NEW (OR CHILD) PROCESS”
Environment vs. Shell Variables (IN THE NEW xterm WINDOW, DO THE FOLLOWING) % set prompt = "Child Shell > " Child Shell > printenv DOG Goofy Child Shell > echo $mouse mouse: Undefined variable.
Environment vs. Shell Variables Child Shell > setenv DOG Pluto Child Shell > set mouse=Minnie Child Shell > printenv DOG Pluto Child Shell > echo $mouse Minnie Child Shell > exit (THE xterm WINDOW SHOULD NOW GO AWAY - THIS PROCESS HAS NOW BEEN KILLED)
Environment vs. Shell Variables Parent Shell > Parent Shell > printenv DOG Goofy Parent Shell > echo $mouse Mickey Parent Shell >
Environment & Shell Variables • Why is this important? • UNIX uses Environment and Shell Variables control a number of processes • Customizes your working environment • Variables used for UNIX Scripts • They are typically defined and initialized in your .login and .cshrc files
Useful Shell Variables filec #Allows file completion path #List of command directories cdpath #List of candidate directories to cd into history #Number of commands to remember
What is shell programming? • Shell programming • automate a set of UNIX commands. • Just like any programming language • “wrappers” • black box a customized collection of UNIX commands. • Example of shell programs .login .cshrc
.loginfile set path=($HOME/bin /usr/local/bin \ /usr/ucb /usr/sbin /bin /usr/bin \ /usr/bin/X11 .) stty dec new tset -I -Q set mail=/usr/spool/mail/$USER set editmode = emacs umask 077 biff n date
.cshrcfile if ($?prompt) then set notify set history = 100 set savehist = 100 alias pd pushd alias pop popd alias vt100 "set term = vt100" endif
When these files are executed? .cshrc • is automatically executed when you start a new shell .login • only gets executed once when you first login Can be re-executed by giving the source command % source .cshrc
Other useful .login and .cshrc entries set filec set cdpath=(~ ~rvrpci/pub ~/mythesis) Other common entries set path=( $path /usr/local/bin) set path=(/usr/local/bin $path)
User defined shell program • Determine name of command • Determine input, output, and option arguments • Determine UNIX commands to execute • Establish error trapping • Make shell program executable
A simple shell program • ddcommand to swap bytes % dd if=input.dat of=output.dat bs=2 conv=swab • Very difficult to remember • Very little utility to non-UNIX geeks (normal people)
We would rather see... % swap_bytes input.dat output.dat
Special Shell Variables Set % swap_bytes input.dat output.dat $0 $1 $2 command $argv[1] $argv[2]
Another Special Shell Variables % swap_bytes input.dat output.dat $#argv Indicates how many arguments are present In this case, 2
shell programswap_bytes #!/bin/csh -f dd if=$1 of=$2 bs=2 conv=swab
Making swap_bytesshell script executable % ls -l swap_bytes -rw------- ... swap_bytes % chmod u+x swap_bytes % ls -l swap_bytes -rwx------ ... swap_bytes
To run swap_bytes • swap_bytesbecomes just another unix command! % swap_bytes input.dat output.dat
Limitation of swap_bytes • No error trapping • Should give usage when typing command % swap_bytes usage: swap_bytes input_file output_file
Improvement to swap_bytes #!/bin/csh -f if ( $#argv != 2 ) then echo "usage: $0 input_file output_file" exit 1 endif dd if=$1 of=$2 bs=2 conv=swab
Commad exit status • By convention exit 0 Indicates successful command completion exit 1(or non-zero) Indicates some error condition
Informational message from swap_bytes • UNIX style informational message % swap_bytes usage: swap_bytes input_file output_file
Interactive swap_bytes • If you want a “friendlier” shell program • Have it query the user for the inputs • Another special shell variable can be used $<
Interactive swap_bytes #!/bin/csh -f if ( $#argv != 2 ) then echo -n "Please enter the input file> " set input=$< echo -n "Please enter the output file> " set output=$< endif dd if=$input of=$output bs=2 conv=swab
Interactive swap_bytesexample • User simply types the command % swap_bytes Please enter the input file> input.dat Please enter the output file> output.dat
A note about quotes in UNIX % set a=ls % echo a % echo $a % set b=“$a” % echo $b % set b=‘$a’ % echo $b % set b=`$a` % echo $b