LCOV - code coverage report
Current view: top level - mstransform/TVI - FreqAxisTVI.h (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 30 55 54.5 %
Date: 2024-12-11 20:54:31 Functions: 7 27 25.9 %

          Line data    Source code
       1             : //# FreqAxisTVI.h: This file contains the interface definition of the MSTransformManager class.
       2             : //#
       3             : //#  CASA - Common Astronomy Software Applications (http://casa.nrao.edu/)
       4             : //#  Copyright (C) Associated Universities, Inc. Washington DC, USA 2011, All rights reserved.
       5             : //#  Copyright (C) European Southern Observatory, 2011, All rights reserved.
       6             : //#
       7             : //#  This library is free software; you can redistribute it and/or
       8             : //#  modify it under the terms of the GNU Lesser General Public
       9             : //#  License as published by the Free software Foundation; either
      10             : //#  version 2.1 of the License, or (at your option) any later version.
      11             : //#
      12             : //#  This library is distributed in the hope that it will be useful,
      13             : //#  but WITHOUT ANY WARRANTY, without even the implied warranty of
      14             : //#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      15             : //#  Lesser General Public License for more details.
      16             : //#
      17             : //#  You should have received a copy of the GNU Lesser General Public
      18             : //#  License along with this library; if not, write to the Free Software
      19             : //#  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
      20             : //#  MA 02111-1307  USA
      21             : //# $Id: $
      22             : 
      23             : #ifndef FreqAxisTVI_H_
      24             : #define FreqAxisTVI_H_
      25             : 
      26             : // Base class
      27             : #include <msvis/MSVis/TransformingVi2.h>
      28             : 
      29             : // VI/VB framework
      30             : #include <msvis/MSVis/VisBuffer2.h>
      31             : #include <msvis/MSVis/VisibilityIterator2.h>
      32             : 
      33             : // TVI framework
      34             : #include <mstransform/TVI/UtilsTVI.h>
      35             : 
      36             : // Measurement Set
      37             : #include <casacore/ms/MSSel/MSSelection.h>
      38             : 
      39             : // NOTE: See implementation include below
      40             : 
      41             : 
      42             : namespace casa { //# NAMESPACE CASA - BEGIN
      43             : 
      44             : namespace vi { //# NAMESPACE VI - BEGIN
      45             : 
      46             : //////////////////////////////////////////////////////////////////////////
      47             : // FreqAxisTVI class
      48             : //////////////////////////////////////////////////////////////////////////
      49             : 
      50             : template<class T> class FreqAxisTransformEngine; // Forward declaration
      51             : template<class T> class FreqAxisTransformEngine2; // Forward declaration
      52             : 
      53             : class FreqAxisTVI : public TransformingVi2
      54             : {
      55             : 
      56             : public:
      57             : 
      58             :         // Lifecycle
      59             :         FreqAxisTVI(ViImplementation2 * inputVii);
      60             :         ~FreqAxisTVI();
      61             : 
      62             :         // Navigation methods
      63             :         virtual void origin ();
      64             :         virtual void next ();
      65             : 
      66             :         // General TVI info (common for all sub-classes)
      67             :     casacore::Bool existsColumn (VisBufferComponent2 id) const;
      68           0 :     casacore::Bool flagCategoryExists () const {return false;}
      69             : 
      70             :         // casacore::List of methods that should be implemented by derived classes
      71             :     // virtual void flag(casacore::Cube<casacore::Bool>& flagCube) const = 0;
      72             :     // virtual void floatData (casacore::Cube<casacore::Float> & vis) const = 0;
      73             :     // virtual void visibilityObserved (casacore::Cube<casacore::Complex> & vis) const = 0;
      74             :     // virtual void visibilityCorrected (casacore::Cube<casacore::Complex> & vis) const = 0;
      75             :     // virtual void visibilityModel (casacore::Cube<casacore::Complex> & vis) const = 0;
      76             :     // virtual void weightSpectrum(casacore::Cube<casacore::Float> &weightSp) const = 0;
      77             :     // virtual void sigmaSpectrum (casacore::Cube<casacore::Float> &sigmaSp) const = 0;
      78             :     // virtual casacore::Vector<casacore::Double> getFrequencies (        casacore::Double time, casacore::Int frameOfReference,casacore::Int spectralWindowId, casacore::Int msId) const = 0;
      79             :     // virtual void writeFlag (const casacore::Cube<casacore::Bool> & flagCube) = 0;
      80             : 
      81             :     // Common transformation for all sub-classes
      82             :     void writeFlagRow (const casacore::Vector<casacore::Bool> & flag);
      83             :     casacore::Vector<casacore::Int> getChannels (casacore::Double time, casacore::Int frameOfReference,
      84             :                                                  casacore::Int spectralWindowId, casacore::Int msId) const;
      85             :     const casacore::Vector<casacore::Int>& nChannelsPerShape () const;
      86             : 
      87             :     void flagRow (casacore::Vector<casacore::Bool> & flagRow) const;
      88             :     void weight (casacore::Matrix<casacore::Float> & weight) const;
      89             :     void sigma (casacore::Matrix<casacore::Float> & sigma) const;
      90             : 
      91             : protected:
      92             : 
      93             :     // Method implementing main loop  (with auxiliary data)
      94           0 :         template <class T> void transformFreqAxis(        casacore::Cube<T> const &inputDataCube,
      95             :                                                                                                 casacore::Cube<T> &outputDataCube,
      96             :                                                                                                 FreqAxisTransformEngine<T> &transformer) const
      97             :         {
      98             :                 // Re-shape output data cube
      99           0 :                 outputDataCube.resize(getVisBuffer()->getShape(),false);
     100             : 
     101             :                 // Get data shape for iteration
     102           0 :                 const casacore::IPosition &inputShape = inputDataCube.shape();
     103           0 :                 casacore::rownr_t nRows = inputShape(2);
     104           0 :                 auto nCorrs = inputShape(0);
     105             : 
     106             :                 // Initialize input-output planes
     107           0 :                 casacore::Matrix<T> inputDataPlane;
     108           0 :                 casacore::Matrix<T> outputDataPlane;
     109             : 
     110             :                 // Initialize input-output vectors
     111           0 :                 casacore::Vector<T> inputDataVector;
     112           0 :                 casacore::Vector<T> outputDataVector;
     113             : 
     114           0 :                 for (casacore::rownr_t row=0; row < nRows; row++)
     115             :                 {
     116             :                         // Assign input-output planes by reference
     117           0 :                         transformer.setRowIndex(row);
     118           0 :                         inputDataPlane.reference(inputDataCube.xyPlane(row));
     119           0 :                         outputDataPlane.reference(outputDataCube.xyPlane(row));
     120             : 
     121           0 :                         for (ssize_t corr=0; corr < nCorrs; corr++)
     122             :                         {
     123             :                                 // Assign input-output vectors by reference
     124           0 :                                 transformer.setCorrIndex(corr);
     125           0 :                                 inputDataVector.reference(inputDataPlane.row(corr));
     126           0 :                                 outputDataVector.reference(outputDataPlane.row(corr));
     127             : 
     128             :                                 // Transform data
     129           0 :                                 transformer.transform(inputDataVector,outputDataVector);
     130             :                         }
     131             :                 }
     132             : 
     133           0 :                 return;
     134           0 :         }
     135             : 
     136             :     // Method implementing main loop  (with auxiliary data)
     137        9031 :         template <class T> void transformFreqAxis2(       const casacore::IPosition &inputShape,
     138             :                                                                                                 FreqAxisTransformEngine2<T> &transformer,
     139             :                                                                                                 casacore::Int parallelCorrAxis=-1) const
     140             :         {
     141        9031 :                 size_t nRows = inputShape(2);
     142        9031 :                 if (parallelCorrAxis >= 0)
     143             :                 {
     144       72702 :                         for (size_t row=0; row < nRows; row++)
     145             :                         {
     146       69280 :                                 transformer.setRowIndex(row);
     147       69280 :                                 transformer.setCorrIndex(parallelCorrAxis);
     148       69280 :                                 transformer.transform();
     149             :                         }
     150             :                 }
     151             :                 else
     152             :                 {
     153        5609 :                         size_t nCorrs = inputShape(0);
     154     1902638 :                         for (size_t row=0; row < nRows; row++)
     155             :                         {
     156     1897029 :                                 transformer.setRowIndex(row);
     157             : 
     158     5677749 :                                 for (size_t corr=0; corr < nCorrs; corr++)
     159             :                                 {
     160     3780720 :                                         transformer.setCorrIndex(corr);
     161             : 
     162             :                                         // jagonzal: Debug code
     163             :                                         /*
     164             :                                         VisBuffer2 *vb = getVii()->getVisBuffer();
     165             :                                         if (vb->rowIds()(row)==0 and corr==0)
     166             :                                         {
     167             :                                                 transformer.setDebug(True);
     168             :                                         }
     169             :                                         else
     170             :                                         {
     171             :                                                 transformer.setDebug(False);
     172             :                                         }
     173             :                                         */
     174     3780720 :                                         transformer.transform();
     175             :                                 }
     176             :                         }
     177             :                 }
     178             : 
     179        9031 :                 return;
     180             :         }
     181             : 
     182             :         void initialize();
     183             : 
     184             :         // Form spwInpChanIdxMap_p via calls to underlying Vii
     185             :         void formChanMap();
     186             : 
     187             :     void configureShapes();
     188             : 
     189             :     casacore::Vector<casacore::Int> nChannPerShape_;
     190             : 
     191             :         mutable casacore::LogIO logger_p;
     192             :         mutable std::map<casacore::Int,casacore::uInt > spwOutChanNumMap_p; // Must be accessed from const methods
     193             :         mutable std::map<casacore::Int,std::vector<casacore::Int> > spwInpChanIdxMap_p; // Must be accessed from const methods
     194             : };
     195             : 
     196             : //////////////////////////////////////////////////////////////////////////
     197             : // FreqAxisTransformEngine class
     198             : //////////////////////////////////////////////////////////////////////////
     199             : 
     200             : template<class T> class FreqAxisTransformEngine
     201             : {
     202             : 
     203             : public:
     204             : 
     205           0 :         virtual void transform( casacore::Vector<T> &,casacore::Vector<T> &) {};
     206           0 :         virtual void setRowIndex(size_t row) {row_p = row;}
     207           0 :         virtual void setCorrIndex(size_t corr) {corr_p = corr;}
     208             : 
     209             : protected:
     210             : 
     211             :         size_t row_p;
     212             :         size_t corr_p;
     213             : 
     214             : };
     215             : 
     216             : //////////////////////////////////////////////////////////////////////////
     217             : // FreqAxisTransformEngine2 class
     218             : //////////////////////////////////////////////////////////////////////////
     219             : 
     220             : template<class T> class FreqAxisTransformEngine2
     221             : {
     222             : 
     223             : public:
     224             : 
     225     1033392 :         FreqAxisTransformEngine2(DataCubeMap *inputData,DataCubeMap *outputData)
     226     1033392 :         {
     227     1033392 :                 debug_p = false;
     228     1033392 :                 inputData_p = inputData;
     229     1033392 :                 outputData_p = outputData;
     230     1033392 :         }
     231             : 
     232     1966309 :         void setRowIndex(size_t row)
     233             :         {
     234     1966309 :                 rowIndex_p = row;
     235     1966309 :                 inputData_p->setMatrixIndex(row);
     236     1966309 :                 outputData_p->setMatrixIndex(row);
     237             : 
     238     1966309 :                 return;
     239             :         }
     240             : 
     241     3850000 :         void setCorrIndex(size_t corr)
     242             :         {
     243     3850000 :                 corrIndex_p = corr;
     244     3850000 :                 inputData_p->setVectorIndex(corr);
     245     3850000 :                 outputData_p->setVectorIndex(corr);
     246             : 
     247     3850000 :                 return;
     248             :         }
     249             : 
     250             :         void setDebug(bool debug) { debug_p = debug;}
     251             : 
     252           0 :         virtual void transform() {}
     253             : 
     254             : protected:
     255             : 
     256             :         casacore::Bool debug_p;
     257             :         size_t rowIndex_p;
     258             :         size_t corrIndex_p;
     259             :         DataCubeMap *inputData_p;
     260             :         DataCubeMap *outputData_p;
     261             : 
     262             : };
     263             : 
     264             : } //# NAMESPACE VI - END
     265             : 
     266             : } //# NAMESPACE CASA - END
     267             : 
     268             : #endif /* FreqAxisTVI_H_ */
     269             : 

Generated by: LCOV version 1.16