Line data Source code
1 : //# RegriddingTVI.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 RegriddingTVI_H_ 24 : #define RegriddingTVI_H_ 25 : 26 : // Base class 27 : #include <mstransform/TVI/FreqAxisTVI.h> 28 : 29 : // To handle variant parameters 30 : #include <stdcasa/StdCasa/CasacSupport.h> 31 : 32 : // casacore::MS Access 33 : #include <casacore/ms/MeasurementSets.h> 34 : 35 : // To get observatory position from observatory name 36 : #include <casacore/measures/Measures/MeasTable.h> 37 : 38 : // calcChanFreqs 39 : #include <mstransform/MSTransform/MSTransformManager.h> 40 : 41 : // 1d interpolation methods 42 : #include <casacore/scimath/Mathematics/InterpolateArray1D.h> 43 : 44 : namespace casa { //# NAMESPACE CASA - BEGIN 45 : 46 : namespace vi { //# NAMESPACE VI - BEGIN 47 : 48 : ////////////////////////////////////////////////////////////////////////// 49 : // Enumerations (see equivalences in InterpolateArray1D.h) 50 : ////////////////////////////////////////////////////////////////////////// 51 : 52 : enum RegriddingMethod { 53 : // nearest neighbour 54 : nearestNeighbour, 55 : // linear 56 : linear, 57 : // cubic 58 : cubic, 59 : // cubic spline 60 : spline, 61 : // fft shift 62 : fftshift 63 : }; 64 : 65 : const casacore::Unit Hz(casacore::String("Hz")); 66 : 67 : ////////////////////////////////////////////////////////////////////////// 68 : // RegriddingTVI class 69 : ////////////////////////////////////////////////////////////////////////// 70 : 71 : class RegriddingTVI : public FreqAxisTVI 72 : { 73 : 74 : public: 75 : 76 : RegriddingTVI( ViImplementation2 * inputVii, 77 : const casacore::Record &configuration); 78 : 79 : // Report the the ViImplementation type 80 0 : virtual casacore::String ViiType() const { return casacore::String("Regridding( ")+getVii()->ViiType()+" )"; }; 81 : 82 : // Navigation methods 83 : void origin (); 84 : 85 : // Frequency specification methods 86 : casacore::Int getReportingFrameOfReference () const; // Used by VisBufferImpl2 to determine default ref. frame 87 : casacore::Vector<casacore::Double> getFrequencies ( casacore::Double time, casacore::Int frameOfReference, 88 : casacore::Int spectralWindowId, casacore::Int msId) const; 89 : // casacore::Data accessors 90 : void flag(casacore::Cube<casacore::Bool>& flagCube) const; 91 : void floatData (casacore::Cube<casacore::Float> & vis) const; 92 : void visibilityObserved (casacore::Cube<casacore::Complex> & vis) const; 93 : void visibilityCorrected (casacore::Cube<casacore::Complex> & vis) const; 94 : void visibilityModel (casacore::Cube<casacore::Complex> & vis) const; 95 : void weightSpectrum(casacore::Cube<casacore::Float> &weightSp) const; 96 : void sigmaSpectrum (casacore::Cube<casacore::Float> &sigmaSp) const; 97 : 98 0 : bool weightSpectrumExists () const {return true;} 99 0 : bool sigmaSpectrumExists () const {return true;} 100 : 101 : protected: 102 : 103 : casacore::Bool parseConfiguration(const casacore::Record &configuration); 104 : void initialize(); 105 : 106 : void initFrequencyGrid(); 107 : void initFrequencyTransformationEngine() const; 108 : 109 : template<class T> void transformDataCube( const casacore::Cube<T> &inputVis, 110 : casacore::Cube<T> &outputVis) const; 111 : 112 : int nChan_p; 113 : casacore::String mode_p; 114 : casacore::String start_p; 115 : casacore::String width_p; 116 : casacore::String velocityType_p; 117 : casacore::String restFrequency_p; 118 : casacore::String interpolationMethodPar_p; 119 : casacore::String outputReferenceFramePar_p; 120 : casac::variant *phaseCenterPar_p; 121 : casacore::uInt regriddingMethod_p; 122 : 123 : casacore::Bool refFrameTransformation_p; 124 : casacore::Bool radialVelocityCorrection_p; 125 : casacore::Bool radialVelocityCorrectionSignificant_p; 126 : 127 : casacore::MEpoch referenceTime_p; 128 : casacore::MDirection phaseCenter_p; 129 : casacore::MPosition observatoryPosition_p; 130 : casacore::MRadialVelocity radialVelocity_p; 131 : casacore::MFrequency::Types outputReferenceFrame_p; 132 : casacore::MFrequency::Types inputReferenceFrame_p; 133 : 134 : mutable casacore::MFrequency::Convert freqTransEngine_p; 135 : mutable casacore::uInt freqTransEngineRowId_p; 136 : 137 : mutable casacore::Double fftShift_p; 138 : casacore::FFTServer<casacore::Float, casacore::Complex> fFFTServer_p; 139 : 140 : casacore::MSColumns *selectedInputMsCols_p; 141 : casacore::MSFieldColumns *inputMSFieldCols_p; 142 : 143 : mutable map<casacore::Int,casacore::Float> weightFactorMap_p; 144 : mutable map<casacore::Int,casacore::Float> sigmaFactorMap_p; 145 : mutable inputOutputSpwMap inputOutputSpwMap_p; 146 : }; 147 : 148 : 149 : ////////////////////////////////////////////////////////////////////////// 150 : // RegriddingTVIFactory class 151 : ////////////////////////////////////////////////////////////////////////// 152 : 153 : class RegriddingTVIFactory : public ViFactory 154 : { 155 : 156 : public: 157 : 158 : RegriddingTVIFactory(casacore::Record &configuration,ViImplementation2 *inputVII); 159 : 160 : protected: 161 : 162 : vi::ViImplementation2 * createVi (VisibilityIterator2 *) const; 163 : vi::ViImplementation2 * createVi () const; 164 : 165 : casacore::Record configuration_p; 166 : ViImplementation2 *inputVii_p; 167 : }; 168 : 169 : ////////////////////////////////////////////////////////////////////////// 170 : // RegriddingTVILayerFactory class (for _recursive_ layering) 171 : ////////////////////////////////////////////////////////////////////////// 172 : 173 : class RegriddingTVILayerFactory : public ViiLayerFactory 174 : { 175 : 176 : public: 177 : 178 : RegriddingTVILayerFactory(casacore::Record &configuration); 179 : 180 0 : virtual ~RegriddingTVILayerFactory() {}; 181 : 182 : protected: 183 : 184 : 185 : virtual ViImplementation2 * createInstance(ViImplementation2* vii0) const; 186 : 187 : const casacore::Record configuration_p; 188 : 189 : }; 190 : 191 : ////////////////////////////////////////////////////////////////////////// 192 : // RegriddingTransformEngine class 193 : ////////////////////////////////////////////////////////////////////////// 194 : 195 : template<class T> class RegriddingKernel; // Forward declaration 196 : 197 : template<class T> class RegriddingTransformEngine : public FreqAxisTransformEngine2<T> 198 : { 199 : 200 : using FreqAxisTransformEngine2<T>::inputData_p; 201 : using FreqAxisTransformEngine2<T>::outputData_p; 202 : 203 : public: 204 : 205 : RegriddingTransformEngine ( RegriddingKernel<T> *kernel, 206 : DataCubeMap *inputData, 207 : DataCubeMap *outputData); 208 : 209 : void transform(); 210 : 211 : protected: 212 : 213 : // This member has to be a pointer, otherwise there 214 : // are compile time problems due to the fact that 215 : // it is a pure virtual class. 216 : RegriddingKernel<T> *regriddingKernel_p; 217 : }; 218 : 219 : ////////////////////////////////////////////////////////////////////////// 220 : // RegriddingKernel class 221 : ////////////////////////////////////////////////////////////////////////// 222 : 223 : template<class T> class RegriddingKernel 224 : { 225 : 226 : public: 227 : 228 : RegriddingKernel(); 229 : virtual void kernel(DataCubeMap *inputData,DataCubeMap *outputData) = 0; 230 0 : virtual ~RegriddingKernel() {} 231 : 232 : protected: 233 : 234 : casacore::Vector<casacore::Bool> & getInputFlagVector(DataCubeMap *inputData); 235 : casacore::Vector<casacore::Bool> & getOutputFlagVector(DataCubeMap *outputData); 236 : casacore::Vector<T> & getInputDataVector(DataCubeMap *inputData); 237 : casacore::Vector<T> & getOutputDataVector(DataCubeMap *outputData); 238 : 239 : casacore::Vector<casacore::Bool> inputDummyFlagVector_p; 240 : casacore::Vector<casacore::Bool> outputDummyFlagVector_p; 241 : casacore::Vector<T> inputDummyDataVector_p; 242 : casacore::Vector<T> outputDummyDataVector_p; 243 : 244 : casacore::Bool inputDummyFlagVectorInitialized_p; 245 : casacore::Bool outputDummyFlagVectorInitialized_p; 246 : casacore::Bool inputDummyDataVectorInitialized_p; 247 : casacore::Bool outputDummyDataVectorInitialized_p; 248 : 249 : }; 250 : 251 : ////////////////////////////////////////////////////////////////////////// 252 : // DataInterpolationKernel class 253 : ////////////////////////////////////////////////////////////////////////// 254 : 255 : template<class T> class DataInterpolationKernel : public RegriddingKernel<T> 256 : { 257 : using RegriddingKernel<T>::getInputFlagVector; 258 : using RegriddingKernel<T>::getOutputFlagVector; 259 : using RegriddingKernel<T>::getInputDataVector; 260 : using RegriddingKernel<T>::getOutputDataVector; 261 : 262 : public: 263 : 264 : DataInterpolationKernel( casacore::uInt interpolationMethod, 265 : casacore::Vector<casacore::Double> *inputFreq, 266 : casacore::Vector<casacore::Double> *outputFreq); 267 : 268 0 : ~DataInterpolationKernel() {} 269 : 270 : void kernel(DataCubeMap *inputData,DataCubeMap *outputData); 271 : 272 : protected: 273 : 274 : casacore::uInt interpolationMethod_p; 275 : casacore::Vector<casacore::Double> *inputFreq_p; 276 : casacore::Vector<casacore::Double> *outputFreq_p; 277 : }; 278 : 279 : ////////////////////////////////////////////////////////////////////////// 280 : // FlagFFTKernel class 281 : ////////////////////////////////////////////////////////////////////////// 282 : 283 : template<class T> class DataFFTKernel : public RegriddingKernel<T> 284 : { 285 : using RegriddingKernel<T>::getInputFlagVector; 286 : using RegriddingKernel<T>::getOutputFlagVector; 287 : using RegriddingKernel<T>::getInputDataVector; 288 : using RegriddingKernel<T>::getOutputDataVector; 289 : 290 : public: 291 : 292 : DataFFTKernel(casacore::Double fftShift); 293 : 294 0 : ~DataFFTKernel() {} 295 : 296 : void kernel(DataCubeMap *inputData,DataCubeMap *outputData); 297 : 298 : protected: 299 : 300 : void fftshift( casacore::Vector<casacore::Complex> &inputDataVector, 301 : casacore::Vector<casacore::Bool> &inputFlagVector, 302 : casacore::Vector<casacore::Complex> &outputDataVector, 303 : casacore::Vector<casacore::Bool> &outputFlagVector); 304 : 305 : void fftshift( casacore::Vector<casacore::Float> &inputDataVector, 306 : casacore::Vector<casacore::Bool> &inputFlagVector, 307 : casacore::Vector<casacore::Float> &outputDataVector, 308 : casacore::Vector<casacore::Bool> &outputFlagVector); 309 : 310 : 311 : casacore::Double fftShift_p; 312 : casacore::FFTServer<casacore::Float, casacore::Complex> fFFTServer_p; 313 : }; 314 : 315 : } //# NAMESPACE VI - END 316 : 317 : } //# NAMESPACE CASA - END 318 : 319 : #endif /* RegriddingTVI_H_ */ 320 :