Line data Source code
1 : //# MsAverager.h: Measurement Sets (Visiablity Averager)
2 : //# Copyright (C) 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: casa-feedback@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 : //#
27 : //#
28 : //# -------------------------------------------------------------------------
29 :
30 : #if !defined MSAVERAGER_H
31 : #define MSAVERAGER_H
32 :
33 :
34 : #include <casacore/casa/aips.h>
35 :
36 : #include <casacore/tables/Tables/SetupNewTab.h>
37 : //#include <tables/Tables/Table.h>
38 : #include <casacore/tables/Tables/MemoryTable.h>
39 : #include <casacore/tables/Tables/TableDesc.h>
40 : #include <casacore/tables/DataMan/StManAipsIO.h>
41 :
42 : #include <casacore/ms/MeasurementSets/MSColumns.h>
43 : #include <casacore/ms/MeasurementSets/MeasurementSet.h>
44 :
45 : #include <list>
46 :
47 : #include <msvis/MSVis/VisBuffer.h>
48 : #include <msvis/MSVis/VisibilityIterator.h>
49 : #include <msvis/MSVis/VisSet.h>
50 : //#include <msvis/MSVis/SubMS.h>
51 : #include <msvis/MSVis/SelectAverageSpw.h>
52 :
53 :
54 :
55 : ///////////////////////////////////////////////////////////////////////////////
56 : //# Start of documentation.
57 : //
58 : // <summary>
59 : // A class to average a visibilty data set in time and/or channel
60 : // </summary>
61 : //
62 : // <use visibility=export>
63 : //
64 : // <reviewed reviewer="Me" date="2007/12/25" tests="" demos="">
65 : // </reviewed>
66 :
67 : // <prerequisite>
68 : // <li> VisBuffer
69 : // <li> MeasurementSet
70 : // </prerequisite>
71 : //
72 : // <etymology>
73 : // From "visibility", "time", "channel", "polarization" and "averaging".
74 : // </etymology>
75 : //
76 : // <synopsis>
77 : // This class averages VisBuffers in time, channel.
78 : // </synopsis>
79 : //
80 : // <example>
81 : // casacore::MS ms("ngc5921.ms" casacore::Table::Update);
82 : // MsAverager msa(ms);
83 : // //chanlist is matrix of int its rows [spwid, start, end, step]
84 : // msa.setAverager(chanlist, 90, 32, "data", "SCALAR");
85 : // if (msa.ok()) {
86 : // casacore::MS avems;
87 : // msa.getMS(avems);
88 : // }
89 : //
90 : // </example>
91 : //
92 : // <motivation>
93 : // Provide time/channel averaging capabilities for plotxy.
94 : // </motivation>
95 : //
96 : // <thrown>
97 : // <li>
98 : // <li>
99 : // </thrown>
100 : //
101 : // <todo asof="2007/12/25">
102 : // <li> everything, and
103 : // <li> everything else
104 : // </todo>
105 :
106 : //# End of documentation.
107 : ///////////////////////////////////////////////////////////////////////////////
108 :
109 : namespace casa {
110 :
111 :
112 : class MsAverager
113 : {
114 :
115 : public:
116 : enum OutputMode {
117 : TableMS = 1,
118 : ListBuffer
119 : };
120 :
121 : MsAverager(casacore::MS*, OutputMode = MsAverager::TableMS);
122 : ~MsAverager();
123 :
124 : void reset(casacore::MS*, OutputMode = MsAverager::TableMS);
125 : void getMS(casacore::MS& ms);
126 : void getXY(casacore::Vector<casacore::Double>& x, casacore::Vector<casacore::Double>& y,
127 : casacore::Vector<casacore::Int>& f, casacore::Int pol);
128 : void getMap(casacore::Matrix<casacore::Int>& rowMap, casacore::Matrix<casacore::Int>& chanMap);
129 :
130 : //average engine and its status
131 : void setAverager(
132 : const casacore::Matrix<casacore::Int>& chanList,
133 : const casacore::Matrix<casacore::Int>& baselines,
134 : casacore::Double aveTime, casacore::Int aveChan,
135 : const casacore::String& column = "DATA",
136 : const casacore::String& aveMode = "VECTOR",
137 : const casacore::Bool& aveFlag = false,
138 : const casacore::Bool& aveScan = false,
139 : const casacore::Bool& aveBline = false,
140 : const casacore::Bool& aveArray = false,
141 : const casacore::Bool& aveVelo = false,
142 : const casacore::String& restfreq = "",
143 : const casacore::String& frame = "",
144 : const casacore::String& doppler = "");
145 : casacore::Bool ok() {return aveOK;}
146 : casacore::Int outputFormat() {return outputMode;}
147 :
148 : void showColumnNames();
149 : casacore::Bool isDataColumn(const casacore::String& colNmae);
150 : casacore::Bool hasColumn(const casacore::String& colName);
151 : static casacore::Int baselineRow(const casacore::Int& nAnt, const casacore::Int& a, const casacore::Int& b);
152 0 : casacore::Int baselineRow(const casacore::Int& a = -1, const casacore::Int& b = -1);
153 :
154 : void putAveBuffer(casacore::Double bufTime, casacore::Int bufField, casacore::Int bufScan,
155 : casacore::Int bufArray, VisBuffer& p, casacore::Int nTime);
156 : void initAveBuffer(casacore::Double bufTime, VisBuffer& p, casacore::Int nAnt, casacore::Int nChan);
157 : void putAveTable(casacore::Double bufTime, casacore::Int bufField, casacore::Int bufScan,
158 : casacore::Int bufArray, casacore::Int bufSpw, VisBuffer& p, casacore::Int nTime,
159 : casacore::Double timeShift);
160 : void showVisRow(casacore::Cube<casacore::Complex>& vc, casacore::Int row);
161 : void showMsRow(casacore::MSMainColumns* msc, casacore::Int row);
162 : void showAveMap(casacore::Matrix<casacore::Int>& rmap, casacore::Matrix<casacore::Int>& cmap);
163 :
164 : const static casacore::String DataColumn[4];
165 : casacore::Int npol() {return nAvePol;}
166 : casacore::Int nchan() {return nAveChan;}
167 : casacore::Int nAnt() {return nAntenna;}
168 :
169 : private:
170 : //to be averaged
171 : void cleanup();
172 : casacore::MS* pMS;
173 : VisSet* vs;
174 : casacore::String msName;
175 : //casacore::MSDerivedValues *msdv;
176 :
177 : //averaged, store as MS
178 : casacore::MS aMS;
179 : casacore::Int msRow;
180 : casacore::MSMainColumns *msc;
181 : //casacore::MSColumns *msc;
182 :
183 : //averaged, store as VBs
184 : VisBuffer* pAveBuff;
185 : std::list<VisBuffer*> aveList;
186 :
187 : //averaging inputs, ideally, calculate only needed column
188 : casacore::String column;
189 :
190 : //selected channels for each piece for spw expression
191 : //each row contains [spwid, start, end, stride]
192 : //may contains multiple rows of same spwid
193 : casacore::Matrix<casacore::Int> chanList;
194 :
195 : casacore::Vector<SAS> spw;
196 :
197 : //map between averaged and original
198 : casacore::Matrix<casacore::Int> aveChanMap;
199 : //casacore::Matrix<casacore::Double> aveTimeMap;
200 : casacore::Matrix<casacore::Int> aveRowMap;
201 :
202 : //averaging requirements
203 : casacore::String aveMode;
204 : casacore::Double aveTime;
205 : casacore::Int aveChan;
206 : casacore::Bool aveFlag;
207 : casacore::Bool crossScans;
208 : casacore::Bool crossBlines;
209 : casacore::Bool crossArrays;
210 : casacore::Bool crossSpws;
211 : casacore::Bool aveVel;
212 : casacore::Bool sorryVel;
213 : casacore::Matrix<casacore::Int> baselines;
214 :
215 : //size of the averaged
216 : casacore::Int nAveChan;
217 : casacore::Int nAveTime;
218 : casacore::Int nAveRow;
219 : casacore::Int nAvePol;
220 : casacore::Int nAntenna;
221 :
222 : casacore::String restfreq;
223 : casacore::String frame;
224 : casacore::String doppler;
225 :
226 : casacore::Bool aveOK;
227 :
228 : //utility
229 : static const casacore::String clname;
230 : //SLog *log;
231 :
232 : int outputMode;
233 :
234 :
235 : };
236 :
237 :
238 : }
239 : #endif
240 :
241 :
|