The principal object with which ULTRA II works is the curve. A curve is an object which consists of an array of x values, an array of y values, a number of points (the length of the x and y arrays), and an ASCII label. ULTRA II operates on curves.
ULTRA II is a portable tool. It runs on machines from supercomputers to PCs. It runs under UNIX, DOS, and MAC OS. Its portability derives from the PACT libraries which provide the portable graphics and the SCHEME interpreter engine which are the main foundation of ULTRA II.
ULTRA II can read and write ASCII data files or PDB files with ULTRA curves in them. PDBLib is another PACT tool which provides portable, self-describing, binary data files. PDBLib has specific functionality to write ULTRA curves. This provides an easy and convenient way for applications to produce ULTRA files. The advantage of PDB files over ASCII files is that PDB files are about 1/3 the size of a corresponding ASCII file and can be written or read about 10 times faster. Interested readers will find references to PACT documentation later in this manual.
2.0 An ULTRA II
Tutorial
This section gives a tutorial introduction to ULTRA II. A sample session is run which highlights the basic ULTRA commands.
a:f
or
This notation is shorthand for the thru procedure.
ULTRA II - 11.22.91
Create a curve consisting of a straight line y=x over the interval (0, 6.28).
U-> span 0 6.28
Print a list of curves on the display.
U-> lst
A Straight line 0.00e+00 6.28e+00 0.00e+00 6.28e+00
Take the sin of curve A.
U-> sin a
Similarly make a cosine curve. Note that this form doesnt require you to know
that curve B is the one being passed to the cos function.
U-> cos (span 0 6.28)
Take the product of the curves A and B
U-> * a b
List the curves currently displayed.
U-> lst
A Straight line 0.00e+00 6.28e+00 -1.00e+00 1.00e+00
B Straight line 0.00e+00 6.28e+00 -1.00e+00 1.00e+00
C * A B 0.00e+00 6.28e+00 -5.00e-01 5.00e-01
Write all of these curves to a file called foo.pdb which is in PDB format.
U-> save foo.pdb a:c
Erase all of the curves currently displayed.
U-> era
List the curves currently displayed.
U-> lst
Read the file foo.pdb in.
U-> rd foo.pdb
Display the menu of curves in all open files.
U-> menu
MENU ULTRA II - 11.22.91
1 Straight line 0.00e+00 6.28e+00 -1.00e+00 1.00e+00 foo.pdb
2 Straight line 0.00e+00 6.28e+00 -1.00e+00 1.00e+00 foo.pdb
3 * A B 0.00e+00 6.28e+00 -5.00e-01 5.00e-01 foo.pdb
Select curves number 1 and 3 from the menu to display on the screen.
U-> cur 1 3
List the curves currently displayed.
U-> lst
A Straight line 0.00e+00 6.28e+00 -1.00e+00 1.00e+00 foo.pdb
B * A B 0.00e+00 6.28e+00 -5.00e-01 5.00e-01 foo.pdb
Shift curve A by one unit to the right.
U-> dx a 1
Delete curve B from the display.
U-> del b
Ask ULTRA II about FFT functionality
U-> apropos fft
APROPOS ULTRA II - 11.22.91
Apropos: fft
cfft :
Procedure: Compute Complex FFT. Return real and imaginary parts.
Usage: cfft <real-curve> <imaginary-curve>
ifft :
Procedure: Compute Inverse FFT. Return real and imaginary parts.
Usage: ifft <real-curve> <imaginary-curve>
fft :
Procedure: Compute Fast Fourier Transform of real curve. Return real
and imaginary parts.
Usage: fft <curve>
Exit ULTRA II.
U-> end
Hopefully this tutorial introduction gave you an orientation which will make the discussions of ULTRA functionality in the following sections clearer.3.0 Basics of
Data Files and Accessing Them
In this section a discussion of input for ULTRA II and a general overview of getting it into a session are given.3.1 ULTRA II Input Data Files
ULTRA II accepts two kinds of input files: ASCII and binary ULTRA files.3.1.1
ASCII ULTRA File Format
There are two kinds of ASCII files which ULTRA II can understand. The first contains curve data and the second contains tables which require additional user input in order to obtain curves.
Curves
In ASCII files, data is stored as space delimited X,Y pairs. These pairs may be on individual lines or there may be multiple pairs per line. Identifiers for the curves begin the line with a # which is followed by whatever identification label you like. For example: # data set 1
0.0 100.0
1.0 200.0
2.0 250.0
3.0 275.0
4.0 287.5
#data set 2
0.0 100.0 1.0 200.0 2.0 250.0
3.0 275.0 4.0 287.5
This file has two curves which incidentally contain the same data.
Tables
Tables of ASCII data are blocks of tabular data which conform to the following rules:
The following example illustrates a file with three tables:
indx pos vel rho
5 1.6313e+00 1.872e-01 2.8419e+00
4 1.5002e+00 1.644e-01 2.9671e+00
3 1.3487e+00 1.475e-01 3.2012e+00
2 1.1692e+00 1.447e-01 3.4873e+00
1 9.3365e-01 1.487e-01 3.3681e+00
c random comments
c just stuff
id 1 2 3 4 5
ab 5.774e+15 5.187e+15 1.469e+14 1.549e+14 1.154e+14
cd 8.652e+16 7.627e+16 2.514e+15 2.870e+15 2.338e+15
ef 6.529e+16 5.507e+16 1.753e+15 1.943e+15 1.525e+15
xy 9.978e+16 9.009e+16 2.855e+15 3.164e+15 2.508e+15
xx 7.537e+16 8.296e+16 2.579e+15 2.775e+15 2.227e+15
lb 7.061e+16 1.123e+15 3.051e+15 2.837e+15 2.207e+15
rf 1.204e+15 2.894e+15 6.902e+15 5.295e+15 3.738e+15
c some other data
1 5.854 1.900 1.684 2.267
2 1.669 4.895 4.182 5.647
3 1.138 3.060 2.533 3.430
4 1.910 5.190 4.192 5.621
5 1.616 4.603 3.501 4.824
6 1.346 4.426 3.028 3.883
7 1.543 6.971 3.883 4.279
8 2.545 2.180 1.021 7.488
9 2.852 4.150 2.047 1.093
For C programs, the functions are:
PD_wrt_pdb_curve(PDBfile *fp, char *labl, int n, double *px, double *py, int icurve)
The arguments are: fp, a pointer to the PDBfile structure corresponding to the file into which the curve is to be written; labl, the ASCII string containing the curve label; n, the number of points in the curve; px, the array of x values; py, the array of y values; and icurve a counter which must start at 0 and count the number of curves in the file. NOTE: there may be several files into which curves are to be written and in each one the count must start from 0 and proceed to the maximum number of curves in the file.
The arguments are: fp, a pointer to the PDBfile structure corresponding to the file into which the curve is to be written; labl, the ASCII string containing the curve label; n, the number of points in the curve; ix, the curve index for the x values; py, the array of y values; and icurve a counter which must start at 0 and count the number of curves in the file. The curve index for the x values refers to the icurve value for a prior PD_wrt_pdb_curve call in which the desired x values were written out to the file. This function is supplied to avoid having unnecessary duplication of x data in a file (the space savings can be quite large). NOTE: there may be several files into which curves are to be written and in each one the count must start from 0 and proceed to the maximum number of curves in the file.
The arguments are: fileid, an integer id for the PDB file into which the curve is to be written; nchr; an integer number of characters in the label; labl, a left justified ASCII character string containing nchr meaningful characters; n, an integer number of points in the curve; px the array of x values (the type should be REAL*8); py the array of y values (the type should be REAL*8); and icurve, an integer counter for the number of curves in the file. Unlike the C version this function increments icurve and returns its new value through the argument list. Also see the note for the C version above.
The arguments are: fileid, an integer id for the PDB file into which the curve is to be written; nchr; an integer number of characters in the label; labl, a left justified ASCII character string containing nchr meaningful characters; n, an integer number of points in the curve; ix the curve index for the x values py the array of y values (the type should be REAL*8); and icurve, an integer counter for the number of curves in the file. The curve index for the x values refers to the icurve value for a prior PFWULC call in which the desired x values were written out to the file. This function is supplied to avoid having unnecessary duplication of x data in a file (the space savings can be quite large). NOTE: there may be several files into which curves are to be written and in each one the count must start from 0 and proceed to the maximum number of curves in the file. Unlike the C version this function increments icurve and returns its new value through the argument list.
3.2
Getting Input Data into ULTRA II
A data file can be read by placing it on the command line. For example ultra test.dat
will read the file test.dat when ultra starts. Once in the program, if you need data from another file, it can be read by the command rd file-name
where you insert your file name in place of file-name. menu
or if you have lots of curves you can have the menu sent to a text file by typing print-menu file-name
The file file-name can then be sent to a printer. select 1 3
If you want to look at curves 1 through 4 inclusive, you would type select 1:4
These two types of notation can be mixed to select any combination of curves from the menu for plotting. menu
Similarly, the list of displayed curves is referred to as the curve list or list. The list can be seen by typing lst
The numbers shown to the right of the label are the number of points in the curve, the minimum x, maximum x, the minimum y, and the maximum y. It is sometimes useful to know these values.4.0
ULTRA Curves
In the previous sections we have seen how to get data into ULTRA II and had a brief glimpse of an ULTRA II session. Before proceeding further, it will be useful to have a brief discussion of how ULTRA II works with its data.
The essential data object in ULTRA II is the curve. The aim of almost every input operation is to get data from somewhere (a file or the console) put into the form of a curve. A curve is a structure whose principal members are an array of x values and an array of y values. Internally ULTRA II can support an arbitrary number of curves (limited only by the memory of your machine and disk). Once curves are displayed they are referred to by a single alphabetic character. This limits one to having only 26 curves visible on the display at a time. This limitation may be removed in future versions of ULTRA II.
ULTRA II defines 26 variables whose names are the single alphabetic characters. It reserves these to use in referring to curves. These variables should NOT be used in your own functions when extending ULTRA II. In addition, the following rules apply:
The excerpt from a session illustrates the above points.
U-> span 0 1
U-> printf nil %s\n (curve? a)
#t
U-> printf nil %s\n (curve? A)
#t
U-> printf nil %s\n (curve? b)
#f
U-> printf nil %s\n (curve? B)
#f
U-> printf nil %s\n a
A
U-> printf nil %s\n b
b
Most readers do not need to be concerned with this fine point of ULTRA II. They may wish to come back to it in the event that they want to write some functions to extend ULTRA II. The reason for bringing it up at this point is that some readers will have noticed ULTRA IIs behavior and be wondering about it.
Curves in ULTRA II behave like functions. They take a single numeric argument and return a numeric value. Because of the treatment of curves discussed above it is very easy to denote this sort of operation as the following examples show:
U-> sin (span 0 6.28)
U-> a 1.57
Curve A
1.57 0.999622
U-> printf nil %6f\n (a 1.57)
Curve A
1.57 0.999622
0.999622
U-> printf nil %6f\n (sin 1.57)
1.000000
As the above example shows, curves do get one bit of exceptional treatment as far as functions go in ULTRA II. When you ask for the value of a curve at a certain point from the console, ULTRA II explicitly prints the result. In your own procedures this behavior can be modified so that the extra message is suppressed in which case the evaluation of a curve at a point becomes indistinguishable from any other function call.
Curve labels as seen by the lst command are too short to record the history of a curve. A curve may be read in or created, and then it may be operated on by such functions as dx in arbitrary ways. Even a long label may not be able to contain a sensible description of all of the operations which have been performed on a curve. In acknowledgment of this limitation and in order to inform the user that a curve has been changed since it was read in, the lst command prints a * in front of curves which have been changed.
One special case requires specific explanation. When the relative range on a linear axis drops below 0.001 the axis tick marks are labeled in a different way. The minimum axis value is printed with a > in front of it and the remaining ticks are labeled by the value minus the minimum value. For example, suppose the domain of a plot goes from 1.0 to 1.000003; the label sequence would appear as:
>1.00e+00 1.00e-6 2.00e-6 3.00e-6
For subsequent sessions you may read in your palette with the rd-pal command. If successful this palette becomes the current palette for the window. By adding a rd-pal command to your .ultrarc file you can have your favorite colors in every ULTRA session.
The format of a palette file is very simple. The first line contains the name of the palette and the number of colors in the palette, nc. This must be followed by nc lines, each specifying a single entry in the palette. Each line contains the red, green, and blue fractions (i.e. values from 0.0 to 1.0) of the color in that order.
Default: off
Usage: compare file-name1 file-name2 [tolerance]
Usage: resume
Usage: stop
Usage: abs curve-list
Usage: absx curve-list
Usage: acos curve-list
Usage: acosx curve-list
Usage: asin curve-list
Usage: asinx curve-list
Usage: atan curve-list
Usage: atanx curve-list
Usage: cos curve-list
Usage: cosh curve-list
Usage: coshx curve-list
Usage: cosx curve-list
Usage: dx curve-list value
Usage: dy curve-list value
Usage: divx curve-list value
Usage: divy curve-list value
Usage: error-bar curve pos-dy-curve [neg-dy-curve [pos-dx-curve [neg-dx-curve]]]
Usage: exp curve-list
Usage: expx curve-list
Usage: filter curve-list domain-predicate range-predicate
Usage: filter-coef curve-list coeff-array ntimes
Usage: j0 curve-list
Usage: j0x curve-list
Usage: j1 curve-list
Usage: j1x curve-list
Usage: jn curve-list n
Usage: jnx curve-list n
Usage: ln curve-list
Usage: lnx curve-list
Usage: log10 curve-list
Usage: log10x curve-list
Usage: mx curve-list value
Usage: my curve-list value
Usage: powa curve-list a
Usage: powax curve-list a
Usage: powr curve-list a
Usage: powrx curve-list a
Usage: recip curve-list
Usage: recipx curve-list
Usage: sin curve-list
Usage: sinh curve-list
Usage: sinhx curve-list
Usage: sinx curve-list
Usage: smo curve-list n [ntimes]
Usage: smooth3 curve-list [ntimes]
Usage: smooth5 curve-list [ntimes]
Usage: sqr curve-list
Usage: sqrt curve-list
Usage: sqrtx curve-list
Usage: sqrx curve-list
Usage: tan curve-list
Usage: tanh curve-list
Usage: tanhx curve-list
Usage: tanx curve-list
Usage: xmax curve-list limit
Usage: xmin curve-list limit
Usage: y0 curve-list
Usage: y0x curve-list
Usage: y1 curve-list
Usage: y1x curve-list
Usage: ymax curve-list limit
Usage: ymin curve-list limit
Usage: yn curve-list n
Usage: ynx curve-list n
Usage: + curve-list
Usage: - curve-list
Usage: * curve-list
Usage: / curve-list
Usage: append-curves curve-list
Usage: average curve-list
Usage: cfft real-curve imaginary-curve
Usage: compose curve-f curve-g
Usage: convol curve-f curve-g
Usage: convol curve-f curve-g
Usage: correl curve-f curve-g
Usage: derivative curve-list
Usage: diffraction r [n-points]
Usage: edit curve
Usage: extract curve npoints | x1min x1max dx1 [x2min x2max dx2 ...]
Usage: fft curve
Usage: fit curve-list n
Usage: fitcurve curve-to-fit curves-for-fit
Usage: gaussian a w x0 [n-points]
Usage: hypot curve-a curve-b
Usage: ifft real-curve imaginary-curve
Usage: integrate curve-list low-lim high-lim
Usage: max curve-list
Usage: min curve-list
Usage: normalize curve
Usage: span xmin xmax [n-points]
Usage: theta xmin x0 xmax [n-points]
6.0 Ultra
Commands
The Ultra commands are grouped according to a rough functional similarity which is also somewhat reflected in their usages. In each group the commands are listed alphabetically. The groups are: I/O Commands
Math Operations Which Do Not Generate a New Curve
Math Operations Which Do Generate a New Curve
Environmental Inquiry Commands
Curve Inquiry Commands
Environmental Control Commands
Plot Control Commands
Curve Control Commands
Commands Useful for Writing Extensions
A brief description of each group is given with the functions.6.1
I/O Commands
These commands access disk files either for reading or writing.
autoload
Usage: autoload procedure-name file-name
command-log
Usage: command-log [on | off | file-name]
compare
Procedure: Compare the curves from two ULTRA files. This function expects the
names of two files which should have comparable curves. The function
diff-measure is mapped over each pair of curves (one from each file) with
the following result. For the nth curve from each file a
hardcopy
Usage: hardcopy [all | number-list]
hc1
Usage: hc1 [all | number-list]
ld
Usage: ld file-name
merge
Usage: merge target-file-name source-file-name-list
np
Usage: np command [arguments]
print-menu
Usage: print-menu [file-name]
rd
Usage: rd file-name
read-table
Usage: read-table file-name [n [m [line]]]
resume
Procedure: Resume reading SCHEME forms from an ASCII disk file. See stop.
save
Usage: save [ascii | pdb] file-name curve-and/or-number-list
stop
Procedure: Return control to the terminal. See resume.
6.2
Math Operations Which Do Not Generate a New Curve
abs
Procedure: Take the absolute value of the y values of the curves.
absx
Procedure: Take the absolute value of the x values of the curves.
acos
Procedure: Take the cos-1 of the y values of the curves.
acosx
Procedure: Take the cos-1 of the x values of the curves.
asin
Procedure: Take the sin-1 of the y values of the curves.
asinx
Procedure: Take the sin-1 of the x values of the curves.
atan
Procedure: Take the tan-1 of the y values of the curves.
atanx
Procedure: Take the tan-1 of the x values of the curves.
cos
Procedure: Take the cosine of the y values of the curves.
cosh
Procedure: Take the hyperbolic cosine of the y values of the curves.
coshx
Procedure: Take the hyperbolic cosine of the x values of the curves.
cosx
Procedure: Take the cosine of the x values of the curves.
dx
Procedure: Shift the x values of the curves by a fixed value.
dy
Procedure: Shift the y values of the curves by a fixed value.
divx
Procedure: Divide the x values of the curves by a fixed value.
divy
Procedure: Divide the y values of the curves by a fixed value.
error-bar
Procedure: Draw error bars on the points of the specified curve. The positive and negative going errors for the data must be given as curves and combined
together as shown in the usage below. NOTE: for this first cut if you delete
the curves with the error information, the error-bars will be scrambled. You
should use the hide command to obtain uncluttered plots with error bars.
See
exp
Procedure: Take the exponential of the y values of the curves, i.e., y = ey.
expx
Procedure: Take the exponential of the x values of the curves, i.e., x = ex.
filter
Procedure: Remove points from the curves that fail the specified domain
filter-coef
Procedure: Return a curve filtered through coefficients. coeff-array is an array of filter
coefficients set up using the make-filter routine.
j0
Procedure: Take the zeroth order Bessel function of the first kind of the y values of the
curves.
j0x
Procedure: Take the zeroth order Bessel function of the first kind of the x values of the
curves.
j1
Procedure: Take the first order Bessel function of the first kind of the y values of the
curves.
j1x
Procedure: Take the first order Bessel function of the first kind of the x values of the
curves.
jn
Procedure: Take the nth order Bessel function of the first kind of the y values of the
curves.
jnx
Procedure: Take the nth order Bessel function of the first kind of the x values of the
curves.
ln
Procedure: Take the natural logarithm of the y values of the curves.
lnx
Procedure: Take the natural logarithm of the x values of the curves.
log10
Procedure: Take the base 10 logarithm of the y values of the curves.
log10x
Procedure: Take the base 10 logarithm of the x values of the curves.
mx
Procedure: Scale the x values of the curves by a fixed value.
my
Procedure: Scale the y values of the curves by a fixed value.
powa
Procedure: Raise a fixed value, a, to the power of the y values of the curves, i.e., y = ay.
powax
Procedure: Raise a fixed value, a, to the power of the x values of the curves, i.e., x = ax.
powr
Procedure: Raise the y values of the curves to a fixed power, i.e., y = ya.
powrx
Procedure: Raise the x values of the curves to a fixed power, i.e., x = xa.
recip
Procedure: Take the reciprocal of the y values of the curves.
recipx
Procedure: Take the reciprocal of the x values of the curves.
sin
Procedure: Take the sine of the y values of the curves.
sinh
Procedure: Take the hyperbolic sine of the y values of the curves.
sinhx
Procedure: Take the hyperbolic sine of the x values of the curves.
sinx
Procedure: Take the sine of the x values of the curves.
smo
Procedure: Smooth the curves the specified number of times using a method specified
by the variable smooth-method. For, averaging this does an n point integral average smooth, and for fft this uses a Lorentzian filter with coefficient (n/number_points).
smooth3
Procedure: Smooth the curves the specified number of times using a method specified
by the variable smooth-method. For, averaging this does a 3 point integral average smooth, and for fft this uses a Lorentzian filter with coefficient (3/number_points).
smooth5
Procedure: Smooth the curves the specified number of times using a method specified
by the variable smooth-method. For, averaging this does a 5 point integral average smooth, and for fft this uses a Lorentzian filter with coefficient (5/number_points).
sqr
Procedure: Take the square of the y values of the curves.
sqrt
Procedure: Take the square root of the y values of the curves.
sqrtx
Procedure: Take the square root of the x values of the curves.
sqrx
Procedure: Take the square of the x values of the curves.
tan
Procedure: Take the tangent of the y values of the curves.
tanh
Procedure: Take the hyperbolic tangent of the y values of the curves.
tanhx
Procedure: Take the hyperbolic tangent of the x values of the curves.
tanx
Procedure: Take the tangent of the x values of the curves.
xmax
Procedure: Filter out points in curves whose x-values > limit.
xmin
Procedure: Filter out points in curves whose x-values < limit.
y0
Procedure: Take the zeroth order Bessel function of the second kind of the y values of
the curves.
y0x
Procedure: Take the zeroth order Bessel function of the second kind of the x values of
the curves.
y1
Procedure: Take the first order Bessel function of the second kind of the y values of the
curves.
y1x
Procedure: Take the first order Bessel function of the second kind of the x values of the
curves.
ymax
Procedure: Filter out points in curves whose y-values > limit.
ymin
Procedure: Filter out points in curves whose y-values < limit.
yn
Procedure: Take the nth order Bessel function of the second kind of the y values of the
curves.
ynx
Procedure: Take the nth order Bessel function of the second kind of the x values of the
curves.
6.3
Math Operations Which Do Generate a New Curve
+
Procedure: Take the sum of the curves, i.e., a + b + ... + n.
-
Procedure: Take the difference of the curves, i.e., a - b - ... - n.
*
Procedure: Take the product of the curves, i.e., a x b x ... x n.
/
Procedure: Take the quotient of the curves, i.e., a / b / ... / n.
append-curves
Procedure: Merge a list of curves over the union of their domains. Where domains
overlap, take the average of the curves y values. Use simple-append to
control behaviour in overlap regions.
average
Procedure: Average the specified curves over the intersection of their domains.
cfft
Procedure: Compute the Complex
compose
Procedure: Compute the functional composition of two curves, i.e.,
convol
Procedure: Compute the convolution of the two curves, i.e.
. This fast
method uses FFTs and the interpolations involved may result in some loss
of accuracy.
convolb
Procedure: Compute the convolution of the two curves, i.e.
. This
slower method uses direct integration and minimal interpolations.
correl
Procedure: Compute the correlation function of the two curves, i.e.
.
delta
Procedure: Create a reasonable approximation to a Dirac delta function from xmin to
xmax with the singularity at x0 where
. This is computed so
that:

derivative
Procedure: Take the derivative of the curves.
diff-measure
Procedure: Compare two curves. For the given curves a fractional difference measure
and its average is computed, i.e.

diffraction
Procedure: Compute a diffraction pattern corresponding to a circular aperture of radius
r.
edit
Procedure: Graphically edit a curve on the screen. This command takes a curve to be
edited. A copy of the curve is made and drawn as a scatter plot. The markers of points to be retained are colored green and the points to be removed
are colored red. By holding down the left mouse button and moving the
cursor, the user can select points for removal. Points can be toggled back to
green by holding down the shift key and the left mouse button and moving
the cursor. When the all points are selected, clicking the right mouse button
returns to ULTRA where the new curve is cleaned up and replotted as a line
plot.
extract
Procedure: Derive a new curve from an existing one by interpolating values from the
existing curve. You may specify either the number of points desired or sets
of triples xmin, xmax, dx which specify sub-domains of the given curve.
fft
Procedure: Compute the Fast
fit
Procedure: Find least-squares fits to the specified curves for a polynomial of order n.
Enter <
fitcurve
Procedure: Using all the curves in the argument list except the first, compute a fit to the
first curve in the list using the least squares method. The result is a new
curve which is a linear combination of all of the given curves but the first.
fode
Procedure: Compute the solution to the first order differential equation:

gaussian
Procedure: Generate a gaussian function:
hypot
Procedure: Take the harmonic average of two curves, i.e.,
.
ifft
Procedure: Compute the Inverse
integrate
Procedure: Compute the definite
max
Procedure: Construct a curve from the maximum y values at each point.
min
Procedure: Construct a curve from the minimum y values at each point.
normalize
Procedure: Construct a new curve with unit area in its domain.
span
Procedure: Generate a curve of unit slope and zero y intercept in the given domain.
theta
Procedure: Create a reasonable approximation to a step function from xmin to xmax with
the step at x0.
thin
Procedure: Construct new curves which retains the information content of the given
curves but with fewer points.