Line data Source code
1 : //# SolvableVJMBuf.cc: Implementation of SolvableVJMBuf.h
2 : //# Copyright (C) 1996,1997,1998,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 :
29 : #include <synthesis/CalTables/SolvableVJMBuf.h>
30 : #include <casacore/casa/Arrays/ArrayMath.h>
31 : #include <casacore/tables/Tables/RefRows.h>
32 :
33 : using namespace casacore;
34 : namespace casa { //# NAMESPACE CASA - BEGIN
35 :
36 : //----------------------------------------------------------------------------
37 :
38 0 : SolvableVisJonesMBuf::SolvableVisJonesMBuf() : TimeVarVisJonesMBuf()
39 : {
40 : // Null constructor
41 : // Output to private data:
42 : // totalSolnOk_p Vector<Bool> Validity of total solution
43 : // totalFit_p Vector<Float> Total fit
44 : // totalFitWgt_p Vector<Float> Total fit weight
45 : // solnOk_p Array<Bool> Solution validity mask
46 : // fitOK_p Array<Float> Fit array
47 : // fitWgt_p Array<Float> Fit weight array
48 : // totalSolnOkOK_p Bool Total solution vailidity cache ok
49 : // totalFitOK_p Bool Total fit cache ok
50 : // totalFitWgtOK_p Bool Total fit weight cache ok
51 : // solnOkOK_p Bool Solution validity mask cache ok
52 : // fitOK_p Bool Fit array cache ok
53 : // fitWgtOK_p Bool Fit weight array cache ok
54 : // flagOK_p Bool flag array cache ok
55 : // snrOK_p Bool snr array cache ok
56 : //
57 : // Invalidate cache
58 0 : invalidate();
59 0 : };
60 :
61 : //----------------------------------------------------------------------------
62 :
63 0 : SolvableVisJonesMBuf::SolvableVisJonesMBuf (const Vector<Int>& calIndices,
64 : const Block<Vector<Int> >&
65 0 : indexValues) :
66 0 : TimeVarVisJonesMBuf (calIndices, indexValues)
67 : {
68 : // Construct from a set of cal buffer indices and specified index values
69 : // Output to private data:
70 : // TimeVarVisJonesMBuf TimeVarVisJonesMBuf Parent class cal main
71 : // table buffer
72 : // Set local non-index columns to default values
73 0 : fillAttributes (calIndices);
74 0 : };
75 :
76 : //----------------------------------------------------------------------------
77 :
78 0 : SolvableVisJonesMBuf::SolvableVisJonesMBuf (CalIterBase& calIter)
79 0 : : TimeVarVisJonesMBuf (calIter)
80 : {
81 : // Construct from a calibration table iterator
82 : // Input:
83 : // calIter CalIterBase& Calibration table iterator
84 : // Output to private data:
85 : // totalSolnOk_p Vector<Bool> Validity of total solution
86 : // totalFit_p Vector<Float> Total fit
87 : // totalFitWgt_p Vector<Float> Total fit weight
88 : // solnOk_p Array<Bool> Solution validity mask
89 : // fitOK_p Array<Float> Fit array
90 : // fitWgt_p Array<Float> Fit weight array
91 : // totalSolnOkOK_p Bool Total solution vailidity cache ok
92 : // totalFitOK_p Bool Total fit cache ok
93 : // totalFitWgtOK_p Bool Total fit weight cache ok
94 : // solnOkOK_p Bool Solution validity mask cache ok
95 : // fitOK_p Bool Fit array cache ok
96 : // fitWgtOK_p Bool Fit weight array cache ok
97 : // flagOK_p Bool flag array cache ok
98 : // snrOK_p Bool snr array cache ok
99 : //
100 : // Invalidate cache
101 0 : invalidate();
102 0 : };
103 :
104 : //----------------------------------------------------------------------------
105 :
106 0 : Int SolvableVisJonesMBuf::append (CalTable& calTable)
107 : {
108 : // Append the current calibration buffer to a calibration table
109 : // Input:
110 : // calTable CalTable& Calibration table
111 : // Output:
112 : // append Int No. of rows appended
113 : //
114 : // Extend the inherited parent method
115 0 : Int nAdded = CalMainBuffer::append(calTable);
116 :
117 : // Compute the rows added in the parent class
118 0 : Int endRow = calTable.nRowMain() - 1;
119 0 : Int startRow = endRow - nAdded + 1;
120 :
121 : // Attach a cal table columns accessor
122 : SolvableVisJonesMCol svjMainCol
123 0 : (dynamic_cast<SolvableVisJonesTable&>(calTable));
124 :
125 : // Append the current cal buffer cal_main columns
126 0 : RefRows refRows(startRow, endRow);
127 0 : svjMainCol.totalSolnOk().putColumnCells(refRows, totalSolnOk());
128 0 : svjMainCol.totalFit().putColumnCells(refRows, totalFit());
129 0 : svjMainCol.totalFitWgt().putColumnCells(refRows, totalFitWgt());
130 0 : svjMainCol.solnOk().putColumnCells(refRows, solnOk());
131 0 : svjMainCol.fit().putColumnCells(refRows, fit());
132 0 : svjMainCol.fitWgt().putColumnCells(refRows, fitWgt());
133 0 : svjMainCol.flag().putColumnCells(refRows, flag());
134 0 : svjMainCol.snr().putColumnCells(refRows, snr());
135 :
136 0 : return nAdded;
137 : };
138 :
139 : //----------------------------------------------------------------------------
140 :
141 0 : Int SolvableVisJonesMBuf::nRow()
142 : {
143 : // Return the maximum number of rows in the cal buffer
144 : // Input from private data:
145 : // totalSolnOk_p Vector<Bool> Validity of total solution
146 : // totalFit_p Vector<Float> Total fit
147 : // totalFitWgt_p Vector<Float> Total fit weight
148 : // solnOk_p Array<Bool> Solution validity mask
149 : // fitOK_p Array<Float> Fit array
150 : // fitWgt_p Array<Float> Fit weight array
151 : // totalSolnOkOK_p Bool Total solution vailidity cache ok
152 : // totalFitOK_p Bool Total fit cache ok
153 : // totalFitWgtOK_p Bool Total fit weight cache ok
154 : // solnOkOK_p Bool Solution validity mask cache ok
155 : // fitOK_p Bool Fit array cache ok
156 : // fitWgtOK_p Bool Fit weight array cache ok
157 : // Output:
158 : // nRow Int Max. no. of rows in the buffer
159 : //
160 : // Extend the inherited parent method
161 0 : Int nRowParent = CalMainBuffer::nRow();
162 :
163 : // Process each local column individually
164 0 : Vector<Int> colLength(9);
165 0 : Int n = 0;
166 0 : colLength(n++) = nRowParent;
167 0 : colLength(n++) = totalSolnOk().nelements();
168 0 : colLength(n++) = totalFit().nelements();
169 0 : colLength(n++) = totalFitWgt().nelements();
170 0 : colLength(n++) = solnOk().shape().nelements() > 0 ?
171 0 : solnOk().shape().getLast(1)(0) : 0;
172 0 : colLength(n++) = fit().shape().nelements() > 0 ?
173 0 : fit().shape().getLast(1)(0) : 0;
174 0 : colLength(n++) = fitWgt().shape().nelements() > 0 ?
175 0 : fitWgt().shape().getLast(1)(0) : 0;
176 0 : colLength(n++) = flag().shape().nelements() > 0 ?
177 0 : flag().shape().getLast(1)(0) : 0;
178 0 : colLength(n++) = snr().shape().nelements() > 0 ?
179 0 : snr().shape().getLast(1)(0) : 0;
180 :
181 0 : return max(colLength);
182 : };
183 :
184 : //----------------------------------------------------------------------------
185 :
186 0 : Vector<Bool>& SolvableVisJonesMBuf::totalSolnOk()
187 : {
188 : // TOTAL_SOLUTION_OK data field accessor
189 : // Input from private data:
190 : // totalSolnOk_p Vector<Bool> Validity of total solution
191 : //
192 : // Fill local cache for this column if cache not valid
193 0 : if (connectedToIter()) {
194 0 : if (!totalSolnOkOK_p) {
195 0 : calMainCol()->totalSolnOk().getColumn (totalSolnOk_p);
196 0 : totalSolnOkOK_p = true;
197 : };
198 : };
199 0 : return totalSolnOk_p;
200 : };
201 :
202 : //----------------------------------------------------------------------------
203 :
204 0 : Vector<Float>& SolvableVisJonesMBuf::totalFit()
205 : {
206 : // TOTAL_FIT data field accessor
207 : // Input from private data:
208 : // totalFit_p Vector<Float> Total fit
209 : //
210 : // Fill local cache for this column if cache not valid
211 0 : if (connectedToIter()) {
212 0 : if (!totalFitOK_p) {
213 0 : calMainCol()->totalFit().getColumn (totalFit_p);
214 0 : totalFitOK_p = true;
215 : };
216 : };
217 0 : return totalFit_p;
218 : };
219 :
220 : //----------------------------------------------------------------------------
221 :
222 0 : Vector<Float>& SolvableVisJonesMBuf::totalFitWgt()
223 : {
224 : // TOTAL_FIT_WEIGHT data field accessor
225 : // Input from private data:
226 : // totalFitWgt_p Vector<Float> Total fit weight
227 : //
228 : // Fill local cache for this column if cache not valid
229 0 : if (connectedToIter()) {
230 0 : if (!totalFitWgtOK_p) {
231 0 : calMainCol()->totalFitWgt().getColumn (totalFitWgt_p);
232 0 : totalFitWgtOK_p = true;
233 : };
234 : };
235 0 : return totalFitWgt_p;
236 : };
237 :
238 : //----------------------------------------------------------------------------
239 :
240 0 : Array<Bool>& SolvableVisJonesMBuf::solnOk()
241 : {
242 : // SOLUTION_OK data field accessor
243 : // Input from private data:
244 : // solnOk_p Array<Bool> Solution validity mask
245 : //
246 : // Fill local cache for this column if cache not valid
247 0 : if (connectedToIter()) {
248 0 : if (!solnOkOK_p) {
249 0 : calMainCol()->solnOk().getColumn (solnOk_p);
250 0 : solnOkOK_p = true;
251 : };
252 : };
253 0 : return solnOk_p;
254 : };
255 :
256 : //----------------------------------------------------------------------------
257 :
258 0 : Array<Float>& SolvableVisJonesMBuf::fit()
259 : {
260 : // FIT data field accessor
261 : // Input from private data:
262 : // fit_p Array<Float> Fit array
263 : //
264 : // Fill local cache for this column if cache not valid
265 0 : if (connectedToIter()) {
266 0 : if (!fitOK_p) {
267 0 : calMainCol()->fit().getColumn (fit_p);
268 0 : fitOK_p = true;
269 : };
270 : };
271 0 : return fit_p;
272 : };
273 :
274 : //----------------------------------------------------------------------------
275 :
276 0 : Array<Float>& SolvableVisJonesMBuf::fitWgt()
277 : {
278 : // FIT_WGT data field accessor
279 : // Input from private data:
280 : // fitWgt_p Array<Float> Fit weight array
281 : //
282 : // Fill local cache for this column if cache not valid
283 0 : if (connectedToIter()) {
284 0 : if (!fitWgtOK_p) {
285 0 : calMainCol()->fitWgt().getColumn (fitWgt_p);
286 0 : fitWgtOK_p = true;
287 : };
288 : };
289 0 : return fitWgt_p;
290 : };
291 :
292 : //----------------------------------------------------------------------------
293 :
294 0 : Array<Bool>& SolvableVisJonesMBuf::flag()
295 : {
296 : // FLAG data field accessor
297 : // Input from private data:
298 : // flag_p Array<Bool> Solution flags mask
299 : //
300 : // Fill local cache for this column if cache not valid
301 0 : if (connectedToIter()) {
302 0 : if (!flagOK_p) {
303 0 : calMainCol()->flag().getColumn (flag_p);
304 0 : flagOK_p = true;
305 : };
306 : };
307 0 : return flag_p;
308 : };
309 :
310 : //----------------------------------------------------------------------------
311 :
312 0 : Array<Float>& SolvableVisJonesMBuf::snr()
313 : {
314 : // SNR data field accessor
315 : // Input from private data:
316 : // snr_p Array<Float> Snr array
317 : //
318 : // Fill local cache for this column if cache not valid
319 0 : if (connectedToIter()) {
320 0 : if (!snrOK_p) {
321 0 : calMainCol()->snr().getColumn (snr_p);
322 0 : snrOK_p = true;
323 : };
324 : };
325 0 : return snr_p;
326 : };
327 :
328 : //----------------------------------------------------------------------------
329 :
330 0 : void SolvableVisJonesMBuf::invalidate()
331 : {
332 : // Invalidate the current cache
333 : // Output to private data:
334 : // totalSolnOkOK_p Bool Total solution vailidity cache ok
335 : // totalFitOK_p Bool Total fit cache ok
336 : // totalFitWgtOK_p Bool Total fit weight cache ok
337 : // solnOkOK_p Bool Solution validity mask cache ok
338 : // fitOK_p Bool Fit array cache ok
339 : // fitWgtOK_p Bool Fit weight array cache ok
340 : // flagOK_p Bool Flag array cache ok
341 : // snrOK_p Bool Snr array cache ok
342 : //
343 : // Invalidate parent class cache
344 0 : CalMainBuffer::invalidate();
345 :
346 : // Set all cache flags to false
347 0 : totalSolnOkOK_p = false;
348 0 : totalFitOK_p = false;
349 0 : totalFitWgtOK_p = false;
350 0 : solnOkOK_p = false;
351 0 : fitOK_p = false;
352 0 : fitWgtOK_p = false;
353 0 : flagOK_p = false;
354 0 : snrOK_p = false;
355 0 : };
356 :
357 : //----------------------------------------------------------------------------
358 :
359 0 : void SolvableVisJonesMBuf::fillAttributes (const Vector<Int>& /*calIndices*/)
360 : {
361 : // Resize all attribute columns and set to their default values
362 : // Input:
363 : // calIndices const Vector<Int.& Vector of cal indices, specified
364 : // as enums from class MSCalEnums,
365 : // to exclude
366 : // Output to private data:
367 : // totalSolnOk_p Vector<Bool> Validity of total solution
368 : // totalFit_p Vector<Float> Total fit
369 : // totalFitWgt_p Vector<Float> Total fit weight
370 : // solnOk_p Array<Bool> Solution validity mask
371 : // fitOK_p Array<Float> Fit array
372 : // fitWgt_p Array<Float> Fit weight array
373 : //
374 : // Use the maximum number of rows currently defined in the cal buffer
375 0 : uInt nrow = nRow();
376 :
377 : // Process each local column separately
378 : //
379 : // TOTAL_SOLUTION_OK
380 0 : totalSolnOk().resize(nrow);
381 0 : totalSolnOk() = false;
382 :
383 : // TOTAL_FIT
384 0 : totalFit().resize(nrow);
385 0 : totalFit() = 0;
386 :
387 : // TOTAL_FIT_WEIGHT
388 0 : totalFitWgt().resize(nrow);
389 0 : totalFitWgt() = 0;
390 :
391 : // Array-based columns; set to default unit dimensions
392 0 : uInt numSpw = 1;
393 0 : uInt numChan = 1;
394 0 : uInt nJones = 1;
395 0 : IPosition sizeA(5, nJones, nJones, numSpw, numChan, nrow);
396 :
397 : // SOLUTION_OK
398 0 : solnOk().resize(sizeA);
399 0 : solnOk() = false;
400 :
401 : // FIT
402 0 : fit().resize(sizeA);
403 0 : fit() = 0;
404 :
405 : // FIT_WEIGHT
406 0 : fitWgt().resize(sizeA);
407 0 : fitWgt() = 0;
408 :
409 : // FLAG
410 0 : flag().resize(sizeA);
411 0 : flag() = true;
412 :
413 : // SNR
414 0 : snr().resize(sizeA);
415 0 : snr() = 0;
416 :
417 :
418 0 : return;
419 : };
420 :
421 : //----------------------------------------------------------------------------
422 :
423 0 : GJonesMBuf::GJonesMBuf() : SolvableVisJonesMBuf()
424 : {
425 : // Null constructor
426 0 : };
427 :
428 : //----------------------------------------------------------------------------
429 :
430 0 : GJonesMBuf::GJonesMBuf (const Vector<Int>& calIndices,
431 0 : const Block<Vector<Int> >& indexValues) :
432 0 : SolvableVisJonesMBuf (calIndices, indexValues)
433 : {
434 : // Construct from a set of cal buffer indices and specified index values
435 : // Output to private data:
436 : // SolvableVisJonesMBuf SolvableVisJonesMBuf Parent class cal main
437 : // table buffer
438 0 : };
439 :
440 : //----------------------------------------------------------------------------
441 :
442 0 : GJonesMBuf::GJonesMBuf (CalIterBase& calIter)
443 0 : : SolvableVisJonesMBuf (calIter)
444 : {
445 : // Construct from a calibration table iterator
446 : // Input:
447 : // calIter CalIterBase& Calibration table iterator
448 0 : };
449 :
450 : //----------------------------------------------------------------------------
451 :
452 0 : Bool GJonesMBuf::fillMatchingRows (const Vector<Int>& matchingRows,
453 : const String& sFreqGrpName,
454 : const Complex& sGain,
455 : const MFrequency& sRefFreq,
456 : const Int& sRefAnt)
457 : {
458 : // Update the calibration solution in each of a set of buffer rows
459 : // Input:
460 : // matchingRows const Vec<Int>& Buffer rows to update
461 : // sFreqGrpName const String& Freq. group name
462 : // sGain const Complex& Correction factor
463 : // sRefFreq const MFrequency& Reference frequency
464 : // sRefAnt const Int & Reference antenna id.
465 : //
466 : // Initialization
467 0 : Bool retval = false;
468 0 : Int nMatch = matchingRows.nelements();
469 :
470 0 : if (nMatch > 0) {
471 0 : retval = true;
472 : // Update each matched row
473 0 : for (Int i=0; i < nMatch; i++) {
474 0 : uInt row = matchingRows(i);
475 0 : freqGrpName()(row) = sFreqGrpName;
476 :
477 : // Update all array elements
478 0 : IPosition gainShape = gain().shape();
479 :
480 0 : for (Int recep=0; recep < gainShape(0); recep++) {
481 0 : for (Int spw=0; spw < gainShape(1); spw++) {
482 0 : IPosition ipos3(3, recep, spw, row);
483 : // Reference frequency and antenna
484 0 : refFreqMeas()(ipos3) = sRefFreq;
485 0 : refAnt()(ipos3) = sRefAnt;
486 :
487 : // Gain factor
488 0 : IPosition ipos4(4, recep, recep, spw, row);
489 0 : gain()(ipos4) = sGain;
490 : };
491 : };
492 : };
493 : };
494 0 : return retval;
495 : };
496 : //----------------------------------------------------------------------------
497 :
498 0 : DJonesMBuf::DJonesMBuf() : SolvableVisJonesMBuf()
499 : {
500 : // Null constructor
501 0 : };
502 :
503 : //----------------------------------------------------------------------------
504 :
505 0 : DJonesMBuf::DJonesMBuf (const Vector<Int>& calIndices,
506 0 : const Block<Vector<Int> >& indexValues) :
507 0 : SolvableVisJonesMBuf (calIndices, indexValues)
508 : {
509 : // Construct from a set of cal buffer indices and specified index values
510 : // Output to private data:
511 : // SolvableVisJonesMBuf SolvableVisJonesMBuf Parent class cal main
512 : // table buffer
513 0 : };
514 :
515 : //----------------------------------------------------------------------------
516 :
517 0 : DJonesMBuf::DJonesMBuf (CalIterBase& calIter)
518 0 : : SolvableVisJonesMBuf (calIter)
519 : {
520 : // Construct from a calibration table iterator
521 : // Input:
522 : // calIter CalIterBase& Calibration table iterator
523 0 : };
524 :
525 : //----------------------------------------------------------------------------
526 :
527 0 : TJonesMBuf::TJonesMBuf() : SolvableVisJonesMBuf()
528 : {
529 : // Null constructor
530 0 : };
531 :
532 : //----------------------------------------------------------------------------
533 :
534 0 : TJonesMBuf::TJonesMBuf (const Vector<Int>& calIndices,
535 0 : const Block<Vector<Int> >& indexValues) :
536 0 : SolvableVisJonesMBuf (calIndices, indexValues)
537 : {
538 : // Construct from a set of cal buffer indices and specified index values
539 : // Output to private data:
540 : // SolvableVisJonesMBuf SolvableVisJonesMBuf Parent class cal main
541 : // table buffer
542 0 : };
543 :
544 : //----------------------------------------------------------------------------
545 :
546 0 : TJonesMBuf::TJonesMBuf (CalIterBase& calIter)
547 0 : : SolvableVisJonesMBuf (calIter)
548 : {
549 : // Construct from a calibration table iterator
550 : // Input:
551 : // calIter CalIterBase& Calibration table iterator
552 0 : };
553 :
554 : //----------------------------------------------------------------------------
555 :
556 :
557 :
558 : } //# NAMESPACE CASA - END
559 :
|