LinearXform.h
Classes
- LinearXform -- Perform a linear transform between input and output vectors (full description)
Interface
- Public Members
- LinearXform(uInt naxis=1)
- LinearXform(const Vector<Double> &crpix, const Vector<Double> &cdelt)
- LinearXform(const Vector<Double> &crpix, const Vector<Double> &cdelt, const Matrix<Double> &pc)
- LinearXform(const LinearXform &other)
- LinearXform &operator=(const LinearXform &other)
- ~LinearXform()
- uInt nWorldAxes() const
- Bool forward(Vector<Double> &pixel, const Vector<Double> &world, String &errorMsg) const
- Bool reverse(Vector<Double> &world, const Vector<Double> &pixel, String &errorMsg) const
- Vector<Double> crpix() const
- Vector<Double> cdelt() const
- Matrix<Double> pc() const
- void crpix(const Vector<Double> &newvals)
- void cdelt(const Vector<Double> &newvals)
- void pc(const Matrix<Double> &newvals)
- LinearXform* fourierInvert (String& errMsg, const Vector<Bool>& axes, const Vector<Double>& crpix, const Vector<Double>& scale) const
- Bool near(const LinearXform& other, Double tol=1e-6) const
- Bool near(const LinearXform& other, const Vector<Int>& excludeAxes, Double tol=1e-6) const
- Private Members
- void set_linprm()
Review Status
- Reviewed By:
- Peter Barnes
- Date Reviewed:
- 1999/12/24
- Programs:
- Tests:
Prerequisite
- General knowledge of AIPS++ Arrays
- Knowledge of FITS terminology in coordinate transformations
Synopsis
This class represents the common linear part of a FITS coordinate
transformation. In particular it does the following:
world = cdelt * PC * (pixel - crpix)
Where PC is an NxN matrix; pixel, crpix (reference pixel) and world are
length N vectors; and cdelt (increment) is an NxN diagonal matrix,
represented as a length N vector.
Normally this class isn't used directly, rather it is used indirectly through
a class like LinearCoordinate.
The actual computations are performed by WCSLIB, written by Mark Calabretta
of the ATNF.
Example
Let's make a LinearXform housing two axes with a unit
diagonal PC matrix and convert from pixel to world
Vector<Double> crpix(2), cdelt(2);
crpix(0) = 10.0; crpix(1) = 20.0;
cdelt(0) = 1.0; cdelt(1) = -1.0;
LinearXform lxf(crpix, cdelt);
String errMsg;
Vector<Double> world, pixel(2);
pixel = 10.0;
Bool ok = lxf.reverse(world, pixel, errMsg);
if (ok) {
cerr << "pixel, world = " << pixel << world << endl;
} else {
cerr << "Error : " << errMsg << endl;
}
The answer should be a world vector with values 0 and -10.
Motivation
Factor out the common linear part of coordinate transformations.
Thrown Exceptions
To Do
- Allow different numbers of pixel and world axes.
Member Description
Construct with specified number of axes. The reference pixel is
assumed to be 0, and the increment is assumed to be unity, and the
PC matrix is assumed to be diagonal.
Construct the linear transformation from the supplied reference pixel
and increment. The PC matrix is the unit matrix.
crpix and cdelt must have the same number
of elements.
LinearXform(const Vector<Double> &crpix, const Vector<Double> &cdelt, const Matrix<Double> &pc)
Construct a linear transformation, supplying all of the reference pixel,
increment and PC matrix.
The vectors must be of the same length ("n") and the number of rows and
columns in the matrix must also be n.
LinearXform(const LinearXform &other)
Copy constructor (copy sematics)
LinearXform &operator=(const LinearXform &other)
Assignment (copy sematics)
Destructor
Returns the number of world axes, which for this class is also the
number of pixel axes.
Bool forward(Vector<Double> &pixel, const Vector<Double> &world, String &errorMsg) const
Bool reverse(Vector<Double> &world, const Vector<Double> &pixel, String &errorMsg) const
Convert world coordinates to pixel coordinates (forward), or pixel
coordinates to world (reverse). If the conversion works True is returned,
otherwise False is returned and errorMsg is set. The output vectors
are resized appropriately.
Retrieve the value of crpix, cdelt, and pc.
void crpix(const Vector<Double> &newvals)
void cdelt(const Vector<Double> &newvals)
void pc(const Matrix<Double> &newvals)
Set the value of crpix, cdelt, and pc. Note that since you can only
set one of them, you cannot change the dimensionality of the transform
using these functions. Instead use assignment on a temporary, i.e.:
linxform = LinearXform (crpix,crval,pc);
LinearXform* fourierInvert (String& errMsg, const Vector<Bool>& axes, const Vector<Double>& crpix, const Vector<Double>& scale) const
Invert the LinearXform ready for use in a Fourier Transformed Coordinate.
It is the callers responsibility to delete the pointer. If it fails
the pointer is 0 and an error message is provided
Bool near(const LinearXform& other, Double tol=1e-6) const
Bool near(const LinearXform& other, const Vector<Int>& excludeAxes, Double tol=1e-6) const
Comparison function. Any private Double data members are compared
with the specified fractional tolerance. You can specify axes to
exclude from the comparison if you wish.