Line data Source code
1 : //# ChannelAverageTVI.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 ChannelAverageTVI_H_
24 : #define ChannelAverageTVI_H_
25 :
26 : // Base class
27 : #include <mstransform/TVI/FreqAxisTVI.h>
28 :
29 : //#define REPORT_TIMING
30 :
31 : namespace casa { //# NAMESPACE CASA - BEGIN
32 :
33 : namespace vi { //# NAMESPACE VI - BEGIN
34 :
35 : //////////////////////////////////////////////////////////////////////////
36 : // ChannelAverageTVI class
37 : //////////////////////////////////////////////////////////////////////////
38 :
39 : class ChannelAverageTVI : public FreqAxisTVI
40 : {
41 :
42 : public:
43 :
44 : ChannelAverageTVI(ViImplementation2 * inputVii, const casacore::Record &configuration);
45 : // Report the the ViImplementation type
46 0 : virtual casacore::String ViiType() const override { return casacore::String("ChannelAverage( ")+getVii()->ViiType()+" )"; };
47 :
48 : #ifdef _OPENMP
49 21 : virtual void originChunks(casacore::Bool forceRewind) {
50 21 : Tfl_=Tws_=Tss_=Tcd_=Tmd_=Tchave_=0.0; getVii()->originChunks(forceRewind); }
51 : #ifdef REPORT_TIMING
52 : virtual ~ChannelAverageTVI() {
53 : cout << "ChannelAverageTVI: " << endl
54 : << " T_flagCube =" << Tfl_ << endl
55 : << " T_weightSpectrum =" << Tws_ << endl
56 : << " T_sigmaSpectrum =" << Tss_ << endl
57 : << " T_visibilityCorrected =" << Tcd_ << endl
58 : << " T_visibilityModel =" << Tmd_ << endl
59 : << " T_total =" << Tfl_+Tws_+Tss_+Tcd_+Tmd_
60 : << endl;
61 : }
62 : #endif
63 : #endif
64 :
65 : void flag(casacore::Cube<casacore::Bool>& flagCube) const override;
66 : void floatData (casacore::Cube<casacore::Float> & vis) const override;
67 : void visibilityObserved (casacore::Cube<casacore::Complex> & vis) const override;
68 : void visibilityCorrected (casacore::Cube<casacore::Complex> & vis) const override;
69 : void visibilityModel (casacore::Cube<casacore::Complex> & vis) const override;
70 : void weightSpectrum(casacore::Cube<casacore::Float> &weightSp) const override;
71 : void sigmaSpectrum (casacore::Cube<casacore::Float> &sigmaSp) const override;
72 :
73 6 : casacore::Bool weightSpectrumExists () const override {return true;}
74 0 : casacore::Bool sigmaSpectrumExists () const override {return true;}
75 :
76 : casacore::Vector<casacore::Double> getFrequencies ( casacore::Double time, casacore::Int frameOfReference,
77 : casacore::Int spectralWindowId, casacore::Int msId) const override;
78 : casacore::Vector<casacore::Double> getChanWidths ( casacore::Double time, casacore::Int frameOfReference,
79 : casacore::Int spectralWindowId, casacore::Int msId) const override;
80 :
81 :
82 : void writeFlag (const casacore::Cube<casacore::Bool> & flag) override;
83 :
84 : protected:
85 :
86 : void propagateChanAvgFlags (const casacore::Cube<casacore::Bool> &avgFlagCube, casacore::Cube<casacore::Bool> &expandedFlagCube);
87 : casacore::Bool parseConfiguration(const casacore::Record &configuration);
88 : void initialize();
89 :
90 : casacore::Vector<casacore::Int> chanbin_p;
91 : // (back)propagate flags as flagdata likes it (CAS-12737): existing ones are always preserved
92 : bool flagdataFlagPropagation_p;
93 : mutable std::map<casacore::Int,casacore::uInt > spwChanbinMap_p; // Must be accessed from const methods
94 :
95 : #ifdef _OPENMP
96 : mutable casacore::Double Tfl_,Tws_,Tcd_,Tmd_,Tss_,Tchave_;
97 : #endif
98 : };
99 :
100 : //////////////////////////////////////////////////////////////////////////
101 : // ChannelAverageTVIFactory class
102 : //////////////////////////////////////////////////////////////////////////
103 :
104 : class ChannelAverageTVIFactory : public ViFactory
105 : {
106 :
107 : public:
108 :
109 : ChannelAverageTVIFactory(casacore::Record &configuration,
110 : ViImplementation2 *inputVII);
111 :
112 : protected:
113 :
114 : vi::ViImplementation2 * createVi () const;
115 :
116 : casacore::Record configuration_p;
117 : ViImplementation2 *inputVii_p;;
118 : };
119 :
120 : //////////////////////////////////////////////////////////////////////////
121 : // ChannelAverageTVILayerFactory class (for _recursive_ layering)
122 : //////////////////////////////////////////////////////////////////////////
123 :
124 : class ChannelAverageTVILayerFactory : public ViiLayerFactory
125 : {
126 :
127 : public:
128 :
129 : ChannelAverageTVILayerFactory(casacore::Record &configuration);
130 :
131 42 : virtual ~ChannelAverageTVILayerFactory() {};
132 :
133 : protected:
134 :
135 :
136 : virtual ViImplementation2 * createInstance(ViImplementation2* vii0) const;
137 :
138 : const casacore::Record configuration_p;
139 :
140 : };
141 :
142 : //////////////////////////////////////////////////////////////////////////
143 : // ChannelAverageTransformEngine class
144 : //////////////////////////////////////////////////////////////////////////
145 :
146 :
147 : template<class T> class ChannelAverageKernel; // Forward declaration
148 :
149 : template<class T> class ChannelAverageTransformEngine : public FreqAxisTransformEngine2<T>
150 : {
151 :
152 : using FreqAxisTransformEngine2<T>::inputData_p;
153 : using FreqAxisTransformEngine2<T>::outputData_p;
154 :
155 : public:
156 :
157 : ChannelAverageTransformEngine ( ChannelAverageKernel<T> *kernel,
158 : DataCubeMap *inputData,
159 : DataCubeMap *outputData,
160 : casacore::uInt width);
161 :
162 : // package transformation of all corr,row spectra in the in/outputData_p
163 : // gmoellen (2017Mar06)
164 : void transformAll();
165 :
166 : void transform();
167 :
168 : protected:
169 :
170 : casacore::uInt width_p;
171 : // This member has to be a pointer, otherwise there
172 : // are compile time problems due to the fact that
173 : // it is a pure virtual class.
174 : ChannelAverageKernel<T> *chanAvgKernel_p;
175 : };
176 :
177 : //////////////////////////////////////////////////////////////////////////
178 : // ChannelAverageKernel class
179 : //////////////////////////////////////////////////////////////////////////
180 :
181 : template<class T> class ChannelAverageKernel
182 : {
183 :
184 : public:
185 :
186 : virtual void kernel(DataCubeMap *inputData,
187 : DataCubeMap *outputData,
188 : casacore::uInt startInputPos,
189 : casacore::uInt outputPos,
190 : casacore::uInt width) = 0;
191 : };
192 :
193 : //////////////////////////////////////////////////////////////////////////
194 : // PlainChannelAverageKernel class
195 : // (numerical averaging, ignoring flags)
196 : //////////////////////////////////////////////////////////////////////////
197 :
198 : template<class T> class PlainChannelAverageKernel : public ChannelAverageKernel<T>
199 : {
200 :
201 : public:
202 :
203 : void kernel( DataCubeMap *inputData,
204 : DataCubeMap *outputData,
205 : casacore::uInt startInputPos,
206 : casacore::uInt outputPos,
207 : casacore::uInt width);
208 :
209 : };
210 :
211 : //////////////////////////////////////////////////////////////////////////
212 : // FlaggedChannelAverageKernel class
213 : // (numerical averaging, respecting flags)
214 : //////////////////////////////////////////////////////////////////////////
215 :
216 : template<class T> class FlaggedChannelAverageKernel : public ChannelAverageKernel<T>
217 : {
218 :
219 : public:
220 :
221 : void kernel(DataCubeMap *inputData,
222 : DataCubeMap *outputData,
223 : casacore::uInt startInputPos,
224 : casacore::uInt outputPos,
225 : casacore::uInt width);
226 : };
227 :
228 : //////////////////////////////////////////////////////////////////////////
229 : // WeightedChannelAverageKernel class
230 : // (weighted averaging, respecting flags)
231 : //////////////////////////////////////////////////////////////////////////
232 :
233 : template<class T> class WeightedChannelAverageKernel : public ChannelAverageKernel<T>
234 : {
235 :
236 : public:
237 :
238 : void kernel(DataCubeMap *inputData,
239 : DataCubeMap *outputData,
240 : casacore::uInt startInputPos,
241 : casacore::uInt outputPos,
242 : casacore::uInt width);
243 : };
244 :
245 : //////////////////////////////////////////////////////////////////////////
246 : // LogicalANDKernel class
247 : //////////////////////////////////////////////////////////////////////////
248 :
249 : template<class T> class LogicalANDKernel : public ChannelAverageKernel<T>
250 : {
251 :
252 : public:
253 :
254 : void kernel(DataCubeMap *inputData,
255 : DataCubeMap *outputData,
256 : casacore::uInt startInputPos,
257 : casacore::uInt outputPos,
258 : casacore::uInt width);
259 : };
260 :
261 : //////////////////////////////////////////////////////////////////////////
262 : // ChannelAccumulationKernel class
263 : // (numerical accumulation, respecting flags)
264 : //////////////////////////////////////////////////////////////////////////
265 :
266 : template<class T> class ChannelAccumulationKernel : public ChannelAverageKernel<T>
267 : {
268 :
269 : public:
270 :
271 : void kernel(DataCubeMap *inputData,
272 : DataCubeMap *outputData,
273 : casacore::uInt startInputPos,
274 : casacore::uInt outputPos,
275 : casacore::uInt width);
276 : };
277 :
278 : } //# NAMESPACE VI - END
279 :
280 : } //# NAMESPACE CASA - END
281 :
282 : #endif /* ChannelAverageTVI_H_ */
283 :
|