casa  $Rev:20696$
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
Public Member Functions | Static Public Member Functions | Private Attributes | Friends
casa::Quantum< Qtype > Class Template Reference

Quantities (i.e. dimensioned values) More...

#include <Quantum.h>

Inheritance diagram for casa::Quantum< Qtype >:
casa::QBase

List of all members.

Public Member Functions

 Quantum ()
 Default constructor, generates '0'.
 Quantum (const Quantum< Qtype > &other)
 Copy constructor (deep copy)
 Quantum (const Qtype &factor)
 Construct undimensioned quantum (i.e.
 Quantum (const Qtype &factor, const Unit &s)
 Construct dimensioned quantum (e.g.
 Quantum (const Qtype &factor, const QBase &other)
 Construct quantum with unit copied from existing quantum.
 ~Quantum ()
 Destructor.
Quantum< Qtype > & operator= (const Quantum< Qtype > &other)
 Assignment (deep copy)
const Quantum< Qtype > & operator+ () const
 Unary operations.
Quantum< Qtype > operator- () const
Quantum< Qtype > & operator+= (const Quantum< Qtype > &other)
 In place arithmetic functions: left hand side changed in place.
Quantum< Qtype > & operator+= (const Qtype &other)
Quantum< Qtype > & operator-= (const Quantum< Qtype > &other)
Quantum< Qtype > & operator-= (const Qtype &other)
Quantum< Qtype > & operator*= (const Quantum< Qtype > &other)
Quantum< Qtype > & operator*= (const Qtype &other)
Quantum< Qtype > & operator/= (const Quantum< Qtype > &other)
Quantum< Qtype > & operator/= (const Qtype &other)
Quantum< Qtype > operator+ (const Quantum< Qtype > &other) const
 Arithmetic operators: return Quantum<T>
Quantum< Qtype > operator- (const Quantum< Qtype > &other) const
Quantum< Qtype > operator* (const Quantum< Qtype > &other) const
Quantum< Qtype > operator/ (const Quantum< Qtype > &other) const
const Qtype & getValue () const
 Get value of quantum in current units (i.e.
Qtype & getValue ()
Qtype getBaseValue () const
 Get value in canonical base units.
Qtype getValue (const Unit &other) const
 Get value in specified units.
virtual const UnitgetFullUnit () const
 Get the unit (as Unit) that is attached to the Quantum.
void convert ()
 Convert a Quantum to specified units.
void convert (const Unit &s)
 Convert to specified units; any remainder will be expressed in canonical units.
void convert (const Quantum< Qtype > &other)
 Convert a Quantum to units from specified quantum (ibid example)
virtual QBaseclone () const
 Get a copy of Quantum.
virtual void print (ostream &os) const
 Print a Quantum.
virtual uInt type () const
 Get the type (using QuantumType) of derived Quantum (faster than Strings)

Static Public Member Functions

static uInt myType ()

Private Attributes

Qtype qVal
 
   

Friends

istream & operator>> (istream &is, Quantity &ku)
 Input, only quantity is supported now.
void scale (const Qtype &factor)
 Re-specify parts of a quantum.
void setValue (const Qtype &val)
 Set the value without changing units.
Bool check (const UnitVal &uv) const
 Check if of specified type.
void assure (const UnitVal &uv) const
 Assert correct kind.
Quantum< Qtype > get () const
 Return a Quantum converted to specified units.
Quantum< Qtype > get (const Unit &s) const
 Convert to specified units; any remainder will be expressed in canonical units.
Quantum< Qtype > get (const Quantum< Qtype > &other) const
 Convert a Quantum to units from specified quantum (ibid example)
static Bool read (Quantity &res, const String &in)
 Set the value and unit deduced from input string
Caution: At the moment the implementation can only convert scalars to the appropiate Quantum; If format for Array input defined, it could easily be changed; In addition recognition of date/time/angle still has to be added

static Bool read (Quantity &res, MUString &in)

Detailed Description

template<class Qtype>
class casa::Quantum< Qtype >

Quantities (i.e. dimensioned values)

Intended use:

Public interface

Review Status

Reviewed By:
UNKNOWN
Date Reviewed:
before2004/08/25
Test programs:
tQuantum

Prerequisite

Etymology

A Quantity is defined as a single Double value with attached units. From this definition the templated Quantum class arose, to have non-Double, non-scalar quantities.

Synopsis

Quantities are values with a unit. Their basic specification can be one of two forms:

    Quantity( Double value, String unit);       // or: Unit unit
    Quantum<Type> ( Type value, String unit)    // or: Unit unit

A unit is a string of known unit fields separated by 'space' or '.' (to indicate multiply) or '/' (to indicate divide). See the Unit class for details.

Example: km/s/(Mpc.s)2 is identical to km.s-1.Mpc-2.s-2

Defining a Quantum

The following list of constructors is available.
Tip: In the following 'String' can be replaced by 'Unit' everywhere; The only difference being a check for a legitimate unit string being executed if Unit specified (with exception if error)

Tip: 'Quantum<Type>' can, if Type equals Double, be replaced with 'Quantity'

'Type' can be any simple or non-simple arithmetic type;

E;g; <Double>, <Complex>, <Vector<Double> >

Manipulating quantities

Mathematical operators and functions and logical operations (comparisons) are defined on Quantums. They are, of course, only available if the template Type supports them.

Manipulating the value and/or units of quanta

Quantities can be converted to other units by the following set of member functions:


Tip: All converting type methods (i;e; convert(), get() and getValue() with specified units), will automatically convert also from time to angle units (or v;v) if necessary, as long as they are simple; I;e; deg will be converted to h, but asking to convert m/s to m/deg will produce the standard conversion to m/deg;rad/s;

Quanta can be checked for having the correct unit dimensions (e.g. before addition or comparing) by the following two member functions, which will return a Bool value:

or by an assertion, which will throw an exception:

The quantum can be retrieved with a change in units by:

The value and units of a quantum can be set or retrieved separately by the following member functions:

The output operator (<<) will produce the value of the quantum and its units. Given Quantity myval(5.,"mJy"), << myval will produce: 5.0 mJy; while << myval.get("yW/m2") will produce: .00005 yW/m2.s.
The input operator (>>, or the static read functions) will convert a String to a Quantum (quantity only for now). The analysis will do the following:


Caution: Since e;g; 12d could be interpreted as being both an angle (12 degrees) or a quantity (12 days), the only way is to differentiate them with a decimal point (12;d will be days)

Example

An experiment has measured the energy of a photon in keV. The following will output the wavelength and frequency of this photon (see the QC class for quantity constants):

        #include <casa/Quanta.h>
        Double myval;                   // keV photon energy
        Quantity quant(myval,"keV");    // make quantity
        cout << "A photon with energy " << quant << endl
                << " has a frequency of "
                << (quant/QC::h)->get("GHz") << endl    // h=Planck
                << " and a wavelength of "
                << (QC::c/quant/QC::h)->get("nm")       // c=light velocity
                << " or " << QC::c/quant/QC::h << endl;

Motivation

Major use is foreseen in all calculations with observed data.

Template Type Argument Requirements (Qtype)

To Do

Definition at line 273 of file Quantum.h.


Constructor & Destructor Documentation

template<class Qtype>
casa::Quantum< Qtype >::Quantum ( )

Default constructor, generates '0'.

template<class Qtype>
casa::Quantum< Qtype >::Quantum ( const Quantum< Qtype > &  other)

Copy constructor (deep copy)

template<class Qtype>
casa::Quantum< Qtype >::Quantum ( const Qtype &  factor)

Construct undimensioned quantum (i.e.

unit="")

template<class Qtype>
casa::Quantum< Qtype >::Quantum ( const Qtype &  factor,
const Unit s 
)

Construct dimensioned quantum (e.g.

'1.23 km/Mpc')

<h3>Thrown Exceptions</h3><ul>    <li> AipsError if non-matching unit dimensions
</ul>
template<class Qtype>
casa::Quantum< Qtype >::Quantum ( const Qtype &  factor,
const QBase other 
)

Construct quantum with unit copied from existing quantum.

template<class Qtype>
casa::Quantum< Qtype >::~Quantum ( )

Destructor.


Member Function Documentation

template<class Qtype>
void casa::Quantum< Qtype >::assure ( const UnitVal uv) const

Assert correct kind.

Thrown Exceptions

  • AipsError if non-conforming unit dimensions
template<class Qtype>
Bool casa::Quantum< Qtype >::check ( const UnitVal uv) const

Check if of specified type.

template<class Qtype>
virtual QBase* casa::Quantum< Qtype >::clone ( ) const [virtual]

Get a copy of Quantum.

Implements casa::QBase.

template<class Qtype>
void casa::Quantum< Qtype >::convert ( )

Convert a Quantum to specified units.

Convert to canonical units

template<class Qtype>
void casa::Quantum< Qtype >::convert ( const Unit s)

Convert to specified units; any remainder will be expressed in canonical units.

E.g. conversion of Jy/pc into W/ly2 will result in W/ly2.m-1.s .

<h3>Thrown Exceptions</h3><ul>    <li> AipsError if illegal unit
</ul>  
template<class Qtype>
void casa::Quantum< Qtype >::convert ( const Quantum< Qtype > &  other)

Convert a Quantum to units from specified quantum (ibid example)

template<class Qtype>
Quantum<Qtype> casa::Quantum< Qtype >::get ( ) const

Return a Quantum converted to specified units.

Convert to canonical units

template<class Qtype>
Quantum<Qtype> casa::Quantum< Qtype >::get ( const Unit s) const

Convert to specified units; any remainder will be expressed in canonical units.

E.g. conversion of Jy/pc into W/ly2 will result in W/ly2.m-1.s .

Thrown Exceptions

template<class Qtype>
Quantum<Qtype> casa::Quantum< Qtype >::get ( const Quantum< Qtype > &  other) const

Convert a Quantum to units from specified quantum (ibid example)

template<class Qtype>
Qtype casa::Quantum< Qtype >::getBaseValue ( ) const

Get value in canonical base units.

template<class Qtype>
virtual const Unit& casa::Quantum< Qtype >::getFullUnit ( ) const [virtual]

Get the unit (as Unit) that is attached to the Quantum.

(use getUnit() if interested in the String part only, e.g. for output)

Implements casa::QBase.

template<class Qtype>
const Qtype& casa::Quantum< Qtype >::getValue ( ) const

Get value of quantum in current units (i.e.

in units specified in quantum)

Referenced by casa::CFCache::cacheConvFunction(), casa::CFCache::locateConvFunction(), casa::CFCache::searchConvFunction(), and casa::PlotMSTransformations::setRestFreq().

template<class Qtype>
Qtype& casa::Quantum< Qtype >::getValue ( )
template<class Qtype>
Qtype casa::Quantum< Qtype >::getValue ( const Unit other) const

Get value in specified units.

template<class Qtype>
static uInt casa::Quantum< Qtype >::myType ( ) [static]
template<class Qtype>
Quantum<Qtype> casa::Quantum< Qtype >::operator* ( const Quantum< Qtype > &  other) const
template<class Qtype>
Quantum<Qtype>& casa::Quantum< Qtype >::operator*= ( const Quantum< Qtype > &  other)
template<class Qtype>
Quantum<Qtype>& casa::Quantum< Qtype >::operator*= ( const Qtype &  other)
template<class Qtype>
const Quantum<Qtype>& casa::Quantum< Qtype >::operator+ ( ) const

Unary operations.

template<class Qtype>
Quantum<Qtype> casa::Quantum< Qtype >::operator+ ( const Quantum< Qtype > &  other) const

Arithmetic operators: return Quantum<T>

Thrown Exceptions

  • AipsError if non-conforming units (+ and -)

See QMath class for unequal argument types

template<class Qtype>
Quantum<Qtype>& casa::Quantum< Qtype >::operator+= ( const Quantum< Qtype > &  other)

In place arithmetic functions: left hand side changed in place.

Thrown Exceptions

  • AipsError if non-conforming units (+ and -)
  • AipsError if illegal result unit (* and /; programming error)
template<class Qtype>
Quantum<Qtype>& casa::Quantum< Qtype >::operator+= ( const Qtype &  other)
template<class Qtype>
Quantum<Qtype> casa::Quantum< Qtype >::operator- ( ) const
template<class Qtype>
Quantum<Qtype> casa::Quantum< Qtype >::operator- ( const Quantum< Qtype > &  other) const
template<class Qtype>
Quantum<Qtype>& casa::Quantum< Qtype >::operator-= ( const Quantum< Qtype > &  other)
template<class Qtype>
Quantum<Qtype>& casa::Quantum< Qtype >::operator-= ( const Qtype &  other)
template<class Qtype>
Quantum<Qtype> casa::Quantum< Qtype >::operator/ ( const Quantum< Qtype > &  other) const
template<class Qtype>
Quantum<Qtype>& casa::Quantum< Qtype >::operator/= ( const Quantum< Qtype > &  other)
template<class Qtype>
Quantum<Qtype>& casa::Quantum< Qtype >::operator/= ( const Qtype &  other)
template<class Qtype>
Quantum<Qtype>& casa::Quantum< Qtype >::operator= ( const Quantum< Qtype > &  other)

Assignment (deep copy)

template<class Qtype>
virtual void casa::Quantum< Qtype >::print ( ostream &  os) const [virtual]

Print a Quantum.

Implements casa::QBase.

template<class Qtype>
static Bool casa::Quantum< Qtype >::read ( Quantity res,
const String in 
) [static]

Set the value and unit deduced from input string
Caution: At the moment the implementation can only convert scalars to the appropiate Quantum; If format for Array input defined, it could easily be changed; In addition recognition of date/time/angle still has to be added

template<class Qtype>
static Bool casa::Quantum< Qtype >::read ( Quantity res,
MUString in 
) [static]
template<class Qtype>
void casa::Quantum< Qtype >::scale ( const Qtype &  factor)

Re-specify parts of a quantum.

Scale ( i.e. multiply) the value of the Quantum without changing units

template<class Qtype>
void casa::Quantum< Qtype >::setValue ( const Qtype &  val)

Set the value without changing units.

template<class Qtype>
virtual uInt casa::Quantum< Qtype >::type ( ) const [virtual]

Get the type (using QuantumType) of derived Quantum (faster than Strings)

Implements casa::QBase.


Friends And Related Function Documentation

template<class Qtype>
istream& operator>> ( istream &  is,
Quantity ku 
) [friend]

Input, only quantity is supported now.


Member Data Documentation

template<class Qtype>
Qtype casa::Quantum< Qtype >::qVal [private]

   

Actual quantum value

Definition at line 417 of file Quantum.h.


The documentation for this class was generated from the following file: