//# MVuvw.h: A 3D vector on Earth //# Copyright (C) 1998,2000 //# Associated Universities, Inc. Washington DC, USA. //# //# This library is free software; you can redistribute it and/or modify it //# under the terms of the GNU Library General Public License as published by //# the Free Software Foundation; either version 2 of the License, or (at your //# option) any later version. //# //# This library is distributed in the hope that it will be useful, but WITHOUT //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or //# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public //# License for more details. //# //# You should have received a copy of the GNU Library General Public License //# along with this library; if not, write to the Free Software Foundation, //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA. //# //# Correspondence concerning AIPS++ should be addressed as follows: //# Internet email: aips2-request@nrao.edu. //# Postal address: AIPS++ Project Office //# National Radio Astronomy Observatory //# 520 Edgemont Road //# Charlottesville, VA 22903-2475 USA //# //# $Id$ #ifndef CASA_MVUVW_H #define CASA_MVUVW_H //# Includes #include #include namespace casacore { //# NAMESPACE CASACORE - BEGIN //# Forward Declarations class MVDirection; class MVBaseline; // A 3D vector on Earth // // // // //
  • MeasValue // // // // From Measure, Value and uvw // // // // A MVuvw is a 3-vector of uvws in a rectangular frame with // internal units of m.
    // It can be constructed with: //
      //
    • MVuvw() creates point at origin (0,0,0) //
    • MVuvw(MVuvw) creates a copy //
    • MVuvw(MVPosition) creates (x,y,z) from the given position //
    • MVuvw(Double, Double, Double) creates (x,y,z) with // specified values (assuming meters) //
    • MVuvw(Quantity length,Double, Double) creates a MVuvw assuming // that the two values are (in radians) angle along 'equator' // and towards 'pole'. //
    • MVuvw(Quantity length, Quantity, Quantity) creates a MVuvw // assuming angles as in previous, or uvws //
    • MVuvw(Quantity, Quantum >) creates a // MVuvw from angle vector, using first two angles, and // assuming second as zero if not present. //
    • MVuvw(Quantum > creates from // angles or uvws, depending on the units in the // quantum vector. In the angle case, // the data derived can be scaled with the readjust() function. If // the unit of the quantum vector is length, uvw is // assumed. //
    • MVuvw(Vector creates from angles (less than // or equal to two elements) or x,y,z (3 elements). //
    • MVuvw(Vector creates from length+angles, // angles, or x,y,z, depending on units. //
    • MVuvw(MVBaseline, MVDirection) creates a uvw // in the specified reference direction (in same reference frame) //
    // A void adjust(Double) function normalises the vector to a length of 1; // a get() returns as a // Double 3-vector the length and angles of the uvw vector; // a getAngle() returns a Quantum 2-vector, (uInt) returns the indicated // element, and getValue returns the vector.
    // uvws can be added and subtracted.
    // The multiplication of two uvws produces the in-product.
    //
    // // // See Muvw class. // // // // To do coordinate transformations // // // //
  • Implement for EW //
  • Get sign (especially of V) correct //
  • Let it handle Vectors of UVW //
  • Add some rotation matrix history for speed // class MVuvw : public MVPosition { public: //# Friends //# Constructors // Default constructor generates a (0,0,0) uvw MVuvw(); // Creates from an MVPosition MVuvw(const MVPosition &other); // Creates a specified vector MVuvw(Double in0, Double in1, Double in2); // Creates a vector with specified length towards pole // explicit MVuvw(Double in0); MVuvw(const Quantity &l); // // Creates the uvw from specified (azimuth,elevation) angles and length MVuvw(const Quantity &l, Double angle0, Double angle1); // Creates the uvw from specified angles and length. or uvws // //
  • AipsError if quantities not in angle format // // MVuvw(const Quantity &l, const Quantity &angle0, const Quantity &angle1); // If not enough angles: pole assumed (if none), or elevation =0 (if 1) MVuvw(const Quantum > &angle); MVuvw(const Quantity &l, const Quantum > &angle); // // Create from specified length and/or angles and/or uvw // MVuvw(const Vector &other); MVuvw(const Vector &other); // // uvw from a baseline and a reference direction (in same frame) // MVuvw(const MVBaseline &pos, const MVDirection &dr, Bool ew=False); // //# Operators // Multiplication defined as in-product // Double operator*(const MVuvw &other) const; // // Equality comparisons // Bool operator== (const MVuvw &other) const; Bool operator!= (const MVuvw &other) const; Bool near(const MVuvw &other, Double tol=1e-13) const; Bool near(const MVuvw &other, Quantity tol) const; Bool nearAbs(const MVuvw &other, Double tol=1e-13) const; // // Addition and subtraction // MVuvw operator-() const; MVuvw &operator+=(const MVuvw &right); MVuvw operator+(const MVuvw &right) const; MVuvw &operator-=(const MVuvw &right); MVuvw operator-(const MVuvw &right) const; // //# General Member Functions // Tell me your type // static void assure(const MeasValue &in); // // Normalise direction aspects by adjusting the length to 1 // virtual void adjust(); virtual void adjust(Double &res); virtual void readjust(Double res); // // Get radius(i.e. length of vector, in m) of uvw virtual Double radius(); // Generate a 3-vector of coordinates (length(m), angles(rad)) Vector get() const; // Generate a 3-vector of x,y,z in m const Vector &getValue() const; // Generate angle 2-vector (in rad) Quantum > getAngle() const; // and with specified units Quantum > getAngle(const Unit &unit) const; // Generate the length Quantity getLength() const; // and generate it with the specified units Quantity getLength(const Unit &unit) const; // Get the uvw angle between the directions. I.e. the angle between // the direction from one to the pole, and from one to the other. // Double uvwAngle(const MVuvw &other) const; Quantity uvwAngle(const MVuvw &other, const Unit &unit) const; // // Get the angular separation between two directions. // Double separation(const MVuvw &other) const; Quantity separation(const MVuvw &other, const Unit &unit) const; // // Produce the cross product MVuvw crossProduct(const MVuvw &other) const; // Print data virtual void print(ostream &os) const; // Clone virtual MeasValue *clone() const; // Get the value in internal units virtual Vector getVector() const; // Set the value from internal units (set 0 for empty vector) virtual void putVector(const Vector &in); // Get the internal value as a Vector. Usable in // records. The getXRecordValue() gets additional information for records. // Note that the Vectors could be empty. // virtual Vector > getRecordValue() const; virtual Vector > getXRecordValue() const; virtual Vector > getTMRecordValue() const { return getXRecordValue(); } ; // // Set the internal value if correct values and dimensions virtual Bool putValue(const Vector > &in); }; //# Global functions // Rotate a uvw vector with rotation matrix and other multiplications // MVuvw operator*(const RotMatrix &left, const MVuvw &right); MVuvw operator*(const MVuvw &left, const RotMatrix &right); MVuvw operator*(Double left, const MVuvw &right); MVuvw operator*(const MVuvw &left, Double right); Double operator*(const Vector &left, const MVuvw &right); Double operator*(const MVuvw &left, const Vector &right); Double operator*(const MVPosition &left, const MVuvw &right); Double operator*(const MVuvw &left, const MVPosition &right); // } //# NAMESPACE CASACORE - END #endif