LCOV - code coverage report
Current view: top level - components/ComponentModels - Flux.tcc (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 233 503 46.3 %
Date: 2024-10-29 13:38:20 Functions: 42 67 62.7 %

          Line data    Source code
       1             : //# Flux.cc:
       2             : //# Copyright (C) 1998,1999,2000,2001,2002
       3             : //# Associated Universities, Inc. Washington DC, USA.
       4             : //#
       5             : //# This library is free software; you can redistribute it and/or modify it
       6             : //# under the terms of the GNU Library General Public License as published by
       7             : //# the Free Software Foundation; either version 2 of the License, or (at your
       8             : //# option) any later version.
       9             : //#
      10             : //# This library is distributed in the hope that it will be useful, but WITHOUT
      11             : //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
      12             : //# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
      13             : //# License for more details.
      14             : //#
      15             : //# You should have received a copy of the GNU Library General Public License
      16             : //# along with this library; if not, write to the Free Software Foundation,
      17             : //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
      18             : //#
      19             : //# Correspondence concerning AIPS++ should be addressed as follows:
      20             : //#        Internet email: casa-feedback@nrao.edu.
      21             : //#        Postal address: AIPS++ Project Office
      22             : //#                        National Radio Astronomy Observatory
      23             : //#                        520 Edgemont Road
      24             : //#                        Charlottesville, VA 22903-2475 USA
      25             : //#
      26             : //# $Id: Flux.tcc 21292 2012-11-28 14:58:19Z gervandiepen $
      27             : 
      28             : #include <components/ComponentModels/Flux.h>
      29             : #include <casacore/casa/Arrays/Array.h>
      30             : #include <casacore/casa/Arrays/ArrayMath.h>
      31             : #include <casacore/casa/Arrays/ArrayLogical.h>
      32             : #include <casacore/casa/Containers/RecordInterface.h>
      33             : #include <casacore/casa/Exceptions/Error.h>
      34             : #include <casacore/casa/Logging/LogIO.h>
      35             : #include <casacore/casa/Logging/LogOrigin.h>
      36             : #include <casacore/casa/BasicSL/Complex.h>
      37             : #include <casacore/casa/BasicSL/Constants.h>
      38             : #include <casacore/measures/Measures/Stokes.h>
      39             : #include <casacore/casa/Quanta/Quantum.h>
      40             : #include <casacore/casa/Quanta/QuantumHolder.h>
      41             : #include <casacore/casa/Utilities/Assert.h>
      42             : #include <casacore/casa/Utilities/DataType.h>
      43             : #include <casacore/casa/BasicSL/String.h>
      44             : #include <iostream>
      45             : 
      46             : namespace casa { //# NAMESPACE CASA - BEGIN
      47             : 
      48             : template<class T> const std::vector<casacore::Unit> FluxRep<T>::_allowedUnits {"Jy", "Jy.km/s", "K.rad2"};
      49             : 
      50     2611205 : template<class T> FluxRep<T>::
      51             : FluxRep()
      52     2611205 :   :itsVal(4, typename casacore::NumericTraits<T>::ConjugateType(0,0)),
      53     2611205 :    itsPol(ComponentType::STOKES),
      54     2611205 :    itsUnit("Jy"),
      55     2611205 :    itsErr(4, typename casacore::NumericTraits<T>::ConjugateType(0,0))
      56             : {
      57     2611205 :   itsVal(0) = 1;
      58     2611205 : }
      59             : 
      60           0 : template<class T> FluxRep<T>::
      61             : FluxRep(T i) 
      62           0 :   :itsVal(4, typename casacore::NumericTraits<T>::ConjugateType(0,0)),
      63           0 :    itsPol(ComponentType::STOKES),
      64           0 :    itsUnit("Jy"),
      65           0 :    itsErr(4, typename casacore::NumericTraits<T>::ConjugateType(0,0))
      66             : {
      67           0 :   itsVal(0) = i;
      68           0 : }
      69             : 
      70           4 : template<class T> FluxRep<T>::
      71             : FluxRep(T i, T q, T u, T v)
      72           4 :   :itsVal(4, typename casacore::NumericTraits<T>::ConjugateType(0,0)),
      73           4 :    itsPol(ComponentType::STOKES),
      74           4 :    itsUnit("Jy"),
      75           4 :    itsErr(4, typename casacore::NumericTraits<T>::ConjugateType(0,0))
      76             : {
      77           4 :   itsVal(0) = i;
      78           4 :   itsVal(1) = q;
      79           4 :   itsVal(2) = u;
      80           4 :   itsVal(3) = v;
      81           4 : }
      82             : 
      83             : template<class T> FluxRep<T>::
      84             : FluxRep(typename casacore::NumericTraits<T>::ConjugateType xx,
      85             :         typename casacore::NumericTraits<T>::ConjugateType xy,
      86             :         typename casacore::NumericTraits<T>::ConjugateType yx,
      87             :         typename casacore::NumericTraits<T>::ConjugateType yy,
      88             :         ComponentType::Polarisation pol)
      89             :   :itsVal(4),
      90             :    itsPol(pol),
      91             :    itsUnit("Jy"),
      92             :    itsErr(4, typename casacore::NumericTraits<T>::ConjugateType(0,0))
      93             : {
      94             :   itsVal(0) = xx;
      95             :   itsVal(1) = xy;
      96             :   itsVal(2) = yx;
      97             :   itsVal(3) = yy;
      98             : }
      99             : 
     100     2560000 : template<class T> FluxRep<T>::
     101             : FluxRep(const casacore::Vector<T>& flux)
     102     2560000 :   :itsVal(4, typename casacore::NumericTraits<T>::ConjugateType(0,0)),
     103     2560000 :    itsPol(ComponentType::STOKES),
     104     2560000 :    itsUnit("Jy"),
     105     2560000 :    itsErr(4, typename casacore::NumericTraits<T>::ConjugateType(0,0))
     106             : {
     107    12800000 :   for (casacore::uInt i = 0 ; i < 4; i++) {
     108    10240000 :     itsVal(i) = flux(i);
     109             :   }
     110     2560000 : }
     111             : 
     112       25601 : template<class T> FluxRep<T>::
     113             : FluxRep(const casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& flux,
     114             :         ComponentType::Polarisation pol)
     115       25601 :   :itsVal(flux.copy()),
     116       25601 :    itsPol(pol),
     117       25601 :    itsUnit("Jy"),
     118       25601 :    itsErr(4, typename casacore::NumericTraits<T>::ConjugateType(0,0))
     119             : {
     120       25601 : }
     121             : 
     122             : template<class T> FluxRep<T>::
     123             : FluxRep(const casacore::Quantum<casacore::Vector<T> >& flux)
     124             :   :itsVal(4, typename casacore::NumericTraits<T>::ConjugateType(0,0)),
     125             :    itsPol(ComponentType::STOKES),
     126             :    itsUnit(flux.getFullUnit()),
     127             :    itsErr(4, typename casacore::NumericTraits<T>::ConjugateType(0,0))
     128             : {
     129             :   const casacore::Vector<T>& fluxVal(flux.getValue());
     130             :   convertArray(itsVal, fluxVal);
     131             : }
     132             : 
     133             : template<class T> FluxRep<T>::
     134             : FluxRep(const casacore::Quantum<casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType> >& flux,
     135             :         ComponentType::Polarisation pol)
     136             :   :itsVal(flux.getValue().copy()),
     137             :    itsPol(pol),
     138             :    itsUnit(flux.getFullUnit()),
     139             :    itsErr(4, typename casacore::NumericTraits<T>::ConjugateType(0,0))
     140             : {
     141             : }
     142             : 
     143         800 : template<class T> FluxRep<T>::
     144             : FluxRep(const FluxRep<T>& other) 
     145         800 :   :itsVal(other.itsVal.copy()),
     146         800 :    itsPol(other.itsPol),
     147         800 :    itsUnit(other.itsUnit),
     148         800 :    itsErr(other.itsErr)
     149             : {
     150         800 : }
     151             : 
     152     5197609 : template<class T> FluxRep<T>::
     153             : ~FluxRep() {
     154     5197609 : }
     155             : 
     156             : template<class T> FluxRep<T>& FluxRep<T>::
     157             : operator=(const FluxRep<T>& other) {
     158             :   if (this != &other) {
     159             :     itsVal = other.itsVal;
     160             :     itsPol = other.itsPol;
     161             :     itsUnit = other.itsUnit;
     162             :     itsErr = other.itsErr;
     163             :   }
     164             :   return *this;
     165             : }
     166             : 
     167       51201 : template<class T> const casacore::Unit& FluxRep<T>::
     168             : unit() const {
     169       51201 :   return itsUnit;
     170             : }
     171             : 
     172             : template<class T> void FluxRep<T>::
     173             : unit(casacore::Unit& unit) const {
     174             :   unit = itsUnit;
     175             : }
     176             : 
     177       51201 : template<class T> void FluxRep<T>::
     178             : setUnit(const casacore::Unit& unit) {
     179       51201 :   itsUnit = unit;
     180       51201 : }
     181             : 
     182       25600 : template<class T> void FluxRep<T>::
     183             : convertUnit(const casacore::Unit& unit) {
     184       25600 :   if (unit.getName() != itsUnit.getName()) {
     185           0 :     T factor = itsUnit.getValue().getFac()/unit.getValue().getFac();
     186           0 :     for (casacore::uInt i = 0; i < 4; i++) {
     187           0 :       itsVal(i) *= factor;
     188           0 :       itsErr(i) *= factor;
     189             :     }
     190           0 :     itsUnit = unit;
     191             :   }
     192       25600 : }
     193             : 
     194     2588001 : template<class T> ComponentType::Polarisation FluxRep<T>::
     195             : pol() const {
     196     2588001 :   return itsPol;
     197             : }
     198             : 
     199             : template<class T> void FluxRep<T>::
     200             : pol(ComponentType::Polarisation& pol) const {
     201             :   pol = itsPol;
     202             : }
     203             : 
     204     2636800 : template<class T> void FluxRep<T>::
     205             : setPol(ComponentType::Polarisation pol) {
     206     2636800 :   itsPol = pol;
     207     2636800 : }
     208             : 
     209     2612000 : template<class T> void FluxRep<T>::
     210             : convertPol(ComponentType::Polarisation pol) {
     211     2612000 :   if (itsPol != pol) {
     212     2611200 :     switch (pol){
     213       25600 :     case ComponentType::STOKES:
     214       25600 :       if (itsPol == ComponentType::LINEAR) {
     215           0 :         Flux<T>::linearToStokes(itsVal, itsVal);
     216             :       } else {
     217       25600 :         Flux<T>::circularToStokes(itsVal, itsVal);
     218             :       }
     219       25600 :       break;
     220           0 :     case ComponentType::LINEAR:
     221           0 :       if (itsPol == ComponentType::STOKES) {
     222           0 :         Flux<T>::stokesToLinear(itsVal, itsVal);
     223             :       } else {
     224           0 :         Flux<T>::circularToLinear(itsVal, itsVal);
     225             :       }
     226           0 :       break;
     227     2585600 :     case ComponentType::CIRCULAR:
     228     2585600 :       if (itsPol == ComponentType::STOKES) {
     229     2585600 :         Flux<T>::stokesToCircular(itsVal, itsVal);
     230             :       } else {
     231           0 :         Flux<T>::linearToCircular(itsVal, itsVal);
     232             :       }
     233     2585600 :       break;
     234           0 :     default:
     235           0 :       throw(casacore::AipsError("FluxRep<T>::convertPol(...) - bad polarisation type"));
     236             :     };
     237             : 
     238     2611200 :     setPol(pol);                     // New pol rep label
     239             : 
     240     2611200 :     if (!allNearAbs(itsErr, typename casacore::NumericTraits<T>::ConjugateType(0,0), 
     241             :                     casacore::C::dbl_epsilon)) {
     242           0 :       casacore::LogIO logErr(casacore::LogOrigin("FluxRep", "convertPol()"));
     243             :       logErr << casacore::LogIO::WARN 
     244             :              << "The change in flux representation means the numerical values"
     245             :              << " have changed" << std::endl
     246             :              << "But the errors in the flux are not being changed "
     247             :              << "and are probably now incorrect"
     248           0 :              << casacore::LogIO::POST;
     249           0 :     }
     250             :   }
     251     2612000 : }
     252             : 
     253             : template<class T>
     254       25601 : const casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& FluxRep<T>::
     255             : value() const {
     256       25601 :   return itsVal;
     257             : }
     258             : 
     259             : template<class T>
     260   112320000 : const typename casacore::NumericTraits<T>::ConjugateType& FluxRep<T>::
     261             : value(casacore::uInt p) const {
     262   112320000 :   return itsVal(p);
     263             : }
     264             : 
     265       25600 : template<class T> void FluxRep<T>::
     266             : value(casacore::Vector<T>& value) {
     267       25600 :   const casacore::uInt len = value.nelements();
     268       25600 :   if (len == 0) value.resize(4);
     269       25600 :   convertPol(ComponentType::STOKES);
     270      128000 :   for (casacore::uInt s = 0 ; s < 4; s++) {
     271      102400 :     value(s) = itsVal(s).real();
     272             :   }
     273       25600 : }
     274             : 
     275             : template<class T> void FluxRep<T>::
     276             : value(casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& value) const {
     277             :   value = itsVal;
     278             : }
     279             : 
     280         800 : template<class T> void FluxRep<T>::
     281             : value(casacore::Quantum<casacore::Vector<T> >& value) {
     282         800 :   const casacore::Unit& curUnit = value.getFullUnit();
     283         800 :   if (curUnit != itsUnit) {
     284         800 :     value.setUnit(itsUnit);
     285             :   }
     286         800 :   convertPol(ComponentType::STOKES);
     287         800 :   casacore::Vector<T>& newValue = value.getValue();
     288         800 :   if (newValue.nelements() != 4) newValue.resize(4);
     289        4000 :   for (casacore::uInt s = 0 ; s < 4; s++) {
     290        3200 :     newValue(s) = itsVal(s).real();
     291             :   }
     292         800 : }
     293             : 
     294           0 : template<class T> casacore::Quantum<T>  FluxRep<T>::
     295             : value (casacore::Stokes::StokesTypes stokes, casacore::Bool toJy) 
     296             : {
     297           0 :    casacore::LogIO os(casacore::LogOrigin("FluxRep", "value(Stokes::StokesTypes)"));
     298             : 
     299             : // Get the vector of values that we are holding
     300             :   
     301           0 :    casacore::Vector<T> values;
     302           0 :    value(values);
     303             :   
     304             : // Make a quantum for the result
     305             :       
     306           0 :    casacore::Quantum<T> value;
     307           0 :    value.setUnit(unit());
     308             : 
     309             : // Fish it out
     310             :    
     311           0 :    ComponentType::Polarisation cPol = pol();
     312           0 :    if ( (stokes==casacore::Stokes::I || stokes==casacore::Stokes::Q ||
     313           0 :          stokes==casacore::Stokes::U || stokes==casacore::Stokes::V)  &&
     314             :          cPol==ComponentType::STOKES) {
     315             : //
     316           0 :       casacore::String error("Failed to extract Flux from SkyComponent because not enough Stokes values");
     317           0 :       if (stokes==casacore::Stokes::I) {
     318           0 :          if (values.nelements()<1) os << error << casacore::LogIO::EXCEPTION;
     319           0 :          value.setValue(values(0));
     320           0 :       } else if (stokes==casacore::Stokes::Q) {
     321           0 :          if (values.nelements()<2) os << error << casacore::LogIO::EXCEPTION;
     322           0 :          value.setValue(values(1));
     323           0 :       } else if (stokes==casacore::Stokes::U) {
     324           0 :          if (values.nelements()<3) os << error << casacore::LogIO::EXCEPTION;
     325           0 :          value.setValue(values(2));
     326           0 :       } else if (stokes==casacore::Stokes::V) {
     327           0 :          if (values.nelements()<4) os << error << casacore::LogIO::EXCEPTION;
     328           0 :          value.setValue(values(3));
     329             :       }
     330           0 :    } else {
     331           0 :       os << "It is not possible currently to extract the flux value" << std::endl;
     332           0 :       os << "for Stokes type " << casacore::Stokes::name(stokes)  << " from the SkyComponent" << casacore::LogIO::EXCEPTION;
     333             :    }
     334             : //
     335           0 :    if (toJy) value.convert(casacore::Unit("Jy"));
     336           0 :    return value;
     337           0 : }
     338             : 
     339           0 : template<class T> void FluxRep<T>::
     340             : value(casacore::Quantum<casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType> >&
     341             :       value) const {
     342           0 :   const casacore::Unit& curUnit = value.getFullUnit();
     343           0 :   if (curUnit != itsUnit) {
     344           0 :     value.setUnit(itsUnit);
     345             :   }
     346           0 :   casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& newValue = value.getValue();
     347           0 :   if (newValue.nelements() != 4) newValue.resize(4);
     348           0 :   for (casacore::uInt s = 0 ; s < 4; s++) {
     349           0 :     newValue(s) = itsVal(s);
     350             :   }
     351           0 : }
     352             : 
     353           0 : template<class T> void FluxRep<T>::
     354             : setValue(T value) {
     355           0 :   for (casacore::uInt i = 0; i < 4; i++) {
     356           0 :     itsVal(i) = 0.0;
     357             :   }
     358           0 :   itsVal(0) = value;
     359           0 :   itsPol = ComponentType::STOKES;
     360           0 : }
     361             : 
     362           0 : template<class T> void FluxRep<T>::
     363             : setValue(const casacore::Vector<T>& value) {
     364           0 :   for (casacore::uInt i = 0; i < 4; i++) {
     365           0 :     itsVal(i) = value(i);
     366             :   }
     367           0 :   itsPol = ComponentType::STOKES;
     368           0 : }
     369             : 
     370       25600 : template<class T> void FluxRep<T>::
     371             : setValue(const casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& value) {
     372       25600 :   itsVal = value;
     373       25600 : }
     374             : 
     375             : template<class T> void FluxRep<T>::
     376             : setValue(const casacore::Quantum<casacore::Vector<T> >& value) {
     377             :   const casacore::Vector<T>& val = value.getValue();
     378             :   for (casacore::uInt s = 0; s < 4; s++) {
     379             :     itsVal(s) = val(s);
     380             :   }
     381             :   itsUnit = value.getFullUnit();
     382             :   itsPol = ComponentType::STOKES;
     383             : }
     384             : 
     385             : template<class T> void FluxRep<T>::
     386             : setValue(const
     387             :          casacore::Quantum<casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType> >& value,
     388             :          ComponentType::Polarisation pol) {
     389             :   itsVal = value.getValue();
     390             :   itsUnit = value.getFullUnit();
     391             :   itsPol = pol;
     392             : }
     393             : 
     394       26400 : template<class T> casacore::Unit FluxRep<T>::_getConversionUnit(const casacore::Unit& unit) {
     395       26400 :     auto iter = _allowedUnits.begin();
     396       26400 :     auto end = _allowedUnits.end();
     397       26400 :     for (; iter!=end; ++iter) {
     398       26400 :         if (unit.getValue() == iter->getValue()) {
     399       52800 :                     return *iter;
     400             :                 }
     401             :     }
     402           0 :     std::ostringstream oss;
     403             :     using casacore::AipsError;
     404           0 :         ThrowCc(
     405             :         "The flux unit "
     406             :                 + unit.getName()
     407             :         + " has dimensions that are not supported"
     408             :     );
     409           0 : }
     410             : 
     411           0 : template<class T> void FluxRep<T>::setValue(
     412             :                 const casacore::Quantum<T>& value, casacore::Stokes::StokesTypes stokes
     413             : ) {
     414           0 :         casacore::LogIO os(casacore::LogOrigin("FluxRep", "setValue(const Quantum<Double>&, Stokes::StokesTypes)"));
     415           0 :         casacore::Vector<T> tmp(4, 0.0);
     416           0 :         auto conversionUnit = _getConversionUnit(value.getUnit()) ;
     417           0 :         if (stokes==casacore::Stokes::I || stokes==casacore::Stokes::Q || stokes==casacore::Stokes::U || stokes==casacore::Stokes::V) {
     418           0 :                 if (stokes==casacore::Stokes::I) {
     419           0 :                         tmp(0) = value.getValue(casacore::Unit(conversionUnit));
     420           0 :                 } else if (stokes==casacore::Stokes::Q) {
     421           0 :                         tmp(1) = value.getValue(casacore::Unit(conversionUnit));
     422           0 :                 } else if (stokes==casacore::Stokes::U) {
     423           0 :                         tmp(2) = value.getValue(casacore::Unit(conversionUnit));
     424           0 :                 } else if (stokes==casacore::Stokes::V) {
     425           0 :                         tmp(3) = value.getValue(casacore::Unit(conversionUnit));
     426             :                 }
     427             :         }
     428             :         else {
     429           0 :                 os << casacore::LogIO::WARN << "Can only properly handle I,Q,U,V presently." << std::endl;
     430           0 :                 os << "The brightness is assumed to be Stokes I"  << casacore::LogIO::POST;
     431           0 :                 tmp(0) = value.getValue(casacore::Unit("Jy"));
     432             :         }
     433           0 :         setValue(tmp);
     434           0 : }
     435             : 
     436           0 : template<class T> void FluxRep<T>::
     437             : scaleValue(const T& factor) {
     438           0 :   itsVal(0) *= factor;
     439           0 : }
     440             : 
     441           0 : template<class T> void FluxRep<T>::
     442             : scaleValue(const T& factor0, const T& factor1, 
     443             :            const T& factor2, const T& factor3) {
     444           0 :   itsVal(0) *= factor0;
     445           0 :   itsVal(1) *= factor1;
     446           0 :   itsVal(2) *= factor2;
     447           0 :   itsVal(3) *= factor3;
     448           0 : }
     449             : 
     450             : template<class T> void FluxRep<T>::
     451             : scaleValue(const typename  casacore::NumericTraits<T>::ConjugateType& factor) {
     452             :   itsVal(0) *= factor;
     453             : }
     454             : 
     455             : template<class T> void FluxRep<T>::
     456             : scaleValue(const typename casacore::NumericTraits<T>::ConjugateType& factor0,
     457             :            const typename casacore::NumericTraits<T>::ConjugateType& factor1,
     458             :            const typename casacore::NumericTraits<T>::ConjugateType& factor2,
     459             :            const typename casacore::NumericTraits<T>::ConjugateType& factor3) {
     460             :   itsVal(0) *= factor0;
     461             :   itsVal(1) *= factor1;
     462             :   itsVal(2) *= factor2;
     463             :   itsVal(3) *= factor3;
     464             : }
     465             : 
     466       25600 : template<class T> void FluxRep<T>::
     467             : setErrors(const typename casacore::NumericTraits<T>::ConjugateType& error0,
     468             :           const typename casacore::NumericTraits<T>::ConjugateType& error1,
     469             :           const typename casacore::NumericTraits<T>::ConjugateType& error2,
     470             :           const typename casacore::NumericTraits<T>::ConjugateType& error3) {
     471       25600 :   itsErr(0) = error0;
     472       25600 :   itsErr(1) = error1;
     473       25600 :   itsErr(2) = error2;
     474       25600 :   itsErr(3) = error3;
     475       25600 : }
     476             : 
     477             : template<class T> void FluxRep<T>::setErrors(
     478             :         const casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& errors
     479             : ) {
     480             :         itsErr = errors;
     481             : }
     482             : 
     483             : 
     484             : template<class T> const
     485         800 : casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& FluxRep<T>::errors() const {
     486         800 :   return itsErr;
     487             : }
     488             : 
     489       25600 : template<class T> casacore::Bool FluxRep<T>::
     490             : fromRecord(casacore::String& errorMessage, const casacore::RecordInterface& record) {
     491       25600 :   ComponentType::Polarisation newPol = ComponentType::UNKNOWN_POLARISATION;
     492             :   {
     493       25600 :     const casacore::String polarisationString("polarisation");
     494       25600 :     if (!record.isDefined(polarisationString)) {
     495           0 :       casacore::LogIO logErr(casacore::LogOrigin("FluxRep", "fromRecord()"));
     496             :       logErr << casacore::LogIO::WARN 
     497             :              << "The flux does not have a 'polarisation' field." << std::endl
     498             :              << "Using the default of Stokes"
     499           0 :              << casacore::LogIO::POST;
     500           0 :       setPol(ComponentType::STOKES);
     501           0 :     } else {
     502       25600 :       const casacore::RecordFieldId polarisation(polarisationString);
     503             :       // Maybe the polarisation field should contain ["I", "Q", "U", "V"]. This
     504             :       // is harder to parse but more flexible for the future.
     505       25600 :       if (record.dataType(polarisation) != casacore::TpString) {
     506           0 :         errorMessage += "The 'polarisation' field must be a record\n";
     507           0 :         return false;
     508             :       }      
     509       25600 :       if (record.shape(polarisation) != casacore::IPosition(1,1)) {
     510           0 :         errorMessage += "The 'polarisation' field must have only 1 element\n";
     511           0 :         return false;
     512             :       } 
     513       25600 :       const casacore::String polVal = record.asString(polarisation);
     514       25600 :       newPol = ComponentType::polarisation(polVal);
     515       25600 :       if (newPol == ComponentType::UNKNOWN_POLARISATION) {
     516           0 :         errorMessage += casacore::String("The polarisation type is not known.\n") +
     517           0 :           casacore::String("Allowed values are 'Stokes', 'Linear' & 'Circular'\n");
     518           0 :         return false;
     519             :       }
     520       25600 :     }
     521       25600 :   }
     522       25600 :   setPol(newPol);
     523             :   {
     524       25600 :     casacore::QuantumHolder qh;
     525       25600 :     if (!qh.fromRecord(errorMessage, record)) {
     526           0 :       errorMessage += "Could not parse the flux record\n";
     527           0 :       return false;
     528             :     }
     529       25600 :     if (qh.isScalar() && pol() == ComponentType::STOKES) {
     530           0 :       if (qh.isReal()) {
     531           0 :         const casacore::Quantum<casacore::Double>& qVal = qh.asQuantumDouble();
     532           0 :         setValue(qVal.getValue());
     533           0 :         setUnit(qVal.getFullUnit());
     534             :       } else {
     535           0 :         const casacore::Quantum<casacore::DComplex>& qVal = qh.asQuantumDComplex();
     536           0 :         const casacore::DComplex& val = qVal.getValue();
     537           0 :         if (! casacore::nearAbs(val.imag(), 0.0, casacore::NumericTraits<T>::minimum)) {
     538           0 :           errorMessage += "I value cannot be complex\n";
     539           0 :           return false;
     540             :         }
     541           0 :         setValue(T(val.real()));
     542           0 :         setUnit(qVal.getFullUnit());
     543             :       }
     544           0 :       casacore::LogIO logErr(casacore::LogOrigin("FluxRep", "fromRecord()"));
     545             :       logErr << casacore::LogIO::WARN
     546             :              << "Only the I flux specified. Assuming Q, U, & V are zero\n" 
     547           0 :              << casacore::LogIO::POST;
     548           0 :     } else {
     549       25600 :       if (qh.nelements() != 4u) {
     550           0 :         errorMessage += casacore::String("Must specify all 4 flux values\n")
     551           0 :           + casacore::String("if the polarisation representation is not Stokes\n");
     552           0 :         return false;
     553             :       }
     554       25600 :       if (qh.isQuantumVectorDouble()) {
     555       25600 :         const casacore::Quantum<casacore::Vector<casacore::Double> > qVal = qh.asQuantumVectorDouble();
     556       25600 :         setUnit(qVal.getFullUnit());
     557       25600 :         casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType> val(4);
     558       25600 :         convertArray(val, qVal.getValue());
     559       25600 :         setValue(val);
     560       25600 :       } else if (qh.isQuantumVectorDComplex()) {
     561           0 :         const casacore::Quantum<casacore::Vector<casacore::DComplex> >& qVal = qh.asQuantumVectorDComplex();
     562           0 :         setUnit(qVal.getFullUnit());
     563           0 :         casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType> val(4);
     564           0 :         convertArray(val, qVal.getValue());
     565           0 :         setValue(val);
     566           0 :       } else if (qh.isQuantumVectorComplex()) {
     567           0 :         const casacore::Quantum<casacore::Vector<casacore::Complex> >& qVal = qh.asQuantumVectorComplex();
     568           0 :         setUnit(qVal.getFullUnit());
     569           0 :         casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType> val(4);
     570           0 :         convertArray(val, qVal.getValue());
     571           0 :         setValue(val);
     572           0 :       } else if (qh.isQuantumVectorFloat()) {
     573           0 :         const casacore::Quantum<casacore::Vector<casacore::Float> >& qVal = qh.asQuantumVectorFloat();
     574           0 :         setUnit(qVal.getFullUnit());
     575           0 :         casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType> val(4);
     576           0 :         convertArray(val, qVal.getValue());
     577           0 :         setValue(val);
     578           0 :       } else if (qh.isQuantumVectorInt()) {
     579           0 :         const casacore::Quantum<casacore::Vector<casacore::Int> >& qVal = qh.asQuantumVectorInt();
     580           0 :         setUnit(qVal.getFullUnit());
     581           0 :         casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType> val(4);
     582           0 :         convertArray(val, qVal.getValue());
     583           0 :         setValue(val);
     584           0 :       } else {
     585           0 :         errorMessage += "value field must be a real or complex vector\n";
     586           0 :         return false;
     587             :       }
     588             :     }
     589       25600 :   }
     590             :   {
     591       25600 :     const casacore::String errorString("error");
     592       25600 :     if (record.isDefined(errorString)) {
     593       25600 :       const casacore::RecordFieldId error(errorString);
     594       25600 :       casacore::Vector<casacore::DComplex> err(4, casacore::DComplex(0.0, 0.0));
     595       25600 :       if  (record.shape(error) != casacore::IPosition(1,4)) {
     596           0 :         errorMessage += 
     597             :           "The 'error' field must be a vector with 4 elements\n";
     598           0 :         return false;
     599             :       }
     600       25600 :       if (record.dataType(error) == casacore::TpArrayDouble &&
     601             :           newPol == ComponentType::STOKES) {
     602       25600 :         convertArray(err, record.asArrayDouble(error));
     603           0 :       } else if (record.dataType(error) == casacore::TpArrayDComplex) {
     604           0 :         err = record.asArrayDComplex(error);
     605             :       } else {
     606           0 :         errorMessage += 
     607             :           "The 'error' field must be a complex vector with 4 elements\n";
     608           0 :         return false;
     609             :       }
     610       25600 :       setErrors(err(0), err(1), err(2), err(3));
     611       25600 :     }
     612       25600 :   }
     613       25600 :   if (unit() != casacore::Unit("Jy") && unit() != casacore::Unit("K.rad.rad")) {
     614           0 :     errorMessage += "The dimensions of the units must be same as the Jy\n";
     615           0 :     return false;
     616             :   }
     617       25600 :   if (!ok()) {
     618           0 :     errorMessage += "Inconsistencies in the FluxRep object\n";
     619           0 :     return false;
     620             :   }
     621       25600 :   return true;
     622             : }
     623             : 
     624         800 : template<class T> casacore::Bool FluxRep<T>::
     625             : toRecord(casacore::String& errorMessage, casacore::RecordInterface& record) const {
     626         800 :   if (!ok()) {
     627           0 :     errorMessage += "Inconsistancies in the FluxRep object\n";
     628           0 :     return false;
     629             :   }
     630         800 :   casacore::QuantumHolder qh;
     631         800 :   if (pol() == ComponentType::STOKES) {
     632         800 :     FluxRep<T> fluxCopy = *this;
     633         800 :     casacore::Quantum<casacore::Vector<T> > qVal;
     634         800 :     fluxCopy.value(qVal);
     635         800 :     qh = casacore::QuantumHolder(qVal);
     636         800 :   } else {
     637           0 :     casacore::Quantum<casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType> > qVal;
     638           0 :     value(qVal);
     639           0 :     qh = casacore::QuantumHolder(qVal);
     640           0 :   }
     641         800 :   if (!qh.toRecord(errorMessage, record)) {
     642           0 :     errorMessage += "Problem generating the flux record\n";
     643           0 :     return false;
     644             :   }
     645         800 :   record.define(casacore::RecordFieldId("polarisation"), ComponentType::name(pol()));
     646         800 :   if (pol() != ComponentType::STOKES) {
     647           0 :     record.define(casacore::RecordFieldId("error"), errors());
     648             :   } else {
     649         800 :     casacore::Vector<T> realErr(4);
     650         800 :     real(realErr, errors());
     651         800 :     record.define(casacore::RecordFieldId("error"), realErr);
     652         800 :   }
     653         800 :   return true;
     654         800 : }
     655             : 
     656             : 
     657       26400 : template<class T> casacore::Bool FluxRep<T>::ok() const {
     658             :         // The casacore::LogIO class is only constructed if an Error is detected for
     659             :         // performance reasons. Both function static and file static variables
     660             :         // where considered and rejected for this purpose.
     661       26400 :         if (itsVal.nelements() != 4) {
     662           0 :                 casacore::LogIO logErr(casacore::LogOrigin("FluxRep", "ok()"));
     663             :                 logErr << casacore::LogIO::SEVERE << "The flux does not have 4 elements"
     664             :                                 << " (corresponding to four polarisations)"
     665           0 :                                 << casacore::LogIO::POST;
     666           0 :                 return false;
     667           0 :         }
     668       26400 :     _getConversionUnit(itsUnit);
     669       26400 :     return true;
     670             : }
     671             : 
     672     2611205 : template<class T> Flux<T>::
     673             : Flux()
     674     2611205 :   :itsFluxPtr(new FluxRep<T>)
     675             : {
     676     2611205 : }
     677             : 
     678           0 : template<class T> Flux<T>::
     679             : Flux(T i)
     680           0 :   :itsFluxPtr(new FluxRep<T>(i))
     681             : {
     682           0 : }
     683             : 
     684           4 : template<class T> Flux<T>::
     685             : Flux(T i, T q, T u, T v)
     686           4 :  :itsFluxPtr(new FluxRep<T>(i, q, u, v))
     687             : {
     688           4 : }
     689             : 
     690             : template<class T> Flux<T>::
     691             : Flux(typename casacore::NumericTraits<T>::ConjugateType xx,
     692             :      typename casacore::NumericTraits<T>::ConjugateType xy,
     693             :      typename casacore::NumericTraits<T>::ConjugateType yx,
     694             :      typename casacore::NumericTraits<T>::ConjugateType yy, 
     695             :      ComponentType::Polarisation pol)  
     696             :   :itsFluxPtr(new FluxRep<T>(xx, xy, yx, yy, pol))
     697             : {
     698             : }
     699             : 
     700     2560000 : template<class T> Flux<T>::
     701             : Flux(const casacore::Vector<T>& flux)
     702     2560000 :   :itsFluxPtr(new FluxRep<T>(flux))
     703             : {
     704     2560000 : }
     705             : 
     706       25601 : template<class T> Flux<T>::
     707             : Flux(const casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& flux,
     708             :      ComponentType::Polarisation pol)
     709       25601 :   :itsFluxPtr(new FluxRep<T>(flux, pol))
     710             : {
     711       25601 : }
     712             :   
     713             : template<class T> Flux<T>::
     714             : Flux(const casacore::Quantum<casacore::Vector<T> >& flux)
     715             :   :itsFluxPtr(new FluxRep<T>(flux))
     716             : {
     717             : }
     718             : 
     719           0 : template<class T> Flux<T>::
     720             : Flux(const Flux<T>& other) 
     721           0 :   :itsFluxPtr(other.itsFluxPtr)
     722             : { 
     723           0 : }
     724             : 
     725     5196809 : template<class T> Flux<T>::
     726             : ~Flux() {
     727     5196809 : }
     728             : 
     729     2560003 : template<class T> Flux<T>& Flux<T>::
     730             : operator=(const Flux<T>& other) {
     731     2560003 :   if (this != &other) {
     732     2560003 :     itsFluxPtr = other.itsFluxPtr;
     733             :   }
     734     2560003 :   return *this;
     735             : }
     736             : 
     737       25601 : template<class T> Flux<T> Flux<T>::
     738             : copy() const {
     739       25601 :   Flux<T> newFlux(value(), pol());
     740       25601 :   newFlux.setUnit(unit());
     741       25601 :   return newFlux;
     742           0 : }
     743             : 
     744       25601 : template<class T> const casacore::Unit& Flux<T>::
     745             : unit() const {
     746       25601 :   return itsFluxPtr->unit();
     747             : }
     748             : 
     749             : template<class T> void Flux<T>::
     750             : unit(casacore::Unit& unit) const {
     751             :   itsFluxPtr->unit(unit);
     752             : }
     753             : 
     754       25601 : template<class T> void Flux<T>::
     755             : setUnit(const casacore::Unit& unit) {
     756       25601 :   itsFluxPtr->setUnit(unit);
     757       25601 : }
     758             : 
     759       25600 : template<class T> void Flux<T>::
     760             : convertUnit(const casacore::Unit& unit) {
     761       25600 :   itsFluxPtr->convertUnit(unit);
     762       25600 : }
     763             : 
     764     2585601 : template<class T> ComponentType::Polarisation Flux<T>::
     765             : pol() const {
     766     2585601 :   return itsFluxPtr->pol();
     767             : }
     768             : 
     769             : template<class T> void Flux<T>::
     770             : pol(ComponentType::Polarisation& pol) const {
     771             :   itsFluxPtr->pol(pol);
     772             : }
     773             : 
     774           0 : template<class T> void Flux<T>::
     775             : setPol(ComponentType::Polarisation pol) {
     776           0 :   itsFluxPtr->setPol(pol);
     777           0 : }
     778             : 
     779     2585600 : template<class T> void Flux<T>::
     780             : convertPol(ComponentType::Polarisation pol) {
     781     2585600 :   itsFluxPtr->convertPol(pol);
     782     2585600 : }
     783             : 
     784             : template<class T> const
     785       25601 : casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& Flux<T>::value() const {
     786       25601 :   return itsFluxPtr->value();
     787             : }
     788             : 
     789   112320000 : template<class T> const typename casacore::NumericTraits<T>::ConjugateType& Flux<T>::
     790             : value(casacore::uInt p) const {
     791   112320000 :   return itsFluxPtr->value(p);
     792             : }
     793             : 
     794       25600 : template<class T> void Flux<T>::
     795             : value(casacore::Vector<T>& value) {
     796       25600 :   itsFluxPtr->value(value);
     797       25600 : }
     798             : 
     799             : template<class T> void Flux<T>::
     800             : value(casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& value) const {
     801             :   itsFluxPtr->value(value);
     802             : }
     803             : 
     804             : template<class T> void Flux<T>::
     805             : value(casacore::Quantum<casacore::Vector<T> >& value) {
     806             :   itsFluxPtr->value(value);
     807             : }
     808             : 
     809           0 : template<class T> void Flux<T>::
     810             : value(casacore::Quantum<casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType> >&
     811             :       value) const {
     812           0 :   itsFluxPtr->value(value);
     813           0 : }
     814             : 
     815           0 : template<class T> casacore::Quantum<T>  Flux<T>::
     816             : value (casacore::Stokes::StokesTypes stokes, casacore::Bool toJy) 
     817             : {
     818           0 :   return itsFluxPtr->value(stokes, toJy);
     819             : }
     820             : 
     821             : 
     822             : 
     823           0 : template<class T> void Flux<T>::
     824             : setValue(T value) {
     825           0 :   itsFluxPtr->setValue(value);
     826           0 : }
     827             : 
     828           0 : template<class T> void Flux<T>::
     829             : setValue(const casacore::Vector<T>& value) {
     830           0 :   itsFluxPtr->setValue(value);
     831           0 : }
     832             : 
     833           0 : template<class T> void Flux<T>::
     834             : setValue(const casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& value) {
     835           0 :   itsFluxPtr->setValue(value);
     836           0 : }
     837             : 
     838             : template<class T> void Flux<T>::
     839             : setValue(const casacore::Quantum<casacore::Vector<T> >& value) {
     840             :   itsFluxPtr->setValue(value);
     841             : }
     842             : 
     843             : template<class T> void Flux<T>::
     844             : setValue(const
     845             :          casacore::Quantum<casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType> >& value,
     846             :          ComponentType::Polarisation pol) {
     847             :   itsFluxPtr->setValue(value, pol);
     848             : }
     849             : 
     850           0 : template<class T> void Flux<T>::
     851             : setValue(const casacore::Quantum<T>& value, casacore::Stokes::StokesTypes stokes)
     852             : {
     853           0 :   itsFluxPtr->setValue(value, stokes);
     854           0 : }
     855             : 
     856           0 : template<class T> void Flux<T>::
     857             : scaleValue(const T& factor) {
     858           0 :   itsFluxPtr->scaleValue(factor);
     859           0 : }
     860             : 
     861           0 : template<class T> void Flux<T>::
     862             : scaleValue(const T& factor0, const T& factor1, 
     863             :            const T& factor2, const T& factor3) {
     864           0 :   itsFluxPtr->scaleValue(factor0, factor1, factor2, factor3);
     865           0 : }
     866             : 
     867             : template<class T> void Flux<T>::
     868             : scaleValue(const typename casacore::NumericTraits<T>::ConjugateType& factor) {
     869             :   itsFluxPtr->scaleValue(factor);
     870             : }
     871             : 
     872             : template<class T> void Flux<T>::
     873             : scaleValue(const typename casacore::NumericTraits<T>::ConjugateType& factor0,
     874             :            const typename casacore::NumericTraits<T>::ConjugateType& factor1,
     875             :            const typename casacore::NumericTraits<T>::ConjugateType& factor2,
     876             :            const typename casacore::NumericTraits<T>::ConjugateType& factor3) {
     877             :   itsFluxPtr->scaleValue(factor0, factor1, factor2, factor3);
     878             : }
     879             : 
     880           0 : template<class T> void Flux<T>::
     881             : setErrors(const typename casacore::NumericTraits<T>::ConjugateType& error0,
     882             :           const typename casacore::NumericTraits<T>::ConjugateType& error1,
     883             :           const typename casacore::NumericTraits<T>::ConjugateType& error2,
     884             :           const typename casacore::NumericTraits<T>::ConjugateType& error3) {
     885           0 :   itsFluxPtr->setErrors(error0, error1, error2, error3);
     886           0 : }
     887             : 
     888             : template<class T> void Flux<T>::setErrors(
     889             :         const casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& errors
     890             : ) {
     891             :         itsFluxPtr->setErrors(errors);
     892             : }
     893             : 
     894             : 
     895             : template<class T> const
     896           0 : casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& Flux<T>::errors() const {
     897           0 :   return itsFluxPtr->errors();
     898             : }
     899             : 
     900       25600 : template<class T> casacore::Bool Flux<T>::
     901             : fromRecord(casacore::String& errorMessage, const casacore::RecordInterface& record) {
     902       25600 :   return itsFluxPtr->fromRecord(errorMessage, record);
     903             : }
     904             : 
     905         800 : template<class T> casacore::Bool Flux<T>::
     906             : toRecord(casacore::String& errorMessage, casacore::RecordInterface& record) const {
     907         800 :   return itsFluxPtr->toRecord(errorMessage, record);
     908             : }
     909             : 
     910             : template<class T> casacore::Bool Flux<T>::
     911             : ok() const {
     912             :   if (itsFluxPtr.null() == true) {
     913             :     casacore::LogIO logErr(casacore::LogOrigin("Flux", "ok()"));
     914             :     logErr << casacore::LogIO::SEVERE << "Internal pointer is not pointing to anything"
     915             :            << casacore::LogIO::POST;
     916             :     return false;
     917             :   }
     918             :   if (itsFluxPtr->ok() == false) {
     919             :     casacore::LogIO logErr(casacore::LogOrigin("Flux", "ok()"));
     920             :     logErr << casacore::LogIO::SEVERE << "Flux representation is not ok"
     921             :            << casacore::LogIO::POST;
     922             :     return false;
     923             :   }
     924             :   return true;
     925             : }
     926             : 
     927             : template<class T> void Flux<T>::
     928             : stokesToCircular(casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& out, 
     929             :                  const casacore::Vector<T>& in) {
     930             :   const T i = in(0);
     931             :   const T q = in(1);
     932             :   const T u = in(2);
     933             :   const T v = in(3);
     934             :   out(0) = typename casacore::NumericTraits<T>::ConjugateType(i + v);
     935             :   out(1) = typename casacore::NumericTraits<T>::ConjugateType(q, u);
     936             :   out(2) = typename casacore::NumericTraits<T>::ConjugateType(q, -u);
     937             :   out(3) = typename casacore::NumericTraits<T>::ConjugateType(i - v);
     938             : }
     939             : 
     940     2585600 : template<class T> void Flux<T>::
     941             : stokesToCircular(casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& out, 
     942             :                  const casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& in) {
     943     2585600 :   const typename casacore::NumericTraits<T>::ConjugateType i = in(0);
     944     2585600 :   const typename casacore::NumericTraits<T>::ConjugateType q = in(1);
     945     2585600 :   const typename casacore::NumericTraits<T>::ConjugateType& u = in(2);
     946     2585600 :   const typename casacore::NumericTraits<T>::ConjugateType ju(-u.imag(), u.real());
     947     2585600 :   const typename casacore::NumericTraits<T>::ConjugateType v = in(3);
     948     2585600 :   out(0) = i + v;
     949     2585600 :   out(1) = q + ju;
     950     2585600 :   out(2) = q - ju;
     951     2585600 :   out(3) = i - v;
     952     2585600 : }
     953             : 
     954             : template<class T> void Flux<T>::
     955             : circularToStokes(casacore::Vector<T>& out,
     956             :                  const casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& in) {
     957             :   const T rr = in(0).real();
     958             :   const typename casacore::NumericTraits<T>::ConjugateType rl = in(1);
     959             :   const typename casacore::NumericTraits<T>::ConjugateType lr = in(2);
     960             :   const T ll = in(3).real();
     961             :   const T two(2);
     962             :   out(0) = (rr + ll)/two;
     963             :   out(1) = (rl.real() + lr.real())/two;
     964             :   out(2) = (rl.imag() - lr.imag())/two;
     965             :   out(3) = (rr - ll)/two;
     966             : }
     967             : 
     968       25600 : template<class T> void Flux<T>::
     969             : circularToStokes(casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& out,
     970             :                  const casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& in) {
     971       25600 :   const typename casacore::NumericTraits<T>::ConjugateType rr = in(0);
     972       25600 :   const typename casacore::NumericTraits<T>::ConjugateType rl = in(1);
     973       25600 :   const typename casacore::NumericTraits<T>::ConjugateType lr = in(2);
     974       25600 :   const typename casacore::NumericTraits<T>::ConjugateType ll = in(3);
     975       25600 :   const T two(2);
     976       25600 :   out(0) = (rr + ll)/two;
     977       25600 :   out(1) = (rl + lr)/two;
     978       25600 :   out(2) = typename casacore::NumericTraits<T>::ConjugateType((rl.imag()-lr.imag())/two,
     979       25600 :                                            (lr.real()-rl.real())/two);
     980       25600 :   out(3) = (rr - ll)/two;
     981       25600 : }
     982             : 
     983             : template<class T> void Flux<T>::
     984             : stokesToLinear(casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& out, 
     985             :                const casacore::Vector<T>& in) {
     986             :   const T i = in(0);
     987             :   const T q = in(1);
     988             :   const T u = in(2);
     989             :   const T v = in(3);
     990             :   out(0) = typename casacore::NumericTraits<T>::ConjugateType(i + q);
     991             :   out(1) = typename casacore::NumericTraits<T>::ConjugateType(u, v);
     992             :   out(2) = typename casacore::NumericTraits<T>::ConjugateType(u, -v);
     993             :   out(3) = typename casacore::NumericTraits<T>::ConjugateType(i - q);
     994             : }
     995             : 
     996           0 : template<class T> void Flux<T>::
     997             : stokesToLinear(casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& out, 
     998             :                const casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& in) {
     999           0 :   const typename casacore::NumericTraits<T>::ConjugateType i = in(0);
    1000           0 :   const typename casacore::NumericTraits<T>::ConjugateType q = in(1);
    1001           0 :   const typename casacore::NumericTraits<T>::ConjugateType u = in(2);
    1002           0 :   const typename casacore::NumericTraits<T>::ConjugateType& v = in(3);
    1003           0 :   const typename casacore::NumericTraits<T>::ConjugateType jv(-v.imag(), v.real());
    1004           0 :   out(0) = i + q;
    1005           0 :   out(1) = u + jv;
    1006           0 :   out(2) = u - jv;
    1007           0 :   out(3) = i - q;
    1008           0 : }
    1009             : 
    1010             : template<class T> void Flux<T>::
    1011             : linearToStokes(casacore::Vector<T>& out, 
    1012             :                const casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& in) {
    1013             :   const T xx = in(0).real();
    1014             :   const typename casacore::NumericTraits<T>::ConjugateType xy = in(1);
    1015             :   const typename casacore::NumericTraits<T>::ConjugateType yx = in(2);
    1016             :   const T yy = in(3).real();
    1017             :   const T two(2);
    1018             :   out(0) = (xx + yy)/two;
    1019             :   out(1) = (xx - yy)/two;
    1020             :   out(2) = (xy.real() + xy.real())/two;
    1021             :   out(3) = (xy.imag() - yx.imag())/two;
    1022             : }
    1023             : 
    1024           0 : template<class T> void Flux<T>::
    1025             : linearToStokes(casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& out, 
    1026             :                const casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& in) {
    1027           0 :   const typename casacore::NumericTraits<T>::ConjugateType xx = in(0);
    1028           0 :   const typename casacore::NumericTraits<T>::ConjugateType xy = in(1);
    1029           0 :   const typename casacore::NumericTraits<T>::ConjugateType yx = in(2);
    1030           0 :   const typename casacore::NumericTraits<T>::ConjugateType yy = in(3);
    1031           0 :   const T two(2);
    1032           0 :   out(0) = (xx + yy)/two;
    1033           0 :   out(1) = (xx - yy)/two;
    1034           0 :   out(2) = (xy + yx)/two;
    1035           0 :   out(3) = typename casacore::NumericTraits<T>::ConjugateType((xy.imag()-yx.imag())/two,
    1036           0 :                                            (yx.real()-xy.real())/two);
    1037           0 : }
    1038             : 
    1039           0 : template<class T> void Flux<T>::
    1040             : linearToCircular(casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& out, 
    1041             :                  const casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& in) {
    1042           0 :   const typename casacore::NumericTraits<T>::ConjugateType xx = in(0);
    1043           0 :   const typename casacore::NumericTraits<T>::ConjugateType& xy = in(1);
    1044           0 :   const typename casacore::NumericTraits<T>::ConjugateType jxy(-xy.imag(), xy.real());
    1045           0 :   const typename casacore::NumericTraits<T>::ConjugateType& yx = in(2);
    1046           0 :   const typename casacore::NumericTraits<T>::ConjugateType jyx(-yx.imag(), yx.real());
    1047           0 :   const typename casacore::NumericTraits<T>::ConjugateType yy = in(3);
    1048           0 :   const T two(2);
    1049           0 :   out(0) = (xx - jxy + jyx + yy)/two;
    1050           0 :   out(1) = (xx + jxy + jyx - yy)/two;
    1051           0 :   out(2) = (xx - jxy - jyx - yy)/two;
    1052           0 :   out(3) = (xx + jxy - jyx + yy)/two;
    1053           0 : }
    1054             : 
    1055           0 : template<class T> void Flux<T>::
    1056             : circularToLinear(casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& out, 
    1057             :                  const casacore::Vector<typename casacore::NumericTraits<T>::ConjugateType>& in) {
    1058           0 :   const typename casacore::NumericTraits<T>::ConjugateType rr = in(0);
    1059           0 :   const typename casacore::NumericTraits<T>::ConjugateType rl = in(1);
    1060           0 :   const typename casacore::NumericTraits<T>::ConjugateType lr = in(2);
    1061           0 :   const typename casacore::NumericTraits<T>::ConjugateType ll = in(3);
    1062           0 :   const T two(2);
    1063           0 :   out(0) = (rr + rl + lr + ll)/two;
    1064           0 :   out(1) = typename casacore::NumericTraits<T>::ConjugateType(
    1065           0 :                      (-rr.imag() + rl.imag() - lr.imag() + ll.imag())/two,
    1066           0 :                      ( rr.real() - rl.real() + lr.real() - ll.real())/two);
    1067           0 :   out(2) = typename casacore::NumericTraits<T>::ConjugateType(
    1068           0 :                      ( rr.imag() + rl.imag() - lr.imag() - ll.imag())/two,
    1069           0 :                      (-rr.real() - rl.real() + lr.real() + ll.real())/two);
    1070           0 :   out(3) = (rr - rl - lr + ll)/two;
    1071           0 : }
    1072             : // Local Variables: 
    1073             : // compile-command: "gmake Flux"
    1074             : // End: 
    1075             : 
    1076             : } //# NAMESPACE CASA - END
    1077             : 

Generated by: LCOV version 1.16