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 :
|