LCOV - code coverage report
Current view: top level - mstransform/TVI - UtilsTVI.cc (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 88 121 72.7 %
Date: 2024-12-11 20:54:31 Functions: 13 25 52.0 %

          Line data    Source code
       1             : //# UtilsTVI.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             : #include <mstransform/TVI/UtilsTVI.h>
      24             : 
      25             : using namespace casacore;
      26             : namespace casa { //# NAMESPACE CASA - BEGIN
      27             : 
      28             : namespace vi { //# NAMESPACE VI - BEGIN
      29             : 
      30             : //////////////////////////////////////////////////////////////////////////
      31             : // DataCubeHolderBase class
      32             : //////////////////////////////////////////////////////////////////////////
      33             : 
      34             : // -----------------------------------------------------------------------
      35             : //
      36             : // -----------------------------------------------------------------------
      37           0 : uInt DataCubeHolderBase::getMatrixIndex()
      38             : {
      39           0 :         return matrixIndex_p;
      40             : }
      41             : 
      42             : // -----------------------------------------------------------------------
      43             : //
      44             : // -----------------------------------------------------------------------
      45           0 : uInt DataCubeHolderBase::getVectorIndex()
      46             : {
      47           0 :         return vectorIndex_p;
      48             : }
      49             : 
      50             : // -----------------------------------------------------------------------
      51             : //
      52             : // -----------------------------------------------------------------------
      53           0 : IPosition & DataCubeHolderBase::getCubeShape()
      54             : {
      55           0 :         return cubeShape_p;
      56             : }
      57             : 
      58             : // -----------------------------------------------------------------------
      59             : //
      60             : // -----------------------------------------------------------------------
      61           0 : IPosition & DataCubeHolderBase::getMatrixShape()
      62             : {
      63           0 :         return matrixShape_p;
      64             : }
      65             : 
      66             : // -----------------------------------------------------------------------
      67             : //
      68             : // -----------------------------------------------------------------------
      69   316444462 : IPosition & DataCubeHolderBase::getVectorShape()
      70             : {
      71   316444462 :         return vectorShape_p;
      72             : }
      73             : 
      74             : //////////////////////////////////////////////////////////////////////////
      75             : // DataCubeMap class
      76             : //////////////////////////////////////////////////////////////////////////
      77             : 
      78             : // -----------------------------------------------------------------------
      79             : //
      80             : // -----------------------------------------------------------------------
      81     2066784 : DataCubeMap::DataCubeMap()
      82             : {
      83     2066784 :         dataCubeMap_p.clear();
      84     2066784 : }
      85             : 
      86             : // -----------------------------------------------------------------------
      87             : //
      88             : // -----------------------------------------------------------------------
      89           0 : DataCubeMap::DataCubeMap(DataCubeMap& other)
      90             : {
      91           0 :         dataCubeMap_p.clear();
      92             : 
      93           0 :         for (dataCubeMapIter_p = other.dataCubeMap_p.begin();dataCubeMapIter_p!= other.dataCubeMap_p.end();dataCubeMapIter_p++)
      94             :         {
      95           0 :                 add(dataCubeMapIter_p->first,dataCubeMapIter_p->second->selfReference());
      96             :         }
      97             : 
      98           0 :         return;
      99           0 : }
     100             : 
     101             : // -----------------------------------------------------------------------
     102             : //
     103             : // -----------------------------------------------------------------------
     104     2066784 : DataCubeMap::~DataCubeMap()
     105             : {
     106     2066784 :         dataCubeMap_p.clear();
     107     2066784 : }
     108             : 
     109             : // -----------------------------------------------------------------------
     110             : //
     111             : // -----------------------------------------------------------------------
     112           0 : void DataCubeMap::add(MS::PredefinedColumns key,DataCubeHolderBase* dataCubeHolder)
     113             : {
     114           0 :         dataCubeMap_p[key] = dataCubeHolder;
     115           0 : }
     116             : 
     117             : // -----------------------------------------------------------------------
     118             : //
     119             : // -----------------------------------------------------------------------
     120     3079921 : void DataCubeMap::add(MS::PredefinedColumns key,DataCubeHolderBase &dataCubeHolder)
     121             : {
     122     3079921 :         dataCubeMap_p[key] = &dataCubeHolder;
     123     3079921 : }
     124             : 
     125             : // -----------------------------------------------------------------------
     126             : //
     127             : // -----------------------------------------------------------------------
     128           0 : Bool DataCubeMap::present(MS::PredefinedColumns key)
     129             : {
     130           0 :         if (dataCubeMap_p.find(key) != dataCubeMap_p.end())
     131             :         {
     132           0 :                 return true;
     133             :         }
     134             :         else
     135             :         {
     136           0 :                 return false;
     137             :         }
     138             : }
     139             : 
     140             : // -----------------------------------------------------------------------
     141             : //
     142             : // -----------------------------------------------------------------------
     143     3932618 : void DataCubeMap::setMatrixIndex(uInt rowIndex)
     144             : {
     145     8003796 :         for (dataCubeMapIter_p = dataCubeMap_p.begin();dataCubeMapIter_p!= dataCubeMap_p.end();dataCubeMapIter_p++)
     146             :         {
     147     4071178 :                 dataCubeMapIter_p->second->setMatrixIndex(rowIndex);
     148             :         }
     149             : 
     150     3932618 :         return;
     151             : }
     152             : 
     153             : // -----------------------------------------------------------------------
     154             : //
     155             : // -----------------------------------------------------------------------
     156     7700000 : void DataCubeMap::setVectorIndex(uInt vectorIndex)
     157             : {
     158    15538560 :         for (dataCubeMapIter_p = dataCubeMap_p.begin();dataCubeMapIter_p!= dataCubeMap_p.end();dataCubeMapIter_p++)
     159             :         {
     160     7838560 :                 dataCubeMapIter_p->second->setVectorIndex(vectorIndex);
     161             :         }
     162             : 
     163     7700000 :         return;
     164             : }
     165             : 
     166             : // -----------------------------------------------------------------------
     167             : //
     168             : // -----------------------------------------------------------------------
     169           0 : IPosition & DataCubeMap::getCubeShape()
     170             : {
     171           0 :         return dataCubeMap_p.begin()->second->getCubeShape();
     172             : }
     173             : 
     174             : // -----------------------------------------------------------------------
     175             : //
     176             : // -----------------------------------------------------------------------
     177           0 : IPosition & DataCubeMap::getMatrixShape()
     178             : {
     179           0 :         return dataCubeMap_p.begin()->second->getMatrixShape();
     180             : }
     181             : 
     182             : // -----------------------------------------------------------------------
     183             : //
     184             : // -----------------------------------------------------------------------
     185   316444462 : IPosition & DataCubeMap::getVectorShape()
     186             : {
     187   316444462 :         return dataCubeMap_p.begin()->second->getVectorShape();
     188             : }
     189             : 
     190             : // -----------------------------------------------------------------------
     191             : //
     192             : // -----------------------------------------------------------------------
     193           0 : size_t DataCubeMap::nelements()
     194             : {
     195           0 :         return dataCubeMap_p.size();
     196             : }
     197             : 
     198             : 
     199             : // Methods controlling iteration
     200             : // gmoellen (2017Mar06)
     201     2012092 : void DataCubeMap::setupVecIter() 
     202             : {
     203     2012092 :   for (dataCubeMapIter_p = dataCubeMap_p.begin();
     204     5030224 :        dataCubeMapIter_p!= dataCubeMap_p.end();
     205     3018132 :        dataCubeMapIter_p++)
     206             :     {
     207     3018132 :       dataCubeMapIter_p->second->setupVecIter();
     208             :     }
     209     2012092 :   return;
     210             : }
     211           0 : void DataCubeMap::reset() 
     212             : {
     213           0 :   for (dataCubeMapIter_p = dataCubeMap_p.begin();
     214           0 :        dataCubeMapIter_p!= dataCubeMap_p.end();
     215           0 :        dataCubeMapIter_p++)
     216             :     {
     217           0 :       dataCubeMapIter_p->second->reset();
     218             :     }
     219           0 :   return;
     220             : }
     221             : 
     222   316407832 : void DataCubeMap::next()
     223             : {
     224   316407832 :   for (dataCubeMapIter_p = dataCubeMap_p.begin();
     225   791019570 :        dataCubeMapIter_p!= dataCubeMap_p.end();
     226   474611738 :        dataCubeMapIter_p++)
     227             :     {
     228   474611738 :       dataCubeMapIter_p->second->next();
     229             :     }
     230   316407832 :   return;
     231             : }
     232             : 
     233   159209962 : casacore::Bool DataCubeMap::pastEnd()
     234             : {
     235             :   // All elements in the map are sync'd, so just ask the first one
     236   159209962 :   return dataCubeMap_p.begin()->second->pastEnd();
     237             : }
     238             : 
     239             : 
     240             : //////////////////////////////////////////////////////////////////////////
     241             : // Convenience methods
     242             : //////////////////////////////////////////////////////////////////////////
     243             : 
     244             : // -----------------------------------------------------------------------
     245             : //
     246             : // -----------------------------------------------------------------------
     247      380566 : void accumulateWeightCube (const Cube<Float> &weightCube, const Cube<Bool> &flags, Matrix<Float> &result)
     248             : {
     249      380566 :         IPosition shape = weightCube.shape();
     250      380566 :         uInt nRows = shape(2);
     251      380566 :         uInt nCorrelations = shape (0);
     252             : 
     253      380566 :         result.resize(nCorrelations,nRows,false);
     254             : 
     255      380566 :         Vector<Float> currentVector;
     256    15577367 :         for (uInt row=0; row < nRows; row++)
     257             :         {
     258    15196801 :                 currentVector.reference(result.column(row));
     259    15196801 :                 accumulateWeightMatrix (weightCube.xyPlane(row), flags.xyPlane(row),currentVector);
     260             :         }
     261             : 
     262      761132 :     return;
     263      380566 : }
     264             : 
     265             : // -----------------------------------------------------------------------
     266             : //
     267             : // -----------------------------------------------------------------------
     268    15196801 : void accumulateWeightMatrix (const Matrix<Float> &weightMatrix, const Matrix<Bool> &flags, Vector<Float> &result)
     269             : {
     270    15196801 :     IPosition shape = weightMatrix.shape();
     271    15196801 :     result.resize(shape(0),false);
     272    15196801 :     Vector<uInt> samples(shape(0),0);
     273    15196801 :     uInt nCorrelations = shape (0);
     274    15196801 :     uInt nChannels = shape (1);
     275             : 
     276    75550554 :     for (uInt correlation = 0; correlation < nCorrelations; correlation++)
     277             :     {
     278    60353753 :         int nSamples = 0;
     279    60353753 :         float sum = 0;
     280    60353753 :         bool accumulatorFlag = true;
     281             : 
     282   121235410 :         for (uInt channel=0; channel< nChannels; channel++)
     283             :         {
     284    60881657 :             Bool inputFlag = flags(correlation,channel);
     285             :             // true/true or false/false
     286    60881657 :             if (accumulatorFlag == inputFlag)
     287             :             {
     288     4251940 :                 nSamples ++;
     289     4251940 :                 sum += weightMatrix (correlation, channel);
     290             :             }
     291             :             // true/false: Reset accumulation when accumulator switches from flagged to unflagged
     292    56629717 :             else if ( accumulatorFlag and ! inputFlag )
     293             :             {
     294    56629717 :                 accumulatorFlag = false;
     295    56629717 :                 nSamples = 1;
     296    56629717 :                 sum = weightMatrix (correlation, channel);
     297             :             }
     298             :             // else ignore case where accumulator is valid and data is not
     299             : 
     300             :         }
     301             : 
     302    60353753 :         result (correlation) = sum / (nSamples != 0 ? nSamples : 1);
     303             :     }
     304             : 
     305    30393602 :     return;
     306    15196801 : }
     307             : 
     308             : // -----------------------------------------------------------------------
     309             : //
     310             : // -----------------------------------------------------------------------
     311       23448 : void accumulateFlagCube (const Cube<Bool> &flagCube, Vector<Bool> &flagRow)
     312             : {
     313             :         // Get original shape
     314       23448 :         IPosition shape = flagCube.shape();
     315       23448 :         size_t nCorr = shape(0);
     316       23448 :         size_t nChan = shape(1);
     317       23448 :         size_t nRows = shape(2);
     318             : 
     319             :         // Reshape flag cube to match the input shape
     320       23448 :         flagRow.resize(nRows,false);
     321       23448 :         flagRow = false;
     322             : 
     323       23448 :         Bool rowFlagValue = false;
     324     1397833 :         for (size_t row_i =0;row_i<nRows;row_i++)
     325             :         {
     326     1374385 :                 rowFlagValue = true;
     327     2997494 :                 for (size_t chan_i =0;chan_i<nChan;chan_i++)
     328             :                 {
     329     2049992 :                         if (rowFlagValue)
     330             :                         {
     331     2215194 :                                 for (size_t corr_i =0;corr_i<nCorr;corr_i++)
     332             :                                 {
     333     1948929 :                                         if (not flagCube(corr_i,chan_i,row_i))
     334             :                                         {
     335     1356844 :                                                 rowFlagValue = false;
     336     1356844 :                                                 break;
     337             :                                         }
     338             :                                 }
     339             :                         }
     340             :                         else
     341             :                         {
     342      426883 :                                 break;
     343             :                         }
     344             :                 }
     345     1374385 :                 flagRow(row_i) = rowFlagValue;
     346             :         }
     347             : 
     348       46896 :         return;
     349       23448 : }
     350             : 
     351             : 
     352             : } //# NAMESPACE VI - END
     353             : 
     354             : } //# NAMESPACE CASA - END
     355             : 

Generated by: LCOV version 1.16