LCOV - code coverage report
Current view: top level - synthesis/TransformMachines - PolOuterProduct.h (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 49 60 81.7 %
Date: 2024-10-10 11:40:37 Functions: 4 13 30.8 %

          Line data    Source code
       1             : //# PolOuterProduct.h: Definition for PolOuterProduct
       2             : //# Copyright (C) 2007
       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 adressed 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             : //#
      27             : //# $Id$
      28             : 
      29             : #ifndef SYNTHESIS_POLOUTERPRODUCT_H
      30             : #define SYNTHESIS_POLOUTERPRODUCT_H
      31             : 
      32             : 
      33             : #include <casacore/casa/Arrays/Vector.h>
      34             : #include <casacore/casa/Arrays/Matrix.h>
      35             : #include <casacore/scimath/Mathematics/RigidVector.h>
      36             : #include <casacore/coordinates/Coordinates/StokesCoordinate.h>
      37             : #include <casacore/ms/MeasurementSets/MSIter.h> // Just to get MSIter::{Linear,Circular}!
      38             : #include <synthesis/TransformMachines/CFDefs.h>
      39             : namespace casa{
      40             :   // <summary>  
      41             :   //  Class to encapsulate the A-Term outer product (the Mueller casacore::Matrix in feed-polarization basis)
      42             :   // </summary>
      43             :   
      44             :   // <use visibility=export>
      45             :   // <prerequisite>
      46             :   // </prerequisite>
      47             :   // <etymology>
      48             :   //   
      49             :   // </etymology>
      50             :   //
      51             :   // <synopsis> 
      52             :   // 
      53             :   //</synopsis>
      54             :   using namespace CFDefs;
      55             :   class PolOuterProduct 
      56             :   {
      57             :     public:
      58             :     enum GenericVBPol {GPP, GPQ, GQP, GQQ, JUSTWRONGVBPOL};
      59             :     enum CrossPolGeneric{PP,     PP2Q,   P2QP,   P2QP2Q,
      60             :                          PQ2P,   PQ,     P2QQ2P, P2QQ,
      61             :                          Q2PP,   Q2PP2Q, QP,     QP2Q,
      62             :                          Q2PQ2P, Q2PQ,   QQ2P,   QQ,
      63             :                          JUSTWRONGGENERIC};
      64             :     enum CrossPolCircular{RR,     RR2L,   R2LR,   R2LR2L,
      65             :                           RL2R,   RL,     R2LL2R, R2LL,
      66             :                           L2RR,   L2RR2L, LR,     LR2L,
      67             :                           L2RL2R, L2RL,   LL2R,   LL,
      68             :                           JUSTWRONGCIRCULAR};
      69             :     enum CrossPolLinear{XX,     XX2Y,   X2YX,   X2YX2Y,
      70             :                         XY2X,   XY,     X2YY2X, X2YY,
      71             :                         Y2XX,   Y2XX2Y, YX,     YX2Y,
      72             :                         Y2XY2X, Y2XY,   YY2X,   YY,
      73             :                         JUSTWRONGLINEAR};
      74             :     enum MuellerType {DIAGONAL=0, HYBRID, FULL};
      75             :     //
      76             :     //========================= Administrative Parts ==========================
      77             :     //------------------------------------------------------------------
      78             :     //
      79           1 :     PolOuterProduct (MuellerType type=DIAGONAL) //set to diagonal which is what was originally defaulted to be. 
      80           1 :     {
      81           1 :       polMap_p.resize(4,4);polMap_p=-1;
      82           1 :       init(type);
      83           1 :     };
      84             :     //
      85             :     //------------------------------------------------------------------
      86             :     //
      87             :     PolOuterProduct (const casacore::Matrix<casacore::Int>& polMap) 
      88             :     {
      89             :       //      assert(polMap.shape() == casacore::IPosition(2,4,4));
      90             : 
      91             :       polMap_p.assign(polMap); 
      92             :       init();
      93             :     };
      94             :     //
      95             :     //------------------------------------------------------------------
      96             :     //
      97           0 :     virtual ~PolOuterProduct () {};
      98             :     //
      99             :     //============================= casacore::Functional Parts ============================
     100             :     //------------------------------------------------------------------
     101             :     //
     102           1 :     void init(MuellerType type=DIAGONAL)
     103             :     {
     104           1 :       muellerType_p = type;
     105           1 :       makeMap();
     106           1 :       nelement_p=countNElements();
     107           1 :     };
     108             :     //
     109             :     //------------------------------------------------------------------
     110             :     //
     111             :     void makePolMap(const casacore::Vector<CrossPolCircular>& pols);
     112             :     //
     113             :     //------------------------------------------------------------------
     114             :     //
     115           0 :     inline void setElement(const casacore::RigidVector<casacore::Int,2>& element,const casacore::Int& pos)   
     116           0 :     {polMap_p(element(0),element(1)) = pos;}
     117             :     //
     118             :     //------------------------------------------------------------------
     119             :     //
     120           0 :     inline void setElement(const CrossPolCircular& element, const casacore::Int& pos)             
     121           0 :     {casacore::RigidVector<casacore::Int,2> loc=getMuellerElement(element); setElement(loc,pos);}
     122             :     //
     123             :     //------------------------------------------------------------------
     124             :     //
     125             :     inline casacore::Int getPolEnum(const casacore::RigidVector<casacore::Int, 2>& element)   
     126             :     {return invIndexMap_p(element(0), element(1));};
     127             :     //
     128             :     //------------------------------------------------------------------
     129             :     //
     130           0 :     inline casacore::RigidVector<casacore::Int,2> getMuellerElement(const CrossPolCircular& element) 
     131           0 :     {return indexMap_p(element);}
     132             :     //
     133             :     //------------------------------------------------------------------
     134             :     //
     135             :     inline casacore::Bool isSet(const casacore::RigidVector<casacore::Int,2> element)
     136             :     {return (polMap_p(element(0), element(1)) >= 0);};
     137             :     //
     138             :     //------------------------------------------------------------------
     139             :     //
     140             :     inline casacore::Bool isSet(const CrossPolCircular& element) 
     141             :     {return isSet(getMuellerElement(element));}
     142             :     //
     143             :     //------------------------------------------------------------------
     144             :     //
     145           1 :     inline casacore::Int countNElements() 
     146             :     {
     147           1 :       casacore::Int n=0;
     148           5 :       for (casacore::Int i=0;i<4;i++)
     149          20 :         for (casacore::Int j=0;j<4;j++)
     150          16 :           if (polMap_p(i,j) >= 0) n++;
     151           1 :       return n;
     152             :     }
     153             :     //
     154             :     //------------------------------------------------------------------
     155             :     //
     156             :     inline casacore::Int nelements() {return nelement_p;};
     157             :     //
     158             :     //------------------------------------------------------------------
     159             :     //
     160             :     const casacore::Vector<casacore::RigidVector<casacore::Int,2> >& getIndexMap() {return indexMap_p;};
     161             :     //
     162             :     //------------------------------------------------------------------
     163             :     //
     164             :     const casacore::Matrix<casacore::Int>& getPolMap() {return polMap_p;}
     165             :     PolMapType& makePolMat(const casacore::Vector<casacore::Int>& vbPol, const casacore::Vector<casacore::Int>& vbPol2ImMap);
     166             :     PolMapType& makePol2CFMat(const casacore::Vector<casacore::Int>& vbPol, const casacore::Vector<casacore::Int>& vbPol2ImMap);
     167             :     PolMapType& makeConjPolMat(const casacore::Vector<casacore::Int>& vbPol, const casacore::Vector<casacore::Int>& vbPol2ImMap);
     168             :     PolMapType& makeConjPol2CFMat(const casacore::Vector<casacore::Int>& vbPol, const casacore::Vector<casacore::Int>& vbPol2ImMap);
     169             :     void initCFMaps(const casacore::Vector<casacore::Int>& visPol, const casacore::Vector<casacore::Int>& visPolsUsed);
     170             : 
     171           0 :     inline PolMapType& getPolMat() {return outerProduct2VBPolMap_p;};
     172           0 :     inline PolMapType& getConjPolMat() {return conjOuterProduct2VBPolMap_p;};
     173           0 :     inline PolMapType& getPol2CFMat() {return outerProductIndex2VBPolMap_p;};
     174           0 :     inline PolMapType& getConjPol2CFMat() {return conjOuterProductIndex2VBPolMap_p;};
     175             :     //
     176             :     //============================= Protected Parts ============================
     177             :     //
     178             :   protected:
     179             :     // casacore::LogIO& logIO() {return logIO_p;}
     180             :     // casacore::LogIO logIO_p;
     181             :     casacore::RigidVector<casacore::RigidVector<casacore::Int, 4>, 4> muellerRows_p, conjMuellerRows_p;
     182             :     casacore::Matrix<casacore::Int> polMap_p, invIndexMap_p;
     183             :     casacore::Vector<casacore::RigidVector<casacore::Int,2> > indexMap_p;
     184             :     PolMapType outerProduct2VBPolMap_p, outerProductIndex2VBPolMap_p, 
     185             :       conjOuterProduct2VBPolMap_p, conjOuterProductIndex2VBPolMap_p, cfIndices_p;
     186             :     MuellerType muellerType_p;
     187             :     casacore::Int nelement_p;
     188             : 
     189             :     PolMapType& makePol2CFMat_p(const casacore::Vector<casacore::Int>& vbPol, 
     190             :                                 const casacore::Vector<casacore::Int>& vbPol2ImMap,
     191             :                                 PolMapType& outerProdNdx2VBPolMap);
     192             :     PolMapType& makePolMat_p(const casacore::Vector<casacore::Int>& vbPol, 
     193             :                              const casacore::Vector<casacore::Int>& vbPol2ImMap,
     194             :                              PolMapType& outerProd2VBPolMap,
     195             :                              casacore::RigidVector<casacore::RigidVector<casacore::Int, 4>, 4>& mRows);
     196             : 
     197           1 :     virtual void makeMap()
     198             :     {
     199             :       //
     200             :       // Make the (damn) mappings!  Phew.
     201             :       //
     202             : 
     203           1 :       casacore::RigidVector<casacore::Int,4> el;
     204           1 :       el(0)=PP;     el(1)=PP2Q;   el(2)=P2QP;    el(3)=P2QP2Q;  muellerRows_p(GPP) = el;
     205           1 :       el(0)=PQ2P;   el(1)=PQ;     el(2)=P2QQ2P;  el(3)=P2QQ;    muellerRows_p(GPQ) = el;
     206           1 :       el(0)=Q2PP;   el(1)=Q2PP2Q; el(2)=QP;      el(3)=QP2Q;    muellerRows_p(GQP) = el;
     207           1 :       el(0)=Q2PQ2P; el(1)=Q2PQ;   el(2)=QQ2P;    el(3)=QQ;      muellerRows_p(GQQ) = el;
     208             : 
     209           1 :       el(0)=QQ;     el(1)=QQ2P;   el(2)=Q2PQ;   el(3)=Q2PQ2P;   conjMuellerRows_p(GPP)=el;
     210           1 :       el(0)=QP2Q;   el(1)=QP;     el(2)=Q2PP2Q; el(3)=Q2PP;     conjMuellerRows_p(GPQ)=el;
     211           1 :       el(0)=P2QQ;   el(1)=P2QQ2P; el(2)=PQ;     el(3)=PQ2P;     conjMuellerRows_p(GQP)=el;
     212           1 :       el(0)=P2QP2Q; el(1)=P2QP;   el(2)=PP2Q;   el(3)=PP;       conjMuellerRows_p(GQQ)=el;
     213             : 
     214             : 
     215             : 
     216             :       // Pol-enum to 2-index
     217           1 :       indexMap_p.resize(16);
     218             : 
     219           1 :       indexMap_p(RR)     = casacore::RigidVector<casacore::Int,2>(0,0);      
     220           1 :       indexMap_p(RR2L)   = casacore::RigidVector<casacore::Int,2>(0,1);    
     221           1 :       indexMap_p(R2LR)   = casacore::RigidVector<casacore::Int,2>(0,2);    
     222           1 :       indexMap_p(R2LR2L) = casacore::RigidVector<casacore::Int,2>(0,3);
     223             : 
     224           1 :       indexMap_p(RL2R)   = casacore::RigidVector<casacore::Int,2>(1,0);      
     225           1 :       indexMap_p(RL)     = casacore::RigidVector<casacore::Int,2>(1,1);      
     226           1 :       indexMap_p(R2LL2R) = casacore::RigidVector<casacore::Int,2>(1,2);      
     227           1 :       indexMap_p(R2LL)   = casacore::RigidVector<casacore::Int,2>(1,3);      
     228             : 
     229           1 :       indexMap_p(L2RR)   = casacore::RigidVector<casacore::Int,2>(2,0);     
     230           1 :       indexMap_p(L2RR2L) = casacore::RigidVector<casacore::Int,2>(2,1);     
     231           1 :       indexMap_p(LR)     = casacore::RigidVector<casacore::Int,2>(2,2);     
     232           1 :       indexMap_p(LR2L)   = casacore::RigidVector<casacore::Int,2>(2,3);     
     233             : 
     234           1 :       indexMap_p(L2RL2R) = casacore::RigidVector<casacore::Int,2>(3,0); 
     235           1 :       indexMap_p(L2RL)   = casacore::RigidVector<casacore::Int,2>(3,1);
     236           1 :       indexMap_p(LL2R)   = casacore::RigidVector<casacore::Int,2>(3,2);
     237           1 :       indexMap_p(LL)     = casacore::RigidVector<casacore::Int,2>(3,3);
     238             : 
     239             : 
     240             :       // 2-Index to Pol-enum
     241           1 :       invIndexMap_p.resize(4,4);
     242             :       
     243           1 :       invIndexMap_p(0,0)=RR;     invIndexMap_p(0,1)=RR2L;   invIndexMap_p(0,2)=R2LR;   invIndexMap_p(0,3)=R2LR2L;
     244           1 :       invIndexMap_p(1,0)=RL2R;   invIndexMap_p(1,1)=RL;     invIndexMap_p(1,2)=R2LL2R; invIndexMap_p(1,3)=R2LL;
     245           1 :       invIndexMap_p(2,0)=L2RR;   invIndexMap_p(2,1)=L2RR2L; invIndexMap_p(2,2)=LR;     invIndexMap_p(2,3)=LR2L;
     246           1 :       invIndexMap_p(3,0)=L2RL2R; invIndexMap_p(3,1)=L2RL;   invIndexMap_p(3,2)=LL2R;   invIndexMap_p(3,3)=LL;
     247           1 :     };
     248             : 
     249             :   };
     250             :   //
     251             :   //------------------------------------------------------------------
     252             :   //
     253             :   PolOuterProduct::GenericVBPol translateStokesToGeneric(const casacore::Int& stokes) ;
     254             :   casacore::Int translateGenericToStokes(const PolOuterProduct::GenericVBPol& gPol, 
     255             :                                const casacore::MSIter::PolFrame& polFrame=casacore::MSIter::Circular);
     256             : };
     257             : 
     258             : #endif

Generated by: LCOV version 1.16