Michael Thomas Flanagan's Java Scientific Library

CurveSmooth Class:     Curve Smoothing

     

Last update: 17 March 2012
Main Page of Michael Thomas Flanagan's Java Scientific Library

This class contains methods for smoothing one dimensional data, i.e. a curve, y = f(x). A choice of smoothing method is offered:
The class also contains methods for: See SurfaceSmooth for the two dimensional equivalent of this class, i.e. for surface smoothing
See ThreeDimensionalSmooth for the three dimensional equivalent of this class.

import directive: import flanagan.analysis.Smooth;

SUMMARY OF METHODS

Constructors public CurveSmooth(double[] xData, double[] yData)
public CurveSmooth(double[] yData)
public CurveSmooth(float[] xData, float[] yData)
public CurveSmooth(float[] yData)
public CurveSmooth(long[] xData, long[] yData)
public CurveSmooth(long[] yData)
public CurveSmooth(int[] xData, int[] yData)
public CurveSmooth(int[] yData)
public CurveSmooth(BigDecimal[] xData, BigDecimal[] yData)
public CurveSmooth(BigDecimal[] yData)
public CurveSmooth(BigInteger[] xData, BigInteger[] yData)
public CurveSmooth(BigInteger[] yData)
public CurveSmooth(ArrayMaths xData, ArrayMaths yData)
public CurveSmooth(ArrayMaths yData)
Smoothing Savitzky-Golay Smoothed Curves public double[] savitzkyGolay(int sgFilterWidth)
public double[] savitzkyGolayPlot(int sgFilterWidth)
public double[] getSavitzkyGolaySmoothedValues()
Smoothed Derivatives public double[][] savitzkyGolay(int sgFilterWidth, int n)
public double[][] savitzkyGolayPlot(int sgFilterWidth, int n)
public double[] getSavitzkyGolayDerivatives(int n)
public double[] getSavitzkyGolayDerivatives()
public double[][] savitzkyGolayPlusFirstDeriv(int sgFilterWidth)
public double[][] savitzkyGolayPlusFirstDerivPlot(int sgFilterWidth)
public double[] getSavitzkyGolayFirstDerivatives()
public double[][] savitzkyGolayPlusSecondDeriv(int sgFilterWidth)
public double[][] savitzkyGolayPlusSecondDerivPlot(int sgFilterWidth)
public double[] getSavitzkyGolaySecondDerivatives()
The Filter public double[][] getSGcoefficients()
public void setSGpolyDegree(int degree)
public int getSGpolyDegree()
public static double[][] savitzkyGolayFilter(int nBackward, int nForward, int polyDegree)
Moving Average Window public double[] movingAverage(int sgWindowWidth)
public double[] movingAveragePlot(int sgWindowWidth)
public double[] getMovingAverageValues()
public BigDecimal[] movingAverageAsBigDecimal(int sgWindowWidth)
public BigDecimal[] movingAverageAsBigDecimalPlot(int sgWindowWidth)
public BigDecimal[] getMovingAverageValuesAsBigDecimal()
Extent of smoothing public double extentMovingAverage()
public double extentSavitzlyGolay()
public double extremaReductionSavitzlyGolay()
public double extremaReductionMovingAverage()
Interpolation Savitzky-Golay public double interpolateSavitzkyGolay(double xi)
Moving average public double interpolateMovingAverage(double xi)
Extrema Minima public double[][] getMinimaUnsmoothed()
public BigDecimal[][] getMinimaUnsmoothedAsBigDecimal()
public int getNumberOfMinimaUnsmoothed()
public double[][] getMinimaMovingSavitzkyGolay()
public int getNumberOfMinimaSavitzkyGolay()
public double[][] getMinimaMovingAverage()
public BigDecimal[][] getMinimaMovingAverageAsBigDecimal()
public int getNumberOfMinimaMovingAverage()
Maxima public double[][] getMaximaUnsmoothed()
public BigDecimal[][] getMaximaUnsmoothedAsBigDecimal()
public int getNumberOfMaximaUnsmoothed()
public double[][] getMaximaSavitzkyGolay()
public int getNumberOfMaximaSavitzkyGolay()
public double[][] getMaximaMovingAverage()
public BigDecimal[][] getMaximaMovingAverageAsBigDecimal()
public int getNumberOfMaximaMovingAverage()
Extrema public int getNumberOfExremaUnsmoothed()
public int getNumberOfExtremaSavitzkyGolay()
public int getNumberOfExtremaMovingAverage()




CONSTRUCTORS

public CurveSmooth(double[] xData, double[] yData)
public CurveSmooth(float[] xData, float[] yData)
public CurveSmooth(long[] xData, long[] yData)
public CurveSmooth(int[] xData, int[] yData)
public CurveSmooth(BigDecimal[] xData, BigDecimal[] yData)
public CurveSmooth(BigInteger[] xData, BigInteger[] yData)
public CurveSmooth(ArrayMaths xData, ArrayMaths yData)
Usage:                      CurveSmooth csm = new CurveSmooth(xData, yData);
Creates an instance of CurveSmooth. The data is entered as arrays of the x and y values, arguments xData and yData, for a curve, y = f(x). The data may be entered as type double, float, long, int, BigDecimal, BigInteger or as any appropriate data type through ArrayMaths. All data, except types BigDecimal and BigInteger, are converted to type double before processing. BigInteger is converted to BigDecimal. Moving average window smoothing is performed in arbitrary precision arithmetic for BigDecimal and BigInteger entered data as is the identification of the minima and maxima in the original and moving average smoothed curves for BigDecimal and BigInteger entered data. Savitzky-Golay filtering and the identification of maxima and minima in the Savitzky-Golay smoothed data is performed in double precision arithmetic for BigDecimal and BigInteger entered data. The data are ordered as ascending x values before processing.

public CurveSmooth(double[] yData)
public CurveSmooth(float[] yData)
public CurveSmooth(long[] yData)
public CurveSmooth(int[] yData)
public CurveSmooth(BigDecimal[] yData)
public CurveSmooth(BigInteger[] yData)
public CurveSmooth(ArrayMaths yData)
Usage:                      CurveSmooth csm = new CurveSmooth(yData);
Creates an instance of CurveSmooth. The data is entered as an array of y values, argument yData, for a curve, y = f(x). As no x values are entered the data is treated as data sampled at equal x value intervals and values of 0, 1, 2 ... to n-1 are assigned to the n x-values. The data may be entered as type double, float, long, int, BigDecimal, BigInteger or as any appropriate data type through ArrayMaths. All data, except types BigDecimal and BigInteger, are converted to type double before processing. BigInteger is converted to BigDecimal. Moving average window smoothing is performed in arbitrary precision arithmetic for BigDecimal and BigInteger entered data as is the identification of the minima and maxima in the original and moving average smoothed curves for BigDecimal and BigInteger entered data. Savitzky-Golay filtering and the identification of maxima and minima in the Savitzky-Golay smoothed data is performed in double precision arithmetic for BigDecimal and BigInteger entered data.



SMOOTHING METHODS

SAVITZKY-GOLAY FILTER METHODS

Savitzky-Golay Smoothed Curves
public double[] savitzkyGolay(int sgFilterWidth)
public double[] savitzkyGolayPlot(int sgFilterWidth)
public double[] getsavitzkyGolaySmoothedValues()
Usage:                      smoothedData = csm.savitzkyGolay(sgFilterWidth);
This method returns the smoothed y values, for the data entered via the constructor arguments, using a Savitzky-Golay filter of sgFilterWidth points. The default value of the degree of the fitting polynomial is 4. This value may be reset using the setSGpolyDeg method.

Usage:                      smoothedData = csm.savitzkyGolayPlot(sgFilterWidth);
This method performs all that described above for the method savitzkyGolay and in addition displays a plot of the original, i.e. unsmoothed, data and of the Savitzky-Golay smoothed data.

Usage:                      smoothedData = csm.getSavitzkyGolaySmoothedValues();
This method returns the smoothed y values, for the data entered via the constructor arguments, using a Savitzky-Golay filter of sgFilterWidth points, if one of the above two Savitzky-Golay filter methods has already been called. If neither have been called null is returned.


Savitzky-Golay Smoothed Derivatives
public double[][] savitzkyGolay(int sgFilterWidth, int n)
public double[][] savitzkyGolayPlot(int sgFilterWidth, int n)
public double[] getSavitzkyGolayDerivatives(int n)
public double[] getSavitzkyGolayDerivatives()
Usage:                      smoothedDataPlusDeriv = csm.savitzkyGolay(sgFilterWidth, n);
This method returns the smoothed y values and the smoothed nth derivatives dny/dxn values, for the data entered via the constructor arguments, using a Savitzky-Golay filter of sgFilterWidth points. The argument n contains the value of the required order of the derivative, n. The smoothed y values are returned, in the above usage, in smoothedDataPlusDeriv[0] and the derivatives are returned in smoothedDataPlusDeriv[1].
The value of n [n] must be less than or equal to the degree of the fitting polynomial. The default value of this degree is 4. This value may be reset using the method setSGpolyDegree.
Additional specific methods for obtaining the first and second degree derivatives are described below.

Usage:                      smoothedData = csm.savitzkyGolayPlot(sgFilterWidth, n);
This method performs all that described above for the method savitzkyGolay(sgFilterWidth, n) and in addition displays a plot of the original, i.e. unsmoothed, data, of the Savitzky-Golay smoothed data and of the Savitzky-Golay smoothed derivatives.

Usage:                      smoothedData = csm.getSavitzkyDerivatives(n);
This method returns the Savitzky-Golay smoothed derivatives dny/dxn, for the data entered via the constructor arguments, for the order n entered as the argument n. A Savitzky-Golay derivative method of order n must already have been called.

Usage:                      smoothedData = csm.getSavitzkyDerivatives();
This method returns the Savitzky-Golay smoothed derivatives dny/dxn, for the data entered via the constructor arguments, for the last call to a Savitzky-Golay derivative method. The order n will be that chosen in this last call.

First derivatives
public double[][] savitzkyGolayPlusFirstDeriv(int sgFilterWidth)
public double[][] savitzkyGolayPlusFirstDerivPlot(int sgFilterWidth)
public double[] getSavitzkyGolayFirstDerivatives()
Usage:                      smoothedDataPlusFirstDeriv = csm.savitzkyGolayPlusFirstDeriv(sgFilterWidth);
This method returns the smoothed y values and the smoothed first derivatives dy/dx values, for the data entered via the constructor arguments, using a Savitzky-Golay filter of sgFilterWidth points. The smoothed y values are returned, in the above usage, in smoothedDataPlusFirstDeriv[0] and the first derivatives are returned in smoothedDataPlusFirstDeriv[1].

Usage:                      smoothedData = csm.savitzkyGolayPlusFirstDerivPlot(sgFilterWidth);
This method performs all that described above for the method savitzkyGolayPlusFirstDeriv and in addition displays a plot of the original, i.e. unsmoothed, data, of the Savitzky-Golay smoothed data and of the Savitzky-Golay smoothed first derivatives.

Usage:                      smoothedDeriv = csm.getSavitzkyGolayFirstDerivatives();
This method returns the smoothed first derivatives dy/dx values, for the data entered via the constructor arguments, using a Savitzky-Golay filter of sgFilterWidth points, if one of the above two Savitzky-Golay derivative methods has already been called.


Second derivatives
public double[][] savitzkyGolayPlusSecondDeriv(int sgFilterWidth)
public double[][] savitzkyGolayPlusSecondDerivPlot(int sgFilterWidth)
public double[] getSavitzkyGolaySecondDerivatives()
Usage:                      smoothedDataPlusSecondDeriv = csm.savitzkyGolayPlusSecondDeriv(sgFilterWidth);
This method returns the smoothed y values and the smoothed second derivatives d2y/dx2 values, for the data entered via the constructor arguments, using a Savitzky-Golay filter of sgFilterWidth points. The smoothed y values are returned, in the above usage, in smoothedDataPlusSecondDeriv[0] and the second derivatives are returned in smoothedDataPlusSecondDeriv[1].

Usage:                      smoothedData = csm.savitzkyGolayPlusSecondDerivPlot(sgFilterWidth);
This method performs all that described above for the method savitzkyGolayPlusSecondDeriv and in addition displays a plot of the original, i.e. unsmoothed, data, of the Savitzky-Golay smoothed data and of the Savitzky-Golay smoothed second derivatives.

Usage:                      smoothedDeriv = csm.getSavitzkyGolaySecondDerivatives();
This method returns the smoothed second derivatives d2y/dx2 values, for the data entered via the constructor arguments, using a Savitzky-Golay filter of sgFilterWidth points, if one of the above two Savitzky-Golay derivative methods has already been called.


The Savitzky-Golay Filter
public double[][] getSGcoefficients()
Usage:                      sgCoefficients = csm.savitzkyGolayFilter(nBackward, nForward);
This method returns the Savitzky-Golay coefficients, c, used in the smoothing filer,

where nb is the number of points preceeding the data point on which the filter is operating, yk, and nf is the number of points following the data point, yk. If the filter is used as a smoothing filter sk is the smoothed value of the data point yk and the c values used are those stored in the zeroth row of the returned matrix sgCoefficients. Each row, when applied to the data gives the smoothed derivatives, dny/dxn, where n is the index of the row; indices starting at 0. For example, the first row, index 0, gives the smoothed zeroth derivative, i.e. the smoothed data values, the second row, index 1, gives the derivative dy/dx.
The default value of the degree of the fitting polynomial is 4,

This value may be reset using the
setSGpolyDeg method.
The Savitzky-Golay smoothing methods in this class use a symmetrical filter, i.e. nb = nf.

public void setSGpolyDegree(int degree)
public int getSGpolyDegree()
Usage:                      csm.setSGpolyDegree(degree);
This method resets the degree of the Savitzky-Golay fitting polynomial. The default value is 4 if this method is not called.

Usage:                      deg = csm.getSGpolyDegree();
This method returns the degree of the Savitzky-Golay fitting polynomial. The default value is 4.

Static methods for returning a Savitzky-Golay filter
public static double[][] savitzkyGolayFilter(int nBackward, int nForward, int polyDegree)
Usage:                      coefficients = CurveSmooth.savitzkyGolayFilter(nBackward, nForward, polyDegree);
This method returns the coefficients, c, of a one dimensional Savitzky-Golay smoothing filter of length, nBackWard + nForWard + 1, with a fitting polynomial of degree, polyDegree. The coefficients, c, are applied as described
above, nBackWard is the number of points preceeding the data point upon which the filter is operating, nb, and nForWard is the number of points following the data point upon which the filter is operating, nf.





MOVING AVERAGE WINDOW SMOOTHING
public double[] movingAverage(int windowWidth)
public BigDecimal[] movingAverageAsBigDecimal(int windowWidth)
public double[] movingAveragePlot(int windowWidth)
public BigDecimal[] movingAverageAsBigDecimalPlot(int windowWidth)
public double[] getMovingAverageValues()
public BigDecimal[] getMovingAverageValuesAsBigDecimal()
Usage:                      smoothedData = csm.movingAverage(windowWidth);
This method returns the smoothed y values, for the data entered via the constructor arguments, using a moving average window of nw [argument windowWidth] points

where sk is the smoothed value of the data point yk. The entered value for the number of points in the window, windowWidth, is adjusted to the next higher odd number if an even number has been entered. The values of nl and nu are truncated appropriately if, when close to the data extremes, they fall below or above the first or last data point respectively. The smoothed data is returned as type double.

Usage:                      smoothedData = csm.movingAverageAsBigDecimal(windowWidth);
As immediately above for movingAverage(windowWidth) with the exception that the smoothed data is returned as type BigDecimal. If the data was entered as type BigDecimal or BigInteger the smoothing will have been performed in arbitrary arithmetic.

Usage:                      smoothedData = csm.movingAveragePlot(windowWidth);
This method performs all that described above for the method movingAverage and in addition displays a plot of the original, i.e. unsmoothed, data and of the moving average window smoothed data.

Usage:                      smoothedData = csm.movingAverageAsBigDecimalPlot(windowWidth);
This method performs all that described above for the method movingAverageAsBigDecimal and in addition displays a plot of the original, i.e. unsmoothed, data moving average window smoothed data.

Usage:                      smoothedData = csm.getMovingAverageValues();
This method returns the smoothed y values, for the data entered via the constructor arguments, using a moving average window of windowWidth points, if the either of the above two moving average window methods have already been called.

Usage:                      smoothedData = csm.getMovingAverageValuesAsBigDecimal();
This method returns the smoothed y values, for the data entered via the constructor arguments, using a moving average window of windowWidth points, if the either of the above two moving average window methods have already been called. The smoothed values are returned as type BigDecimal.



EXTENT OF SMOOTHING

public double extentSavitzkyGolay()
public double extentMovingAverage()
These methods return the value of the function
    
where yi is the original y value of the ith data point, si is its smoothed value, ymin is the minimum value of the yi, ymax is the maximum value of the yi and n is the number of data points.

Usage:                      extent = csm.extentSavitzkyGolay();
In this method si is the Savitzky-Golay smoothed value.

Usage:                      extent = csm.extentMovingAverage();
In this method si is its moving average smoothed value.

public double extremaReductionSavitzkyGolay()
public double extremaReductionMovingAverage()
These methods return the value of the function

    

Usage:                      extent = csm.extentrednSavitzkyGolay();
In this method the smoothed values are the Savitzky-Golay smoothed values.

Usage:                      extent = csm.extenterdnMovingAverage();
In this method the smoothed values are the moving average smoothed values.



INTERPOLATION

public double interpolateSavitzkyGolay(double xi)
public double interpolateMovingAverage(double xi)
Usage:                      yi = csm.interpolateSavitzkyGolay(xi);
This method returns the interpolated value of y [yi] for the supplied x value [argument xi] for the Savitzky-Golay smoothed data. The interpolation procedure uses the
CubicSpline class. A Savitzky-Golay smoothing method must have been called previously.

Usage:                      yi = csm.interpolateMovingAverage(xi);
This method returns the interpolated value of y [yi] for the supplied x value [argument xi] for the moving average smoothed data. The interpolation procedure uses the CubicSpline class. A moving average smoothing method must have been called previously.



EXTREMA (MINIMA AND MAXIMA)

MINIMA
Original data, i.e. unsmoothed data
public double[][] getMinimaUnsmoothed()
public BigDecimal[][] getMinimaUnsmoothedAsBigDecimal()
public int getNumberOfMinimaUnsmoothed()
Usage:                      minima = csm.getMinimaUnsmoothed();
This method returns the minima found in the original, i.e. unsmoothed, data. They are returned as a two dimensional array, minima in the above usage, in which the first row, minima[0] contains the x data values at the minima and the second row, minima[1] contains the corresponding y data values at the minima.

Usage:                      minima = csm.getMinimaUnsmoothedAsBigDecimal();
This method returns the minima found in the original, i.e. unsmoothed, data. They are returned as a two dimensional array, minima in the above usage, in which the first row, minima[0] contains the x data values at the minima and the second row, minima[1] contains the corresponding y data values at the minima. The values are returned as type BigDecimal. If the data was entered as BigDecimal or BigInteger the processing will have been carried out in arbitrary precision arithmetic.

Usage:                      nMin = csm.getNumberOfMinimaUnsmoothed();
This method returns the number of minima found in the original, i.e. unsmoothed, data.

Savitzky-Golay smoothed data
public double[][] getMinimaSavitzkyGolay()
public int getNumberOfMinimaSavitzkyGolay()
Usage:                      minima = csm.getMinimaSavitzkyGolay();
This method returns the minima found in the Savitzky-Golay smoothed data. They are returned as a two dimensional array, minima in the above usage, in which the first row, minima[0] contains the x data values at the minima and the second row, minima[1] contains the corresponding y data values at the minima. A Savitzky-Golay smoothing method must be called before this method is called.

Usage:                      nMin = csm.getNumberOfMinimaSavitzkyGolay();
This method returns the number of minima found in the Savitzky-Golay smoothed data. A Savitzky-Golay smoothing method must be called before this method is called.

Moving average window smoothed data
public double[][] getMinimaMovingAverage()
public BigDecimal[][] getMinimaMovingAverageAsBigDecimal()
public int getNumberOfMinimaMovingAverage()
Usage:                      minima = csm.getMinimaMovingAverage();
This method returns the minima found in the moving average window smoothed data. They are returned as a two dimensional array, minima in the above usage, in which the first row, minima[0] contains the x data values at the minima and the second row, minima[1] contains the corresponding y data values at the minima. A moving average window smoothing method must be called before this method is called.

Usage:                      minima = csm.getMinimaMovingAverageAsBigDecimal();
This method returns the minima found in the moving average window smoothed data. They are returned as a two dimensional array, minima in the above usage, in which the first row, minima[0] contains the x data values at the minima and the second row, minima[1] contains the corresponding y data values at the minima. A moving average window smoothing method must be called before this method is called. The values are returned as type BigDecimal. If the data was entered as BigDecimal or BigInteger the processing will have been carried out in arbitrary precision arithmetic.

Usage:                      nMin = csm.getNumberOfMinimaMovingAverage();
This method returns the number of minima found in the moving average window smoothed data. A moving average window smoothing method must be called before this method is called.



MAXIMA
Original data, i.e. unsmoothed data
public double[][] getMaximaUnsmoothed()
public BigDecimal[][] getMaximaUnsmoothedAsBigDecimal()
public int getNumberOfMaximaUnsmoothed()
Usage:                      maxima = csm.getMaximaUnsmoothed();
This method returns the maxima found in the original, i.e. unsmoothed, data. They are returned as a two dimensional array, maxima in the above usage, in which the first row, maxima[0] contains the x data values at the maxima and the second row, maxima[1] contains the corresponding y data values at the maxima.

b>Usage:                      maxima = csm.getMaximaUnsmoothedAsBigDecimal();
This method returns the maxima found in the original, i.e. unsmoothed, data. They are returned as a two dimensional array, maxima in the above usage, in which the first row, maxima[0] contains the x data values at the maxima and the second row, maxima[1] contains the corresponding y data values at the maxima. The values are returned as type BigDecimal. If the data was entered as BigDecimal or BigInteger the processing will have been carried out in arbitrary precision arithmetic.

Usage:                      nMax = csm.getNumberOfMaximaUnsmoothed();
This method returns the number of maxima found in the original, i.e. unsmoothed, data.

Savitzky-Golay smoothed data
public double[][] getMaximaSavitzkyGolay()
public int getNumberOfMaximaSavitzkyGolay()
Usage:                      maxima = csm.getMaximaSavitzkyGolay();
This method returns the maxima found in the Savitzky-Golay smoothed data. They are returned as a two dimensional array, maxima in the above usage, in which the first row, maxima[0] contains the x data values at the maxima and the second row, maxima[1] contains the corresponding y data values at the maxima. A Savitzky-Golay smoothing method must be called before this method is called.

Usage:                      nMax = csm.getNumberOfMaximaSavitzkyGolay();
This method returns the number of maxima found in the Savitzky-Golay smoothed data. A Savitzky-Golay smoothing method must be called before this method is called.

Moving average window smoothed data
public double[][] getMaximaMovingAverage()
public BigDecimal[][] getMaximaMovingAverageAsBigDecimal()
public int getNumberOfMaximaMovingAverage()
Usage:                      maxima = csm.getMaximaMovingAverage();
This method returns the maxima found in the moving average window smoothed data. They are returned as a two dimensional array, maxima in the above usage, in which the first row, maxima[0] contains the x data values at the maxima and the second row, maxima[1] contains the corresponding y data values at the maxima. A moving average window smoothing method must be called before this method is called.

Usage:                      maxima = csm.getMaximaMovingAverage();
This method returns the maxima found in the moving average window smoothed data. They are returned as a two dimensional array, maxima in the above usage, in which the first row, maxima[0] contains the x data values at the maxima and the second row, maxima[1] contains the corresponding y data values at the maxima. A moving average window smoothing method must be called before this method is called. The values are returned as type BigDecimal. If the data was entered as BigDecimal or BigInteger the processing will have been carried out in arbitrary precision arithmetic.

Usage:                      nMax = csm.getNumberOfMaximaMovingAverage();
This method returns the number of maxima found in the moving average window smoothed data. A moving average window smoothing method must be called before this method is called.



EXTREMA
Original data, i.e. unsmoothed data
public int getNumberOfExtremaUnsmoothed()
Usage:                      extrema = csm.getExtremaUnsmoothed();
This method returns the number of extrema, i.e. minima and maxima, found in the original, i.e. unsmoothed, data.

Savitzky-Golay smoothed data
public int getNumberOfExtremaSavitzkyGolay()
Usage:                      extrema = csm.getExtremaSavitzkyGolay();
This method returns the number of extrema, i.e. minima and maxima, found in the Savitzky-Golay smoothed data.

Moving average window smoothed data
public int getNumberOfExtremaMovingAverage()
Usage:                      extrema = csm.getExtremaMovingAverage();
This method returns the number of extrema, i.e. minima and maxima, found in the moving average smoothed data.



OTHER CLASSES USED BY THIS CLASS

This class uses the following classes in this library:


This page was prepared by Dr Michael Thomas Flanagan