Line data Source code
1 : //# CLPatchPanel.h: Definition for Calibration patch panel
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 adressed 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 : //#
27 :
28 : #ifndef CALTABLES_CLPATCHPANEL_H
29 : #define CALTABLES_CLPATCHPANEL_H
30 :
31 : #include <synthesis/CalTables/NewCalTable.h>
32 : #include <synthesis/CalTables/CTColumns.h>
33 : #include <synthesis/CalTables/CTTimeInterp1.h>
34 : #include <synthesis/CalTables/RIorAParray.h>
35 : #include <synthesis/CalTables/VisCalEnum.h>
36 : #include <casacore/scimath/Mathematics/InterpolateArray1D.h>
37 : #include <casacore/casa/Arrays/Array.h>
38 : #include <casacore/casa/Arrays/Matrix.h>
39 : #include <casacore/casa/Arrays/Cube.h>
40 : #include <casacore/ms/MeasurementSets/MeasurementSet.h>
41 : #include <casacore/ms/MeasurementSets/MSField.h>
42 : #include <casacore/ms/MeasurementSets/MSColumns.h>
43 : #include <casacore/casa/aips.h>
44 :
45 : //#include <casa/BasicSL/Constants.h>
46 : //#include <casa/OS/File.h>
47 : //#include <casa/Logging/LogMessage.h>
48 : //#include <casa/Logging/LogSink.h>
49 :
50 : namespace casacore{
51 :
52 : class MSSelectableTable;
53 : }
54 :
55 : namespace casa { //# NAMESPACE CASA - BEGIN
56 :
57 :
58 : // A specialized key class for Calibration patch panel elements
59 : class CalPatchKey
60 : {
61 : public:
62 : CalPatchKey(casacore::IPosition keyids);
63 424923 : virtual ~CalPatchKey() {};
64 : virtual casacore::Bool operator<(const CalPatchKey& other) const;
65 : virtual casacore::String print() const =0;
66 : private:
67 : casacore::Vector<casacore::Int> cpk_;
68 : };
69 :
70 : class MSCalPatchKey : virtual public CalPatchKey
71 : {
72 : public:
73 : MSCalPatchKey(casacore::Int obs,casacore::Int scan,casacore::Int fld,casacore::Int ent,casacore::Int spw,casacore::Int ant=-1);
74 418619 : virtual ~MSCalPatchKey(){};
75 : virtual casacore::String print() const;
76 : private:
77 : casacore::Int obs_,scan_,fld_,ent_,spw_,ant_;
78 : };
79 :
80 :
81 : class CTCalPatchKey : virtual public CalPatchKey
82 : {
83 : public:
84 : CTCalPatchKey(casacore::Int clsl,casacore::Int obs,casacore::Int scan,casacore::Int fld,casacore::Int spw,casacore::Int ant=-1);
85 6304 : virtual ~CTCalPatchKey(){};
86 : virtual casacore::String print() const;
87 : private:
88 : casacore::Int clsl_,obs_,scan_,fld_,spw_,ant_;
89 : };
90 :
91 : // A base class for calmaps
92 : class CalMap
93 : {
94 : public:
95 :
96 : // Null ctor (defaults everything)
97 : CalMap();
98 :
99 : // Construct from a Vector
100 : CalMap(const casacore::Vector<casacore::Int>& calmap);
101 :
102 : // Construct from a casacore::Record (int:int; TBD: need an casacore::MS to parse strings)
103 : // CalMap(const casacore::Record calmap):
104 :
105 : // Construct from a casacore::String (an algorithm or selection)
106 : //CalMap(casacore::String calmaptype,const NewCalTable& ct, const casacore::MeasurementSet ms,
107 : // casacore::Vector<casacore::Int> availids=casacore::Vector<casacore::Int>());
108 : // Construct from casacore::String and 2 Vectors (default, and explict to/from override)
109 : // TBD
110 :
111 : // Index method returns the ct id mapped to the specified msid
112 : casacore::Int operator()(casacore::Int msid) const; // ,const casacore::Vector<casacore::Int> availids=casacore::Vector<casacore::Int>()) const;
113 :
114 : // Return the ctids required for a set a msids (from among those available)
115 : // TBD: what to do if nominally required ctid is UNavailable (return only the avail ones?)
116 : casacore::Vector<casacore::Int> ctids(const casacore::Vector<casacore::Int>& msids) const;// const casacore::Vector<casacore::Int> availctids=casacore::Vector<casacore::Int>(0)) const;
117 :
118 : // Return the msids that will be satisfied by a specific ctid
119 : casacore::Vector<casacore::Int> msids(casacore::Int ctid,const casacore::Vector<casacore::Int>& superset=casacore::Vector<casacore::Int>()) const;
120 :
121 : // Return the verbatim (casacore::Vector) map
122 264 : casacore::Vector<casacore::Int> vmap() const { return vcalmap_; };
123 :
124 : protected:
125 : casacore::Vector<casacore::Int> vcalmap_; // simple
126 : //casacore::Matrix<casacore::Int> mcalmap_; // per-id prioritized, e.g., 'nearest'
127 : };
128 :
129 : class FieldCalMap : public CalMap
130 : {
131 : public:
132 :
133 : // Null ctor
134 : FieldCalMap();
135 :
136 : // Construct from casacore::Vector<casacore::Int> (override CalMap)
137 : FieldCalMap(const casacore::Vector<casacore::Int>& calmap);
138 :
139 : // Algorithmic ctor that uses casacore::MS and CT meta info
140 : FieldCalMap(const casacore::String fieldcalmap, const casacore::MeasurementSet& ms, const NewCalTable& ct);
141 : FieldCalMap(const casacore::String fieldcalmap,
142 : const casacore::MeasurementSet& ms, const NewCalTable& ct,
143 : casacore::String& extfldsel);
144 :
145 : private:
146 :
147 : // Calculate the simple nearest field map
148 : void setNearestFieldMap(const casacore::MeasurementSet& ms, const NewCalTable& ct);
149 : void setNearestFieldMap(const NewCalTable& ctasms, const NewCalTable& ct);
150 : void setNearestFieldMap(const casacore::MSFieldColumns& msfc, const ROCTColumns& ctc);
151 :
152 : // Parse field selection map
153 : void setSelectedFieldMap(const casacore::String& fieldsel,
154 : const casacore::MeasurementSet& ms,const NewCalTable& ct);
155 : void setSelectedFieldMap(const casacore::String& fieldsel,
156 : const casacore::MeasurementSet& ms,const NewCalTable& ct,
157 : casacore::String& extfldsel);
158 :
159 : // User's specification
160 : casacore::String fieldcalmap_;
161 :
162 :
163 : };
164 :
165 : class ObsCalMap : public CalMap
166 : {
167 : public:
168 :
169 : // Null ctor
170 : ObsCalMap();
171 :
172 : // Algorithmic ctor that uses casacore::MS meta info
173 : ObsCalMap(const casacore::String obscalmap,
174 : const casacore::MeasurementSet& ms);
175 :
176 : };
177 :
178 : class ScanCalMap : public CalMap
179 : {
180 : public:
181 :
182 : // Null ctor
183 : ScanCalMap();
184 :
185 : // Algorithmic ctor that uses casacore::MS meta info
186 : ScanCalMap(const casacore::String scancalmap,
187 : const casacore::MeasurementSet& ms);
188 :
189 : };
190 :
191 :
192 : // A class to parse the contents of a single CalLib slice
193 : // i.e., for one caltable, one setup
194 : class CalLibSlice
195 : {
196 : public:
197 : CalLibSlice(casacore::String obs, casacore::String scan, casacore::String fld, casacore::String ent, casacore::String spw,
198 : casacore::String tinterp,casacore::String finterp,
199 : casacore::Vector<casacore::Int> obsmap=casacore::Vector<casacore::Int>(1,-1),
200 : casacore::Vector<casacore::Int> scanmap=casacore::Vector<casacore::Int>(1,-1),
201 : casacore::Vector<casacore::Int> fldmap=casacore::Vector<casacore::Int>(1,-1),
202 : casacore::Vector<casacore::Int> spwmap=casacore::Vector<casacore::Int>(1,-1),
203 : casacore::Vector<casacore::Int> antmap=casacore::Vector<casacore::Int>(1,-1));
204 : CalLibSlice(const casacore::Record& clslice,
205 : const casacore::MeasurementSet& ms=casacore::MeasurementSet(),
206 : const NewCalTable& ct=NewCalTable());
207 :
208 :
209 : casacore::String obs,scan,fld,ent,spw;
210 : casacore::String tinterp,finterp;
211 : CalMap obsmap, scanmap, fldmap, spwmap, antmap;
212 :
213 : // validation
214 : static casacore::Bool validateCLS(const casacore::Record& clslice);
215 :
216 : // Extract as a record
217 : casacore::Record asRecord();
218 :
219 : // Report maps
220 : casacore::String state();
221 :
222 : // Support external field selection (for trimming in-focus caltable)
223 : casacore::String extfldsel;
224 :
225 : };
226 :
227 :
228 : class CLPPResult
229 : {
230 : public:
231 :
232 : CLPPResult();
233 : CLPPResult(const casacore::IPosition& shape);
234 : CLPPResult(casacore::uInt nPar,casacore::uInt nFPar,casacore::uInt nChan,casacore::uInt nelem);
235 : CLPPResult& operator=(const CLPPResult& other); // avoids deep casacore::Array copies
236 :
237 : void resize(casacore::uInt nPar,casacore::uInt nFPar,casacore::uInt nChan,casacore::uInt nelem);
238 :
239 : casacore::Matrix<casacore::Float> operator()(casacore::Int ielem) { return result_.xyPlane(ielem); };
240 2328 : casacore::Matrix<casacore::Float> result(casacore::Int ielem) { return result_.xyPlane(ielem); };
241 2098 : casacore::Matrix<casacore::Bool> resultFlag(casacore::Int ielem) { return resultFlag_.xyPlane(ielem); };
242 :
243 : casacore::Cube<casacore::Float> result_;
244 : casacore::Cube<casacore::Bool> resultFlag_;
245 :
246 : //private:
247 :
248 : };
249 :
250 :
251 :
252 :
253 :
254 :
255 : class CLPatchPanel
256 : {
257 : public:
258 :
259 : // From caltable name and casacore::MS shapes
260 : CLPatchPanel(const casacore::String& ctname,
261 : const casacore::Record& callib,
262 : VisCalEnum::MatrixType mtype,
263 : casacore::Int nPar,
264 : const CTTIFactoryPtr cttifactoryptr=&CTTimeInterp1::factory);
265 :
266 : // From caltable name and (selected) casacore::MS
267 : CLPatchPanel(const casacore::String& ctname,
268 : const casacore::MeasurementSet& ms,
269 : const casacore::Record& callib,
270 : VisCalEnum::MatrixType mtype,
271 : casacore::Int nPar,
272 : const CTTIFactoryPtr cttifactoryptr=&CTTimeInterp1::factory);
273 : // Destructor
274 : virtual ~CLPatchPanel();
275 :
276 : // Is specific calibration explicitly available for a obs,fld,intent,spw,ant combination?
277 : casacore::Bool calAvailable(casacore::Int obs, casacore::Int scan,
278 : casacore::Int fld, casacore::Int ent,
279 : casacore::Int spw, casacore::Int ant=-1);
280 : // Are specified indices OK for this CL (i.e., not explicitly marked as expected but absent)
281 : // Will be calibrated if calAvailable=true, will be ignored if calAvailable()=false
282 : casacore::Bool MSIndicesOK(casacore::Int obs, casacore::Int scan,
283 : casacore::Int fld, casacore::Int ent,
284 : casacore::Int spw, casacore::Int ant=-1);
285 :
286 : // Interpolate, given input obs, field, intent, spw, timestamp, & (optionally) freq
287 : // returns T if new result (anywhere,anyhow)
288 : // For casacore::Complex params (calls casacore::Float version)
289 : casacore::Bool interpolate(casacore::Cube<casacore::Complex>& resultC, casacore::Cube<casacore::Bool>& resFlag,
290 : casacore::Int obs, casacore::Int scan, casacore::Int fld, casacore::Int ent, casacore::Int spw,
291 : casacore::Double time, casacore::Double freq=-1.0);
292 : // For casacore::Float params
293 : casacore::Bool interpolate(casacore::Cube<casacore::Float>& resultR, casacore::Cube<casacore::Bool>& resFlag,
294 : casacore::Int obs, casacore::Int scan, casacore::Int fld, casacore::Int ent, casacore::Int spw,
295 : casacore::Double time, casacore::Double freq=-1.0);
296 :
297 : // Interpolate, given input obs, field, intent, spw, timestamp, & freq list
298 : // This is for freqdep interpolation context
299 : // returns T if new result (anywhere,anyhow)
300 : // For casacore::Complex params (calls casacore::Float version)
301 : casacore::Bool interpolate(casacore::Cube<casacore::Complex>& resultC, casacore::Cube<casacore::Bool>& resFlag,
302 : casacore::Int obs, casacore::Int scan, casacore::Int fld, casacore::Int ent, casacore::Int spw,
303 : casacore::Double time, const casacore::Vector<casacore::Double>& freq);
304 : // For casacore::Float params
305 : casacore::Bool interpolate(casacore::Cube<casacore::Float>& resultR, casacore::Cube<casacore::Bool>& resFlag,
306 : casacore::Int obs, casacore::Int scan, casacore::Int fld, casacore::Int ent, casacore::Int spw,
307 : casacore::Double time, const casacore::Vector<casacore::Double>& freq);
308 :
309 : // Const access to various state
310 : // TBD
311 :
312 : casacore::Bool getTresult(casacore::Cube<casacore::Float>& resultR, casacore::Cube<casacore::Bool>& resFlag,
313 : casacore::Int obs, casacore::Int scan, casacore::Int fld,
314 : casacore::Int ent, casacore::Int spw);
315 :
316 : // Access to CalTable's freq info
317 0 : casacore::Int nCTSpw() {return nCTSpw_;};
318 8 : const casacore::Vector<casacore::Double>& freqIn(casacore::Int spw) {return freqIn_[spw]; }; // per spw
319 0 : const casacore::Vector<casacore::Double>& refFreqIn() { return refFreqIn_; }; // indexed by spw
320 :
321 : // Report state
322 : void listmappings();
323 : void state();
324 :
325 : // CASA version of the internal caltable
326 0 : casacore::String CTCASAvers() { return ct_.CASAvers(); };
327 :
328 : private:
329 :
330 : // Null ctor does nothing
331 : CLPatchPanel() :mtype_(VisCalEnum::GLOBAL) {};
332 :
333 :
334 :
335 : // Methods to support layered selection
336 : void selectOnCTorMS(casacore::Table& ctout,casacore::MSSelectableTable& msst,
337 : const casacore::String& obs, const casacore::String& scan,
338 : const casacore::String& fld, const casacore::String& ent,
339 : const casacore::String& spw, const casacore::String& ant,
340 : const casacore::String& taql);
341 : void selectOnMS(casacore::MeasurementSet& msout,const casacore::MeasurementSet& msin,
342 : const casacore::String& obs, const casacore::String& scan,
343 : const casacore::String& fld, const casacore::String& ent,
344 : const casacore::String& spw, const casacore::String& ant);
345 : void selectOnCT(NewCalTable& ctout,const NewCalTable& ctin,
346 : const casacore::String& obs, const casacore::String& scan,
347 : const casacore::String& fld,
348 : const casacore::String& spw, const casacore::String& ant1);
349 :
350 : // Extract unique indices from caltables
351 0 : casacore::Vector<casacore::Int> getCLuniqueObsIds(NewCalTable& ct) {return getCLuniqueIds(ct,"obs"); };
352 0 : casacore::Vector<casacore::Int> getCLuniqueScanIds(NewCalTable& ct) {return getCLuniqueIds(ct,"scan"); };
353 0 : casacore::Vector<casacore::Int> getCLuniqueFldIds(NewCalTable& ct) {return getCLuniqueIds(ct,"fld"); };
354 0 : casacore::Vector<casacore::Int> getCLuniqueSpwIds(NewCalTable& ct) {return getCLuniqueIds(ct,"spw"); };
355 : casacore::Vector<casacore::Int> getCLuniqueIds(NewCalTable& ct, casacore::String vcol);
356 :
357 : // Extract unique indices (net selected) from MS
358 : casacore::Vector<casacore::Int> getMSuniqueIds(casacore::MeasurementSet& ms, casacore::String vcol);
359 :
360 : // Set generic antenna/baseline map
361 : // void setElemMap();
362 :
363 : // Resample in frequency
364 : void resampleInFreq(casacore::Matrix<casacore::Float>& fres,casacore::Matrix<casacore::Bool>& fflg,const casacore::Vector<casacore::Double>& fout,
365 : casacore::Matrix<casacore::Float>& tres,casacore::Matrix<casacore::Bool>& tflg,const casacore::Vector<casacore::Double>& fin,
366 : casacore::String finterp);
367 : void resampleFlagsInFreq(casacore::Vector<casacore::Bool>& flgout,const casacore::Vector<casacore::Double>& fout,
368 : casacore::Vector<casacore::Bool>& flgin,const casacore::Vector<casacore::Double>& fin,
369 : casacore::String finterp);
370 :
371 : // Baseline index from antenna indices: (assumes a1<=a2 !!)
372 : // inline casacore::Int blnidx(const casacore::Int& a1, const casacore::Int& a2, const casacore::Int& nAnt) { return a1*nAnt-a1*(a1+1)/2+a2; };
373 :
374 : // Translate freq axis interpolation string
375 : casacore::InterpolateArray1D<casacore::Double,casacore::Float>::InterpolationMethod ftype(casacore::String& strtype);
376 :
377 :
378 : void recordBadMSIndices(const casacore::Vector<casacore::Int>& obs, const casacore::Vector<casacore::Int>& scan,
379 : const casacore::Vector<casacore::Int>& fld, const casacore::Vector<casacore::Int>& ent,
380 : const casacore::Vector<casacore::Int>& spw);
381 :
382 :
383 : // PRIVATE DATA:
384 :
385 : // The Caltable
386 : NewCalTable ct_, ctasms_;
387 :
388 : // Associated (selected) MS
389 : casacore::MeasurementSet ms_;
390 :
391 : // casacore::Matrix type
392 : VisCalEnum::MatrixType mtype_;
393 :
394 : // Are parameters fundamentally complex?
395 : casacore::Bool isCmplx_;
396 :
397 : // The number of (casacore::Float) parameters (per-chan, per-element)
398 : casacore::Int nPar_, nFPar_;
399 :
400 : // casacore::InterpolateArray1D<casacore::Double,casacore::Float>::InterpolationMethod ia1dmethod_;
401 :
402 : // CalTable freq axis info
403 : casacore::Vector<casacore::Int> nChanIn_;
404 : casacore::Vector<casacore::Vector<casacore::Double> > freqIn_;
405 : casacore::Vector<casacore::Double> refFreqIn_;
406 :
407 : // Obs, Field, Spw, Ant _output_ (casacore::MS) sizes
408 : // calibration required for up to this many
409 : casacore::Int nMSObs_, nMSFld_, nMSSpw_, nMSAnt_, nMSElem_;
410 :
411 : // Obs, Field, Spw, Ant _input_ (CalTable) sizes
412 : // patch panels should not violate these (point to larger indices)
413 : casacore::Int nCTObs_, nCTFld_, nCTSpw_, nCTAnt_, nCTElem_;
414 :
415 : // Maps
416 : std::map<CTCalPatchKey,CLPPResult> clTres_;
417 : std::map<CTCalPatchKey,casacore::String> ciname_;
418 : std::map<CTCalPatchKey,CTTimeInterp1*> ci_;
419 :
420 :
421 : std::map<MSCalPatchKey,CLPPResult> msTres_,msFres_;
422 : std::map<MSCalPatchKey,casacore::String> msciname_;
423 : std::map<MSCalPatchKey,casacore::String> badmsciname_;
424 : std::map<MSCalPatchKey,casacore::Int> ctspw_;
425 : std::map<MSCalPatchKey,casacore::String> finterp_;
426 : std::map<MSCalPatchKey,CTTimeInterp1*> msci_;
427 :
428 : // Keep track of last cal result address (per spw)
429 : casacore::Vector<casacore::Float*> lastresadd_; // [nMSspw_]
430 :
431 : // Control conjugation of baseline-based solutions when mapping requires
432 : // casacore::Vector<casacore::Bool> conjTab_;
433 :
434 :
435 : casacore::Cube<casacore::Float> result_;
436 : casacore::Cube<casacore::Bool> resFlag_;
437 :
438 : casacore::LogIO logsink_;
439 :
440 : // The factory to use to create CTTimeInterp1s
441 : CTTIFactoryPtr cttifactoryptr_;
442 :
443 : };
444 :
445 :
446 : } //# NAMESPACE CASA - END
447 :
448 : #endif
|