Line data Source code
1 : //# PolAverageTVI.h: Transforming VI for polarization averaging
2 : //# Copyright (C) 1996,1997,1998,1999,2000,2001,2002,2003
3 : //# Associated Universities, Inc. Washington DC, USA.
4 : //#
5 : //# This library is free software; you can redistribute it and/or modify it
6 : //# under the terms of the GNU Library General Public License as published by
7 : //# the Free Software Foundation; either version 2 of the License, or (at your
8 : //# option) any later version.
9 : //#
10 : //# This library is distributed in the hope that it will be useful, but WITHOUT
11 : //# ANY WARRANTY; without even the Implied warranty of MERCHANTABILITY or
12 : //# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
13 : //# License for more details.
14 : //#
15 : //# You should have received a copy of the GNU Library General Public License
16 : //# along with this library; if not, write to the Free Software Foundation,
17 : //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
18 : //#
19 : //# Correspondence concerning AIPS++ should be addressed as follows:
20 : //# Internet email: aips2-request@nrao.edu.
21 : //# Postal address: AIPS++ Project Office
22 : //# National Radio Astronomy Observatory
23 : //# 520 Edgemont Road
24 : //# Charlottesville, VA 22903-2475 USA
25 : //#
26 : //# $Id: $
27 :
28 : #ifndef _MSVIS_POLAVERAGINGTVI_H_
29 : #define _MSVIS_POLAVERAGINGTVI_H_
30 :
31 : #include <casacore/casa/aips.h>
32 : #include <msvis/MSVis/ViImplementation2.h>
33 : #include <msvis/MSVis/TransformingVi2.h>
34 : #include <msvis/MSVis/VisibilityIterator2.h>
35 :
36 : #include <map>
37 : #include <vector>
38 :
39 : #include <casacore/measures/Measures/Stokes.h>
40 : #include <casacore/casa/Containers/Record.h>
41 :
42 : namespace casa { //# NAMESPACE CASA - BEGIN
43 :
44 : namespace vi { // # NAMESPACE VI - BEGIN
45 :
46 : //# forward decl
47 :
48 : class VisBuffer2;
49 :
50 : class ChannelSelector;
51 : class ChannelSelectorCache;
52 : typedef casacore::Vector<casacore::Vector<casacore::Slice> > ChannelSlicer;
53 : class SpectralWindowChannelsCache;
54 : class SpectralWindowChannels;
55 : class SubtableColumns;
56 :
57 : class PolAverageVi2Factory;
58 :
59 : // <summary>
60 : // PolAverageTVI
61 : // </summary>
62 :
63 : // <use visibility=export>
64 :
65 : // <reviewed reviewer="" date="yyyy/mm/dd" tests="" demos="">
66 : // </reviewed>
67 :
68 : // <prerequisite>
69 : // <li> <linkto class="MSIter">MSIter</linkto>
70 : // <li> <linkto class="casacore::MeasurementSet">casacore::MeasurementSet</linkto>
71 : // <li> <linkto class="VisSet">VisSet</linkto>
72 : // </prerequisite>
73 : //
74 : // <etymology>
75 : // PolAverageTVI
76 : // </etymology>
77 : //
78 : // <synopsis>
79 : //
80 : // </synopsis>
81 : //
82 : // <example>
83 : // <code>
84 : // //
85 : // </code>
86 : // </example>
87 : //
88 : // <motivation>
89 : //
90 : // </motivation>
91 : //
92 : // <thrown>
93 : // <li>
94 : // <li>
95 : // </thrown>
96 : //
97 : // <todo asof="1997/05/30">
98 : // <li> cleanup the currently dual interface for visibilities and flags
99 : // <li> sort out what to do with weights when interpolating
100 : // </todo>
101 :
102 : class PolAverageTVI: public TransformingVi2 {
103 :
104 : public:
105 :
106 : // Destructor
107 :
108 : virtual ~PolAverageTVI();
109 :
110 : // Report the the ViImplementation type
111 : // (should be specialized in child classes)
112 0 : virtual casacore::String ViiType() const {
113 0 : return casacore::String("PolAverage( ") + getVii()->ViiType() + " )";
114 : }
115 :
116 : // Methods to control and monitor subchunk iteration
117 :
118 : virtual void origin();
119 : virtual void next();
120 :
121 : // Override the following methods to always return Stokes::I
122 : virtual void corrType(casacore::Vector<casacore::Int> & corrTypes) const;
123 : virtual casacore::Vector<casacore::Int> getCorrelations() const;
124 : virtual casacore::Vector<casacore::Stokes::StokesTypes> getCorrelationTypesDefined() const;
125 : virtual casacore::Vector<casacore::Stokes::StokesTypes> getCorrelationTypesSelected() const;
126 :
127 : // Override the number of correlations per shape. This TVI just generates one output shape
128 : const casacore::Vector<casacore::Int>& nCorrelationsPerShape() const;
129 :
130 : // POLARIZATION table will have additional entry nPolarizationIds() should
131 : // return original number plus one
132 : // NB: nDataDescriptionIds() will not be affected
133 0 : virtual casacore::Int nPolarizationIds() const {
134 0 : return TransformingVi2::nPolarizationIds() + 1;
135 : }
136 :
137 : // Polarization Id will point to the new row to be added (to the end)
138 0 : virtual casacore::Int polarizationId() const {
139 0 : return nPolarizationIds() - 1;
140 : }
141 :
142 : // Return row flag
143 :
144 : virtual void flagRow (casacore::Vector<casacore::Bool> & rowflags) const;
145 :
146 : // Return flag for each polarization, channel and row
147 :
148 : virtual void flag(casacore::Cube<casacore::Bool> & flags) const;
149 :
150 : // Return flag for each channel & row
151 :
152 : virtual void flag(casacore::Matrix<casacore::Bool> & flags) const;
153 :
154 : // Return feed configuration matrix for specified antenna
155 : // Must fail
156 : virtual void jonesC(
157 : casacore::Vector<casacore::SquareMatrix<casacore::Complex, 2> > & cjones) const;
158 :
159 : // Return sigma
160 :
161 : virtual void sigma(casacore::Matrix<casacore::Float> & sigmat) const;
162 :
163 : // Return the visibilities as found in the casacore::MS, casacore::Cube (npol,nchan,nrow).
164 :
165 : virtual void visibilityCorrected(
166 : casacore::Cube<casacore::Complex> & vis) const;
167 : virtual void visibilityModel(casacore::Cube<casacore::Complex> & vis) const;
168 : virtual void visibilityObserved(
169 : casacore::Cube<casacore::Complex> & vis) const;
170 :
171 : // Return FLOAT_DATA as a casacore::Cube (npol, nchan, nrow) if found in the MS.
172 :
173 : virtual void floatData(casacore::Cube<casacore::Float> & fcube) const;
174 :
175 : // Return the shape of the visibility Cube
176 :
177 : virtual casacore::IPosition visibilityShape() const;
178 :
179 : // Return weight
180 : // TODO
181 :
182 : virtual void weight(casacore::Matrix<casacore::Float> & wtmat) const;
183 :
184 : // Return weightspectrum (a weight for each channel)
185 : // TODO
186 :
187 : virtual void weightSpectrum(casacore::Cube<casacore::Float> & wtsp) const;
188 : virtual void sigmaSpectrum(casacore::Cube<casacore::Float> & wtsp) const;
189 :
190 : // Return imaging weight (a weight for each channel)
191 : // virtual casacore::Matrix<casacore::Float> & imagingWeight (casacore::Matrix<casacore::Float> & wt) const;
192 :
193 : virtual const VisImagingWeight & getImagingWeightGenerator() const;
194 :
195 : protected:
196 :
197 : // Constructor
198 :
199 : PolAverageTVI(ViImplementation2 * inputVi);
200 :
201 : // transform data (DATA, CORRECTED_DATA, MODEL_DATA, FLOAT_DATA)
202 : virtual void transformComplexData(
203 : casacore::Cube<casacore::Complex> const &dataIn,
204 : casacore::Cube<casacore::Bool> const &flagIn,
205 : casacore::Cube<casacore::Complex> &dataOut) const = 0;
206 : virtual void transformFloatData(casacore::Cube<casacore::Float> const &dataIn,
207 : casacore::Cube<casacore::Bool> const &flagIn,
208 : casacore::Cube<casacore::Float> &dataOut) const = 0;
209 :
210 : // transform weight (WEIGHT, WEIGHT_SPECTRUM)
211 : // TODO
212 : virtual void transformWeight(casacore::Array<casacore::Float> const &weightIn,
213 : casacore::Array<casacore::Float> &weightOut) const = 0;
214 :
215 : void configureShapes();
216 :
217 : // Flags (per ms, per data description) whether transformation must be executed or not
218 : // condition:
219 : //
220 : // 1. if polarization type is neither Linear nor Circular, do not transform
221 : // 2. if visibility only contain one polarization component, do not transform
222 : // 3. if visibility contains cross-polarization (XY, YX, RL, LR), do not
223 : // take into account it
224 : //
225 : // casacore::Vector<Vector<Bool> > doTransform_;
226 : casacore::Vector<casacore::Bool> doTransform_;
227 :
228 : // List of polarization ids that points either (XX,YY) or (RR,LL)
229 : // Vector<Vector<uInt> > polId0;
230 : // Vector<Vector<uInt> > polId1;
231 : casacore::Vector<casacore::Int> polId0_;casacore::Vector<casacore::Int> polId1_;
232 :
233 : casacore::Vector<casacore::Int> nCorrelationsPerShape_;
234 :
235 : private:
236 :
237 : // Properly fill doTransform_, polId0_, and polId1_ based on current MS
238 : void configurePolAverage();
239 :
240 : // Reconfigure if necessary
241 0 : void reconfigurePolAverageIfNecessary() {
242 0 : if (isNewMs()) {
243 0 : configurePolAverage();
244 : }
245 0 : }
246 :
247 : // warn if current dd is inappropriate for polarization averaging
248 : void warnIfNoTransform();
249 :
250 : friend PolAverageVi2Factory;
251 : };
252 :
253 : class GeometricPolAverageTVI: public PolAverageTVI {
254 : public:
255 : GeometricPolAverageTVI(ViImplementation2 * inputVi);
256 : ~GeometricPolAverageTVI();
257 :
258 : // Report the the ViImplementation type
259 : // (should be specialized in child classes)
260 0 : virtual casacore::String ViiType() const {
261 0 : return casacore::String("GeometricPolAverage( ") + getVii()->ViiType()
262 0 : + " )";
263 : }
264 :
265 : // transform data (DATA, CORRECTED_DATA, MODEL_DATA, FLOAT_DATA)
266 : virtual void transformComplexData(
267 : casacore::Cube<casacore::Complex> const &dataIn,
268 : casacore::Cube<casacore::Bool> const &flagIn,
269 : casacore::Cube<casacore::Complex> &dataOut) const;
270 : virtual void transformFloatData(casacore::Cube<casacore::Float> const &dataIn,
271 : casacore::Cube<casacore::Bool> const &flagIn,
272 : casacore::Cube<casacore::Float> &dataOut) const;
273 :
274 : // transform weight (WEIGHT, WEIGHT_SPECTRUM)
275 : // TODO
276 : virtual void transformWeight(casacore::Array<casacore::Float> const &weightIn,
277 : casacore::Array<casacore::Float> &weightOut) const;
278 :
279 : protected:
280 :
281 : template<class T>
282 : void transformData(casacore::Cube<T> const &dataIn,
283 : casacore::Cube<casacore::Bool> const &flagIn,
284 : casacore::Int pid0,
285 : casacore::Int pid1,
286 : casacore::Cube<T> &dataOut) const;
287 : };
288 :
289 : class StokesPolAverageTVI: public PolAverageTVI {
290 : public:
291 : StokesPolAverageTVI(ViImplementation2 * inputVi);
292 : ~StokesPolAverageTVI();
293 :
294 : // Report the the ViImplementation type
295 : // (should be specialized in child classes)
296 0 : virtual casacore::String ViiType() const {
297 0 : return casacore::String("StokesPolAverage( ") + getVii()->ViiType() + " )";
298 : }
299 :
300 : // transform data (DATA, CORRECTED_DATA, MODEL_DATA, FLOAT_DATA)
301 : virtual void transformComplexData(
302 : casacore::Cube<casacore::Complex> const &dataIn,
303 : casacore::Cube<casacore::Bool> const &flagIn,
304 : casacore::Cube<casacore::Complex> &dataOut) const;
305 : virtual void transformFloatData(casacore::Cube<casacore::Float> const &dataIn,
306 : casacore::Cube<casacore::Bool> const &flagIn,
307 : casacore::Cube<casacore::Float> &dataOut) const;
308 :
309 : // transform weight (WEIGHT, WEIGHT_SPECTRUM)
310 : // TODO
311 : virtual void transformWeight(casacore::Array<casacore::Float> const &weightIn,
312 : casacore::Array<casacore::Float> &weightOut) const;
313 :
314 : protected:
315 :
316 : template<class T>
317 : void transformData(casacore::Cube<T> const &dataIn,
318 : casacore::Cube<casacore::Bool> const &flagIn,
319 : casacore::Int pid0,
320 : casacore::Int pid1,
321 : casacore::Cube<T> &dataOut) const;
322 : };
323 :
324 : // <summary>
325 : // A factory for generating ViImplementation2 for polarization averaging.
326 : // </summary>
327 : //
328 : // <use visibility=export>
329 : //
330 : // <prerequisite>
331 : // <li> <linkto class="VisibilityIterator2:description">VisibilityIterator2</linkto>
332 : // </prerequisite>
333 : //
334 : // <etymology>
335 : // Factory for layered ViImplementation2 construction
336 : // </etymology>
337 : //
338 : // <synopsis>
339 : // PolAverageVi2Factory
340 : // </synopsis>
341 : //
342 : // <motivation>
343 : //
344 : // </motivation>
345 : //
346 : // <example>
347 : //
348 : // </example>
349 :
350 : class PolAverageVi2Factory: public ViFactory {
351 :
352 : public:
353 : // Constructor
354 : PolAverageVi2Factory(casacore::Record const &configuration,
355 : ViImplementation2 *inputVII);
356 : PolAverageVi2Factory(casacore::Record const &configuration,
357 : casacore::MeasurementSet const *ms, SortColumns const sortColumns,
358 : casacore::Double timeInterval, casacore::Bool isWritable);
359 :
360 : // Destructor
361 : ~PolAverageVi2Factory();
362 :
363 : ViImplementation2 * createVi() const;
364 :
365 : private:
366 : enum AveragingMode {
367 : GEOMETRIC, STOKES, NUM_MODES, DEFAULT = STOKES
368 : };
369 :
370 0 : static AveragingMode GetAverageModeFromConfig(
371 : casacore::Record const &configuration) {
372 0 : if (configuration.isDefined("mode")) {
373 0 : casacore::String mode = configuration.asString("mode");
374 0 : mode.downcase();
375 0 : if (mode == "geometric") {
376 0 : return AveragingMode::GEOMETRIC;
377 0 : } else if (mode == "stokes") {
378 0 : return AveragingMode::STOKES;
379 0 : } else if (mode == "default") {
380 0 : return AveragingMode::DEFAULT;
381 : } else {
382 0 : return AveragingMode::NUM_MODES;
383 : }
384 : }
385 0 : return AveragingMode::DEFAULT;
386 : }
387 :
388 : ViImplementation2 *inputVII_p;
389 :
390 : AveragingMode mode_;
391 : };
392 :
393 : class PolAverageTVILayerFactory: public ViiLayerFactory {
394 :
395 : public:
396 : PolAverageTVILayerFactory(casacore::Record const &configuration);
397 0 : virtual ~PolAverageTVILayerFactory() {
398 0 : }
399 : ;
400 :
401 : protected:
402 :
403 : ViImplementation2 * createInstance(ViImplementation2* vii0) const;
404 :
405 : casacore::Record configuration_p;
406 :
407 : };
408 :
409 : } //# NAMESPACE VI - END
410 :
411 : } //# NAMESPACE CASA - END
412 :
413 : #endif // _MSVIS_POLAVERAGINGTVI_H_
414 :
|