LCOV - code coverage report
Current view: top level - mstransform/MSTransform - MSTransformBufferImpl.h (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 0 39 0.0 %
Date: 2024-10-09 13:55:54 Functions: 0 23 0.0 %

          Line data    Source code
       1             : //# MSTransformBufferImpl.h: This file contains the interface definition of the MSTransformBufferImpl.h 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 MSTransformBufferImpl_H_
      24             : #define MSTransformBufferImpl_H_
      25             : 
      26             : // Where VisBufferImpl2 interface is defined
      27             : #include <msvis/MSVis/VisBufferImpl2.h>
      28             : 
      29             : // Class containing the actual transformation logic
      30             : #include <mstransform/MSTransform/MSTransformManager.h>
      31             : 
      32             : namespace casa {
      33             : 
      34             : class DataCubeHolderBase
      35             : {
      36             : 
      37             : public:
      38             : 
      39           0 :         DataCubeHolderBase() {}
      40           0 :         virtual ~DataCubeHolderBase() {}
      41             :         virtual void setMatrixIndex(casacore::uInt matrixIndex) = 0;
      42             :         virtual void setVectorIndex(casacore::uInt vectorIndex) = 0;
      43             :         casacore::uInt getMatrixIndex() {return matrixIndex_p;}
      44             :         casacore::uInt getVectorIndex() {return vectorIndex_p;}
      45             :         casacore::IPosition & getMatrixShape() {return matrixShape_p;}
      46           0 :         casacore::IPosition & getVectorShape() {return vectorShape_p;}
      47             : 
      48             : protected:
      49             : 
      50             :         casacore::uInt matrixIndex_p;
      51             :         casacore::uInt vectorIndex_p;
      52             :         casacore::IPosition matrixShape_p;
      53             :         casacore::IPosition vectorShape_p;
      54             : };
      55             : 
      56             : template <class T> class DataCubeHolder : public DataCubeHolderBase
      57             : {
      58             : 
      59             : public:
      60             : 
      61           0 :         DataCubeHolder(casacore::Cube<T> &dataCube) {cube_p.reference(dataCube);}
      62           0 :         ~DataCubeHolder() {}
      63             : 
      64             :         casacore::Matrix<T> & getMatrix() {return matrix_p;}
      65           0 :         casacore::Vector<T> & getVector() {return vector_p;}
      66             : 
      67           0 :         void setMatrixIndex(casacore::uInt matrixIndex)
      68             :         {
      69           0 :                 matrix_p.resize(); // Resize to 0 to avoid shape conformance problems
      70           0 :                 matrixIndex_p = matrixIndex;
      71           0 :                 matrix_p.reference(cube_p.xyPlane(matrixIndex));
      72           0 :                 matrixShape_p = matrix_p.shape();
      73           0 :         }
      74             : 
      75           0 :         void setVectorIndex(casacore::uInt vectorIndex)
      76             :         {
      77           0 :                 vector_p.resize(); // Resize to 0 to avoid shape conformance problems
      78           0 :                 vectorIndex_p = vectorIndex;
      79           0 :                 vector_p.reference(matrix_p.row(vectorIndex));
      80           0 :                 vectorShape_p = vector_p.shape();
      81           0 :         }
      82             : 
      83             : protected:
      84             : 
      85             :         casacore::Cube<T> cube_p;
      86             :         casacore::Matrix<T> matrix_p;
      87             :         casacore::Vector<T> vector_p;
      88             : };
      89             : 
      90             : class DataCubeMap
      91             : {
      92             : 
      93             : public:
      94             : 
      95           0 :         DataCubeMap() {dataCubeMap_p.clear();}
      96           0 :         ~DataCubeMap() {dataCubeMap_p.clear();}
      97             : 
      98           0 :         void add(casacore::MS::PredefinedColumns key,DataCubeHolderBase* dataCubeHolder){dataCubeMap_p[key] = dataCubeHolder;}
      99             : 
     100           0 :         void setWindowShape(casacore::IPosition windowShape) {windowShape_p = windowShape;}
     101           0 :         casacore::IPosition & getWindowShape() {return windowShape_p;}
     102             : 
     103           0 :         template <class T> casacore::Vector<T> & getVector(casacore::MS::PredefinedColumns key)
     104             :         {
     105           0 :                 DataCubeHolder<T> *flagCubeHolder = static_cast< DataCubeHolder<T>* >(dataCubeMap_p[key]);
     106           0 :                 return flagCubeHolder->getVector();
     107             :         }
     108             : 
     109             :         template <class T> casacore::Matrix<T> & getMatrix(casacore::MS::PredefinedColumns key)
     110             :         {
     111             :                 DataCubeHolder<T> *flagCubeHolder = static_cast< DataCubeHolder<T>* >(dataCubeMap_p[key]);
     112             :                 return flagCubeHolder->getVector();
     113             :         }
     114             : 
     115           0 :         void setMatrixIndex(casacore::uInt rowIndex)
     116             :         {
     117           0 :                 for (dataCubeMapIter_p = dataCubeMap_p.begin();dataCubeMapIter_p!= dataCubeMap_p.end();dataCubeMapIter_p++)
     118             :                 {
     119           0 :                         dataCubeMapIter_p->second->setMatrixIndex(rowIndex);
     120             :                 }
     121           0 :         }
     122             : 
     123           0 :         void setVectorIndex(casacore::uInt vectorIndex)
     124             :         {
     125           0 :                 for (dataCubeMapIter_p = dataCubeMap_p.begin();dataCubeMapIter_p!= dataCubeMap_p.end();dataCubeMapIter_p++)
     126             :                 {
     127           0 :                         dataCubeMapIter_p->second->setVectorIndex(vectorIndex);
     128             :                 }
     129           0 :         }
     130             : 
     131             :         casacore::IPosition & getMatrixShape()
     132             :         {
     133             :                 return dataCubeMap_p.begin()->second->getMatrixShape();
     134             :         }
     135             : 
     136           0 :         casacore::IPosition & getVectorShape()
     137             :         {
     138           0 :                 return dataCubeMap_p.begin()->second->getVectorShape();
     139             :         }
     140             : 
     141             : 
     142             : protected:
     143             : 
     144             :         casacore::IPosition windowShape_p;
     145             :         std::map<casacore::MS::PredefinedColumns, DataCubeHolderBase*> dataCubeMap_p;
     146             :         std::map<casacore::MS::PredefinedColumns, DataCubeHolderBase*>::iterator dataCubeMapIter_p;
     147             : };
     148             : 
     149             : typedef void (casa::MSTransformBufferImpl::*TransformFunction)( vi::VisBuffer2 *vb,
     150             :                                                                                                                                 DataCubeMap &inputDataMap,
     151             :                                                                                                                                 DataCubeMap &outputDataMap) const;
     152             : 
     153             : typedef void (casa::MSTransformBufferImpl::*TransformKernel)(   vi::VisBuffer2 *vb,
     154             :                                                                                                                                 DataCubeMap &inputDataMap,
     155             :                                                                                                                                 DataCubeMap &outputDataMap,
     156             :                                                                                                                                 casacore::IPosition &inputPos,
     157             :                                                                                                                                 casacore::IPosition &outputPos,
     158             :                                                                                                                                 casacore::IPosition &kernelShape) const;
     159             : 
     160             : typedef void (casa::MSTransformBufferImpl::*TransformKernel1D)( vi::VisBuffer2 *vb,
     161             :                                                                                                                                 DataCubeMap &inputDataMap,
     162             :                                                                                                                                 DataCubeMap &outputDataMap,
     163             :                                                                                                                                 casacore::uInt &inputPos,
     164             :                                                                                                                                 casacore::uInt &outputPos,
     165             :                                                                                                                                 casacore::uInt &kernelSize) const;
     166             : 
     167             : class MSTransformBufferImpl : public vi::VisBufferImpl2
     168             : {
     169             : 
     170             : public:
     171             : 
     172             :         MSTransformBufferImpl(MSTransformManager *manager);
     173           0 :         ~MSTransformBufferImpl() {};
     174             : 
     175             :         void resetState();
     176           0 :         void setRowIdOffset(casacore::uInt rowOffset) {rowIdOffset_p = rowOffset;}
     177           0 :         void shiftRowIdOffset(casacore::Int nRows) {rowIdOffset_p += nRows;}
     178             : 
     179             :         void generateWeights() const;
     180             : 
     181             :         // Re-indexable Vectors
     182             :     const casacore::Vector<casacore::Int> & dataDescriptionIds () const; // [nR]
     183             :     const casacore::Vector<casacore::Int> & spectralWindows () const; // [nR]
     184             :     const casacore::Vector<casacore::Int> & observationId () const; // [nR]
     185             :     const casacore::Vector<casacore::Int> & arrayId () const; // [nR]
     186             :     const casacore::Vector<casacore::Int> & fieldId () const; // [nR]
     187             :     const casacore::Vector<casacore::Int> & stateId () const; // [nR]
     188             :     const casacore::Vector<casacore::Int> & antenna1 () const; // [nR]
     189             :     const casacore::Vector<casacore::Int> & antenna2 () const; // [nR]
     190             : 
     191             :         // Not-Re-indexable Vectors
     192             :     const casacore::Vector<casacore::Int> & scan () const; // [nR]
     193             :     const casacore::Vector<casacore::Int> & processorId () const; // [nR]
     194             :     const casacore::Vector<casacore::Int> & feed1 () const; // [nR]
     195             :     const casacore::Vector<casacore::Int> & feed2 () const; // [nR]
     196             :     const casacore::Vector<casacore::Double> & time () const; // [nR]
     197             :     const casacore::Vector<casacore::Double> & timeCentroid () const; // [nR]
     198             :     const casacore::Vector<casacore::Double> & timeInterval () const; // [nR]
     199             : 
     200             :     // Average-able vectors
     201             :     const casacore::Vector<casacore::Double> & exposure () const; // [nR]
     202             :     const casacore::Vector<casacore::Bool> & flagRow () const; // [nR]
     203             : 
     204             :     const casacore::Matrix<casacore::Double> & uvw () const; // [3,nR]
     205             :     const casacore::Matrix<casacore::Float> & weight () const; // [nC, nR]
     206             :     const casacore::Matrix<casacore::Float> & sigma () const; // [nC, nR]
     207             :     const casacore::Cube<casacore::Bool> & flagCube () const; // [nC,nF,nR]
     208             :     const casacore::Cube<casacore::Complex> & visCube () const; // [nC,nF,nR]
     209             :     const casacore::Cube<casacore::Complex> & visCubeCorrected () const; // [nC,nF,nR]
     210             :     const casacore::Cube<casacore::Complex> & visCubeModel () const; // [nC,nF,nR]
     211             :     const casacore::Cube<casacore::Float> & visCubeFloat () const; // [nC,nF,nR]
     212             :     const casacore::Cube<casacore::Float> & weightSpectrum () const; // [nC,nF,nR]
     213             :     const casacore::Cube<casacore::Float> & sigmaSpectrum () const; // [nC,nF,nR]
     214             :     const casacore::Array<casacore::Bool> & flagCategory () const; // [nC,nF,nCategories,nR]
     215             : 
     216             :         casacore::IPosition getShape () const;
     217             :         casacore::rownr_t nRows () const;
     218             :         casacore::Int nChannels () const;
     219             :         casacore::Int nCorrelations () const;
     220             :         casacore::Int nAntennas () const;
     221             : 
     222             :         // For plotms
     223             :     const casacore::Vector<casacore::Float> & feedPa (casacore::Double time) const; // [nA]
     224             :     casacore::Float parang0(casacore::Double time) const;
     225             :     const casacore::Vector<casacore::Float> & parang(casacore::Double time) const; // [nA]
     226             :     casacore::MDirection azel0(casacore::Double time) const;
     227             :     const casacore::Vector<casacore::MDirection> & azel(casacore::Double time) const; // [nA]
     228             :     casacore::Double hourang(casacore::Double time) const;
     229             :     const casacore::Vector<casacore::MDirection> & direction1() const; // ??
     230             : 
     231             :     casacore::Vector<casacore::Int> getCorrelationTypes () const;
     232             :     const casacore::Vector<casacore::Int> & correlationTypes () const;
     233             :     casacore::Vector<casacore::Stokes::StokesTypes> getCorrelationTypesDefined () const;
     234             :     casacore::Vector<casacore::Stokes::StokesTypes> getCorrelationTypesSelected () const;
     235             : 
     236             :     casacore::Double getFrequency (casacore::Int rowInBuffer, casacore::Int frequencyIndex, casacore::Int frame = FrameNotSpecified) const;
     237             :     const casacore::Vector<casacore::Double> & getFrequencies (casacore::Int rowInBuffer,casacore::Int frame = FrameNotSpecified) const;
     238             :     casacore::Int getChannelNumber (casacore::Int rowInBuffer, casacore::Int frequencyIndex) const;
     239             :     const casacore::Vector<casacore::Int> & getChannelNumbers (casacore::Int rowInBuffer) const;
     240             :     casacore::Vector<casacore::Int> getChannelNumbersSelected (casacore::Int outputChannelIndex) const;
     241             : 
     242             :     const casacore::Vector<casacore::rownr_t> & rowIds () const;
     243             : 
     244             :     // Rotate visibility phase for given vector (dim = nrow of vb) of phases (metres)
     245             :     void phaseCenterShift(const casacore::Vector<casacore::Double>& phase);
     246             :     // Rotate visibility phase for phase center offsets (arcsecs)
     247             :     void phaseCenterShift(casacore::Double dx, casacore::Double dy);
     248             : 
     249             :     const casacore::MDirection& phaseCenter () const;
     250             :     const casacore::MFrequency::Types & freqRefFrameType () const;
     251             : 
     252             : protected:
     253             : 
     254             :     casacore::MFrequency::Convert generateFreqRefTranEngine (casacore::Double time,casacore::Int outputRefFrame,casacore::Bool toObservedFrame) const;
     255             : 
     256             :     void transformDataCube(     vi::VisBuffer2 *vb,
     257             :                                                 DataCubeMap &inputDataCubeMap,
     258             :                                                 DataCubeMap &outputDataCubeMap,
     259             :                                                 TransformFunction funcPointer) const;
     260             : 
     261             :     void channelAverage(        vi::VisBuffer2 *vb,
     262             :                                                 DataCubeMap &inputDataCubeMap,
     263             :                                                 DataCubeMap &outputDataCubeMap) const;
     264             : 
     265             :     void decimationWindow(      vi::VisBuffer2 *vb,
     266             :                                                 DataCubeMap &inputDataCubeMap,
     267             :                                                 DataCubeMap &outputDataCubeMap,
     268             :                                                 TransformKernel1D kernelPointer) const;
     269             : 
     270             :     void flagAverageKernel(     vi::VisBuffer2 *vb,
     271             :                                                 DataCubeMap &inputDataCubeMap,
     272             :                                                 DataCubeMap &outputDataCubeMap,
     273             :                                                 casacore::uInt &inputPos,
     274             :                                                 casacore::uInt &outputPos,
     275             :                                                 casacore::uInt &kernelSize) const;
     276             : 
     277             : private:
     278             : 
     279             :         MSTransformManager *manager_p;
     280             :         casacore::ArrayColumn<casacore::Double> spwFrequencies_p;
     281             :         map<casacore::uInt,casacore::uInt> inputOutputSPWIndexMap_p;
     282             :         casacore::uInt rowIdOffset_p;
     283             : 
     284             :         // OTF frequency transformation
     285             :         casacore::MDirection phaseCenter_p;
     286             :         casacore::MPosition observatoryPosition_p;
     287             :         casacore::ArrayMeasColumn<casacore::MFrequency> spwRefRame_p;
     288             : 
     289             :         // Phase shifting
     290             :         casacore::Bool applyPhaseShifting_p;
     291             :         casacore::Double dx_p, dy_p;
     292             : 
     293             :         // NONE datacol handling
     294             :         casacore::Bool noneDataCol_p;
     295             : 
     296             :         mutable casacore::Vector<casacore::Int> observationId_p;
     297             :         mutable casacore::Vector<casacore::Int> arrayId_p;
     298             :         mutable casacore::Vector<casacore::Int> scan_p;
     299             :         mutable casacore::Vector<casacore::Int> stateId_p;
     300             :         mutable casacore::Vector<casacore::Int> fieldId_p;
     301             :         mutable casacore::Vector<casacore::Int> dataDescriptionIds_p;
     302             :         mutable casacore::Vector<casacore::Int> spectralWindows_p;
     303             :         mutable casacore::Vector<casacore::Int> processorId_p;
     304             :         mutable casacore::Vector<casacore::Int> antenna1_p;
     305             :         mutable casacore::Vector<casacore::Int> antenna2_p;
     306             :         mutable casacore::Vector<casacore::Int> feed1_p;
     307             :         mutable casacore::Vector<casacore::Int> feed2_p;
     308             :         mutable casacore::Vector<casacore::Bool> flagRow_p;
     309             :         mutable casacore::Vector<casacore::Double> time_p;
     310             :         mutable casacore::Vector<casacore::Double> timeCentroid_p;
     311             :         mutable casacore::Vector<casacore::Double> timeInterval_p;
     312             :         mutable casacore::Vector<casacore::Double> exposure_p;
     313             :         mutable casacore::Matrix< casacore::Double> uvw_p;
     314             :         mutable casacore::Matrix<casacore::Float> weight_p;
     315             :         mutable casacore::Matrix<casacore::Float> sigma_p;
     316             :         mutable casacore::Cube<casacore::Bool> flagCube_p;
     317             :         mutable casacore::Cube<casacore::Complex> visCube_p;
     318             :         mutable casacore::Cube<casacore::Complex> visCubeCorrected_p;
     319             :         mutable casacore::Cube<casacore::Complex> visCubeModel_p;
     320             :         mutable casacore::Cube<casacore::Float> visCubeFloat_p;
     321             :         mutable casacore::Cube<casacore::Float> weightSpectrum_p;
     322             :         mutable casacore::Cube<casacore::Float> sigmaSpectrum_p;
     323             :         mutable casacore::Array<casacore::Bool> flagCategory_p;
     324             :         mutable casacore::Vector<casacore::Float> feedPa_p;
     325             :         mutable casacore::Vector<casacore::Float> parang_p;
     326             :         mutable casacore::Vector<casacore::MDirection> azel_p;
     327             :         mutable casacore::Vector<casacore::Double> frequencies_p;
     328             :         mutable casacore::Vector<casacore::Int> channelNumbers_p;
     329             :         mutable map< casacore::Int,casacore::Vector<casacore::Int> > outputInputChannelMap_p;
     330             :         mutable casacore::Vector<casacore::rownr_t> rowIds_p;
     331             :         mutable casacore::IPosition shape_p;
     332             :         mutable casacore::uInt nRows_p;
     333             :         mutable casacore::uInt nChannels_p;
     334             :         mutable casacore::uInt nCorrelations_p;
     335             :         mutable casacore::uInt nAntennas_p;
     336             :         mutable casacore::MFrequency::Types freqRefFrameType_p;
     337             : 
     338             :         mutable casacore::Bool observationIdOk_p;
     339             :         mutable casacore::Bool arrayIdOk_p;
     340             :         mutable casacore::Bool scanOk_p;
     341             :         mutable casacore::Bool stateIdOk_p;
     342             :         mutable casacore::Bool fieldIdOk_p;
     343             :         mutable casacore::Bool dataDescIdOk_p;
     344             :         mutable casacore::Bool spectralWindowsOk_p;
     345             :         mutable casacore::Bool processorIdOk_p;
     346             :         mutable casacore::Bool antenna1Ok_p;
     347             :         mutable casacore::Bool antenna2Ok_p;
     348             :         mutable casacore::Bool feed1Ok_p;
     349             :         mutable casacore::Bool feed2Ok_p;
     350             :         mutable casacore::Bool flagRowOk_p;
     351             :         mutable casacore::Bool timeOk_p;
     352             :         mutable casacore::Bool timeCentroidOk_p;
     353             :         mutable casacore::Bool timeIntervalOk_p;
     354             :         mutable casacore::Bool exposureOk_p;
     355             :         mutable casacore::Bool uvwOk_p;
     356             :         mutable casacore::Bool weightOk_p;
     357             :         mutable casacore::Bool sigmaOk_p;
     358             :         mutable casacore::Bool flagCubeOk_p;
     359             :         mutable casacore::Bool visCubeOk_p;
     360             :         mutable casacore::Bool visCubeCorrectedOk_p;
     361             :         mutable casacore::Bool visCubeModelOk_p;
     362             :         mutable casacore::Bool visCubeFloatOk_p;
     363             :         mutable casacore::Bool weightSpectrumOk_p;
     364             :         mutable casacore::Bool sigmaSpectrumOk_p;
     365             :         mutable casacore::Bool flagCategoryOk_p;
     366             :         mutable casacore::Bool feedPaOk_p;
     367             :         mutable casacore::Bool parangOk_p;
     368             :         mutable casacore::Bool azelOk_p;
     369             :         mutable casacore::Bool frequenciesOk_p;
     370             :         mutable casacore::Bool channelNumbersOk_p;
     371             :         mutable casacore::Bool channelNumbersSelectedOk_p;
     372             :         mutable casacore::Bool rowIdsOk_p;
     373             :         mutable casacore::Bool shapeOk_p;
     374             :         mutable casacore::Bool nRowsOk_p;
     375             :         mutable casacore::Bool nChannelsOk_p;
     376             :         mutable casacore::Bool nCorrelationsOk_p;
     377             :         mutable casacore::Bool nAntennasOk_p;
     378             :         mutable casacore::Bool freqRefFrameTypeOk_p;
     379             : 
     380             :         mutable casacore::Bool observationIdTransformed_p;
     381             :         mutable casacore::Bool arrayIdTransformed_p;
     382             :         mutable casacore::Bool scanTransformed_p;
     383             :         mutable casacore::Bool stateIdTransformed_p;
     384             :         mutable casacore::Bool fieldIdTransformed_p;
     385             :         mutable casacore::Bool dataDescIdTransformed_p;
     386             :         mutable casacore::Bool spectralWindowsTransformed_p;
     387             :         mutable casacore::Bool processorIdTransformed_p;
     388             :         mutable casacore::Bool antenna1Transformed_p;
     389             :         mutable casacore::Bool antenna2Transformed_p;
     390             :         mutable casacore::Bool feed1Transformed_p;
     391             :         mutable casacore::Bool feed2Transformed_p;
     392             :         mutable casacore::Bool flagRowTransformed_p;
     393             :         mutable casacore::Bool uvwTransformed_p;
     394             :         mutable casacore::Bool weightTransformed_p;
     395             :         mutable casacore::Bool sigmaTransformed_p;
     396             :         mutable casacore::Bool timeTransformed_p;
     397             :         mutable casacore::Bool timeCentroidTransformed_p;
     398             :         mutable casacore::Bool timeIntervalTransformed_p;
     399             :         mutable casacore::Bool exposureTransformed_p;
     400             :         mutable casacore::Bool feedPaTransformed_p;
     401             :         mutable casacore::Bool parangTransformed_p;
     402             :         mutable casacore::Bool azelTransformed_p;
     403             :         mutable casacore::Bool frequenciesTransformed_p;
     404             :         mutable casacore::Bool channelNumbersTransformed_p;
     405             :         mutable casacore::Bool rowIdsTransformed_p;
     406             : 
     407             : };
     408             : 
     409             : } //# NAMESPACE CASA - END
     410             : 
     411             : 
     412             : #endif /* MSTransformBufferImpl_H_ */
     413             : 

Generated by: LCOV version 1.16