UVWMachine.h

Classes

UVWMachine -- Converts UVW coordinates between coordinate systems (full description)

class UVWMachine

Interface

Public Members
UVWMachine(const MDirection::Ref &out, const MDirection &in, Bool EW=False, Bool project=False)
UVWMachine(const MDirection &out, const MDirection &in, Bool EW=False, Bool project=False)
UVWMachine(const MDirection::Ref &out, const MDirection &in, const MeasFrame &frame, Bool EW=False, Bool project=False)
UVWMachine(const MDirection &out, const MDirection &in, const MeasFrame &frame, Bool EW=False, Bool project=False)
UVWMachine(const UVWMachine &other)
UVWMachine &operator=(const UVWMachine &other)
~UVWMachine()
Vector<Double> operator()(const Vector<Double> &uv) const
Vector<Vector<Double> > operator()(const Vector<Vector<Double> > &uv) const
MVPosition operator()(const MVPosition &uv) const
Vector<MVPosition > operator()(const Vector<MVPosition > &uv) const
const MDirection &phaseCenter() const
Bool isNOP()
const RotMatrix &rotationUVW() const
const MVPosition &rotationPhase() const
void convertUVW(Vector<Double> &uv) const
void convertUVW(Vector<Vector<Double> > &uv) const
void convertUVW(MVPosition &uv) const
void convertUVW(Vector<MVPosition > &uv) const
Double getPhase(Vector<Double> &uv) const
Vector<Double> getPhase(Vector<Vector<Double> > &uv) const
Double getPhase(MVPosition &uv) const
Vector<Double> getPhase(Vector<MVPosition > &uv) const
void convertUVW(Double &phase, Vector<Double> &uv) const
void convertUVW(Vector<Double> &phase, Vector<Vector<Double> > &uv) const
void convertUVW(Double &phase, MVPosition &uv) const
void convertUVW(Vector<Double> &phase, Vector<MVPosition> &uv) const
void reCalculate()
Private Members
UVWMachine()
void init()
void planetinit()
void copy(const UVWMachine &other)

Description

Review Status

Reviewed By:
UNKNOWN
Date Reviewed:
before2004/08/25
Programs:
Tests:

Prerequisite

Etymology

From UVW coordinates and machinery

Synopsis

The construction of a UVWMachine class object creates a machine that can convert UVW coordinates from one coordinate system to another. In addition it can also supply the phase rotation necessary to move to a new position.

The constructors need an input MDirection to specify the input UVW coordinates reference direction and coordinate system. An EW flag can be specified to indicate the different type of UVW coordinates. I.e. projection along polar axis rather than towards observing direction (not implemented yet). A project flag, if set, will re-project the resulting UV plane onto the in-direction reference plane.

The constructors also need an output coordinate system (MDirection::Ref) or an output MDirection (including the reference coordinate system). The first case indicates that the real position on the sky does not change (only the coordinate system used); the second indicates that the UVW should be for a new position on the sky (in addition to maybe a different coordinate system). In the first case only the UVW coordinates will change, in the second the UVW positions will change, but also the phase of the observed data will have to change. For some conversions a reference frame is needed (to indicate e.g. the position or time). This frame can be part of one of the constructor references, but can also be specified separately in the constructor. A change in the frame parameter can be made outside the UVWMachine by e.g. frame.reset(anMEpoch).

Caution If the frame is changed by the user of the conversion machine, the machine has to be reinitialised before using it for output by using reCalculate().
Projection entails a rotation. For changes to a fixed frame (i.e. not changing with e.g. time), the rotation matrix is calculated only once. In other cases it has to be calculated per series of uvw conversions. The latter case can hence be time consuming.
Tip If either the input or output direction/reference specifies a planet, action is special. Planets are assumed to be in J2000 positions, since that is the only way to carry them from conversion to conversion (and also have a variable phase-center; which can, btw, always be obtained by the phaseCenter() member).
Note that a reCalculate() is necessary between calls of the engine, since the planetary position will change from time to time (i.e. with the Frame).
If no explicit output coordinate is given (i.e. no phase shift necessary), and the conversion from input to output is an essential NOP, and no reprojection to the input plane is required, the machine will bypass all calculations. This state can be inspected by the isNOP() method.

If you want to convert to say an azimuth/elevation map of the Sun, this can be done to have either two conversion engines (original to Sun, then Sun to AzEl), or by conversion of the Sun to AzEl before entering the engine. The output of the machine is either a set of rotation matrices that can be used to convert UVW coordinates (and, if necessary, phases); or the UVW conversion and actual phase can be calculated from a given UVW coordinate (or set of coordinates).

Tip Since e.g. in an EW interferometer (or any set of baselines on a line) the phase correction and UVW transform scales with the length of the baseline, conversion of a nominal (say 1m) baseline suffices to easily calculate others. The same is true for baselines in a plane, where a conversion of two orthogonal baselines in that plane will suffice.

Example

	// Given a current phase stopping Center
	MDirection indir(Quantity(3.25745692, "rad"),
		   	 Quantity(0.040643336,"rad"),
		   	 MDirection::Ref(MDirection::B1950));
	// Conversion to J2000 is set by:
	UVWMachine uvm(MDirection::Ref(MDirection::J2000), indir);
	// The rotation matrix to go to new UVW is obtained by:
	RotMatrix rm(uvm.rotationUVM());
	// If an UVW specified:
	MVPosition uvw(-739.048461, -1939.10604, 1168.62562);
	// This can be converted by e.g.:
	uvw *= rm;
	// Or, alternatively, by e.g.:
	uvm.convertUVW(uvw);

Motivation

To aid making maps in different coordinate systems

To Do

Member Description

UVWMachine(const MDirection::Ref &out, const MDirection &in, Bool EW=False, Bool project=False)

Constructors have an EW flag, which will give a projection parallel to the polar axis rather than in the direction of the fieldcenter, and a project flag. The last will correct the UV coordinates to re-project them onto the plane specified by the in direction

Construct a UVW conversion machine from the in coordinate and its system to the out coordinate system (output absolute direction remains the same)

UVWMachine(const MDirection &out, const MDirection &in, Bool EW=False, Bool project=False)

Constructors have an EW flag, which will give a projection parallel to the polar axis rather than in the direction of the fieldcenter, and a project flag. The last will correct the UV coordinates to re-project them onto the plane specified by the in direction

Construct a UVW conversion machine from the in coordinate and its system to the out coordinate and its system

UVWMachine(const MDirection::Ref &out, const MDirection &in, const MeasFrame &frame, Bool EW=False, Bool project=False)
UVWMachine(const MDirection &out, const MDirection &in, const MeasFrame &frame, Bool EW=False, Bool project=False)

Constructors have an EW flag, which will give a projection parallel to the polar axis rather than in the direction of the fieldcenter, and a project flag. The last will correct the UV coordinates to re-project them onto the plane specified by the in direction

UVWMachine(const UVWMachine &other)

Copy constructor

UVWMachine &operator=(const UVWMachine &other)

Copy assignments

~UVWMachine()

Vector<Double> operator()(const Vector<Double> &uv) const
Vector<Vector<Double> > operator()(const Vector<Vector<Double> > &uv) const
MVPosition operator()(const MVPosition &uv) const
Vector<MVPosition > operator()(const Vector<MVPosition > &uv) const

Return converted UVW coordinates

const MDirection &phaseCenter() const

Return the new phase center coordinates

Bool isNOP()

Return if the engine is an effective NOP

const RotMatrix &rotationUVW() const

Return a rotation matrix that can be used to convert UVW coordinates: UVW(new) = UVW(old) * rotationUVW()

const MVPosition &rotationPhase() const

Return a position vector that can produce the phase correction: dPhase = rotationPhase * UVW(new)

void convertUVW(Vector<Double> &uv) const
void convertUVW(Vector<Vector<Double> > &uv) const
void convertUVW(MVPosition &uv) const
void convertUVW(Vector<MVPosition > &uv) const

replace UVW with converted values

Double getPhase(Vector<Double> &uv) const
Vector<Double> getPhase(Vector<Vector<Double> > &uv) const
Double getPhase(MVPosition &uv) const
Vector<Double> getPhase(Vector<MVPosition > &uv) const

Get phase shift (in implied units of UVW), and change input uvw as well

void convertUVW(Double &phase, Vector<Double> &uv) const
void convertUVW(Vector<Double> &phase, Vector<Vector<Double> > &uv) const
void convertUVW(Double &phase, MVPosition &uv) const
void convertUVW(Vector<Double> &phase, Vector<MVPosition> &uv) const

Replace UVW with converted, and return phase

void reCalculate()

Recalculate the parameters for the machine after e.g. a frame change

UVWMachine()

default constructor: not implemented

void init()

Initialise machinery

void planetinit()

Planet handling

void copy(const UVWMachine &other)

Copy data members