Line data Source code
1 : //# ConvolutionTVI.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 ConvolutionTVI_H_ 24 : #define ConvolutionTVI_H_ 25 : 26 : // Base class 27 : #include <mstransform/TVI/FreqAxisTVI.h> 28 : 29 : 30 : namespace casa { //# NAMESPACE CASA - BEGIN 31 : 32 : namespace vi { //# NAMESPACE VI - BEGIN 33 : 34 : ////////////////////////////////////////////////////////////////////////// 35 : // ConvolutionTVI class 36 : ////////////////////////////////////////////////////////////////////////// 37 : 38 : class ConvolutionTVI : public FreqAxisTVI 39 : { 40 : 41 : public: 42 : 43 : ConvolutionTVI( ViImplementation2 * inputVii, 44 : const casacore::Record &configuration = casacore::Record()); 45 : 46 : void flag(casacore::Cube<casacore::Bool>& flagCube) const; 47 : void floatData (casacore::Cube<casacore::Float> & vis) const; 48 : void visibilityObserved (casacore::Cube<casacore::Complex> & vis) const; 49 : void visibilityCorrected (casacore::Cube<casacore::Complex> & vis) const; 50 : void visibilityModel (casacore::Cube<casacore::Complex> & vis) const; 51 : void weightSpectrum(casacore::Cube<casacore::Float> &weightSp) const; 52 : void sigmaSpectrum (casacore::Cube<casacore::Float> &sigmaSp) const; 53 : 54 0 : bool weightSpectrumExists () const {return true;} 55 0 : bool sigmaSpectrumExists () const {return true;} 56 : 57 : protected: 58 : 59 : casacore::Bool parseConfiguration(const casacore::Record &configuration); 60 : void initialize(); 61 : 62 : mutable casacore::Vector<casacore::Float> convCoeff_p; 63 : }; 64 : 65 : ////////////////////////////////////////////////////////////////////////// 66 : // ConvolutionTVIFactory class 67 : ////////////////////////////////////////////////////////////////////////// 68 : 69 : class ConvolutionTVIFactory : public ViFactory 70 : { 71 : 72 : public: 73 : 74 : ConvolutionTVIFactory(casacore::Record &configuration,ViImplementation2 *inputVII); 75 : 76 : protected: 77 : 78 : vi::ViImplementation2 * createVi (VisibilityIterator2 *) const; 79 : vi::ViImplementation2 * createVi () const; 80 : 81 : casacore::Record configuration_p; 82 : ViImplementation2 *inputVii_p;; 83 : }; 84 : 85 : ////////////////////////////////////////////////////////////////////////// 86 : // ConvolutionTransformEngine class 87 : ////////////////////////////////////////////////////////////////////////// 88 : 89 : 90 : template<class T> class ConvolutionKernel; // Forward declaration 91 : 92 : template<class T> class ConvolutionTransformEngine : public FreqAxisTransformEngine<T> 93 : { 94 : 95 : public: 96 : 97 : ConvolutionTransformEngine(ConvolutionKernel<T> *kernel, casacore::uInt width); 98 : 99 : void transform(casacore::Vector<T> &inputVector,casacore::Vector<T> &outputVector); 100 : 101 : protected: 102 : 103 : casacore::uInt width_p; 104 : // This member has to be a pointer, otherwise there 105 : // are compile time problems due to the fact that 106 : // it is a pure virtual class. 107 : ConvolutionKernel<T> *convolutionKernel_p; 108 : }; 109 : 110 : ////////////////////////////////////////////////////////////////////////// 111 : // ConvolutionKernel class 112 : ////////////////////////////////////////////////////////////////////////// 113 : 114 : template<class T> class ConvolutionKernel 115 : { 116 : 117 : public: 118 : 119 : ConvolutionKernel(casacore::Vector<casacore::Float> *convCoeff); 120 : 121 : virtual void kernel( casacore::Vector<T> &inputVector, 122 : casacore::Vector<T> &outputVector, 123 : casacore::uInt startInputPos, 124 : casacore::uInt outputPos) = 0; 125 : 126 : protected: 127 : 128 : casacore::uInt width_p; 129 : casacore::Vector<casacore::Float> *convCoeff_p; 130 : 131 : }; 132 : 133 : ////////////////////////////////////////////////////////////////////////// 134 : // ConvolutionDataKernel class 135 : ////////////////////////////////////////////////////////////////////////// 136 : 137 : template<class T> class ConvolutionDataKernel : public ConvolutionKernel<T> 138 : { 139 : using ConvolutionKernel<T>::width_p; 140 : using ConvolutionKernel<T>::convCoeff_p; 141 : 142 : public: 143 : 144 : ConvolutionDataKernel(casacore::Vector<casacore::Float> *convCoeff); 145 : 146 : void kernel( casacore::Vector<T> &inputVector, 147 : casacore::Vector<T> &outputVector, 148 : casacore::uInt startInputPos, 149 : casacore::uInt outputPos); 150 : }; 151 : 152 : ////////////////////////////////////////////////////////////////////////// 153 : // ConvolutionLogicalORKernel class 154 : ////////////////////////////////////////////////////////////////////////// 155 : 156 : template<class T> class ConvolutionLogicalORKernel : public ConvolutionKernel<T> 157 : { 158 : 159 : using ConvolutionKernel<T>::width_p; 160 : using ConvolutionKernel<T>::convCoeff_p; 161 : 162 : public: 163 : 164 : ConvolutionLogicalORKernel(casacore::Vector<casacore::Float> *convCoeff); 165 : 166 : void kernel( casacore::Vector<T> &inputVector, 167 : casacore::Vector<T> &outputVector, 168 : casacore::uInt startInputPos, 169 : casacore::uInt outputPos); 170 : }; 171 : 172 : ////////////////////////////////////////////////////////////////////////// 173 : // ConvolutionWeightPropagationKernel class 174 : ////////////////////////////////////////////////////////////////////////// 175 : 176 : template<class T> class ConvolutionWeightPropagationKernel : public ConvolutionKernel<T> 177 : { 178 : 179 : using ConvolutionKernel<T>::width_p; 180 : using ConvolutionKernel<T>::convCoeff_p; 181 : 182 : public: 183 : 184 : ConvolutionWeightPropagationKernel(casacore::Vector<casacore::Float> *convCoeff); 185 : 186 : void kernel( casacore::Vector<T> &inputVector, 187 : casacore::Vector<T> &outputVector, 188 : casacore::uInt startInputPos, 189 : casacore::uInt outputPos); 190 : }; 191 : 192 : 193 : } //# NAMESPACE VI - END 194 : 195 : } //# NAMESPACE CASA - END 196 : 197 : #endif /* ConvolutionTVI_H_ */ 198 :