Line data Source code
1 :
2 : // -----------------------------------------------------------------------------
3 :
4 : /*
5 :
6 : CalAnalysis.cc
7 :
8 : Description:
9 : ------------
10 : This file contains member functions for the CalAnalysis class.
11 :
12 : Classes:
13 : --------
14 : CalAnalysis - This class acts as the interface between the ROCTIter and CalStats
15 : classes.
16 :
17 : Modification history:
18 : ---------------------
19 : 2012 Jan 20 - Nick Elias, NRAO
20 : Initial version.
21 : 2012 Jan 25 - Nick Elias, NRAO
22 : Logging capability added. Error checking added.
23 : 2012 Feb 14 - Nick Elias, NRAO
24 : Updated this code to reflect changes in NewCalTabIter (now
25 : ROCTIter) and other classes.
26 :
27 : */
28 :
29 : // -----------------------------------------------------------------------------
30 : // Includes
31 : // -----------------------------------------------------------------------------
32 :
33 : #include <calanalysis/CalAnalysis/CalAnalysis.h>
34 :
35 : // -----------------------------------------------------------------------------
36 : // Start of casa namespace
37 : // -----------------------------------------------------------------------------
38 :
39 : using namespace casacore;
40 : namespace casa {
41 :
42 : // -----------------------------------------------------------------------------
43 : // Start of CalAnalysis class
44 : // -----------------------------------------------------------------------------
45 :
46 : /*
47 :
48 : CalAnalysis
49 :
50 : Description:
51 : ------------
52 : This class acts as the interface between the ROCTIter and CalAnalysis classes.
53 :
54 : In a nutshell:
55 : --------------
56 : * The constructor gets the information from the new format calibration table
57 : and initializes the class.
58 : * The stats<T>() function calculates statistics (the type depends on T) and
59 : returns the results.
60 : - The user can specify the field(s), antenna 1s, antenna 2s, time range,
61 : feeds, spectral windows, channels, the second iteration axis for the
62 : CalStats class (time or frequency), normalization, and unwrapping.
63 : - The inputs are checked and fixed, if possible.
64 : - The data are grouped according to unique (field,antenna1,antenna2).
65 : - The resulting group-based information is fed to the CalStats class and its
66 : stats<T>() function calculates the desired statistics which are stored in a
67 : vector of OUTPUT<T>() instances. Each OUTPUT<T>() element corresponds to a
68 : group.
69 :
70 : NB: There are a lot of get/set member functions. Unfortunately, they could not
71 : be overloaded with the same names because of conflicts with corresponding
72 : member functions without get/set in their names. Plus, some get functions
73 : need to call other get functions.
74 :
75 : NB: When an instance of this class is created from the python binding, input
76 : parameters are mostly checked there. There is checking in this class as
77 : well, just in case that the class is not called from the python binding.
78 : There does not appear to be a significant speed penalty.
79 :
80 : Nested classes:
81 : ---------------
82 : OUTPUT<T> - This nested class contains the outputs for the
83 : CalAnalysis::stats<T>() template member function.
84 :
85 : Class public member functions:
86 : ------------------------------
87 : CalAnalysis - This constructor gets information from the new format calibration
88 : table for further processing by the stats<T>() function.
89 : ~CalAnalysis - This destructor deallocates the internal memory of an instance.
90 : calName - This member function returns the new format calibration table
91 : name.
92 : msName - This member function returns the associated MS name.
93 : visCal - This member function returns the visibility calibration type.
94 : parType - This member function returns the parameter type ("Complex" or
95 : "Float").
96 : polBasis - This member function returns the polarization basis ("L" or "C").
97 : field - This member function returns the field numbers.
98 : antenna - This member function returns the antenna numbers.
99 : antenna1 - This member function returns the antenna 1 numbers.
100 : antenna2 - This member function returns the antenna 2 numbers.
101 : time - This member function returns the times.
102 : feed - This member function returns the feeds.
103 : numspw - This member function returns the number of spectral windows.
104 : spw - This member function returns the spectral windows.
105 : numChannel - This member function returns the number of channels for each
106 : spectral window.
107 : freq - This member function returns the frequencies for each spectral
108 : window.
109 :
110 : Class template public member functions:
111 : ---------------------------------------
112 : stats<T> - This member function is the main user interface for calculating the
113 : statistics for all iterations. Allowed T: CalStats::NONE only
114 : returns the input data, CalStatsFitter::FIT calculates fit
115 : statistics, and CalStatsHist::HIST calculates histogram statistics.
116 :
117 : Class template static public member functions:
118 : ----------------------------------------------
119 : exists<T> - This member function determines whether a value appears in a vector.
120 : where<T> - This member function returns the index of a search value in a
121 : vector.
122 : unique<T> - This member function returns a unique vector from an input vector.
123 :
124 : Class private member functions:
125 : -------------------------------
126 : calNameGet - This member function gets the new format calibration table
127 : name from the new format calibration table.
128 : calNameSet - This member function sets the new format calibration table
129 : name private variable.
130 : msNameGet - This member function gets the associated MS name from the new
131 : format calibration table.
132 : msNameSet - This member function sets the associated MS name private
133 : variable.
134 : visCalGet - This member function gets the visibility calibration type from
135 : the new format calibration table.
136 : visCalSet - This member function sets the visibility calibration type
137 : private variable.
138 : parTypeGet - This member function gets the parameter type ("Complex" or
139 : "Float") from the new format calibration table.
140 : parTypeSet - This member function sets the parameter type ("Complex" or
141 : "Float") private variable.
142 : polBasisGet - This member function gets the polarization basis ("L" or "C")
143 : from the new format calibration table.
144 : polBasisSet - This member function sets the polarization basis ("L" or "C")
145 : private variable.
146 : fieldGet - This member function gets the field numbers from the new
147 : format calibration table.
148 : fieldSet - This member function sets the field numbers private variables.
149 : fieldCheck - This member function checks the input field vector and returns
150 : the fixed field vector.
151 : antennaGet - This member function gets the antenna numbers from the new
152 : format calibration table.
153 : antennaSet - This member function sets the antenna numbers private
154 : variables.
155 : antenna1Get - This member function gets the antenna 1 numbers from the new
156 : format calibration table.
157 : antenna1Set - This member function sets the antenna 1 numbers private
158 : variables.
159 : antenna1Check - This member function checks the input antenna 1 vector and
160 : returns the fixed antenna 1 vector.
161 : antenna2Get - This member function gets the antenna 2 numbers from the new
162 : format calibration table.
163 : antenna2Set - This member function sets the antenna 2 numbers private
164 : variables.
165 : antenna2Check - This member function checks the input antenna 2 vector and
166 : returns the fixed antenna 2 vector.
167 : timeGet - This member function gets the times from the new format
168 : calibration table.
169 : timeSet - This member function sets the times private variables.
170 : timeCheck - This member function checks the time range and returns the
171 : corresponding time vector.
172 : feedGet - This member function gets the feeds from the new format
173 : calibration table.
174 : feedSet - This member function sets the feeds private variables.
175 : feedCheck - This member function checks the input feed vector and returns
176 : the fixed feed vector.
177 : spwInfoGet - This member function gets the spectral window information from
178 : the new format calibration table.
179 : spwInfoSet - This member function sets the spectral window information
180 : private variables.
181 : statsCheckInput - This member function checks and fixes (if possible) the inputs
182 : to the CalAnalysis::stats<T>() member function.
183 : getGroup - This member function gets input selected rows from a new
184 : format calibration table and groups them according to unique
185 : (field,antenna1,antenna2).
186 : rowSelect - This member function returns the rows selected by the input
187 : parameters.
188 : rowGroup - This member function returns the row numbers, fields, antenna
189 : 1s, antenna 2s, spectral windows, unique spectral windows,
190 : times, and unique times grouped according to selected rows and
191 : input selection.
192 : chanSPW - This member function maps the spectral windows to the input
193 : spectral windows (to get the correct channels) and forms the
194 : start channels so that spectral windows can be concatenated.
195 : freqGroup - This member function concatenates the frequencies from
196 : multiple spectral windows for each group.
197 : cubeGroup - This member function concatenates data from multiple rows into
198 : groups according to unique (field,antenna1,antenna2).
199 :
200 : Class protected member functions:
201 : ---------------------------------
202 : CalAnalysis - This default constructor is unused by this class and unavailable
203 : when an instance is created.
204 : CalAnalysis - This copy constructor is unused by this class and unavailable when
205 : an instance is created.
206 : operator= - This operator= function is unused by this class and unavailable
207 : when an instance is created.
208 :
209 : Modification history:
210 : ---------------------
211 : 2012 Jan 20 - Nick Elias, NRAO
212 : Initial version created with public member functions CalAnalysis()
213 : (generic), ~CalAnalysis(); template static public member function
214 : stats<T>(); template public member functions exists<T>() and
215 : unique<T>(); private member functions tableType(), polBasisGet(),
216 : feedCheck(), timeCheck(), spw_channel(), freq(); template private
217 : member functions parse<T>(), and select<T>(); and protected member
218 : functions CalAnalysis() (default), CalAnalysis() (copy), and
219 : operator=().
220 : 2012 Feb 14 - Nick Elias, NRAO
221 : Updated this code to reflect changes in NewCalTabIter (now
222 : ROCTIter) and other classes. Added the RAP enum.
223 : 2012 Mar 13 - Nick Elias, NRAO
224 : Public member function tableType() renamed to parTypeGet().
225 : Private member functions msNameGet() and visCalGet() added.
226 : 2012 Mar 14 - Nick Elias, NRAO
227 : Spectral window ID, start channel, and stop channel added to the
228 : nested OUTPUT<T> class.
229 : 2012 Apr 03 - Nick Elias, NRAO
230 : Private member function calNameGet() added. Public member
231 : functions calName(), msName(), visCal(), parType(), and polBasis()
232 : added.
233 : 2012 Apr 04 - Nick Elias, NRAO
234 : Private member functions calNameSet(), msNameSet(), visCalSet(),
235 : parTypeSet(), polBasisSet(), feedGet(), feedSet(), timeGet(),
236 : timeSet(), spwGet(), and spwSet() added. Public member functions
237 : feed(), time(), spw(), and numspw() added.
238 : 2012 Apr 17 - Nick Elias, NRAO
239 : Nested class CalAnalysis::SPW_INFO() added. Private member
240 : functions fieldGet(), fieldSet(), fieldCheck(), antennaGet(),
241 : antennaSet(), antennaCheck(), spwInfoGet(), and spwInfoSet()
242 : added. Public member functions field(), antenna(), numChannel(),
243 : and freq() added. Private member functions spwGet(), spwSet(),
244 : and spw_channel() removed.
245 : 2012 Apr 25 - Nick Elias, NRAO
246 : Private member function antennaCheck() renamed to antenna1Check().
247 : private member function antenna2Check() added. The start and stop
248 : channel lists versus spectral window are replaced with a channel
249 : list versus spectral window.
250 : 2012 Apr 26 - Nick Elias, NRAO
251 : Nested class INPUT added (for the stats<T>() member function).
252 : Spectral window ID, start channel, and stop channel removed from
253 : the nested OUTPUT<T> class.
254 : 2012 Apr 27 - Nick Elias, NRAO
255 : Private member function statsCheckInput() added. The member
256 : functions of the nested class CalAnalysis::SPW_INFO() have been
257 : moved to a separate file CalAnalysisSPW_INFO.cc.
258 : 2012 May 02 - Nick Elias, NRAO
259 : Private member functions antenna1Get(), antenna1Set(),
260 : antenna2Get(), and antenna2Set() added.
261 : 2012 May 06 - Nick Elias, NRAO
262 : Template private member functions parse<T>() and select<T>()
263 : removed. Template static public member function where<T>() added.
264 : Private member functions getGroup(), rowSelect(), rowGroup(),
265 : chanSPW(), freqGroup(), and cubeGroup() added.
266 : 2012 May 07 - Nick Elias, NRAO
267 : Public member functions antenna1() and antenna2() added.
268 :
269 : */
270 :
271 : // -----------------------------------------------------------------------------
272 : // Start of CalAnalysis public member functions
273 : // -----------------------------------------------------------------------------
274 :
275 : /*
276 :
277 : CalAnalysis::CalAnalysis (generic)
278 :
279 : Description:
280 : ------------
281 : This constructor gets information from the new format calibration table for
282 : further processing by the stats<T>() function.
283 :
284 : Inputs:
285 : -------
286 : oTableName - This reference to a String instance contains the new format
287 : calibration table name.
288 :
289 : Outputs:
290 : --------
291 : None.
292 :
293 : Modification history:
294 : ---------------------
295 : 2012 Jan 20 - Nick Elias, NRAO
296 : Initial version.
297 : 2012 Jan 25 - Nick Elias, NRAO
298 : Error checking added.
299 : 2012 Apr 17 - Nick Elias, NRAO
300 : Called new member functions to make this member function shorter.
301 : 2012 May 02 - Nick Elias, NRAO
302 : New format calibration table iterator no longer initialized here.
303 : 2012 May 06 - Nick Elias, NRAO
304 : Eliminated the call to the NewCalTable() instance.
305 :
306 : */
307 :
308 : // -----------------------------------------------------------------------------
309 :
310 0 : CalAnalysis::CalAnalysis( const String& oTableName ) {
311 :
312 : // Set the private variables corresponding to the new format calibration
313 : // table name, MS name, visibility calibration type, parameter type, and
314 : // polarization basis
315 :
316 : // Used to check if the new format calibration table name is valid
317 : try {
318 0 : calNameSet( calNameGet(oTableName) );
319 : }
320 :
321 0 : catch ( AipsError oAipsError ) {
322 0 : throw( oAipsError );
323 0 : }
324 :
325 0 : msNameSet( msNameGet(oTableName) );
326 0 : visCalSet( visCalGet(oTableName) );
327 0 : parTypeSet( parTypeGet(oTableName) );
328 0 : polBasisSet( polBasisGet(oTableName) );
329 :
330 :
331 : // Set the private variables corresponding to the field vector, antenna
332 : // vectors, time vector, feed vector, and spectral window information
333 :
334 0 : fieldSet( fieldGet(oTableName) );
335 :
336 0 : antennaSet( antennaGet(oTableName) );
337 0 : antenna1Set( antenna1Get(oTableName) );
338 0 : antenna2Set( antenna2Get(oTableName) );
339 :
340 0 : timeSet( timeGet(oTableName) );
341 :
342 0 : feedSet( feedGet(oTableName) );
343 :
344 0 : spwInfoSet(CalAnalysis::SPW_INFO(oTableName));
345 :
346 :
347 : // Return
348 :
349 0 : return;
350 :
351 0 : }
352 :
353 : // -----------------------------------------------------------------------------
354 :
355 : /*
356 :
357 : CalAnalysis::~CalAnalysis
358 :
359 : Description:
360 : ------------
361 : This destructor deallocates the internal memory of an instance.
362 :
363 : Inputs:
364 : -------
365 : None.
366 :
367 : Outputs:
368 : --------
369 : None.
370 :
371 : Modification history:
372 : ---------------------
373 : 2012 Jan 20 - Nick Elias, NRAO
374 : Initial version.
375 : 2012 May 02 - Nick Elias, NRAO
376 : The new format calibration table iterator pointer may be
377 : deallocated elsewhere, so it is checked for NULL first.
378 : 2012 May 06 - Nick Elias, NRAO
379 : Removed references to NewCalTable() and CTIter().
380 :
381 : */
382 :
383 : // -----------------------------------------------------------------------------
384 :
385 0 : CalAnalysis::~CalAnalysis( void ) {}
386 :
387 : // -----------------------------------------------------------------------------
388 :
389 : /*
390 :
391 : CalAnalysis::calName
392 :
393 : Description:
394 : ------------
395 : This member function returns the new format calibration table.
396 :
397 : Inputs:
398 : -------
399 : None.
400 :
401 : Outputs:
402 : --------
403 : The String instance containing the new format calibration table
404 : name, returned via the function value.
405 :
406 : Modification history:
407 : ---------------------
408 : 2012 Apr 03 - Nick Elias, NRAO
409 : Initial version.
410 :
411 : */
412 :
413 : // -----------------------------------------------------------------------------
414 :
415 0 : String CalAnalysis::calName( void ) const {
416 :
417 : // return the variable containing the new format calibration table name
418 :
419 0 : return oCalName;
420 :
421 : }
422 :
423 : // -----------------------------------------------------------------------------
424 :
425 : /*
426 :
427 : CalAnalysis::msName
428 :
429 : Description:
430 : ------------
431 : This member function returns the MS name.
432 :
433 : Inputs:
434 : -------
435 : None.
436 :
437 : Outputs:
438 : --------
439 : The String instance containing the MS name, returned via the
440 : function value.
441 :
442 : Modification history:
443 : ---------------------
444 : 2012 Apr 03 - Nick Elias, NRAO
445 : Initial version.
446 :
447 : */
448 :
449 : // -----------------------------------------------------------------------------
450 :
451 0 : String CalAnalysis::msName( void ) const {
452 :
453 : // return the private variable containing the MS name
454 :
455 0 : return oMSName;
456 :
457 : }
458 :
459 : // -----------------------------------------------------------------------------
460 :
461 : /*
462 :
463 : CalAnalysis::visCal
464 :
465 : Description:
466 : ------------
467 : This member function returns the visibility calibration type.
468 :
469 : Inputs:
470 : -------
471 : None.
472 :
473 : Outputs:
474 : --------
475 : The String instance containing the visibility calibration type,
476 : returned via the function value.
477 :
478 : Modification history:
479 : ---------------------
480 : 2012 Apr 03 - Nick Elias, NRAO
481 : Initial version.
482 :
483 : */
484 :
485 : // -----------------------------------------------------------------------------
486 :
487 0 : String CalAnalysis::visCal( void ) const {
488 :
489 : // Return opy the private variable containing the visibility calibration type
490 :
491 0 : return oVisCal;
492 :
493 : }
494 :
495 : // -----------------------------------------------------------------------------
496 :
497 : /*
498 :
499 : CalAnalysis::parType
500 :
501 : Description:
502 : ------------
503 : This member function returns the parameter type ("Complex" or "Float").
504 :
505 : Inputs:
506 : -------
507 : None.
508 :
509 : Outputs:
510 : --------
511 : The String instance containing the parameter type, returned via
512 : the function value.
513 :
514 : Modification history:
515 : ---------------------
516 : 2012 Apr 03 - Nick Elias, NRAO
517 : Initial version.
518 :
519 : */
520 :
521 : // -----------------------------------------------------------------------------
522 :
523 0 : String CalAnalysis::parType( void ) const {
524 :
525 : // Return the private variable containing the parameter type
526 :
527 0 : return oParType;
528 :
529 : }
530 :
531 : // -----------------------------------------------------------------------------
532 :
533 : /*
534 :
535 : CalAnalysis::polBasis
536 :
537 : Description:
538 : ------------
539 : This member function returns the polarization basis ("L" or "C").
540 :
541 : Inputs:
542 : -------
543 : None.
544 :
545 : Outputs:
546 : --------
547 : The reference to the String instance containing the polarization basis, returned
548 : via the function value.
549 :
550 : Modification history:
551 : ---------------------
552 : 2012 Apr 03 - Nick Elias, NRAO
553 : Initial version.
554 :
555 : */
556 :
557 : // -----------------------------------------------------------------------------
558 :
559 0 : String CalAnalysis::polBasis( void ) const {
560 :
561 : // Return the variable containing the polarization basis
562 :
563 0 : return oPolBasis;
564 :
565 : }
566 :
567 : // -----------------------------------------------------------------------------
568 :
569 : /*
570 :
571 : CalAnalysis::field
572 :
573 : Description:
574 : ------------
575 : This member function returns the field numbers.
576 :
577 : Inputs:
578 : -------
579 : None.
580 :
581 : Outputs:
582 : --------
583 : The Vector<uInt> instance containing the fields, returned via
584 : the function value.
585 :
586 : Modification history:
587 : ---------------------
588 : 2012 Apr 17 - Nick Elias, NRAO
589 : Initial version.
590 :
591 : */
592 :
593 : // -----------------------------------------------------------------------------
594 :
595 0 : Vector<uInt> CalAnalysis::field( void ) const {
596 :
597 : // Copy the private variable containing the field numbers and return it
598 :
599 0 : return oField.copy();
600 :
601 : }
602 :
603 : // -----------------------------------------------------------------------------
604 :
605 : /*
606 :
607 : CalAnalysis::antenna
608 :
609 : Description:
610 : ------------
611 : This member function returns the antenna numbers.
612 :
613 : Inputs:
614 : -------
615 : None.
616 :
617 : Outputs:
618 : --------
619 : The Vector<uInt> instance containing the antenna numbers,
620 : returned via the function value.
621 :
622 : Modification history:
623 : ---------------------
624 : 2012 Apr 17 - Nick Elias, NRAO
625 : Initial version.
626 :
627 : */
628 :
629 : // -----------------------------------------------------------------------------
630 :
631 0 : Vector<uInt> CalAnalysis::antenna( void ) const {
632 :
633 : // Return a copy of the private variable containing the antenna numbers
634 :
635 0 : return oAntenna.copy();
636 :
637 : }
638 :
639 : // -----------------------------------------------------------------------------
640 :
641 : /*
642 :
643 : CalAnalysis::antenna1
644 :
645 : Description:
646 : ------------
647 : This member function returns the antenna 1 numbers.
648 :
649 : Inputs:
650 : -------
651 : None.
652 :
653 : Outputs:
654 : --------
655 : The the Vector<uInt> instance containing the antenna 1 numbers,
656 : returned via the function value.
657 :
658 : Modification history:
659 : ---------------------
660 : 2012 May 07 - Nick Elias, NRAO
661 : Initial version.
662 :
663 : */
664 :
665 : // -----------------------------------------------------------------------------
666 :
667 0 : Vector<uInt> CalAnalysis::antenna1( void ) const {
668 :
669 : // Copy the private variable containing the antenna 1 numbers and return it
670 :
671 0 : return oAntenna1.copy();
672 :
673 : }
674 :
675 : // -----------------------------------------------------------------------------
676 :
677 : /*
678 :
679 : CalAnalysis::antenna2
680 :
681 : Description:
682 : ------------
683 : This member function returns the antenna 2 numbers.
684 :
685 : Inputs:
686 : -------
687 : None.
688 :
689 : Outputs:
690 : --------
691 : The Vector<Int> instance containing the antenna 2 numbers,
692 : returned via the function value.
693 :
694 : Modification history:
695 : ---------------------
696 : 2012 May 07 - Nick Elias, NRAO
697 : Initial version.
698 :
699 : */
700 :
701 : // -----------------------------------------------------------------------------
702 :
703 0 : Vector<Int> CalAnalysis::antenna2( void ) const {
704 :
705 : // Copy the private variable containing the antenna 2 numbers and return it
706 :
707 0 : return oAntenna2.copy();
708 :
709 : }
710 :
711 : // -----------------------------------------------------------------------------
712 :
713 : /*
714 :
715 : CalAnalysis::time
716 :
717 : Description:
718 : ------------
719 : This member function returns the times.
720 :
721 : Inputs:
722 : -------
723 : None.
724 :
725 : Outputs:
726 : --------
727 : The Vector<Double> instance containing the times, returned via
728 : the function value.
729 :
730 : Modification history:
731 : ---------------------
732 : 2012 Apr 04 - Nick Elias, NRAO
733 : Initial version.
734 :
735 : */
736 :
737 : // -----------------------------------------------------------------------------
738 :
739 0 : Vector<Double> CalAnalysis::time( void ) const {
740 :
741 : // Copy the private variable containing the times and return it
742 :
743 0 : return oTime.copy();
744 :
745 : }
746 :
747 : // -----------------------------------------------------------------------------
748 :
749 : /*
750 :
751 : CalAnalysis::feed
752 :
753 : Description:
754 : ------------
755 : This member function returns the feeds.
756 :
757 : Inputs:
758 : -------
759 : None.
760 :
761 : Outputs:
762 : --------
763 : The Vector<String> instance containing the feeds, returned via
764 : the function value.
765 :
766 : Modification history:
767 : ---------------------
768 : 2012 Apr 04 - Nick Elias, NRAO
769 : Initial version.
770 :
771 : */
772 :
773 : // -----------------------------------------------------------------------------
774 :
775 0 : Vector<String> CalAnalysis::feed( void ) const {
776 :
777 : // Copy the private variable containing the feeds and return it
778 :
779 0 : return oFeed.copy();
780 :
781 : }
782 :
783 : // -----------------------------------------------------------------------------
784 :
785 : /*
786 :
787 : CalAnalysis::numspw
788 :
789 : Description:
790 : ------------
791 : This member function returns the number of spectral windows.
792 :
793 : Inputs:
794 : -------
795 : None.
796 :
797 : Outputs:
798 : --------
799 : The uInt variable containing the spectral windows, returned via
800 : the function value.
801 :
802 : Modification history:
803 : ---------------------
804 : 2012 Apr 04 - Nick Elias, NRAO
805 : Initial version.
806 : 2012 Apr 17 - Nick Elias, NRAO
807 : Modified to handle the SPW_INFO instance.
808 :
809 : */
810 :
811 : // -----------------------------------------------------------------------------
812 :
813 0 : uInt CalAnalysis::numspw( void ) const {
814 :
815 : // Return the variable containing the number of spectral windows
816 :
817 0 : return oSPWInfo.uiNumSPW;
818 :
819 : }
820 :
821 : // -----------------------------------------------------------------------------
822 :
823 : /*
824 :
825 : CalAnalysis::spw
826 :
827 : Description:
828 : ------------
829 : This member function returns the spectral windows.
830 :
831 : Inputs:
832 : -------
833 : None.
834 :
835 : Outputs:
836 : --------
837 : The Vector<uInt> instance containing the spectral windows,
838 : returned via the function value.
839 :
840 : Modification history:
841 : ---------------------
842 : 2012 Apr 04 - Nick Elias, NRAO
843 : Initial version.
844 : 2012 Apr 17 - Nick Elias, NRAO
845 : Modified to handle the SPW_INFO instance.
846 :
847 : */
848 :
849 : // -----------------------------------------------------------------------------
850 :
851 0 : Vector<uInt> CalAnalysis::spw( void ) const {
852 :
853 : // Copy the private variable containing the spectral windows and return it
854 :
855 0 : return oSPWInfo.oSPW.copy();
856 :
857 : }
858 :
859 : // -----------------------------------------------------------------------------
860 :
861 : /*
862 :
863 : CalAnalysis::numChannel
864 :
865 : Description:
866 : ------------
867 : This member function returns the number of channels for each spectral window.
868 :
869 : Inputs:
870 : -------
871 : None.
872 :
873 : Outputs:
874 : --------
875 : The array of pointers to the Vector<uInt> instances containing the number of
876 : channels for each spectral window, returned via the function value.
877 :
878 : Modification history:
879 : ---------------------
880 : 2012 Apr 17 - Nick Elias, NRAO
881 : Initial version.
882 :
883 : */
884 :
885 : // -----------------------------------------------------------------------------
886 :
887 0 : Vector<uInt> CalAnalysis::numChannel( void ) const {
888 :
889 : // Copy the private variable containing the number of channels for each
890 : // spectral window and return it
891 :
892 0 : return oSPWInfo.oNumChannel.copy();
893 :
894 : }
895 :
896 : // -----------------------------------------------------------------------------
897 :
898 : /*
899 :
900 : CalAnalysis::freq
901 :
902 : Description:
903 : -----------
904 : This member function returns the frequencies for each spectral window.
905 :
906 : Inputs:
907 : -------
908 : None.
909 :
910 : Outputs:
911 : --------
912 : The reference to the Vector<Vector<uInt> > instance containing the frequencies
913 : for each spectral window, returned via the function value.
914 :
915 : Modification history:
916 : ---------------------
917 : 2012 Apr 17 - Nick Elias, NRAO
918 : Initial version.
919 :
920 : */
921 :
922 : // -----------------------------------------------------------------------------
923 :
924 0 : Vector<Vector<Double> > CalAnalysis::freq( void ) const {
925 :
926 : // Copy the private variable containing the frequencies for each spectral
927 : // window and return it
928 :
929 0 : uInt uiNumSPW = oSPWInfo.uiNumSPW;
930 :
931 0 : Vector<Vector<Double> > freq( uiNumSPW );
932 :
933 0 : for ( uInt s=0; s<uiNumSPW; s++ ) {
934 0 : freq[s] = oSPWInfo.oFrequency[s].copy();
935 : }
936 :
937 0 : return freq;
938 :
939 0 : }
940 :
941 : // -----------------------------------------------------------------------------
942 : // End of CalAnalysis public member functions
943 : // -----------------------------------------------------------------------------
944 :
945 : // -----------------------------------------------------------------------------
946 : // Start of CalAnalysis private member functions
947 : // -----------------------------------------------------------------------------
948 :
949 : /*
950 :
951 : CalAnalysis::calNameGet
952 :
953 : Description:
954 : ------------
955 : This member function gets the new format calibration table name from the new
956 : format calibration table.
957 :
958 : NB: This function is somewhat trivial, but it is included because of the other
959 : get member functions of this class.
960 :
961 : Inputs:
962 : -------
963 : oTableName - This reference to a String instance contains the new format
964 : calibration table name.
965 :
966 : Outputs:
967 : --------
968 : The reference to the String instance containing the new format calibration table
969 : name, returned via the function value.
970 :
971 : Modification history:
972 : ---------------------
973 : 2012 Apr 03 - Nick Elias, NRAO
974 : Initial version.
975 :
976 : */
977 :
978 : // -----------------------------------------------------------------------------
979 :
980 0 : String CalAnalysis::calNameGet( const String& oTableName ) {
981 :
982 : // Get the new format calibration table name and return it
983 :
984 0 : String poTableName = oTableName;
985 :
986 0 : return poTableName;
987 :
988 : }
989 :
990 : // -----------------------------------------------------------------------------
991 :
992 : /*
993 :
994 : CalAnalysis::calNameSet
995 :
996 : Description:
997 : ------------
998 : This member function sets the new format calibration table name private
999 : variable.
1000 :
1001 : Inputs:
1002 : -------
1003 : oCalNameIn - This reference to a String instance contains the new format
1004 : calibration table name.
1005 :
1006 : Outputs:
1007 : --------
1008 : None.
1009 :
1010 : Modification history:
1011 : ---------------------
1012 : 2012 Apr 04 - Nick Elias, NRAO
1013 : Initial version.
1014 :
1015 : */
1016 :
1017 : // -----------------------------------------------------------------------------
1018 :
1019 0 : void CalAnalysis::calNameSet( const String& oCalNameIn ) {
1020 :
1021 : // Set the new format calibration table name and return
1022 :
1023 0 : oCalName = String( oCalNameIn );
1024 :
1025 0 : return;
1026 :
1027 : }
1028 :
1029 : // -----------------------------------------------------------------------------
1030 :
1031 : /*
1032 :
1033 : CalAnalysis::msNameGet
1034 :
1035 : Description:
1036 : ------------
1037 : This member function gets the associated MS name from the new format calibration
1038 : table.
1039 :
1040 : Inputs:
1041 : -------
1042 : oTableName - This reference to a String instance contains the new format
1043 : calibration table name.
1044 :
1045 : Outputs:
1046 : --------
1047 : The reference to the String instance containing the MS name, returned via the
1048 : function value.
1049 :
1050 : Modification history:
1051 : ---------------------
1052 : 2012 Mar 13 - Nick Elias, NRAO
1053 : Initial version.
1054 :
1055 : */
1056 :
1057 : // -----------------------------------------------------------------------------
1058 :
1059 0 : String CalAnalysis::msNameGet( const String& oTableName ) {
1060 :
1061 : // Get the record containing the main table keywords
1062 :
1063 0 : Table oTable( oTableName );
1064 0 : TableProxy oTP( oTable );
1065 0 : Record oR( oTP.getKeywordSet( String("") ) );
1066 :
1067 :
1068 : // Get the associated MS name and return it
1069 :
1070 0 : uInt uiIndex = oR.fieldNumber( String( "MSName" ) );
1071 0 : String poMSName = RecordFieldPtr<String>(oR,uiIndex).get();
1072 :
1073 0 : return poMSName;
1074 :
1075 0 : }
1076 :
1077 : // -----------------------------------------------------------------------------
1078 :
1079 : /*
1080 :
1081 : CalAnalysis::msNameSet
1082 :
1083 : Description:
1084 : ------------
1085 : This member function sets the associated MS name private variable.
1086 :
1087 : Inputs:
1088 : -------
1089 : oMSNameIn - This reference to a String instance contains the assciated MS name.
1090 :
1091 : Outputs:
1092 : --------
1093 : None.
1094 :
1095 : Modification history:
1096 : ---------------------
1097 : 2012 Apr 04 - Nick Elias, NRAO
1098 : Initial version.
1099 :
1100 : */
1101 :
1102 : // -----------------------------------------------------------------------------
1103 :
1104 0 : void CalAnalysis::msNameSet( const String& oMSNameIn ) {
1105 :
1106 : // Set the assciated MS name and return
1107 :
1108 0 : oMSName = String( oMSNameIn );
1109 :
1110 0 : return;
1111 :
1112 : }
1113 :
1114 : // -----------------------------------------------------------------------------
1115 :
1116 : /*
1117 :
1118 : CalAnalysis::visCalGet
1119 :
1120 : Description:
1121 : ------------
1122 : This member function gets the visibility calibration type from the new format
1123 : calibration table.
1124 :
1125 : Inputs:
1126 : -------
1127 : oTableName - This reference to a String instance contains the new format
1128 : calibration table name.
1129 :
1130 : Outputs:
1131 : --------
1132 : The reference to the String instance containing the visibility calibration type
1133 : instance, returned via the function value.
1134 :
1135 : Modification history:
1136 : ---------------------
1137 : 2012 Mar 13 - Nick Elias, NRAO
1138 : Initial version.
1139 :
1140 : */
1141 :
1142 : // -----------------------------------------------------------------------------
1143 :
1144 0 : String CalAnalysis::visCalGet( const String& oTableName ) {
1145 :
1146 : // Get the record containing the main table keywords
1147 :
1148 0 : Table oTable( oTableName );
1149 0 : TableProxy oTP( oTable );
1150 0 : Record oR( oTP.getKeywordSet( String("") ) );
1151 :
1152 :
1153 : // Get the visibility calibration type and return it
1154 :
1155 0 : uInt uiIndex = oR.fieldNumber( String( "VisCal" ) );
1156 0 : String poVisCal = RecordFieldPtr<String>(oR,uiIndex).get();
1157 :
1158 0 : return poVisCal;
1159 :
1160 0 : }
1161 :
1162 : // -----------------------------------------------------------------------------
1163 :
1164 : /*
1165 :
1166 : CalAnalysis::visCalSet
1167 :
1168 : Description:
1169 : ------------
1170 : This member function sets the visibility calibration type private variable.
1171 :
1172 : Inputs:
1173 : -------
1174 : oVisCalIn - This reference to a String instance contains the visibility
1175 : calibration type.
1176 :
1177 : Outputs:
1178 : --------
1179 : None.
1180 :
1181 : Modification history:
1182 : ---------------------
1183 : 2012 Apr 04 - Nick Elias, NRAO
1184 : Initial version.
1185 :
1186 : */
1187 :
1188 : // -----------------------------------------------------------------------------
1189 :
1190 0 : void CalAnalysis::visCalSet( const String& oVisCalIn ) {
1191 :
1192 : // Set the visibility calibration type and return
1193 :
1194 0 : oVisCal = String( oVisCalIn );
1195 :
1196 0 : return;
1197 :
1198 : }
1199 :
1200 : // -----------------------------------------------------------------------------
1201 :
1202 : /*
1203 :
1204 : CalAnalysis::parTypeGet
1205 :
1206 : Description:
1207 : ------------
1208 : This member function gets the parameter column type ("Complex" or "Float") from
1209 : the new format calibration table.
1210 :
1211 : Inputs:
1212 : -------
1213 : oTableName - This reference to a String instance contains the new format
1214 : calibration table name.
1215 :
1216 : Outputs:
1217 : --------
1218 : The reference to the String instance containing the parameter column type,
1219 : returned via the function value.
1220 :
1221 : Modification history:
1222 : ---------------------
1223 : 2012 Jan 20 - Nick Elias, NRAO
1224 : Initial version.
1225 : 2012 Mar 13 - Nick Elias, NRAO
1226 : Function renamed to parType().
1227 :
1228 : */
1229 :
1230 : // -----------------------------------------------------------------------------
1231 :
1232 0 : String CalAnalysis::parTypeGet( const String& oTableName ) {
1233 :
1234 : // Get the record containing the main table keywords
1235 :
1236 0 : Table oTable( oTableName );
1237 0 : TableProxy oTP( oTable );
1238 0 : Record oR( oTP.getKeywordSet( String("") ) );
1239 :
1240 :
1241 : // Get the parameter column type and return it
1242 :
1243 0 : uInt uiIndex = oR.fieldNumber( String( "ParType" ) );
1244 0 : String poParType = RecordFieldPtr<String>(oR,uiIndex).get();
1245 :
1246 0 : return poParType;
1247 :
1248 0 : }
1249 :
1250 : // -----------------------------------------------------------------------------
1251 :
1252 : /*
1253 :
1254 : CalAnalysis::parTypeSet
1255 :
1256 : Description:
1257 : ------------
1258 : This member function sets the parameter column type ("Complex" or "Float")
1259 : private variable.
1260 :
1261 : Inputs:
1262 : -------
1263 : oParTypeIn - This reference to a String instance contains the parameter column
1264 : type.
1265 :
1266 : Outputs:
1267 : --------
1268 : None.
1269 :
1270 : Modification history:
1271 : ---------------------
1272 : 2012 Apr 04 - Nick Elias, NRAO
1273 : Initial version.
1274 :
1275 : */
1276 :
1277 : // -----------------------------------------------------------------------------
1278 :
1279 0 : void CalAnalysis::parTypeSet( const String& oParTypeIn ) {
1280 :
1281 : // Set the parameter column type and return
1282 :
1283 0 : oParType = String( oParTypeIn );
1284 :
1285 0 : return;
1286 :
1287 : }
1288 :
1289 : // -----------------------------------------------------------------------------
1290 :
1291 : /*
1292 :
1293 : CalAnalysis::polBasisGet
1294 :
1295 : Description:
1296 : ------------
1297 : This member function gets the polarization basis ("L" or "C") from the new
1298 : format calibration table.
1299 :
1300 : Inputs:
1301 : -------
1302 : oTableName - This reference to a String instance contains the new format
1303 : calibration table name.
1304 :
1305 : Outputs:
1306 : --------
1307 : The reference to the String instance containing the polarization basis, returned
1308 : via the function value.
1309 :
1310 : Modification history:
1311 : ---------------------
1312 : 2012 Jan 20 - Nick Elias, NRAO
1313 : Initial version.
1314 :
1315 : */
1316 :
1317 : // -----------------------------------------------------------------------------
1318 :
1319 0 : String CalAnalysis::polBasisGet( const String& oTableName ) {
1320 :
1321 : // Get the record containing the main table keywords
1322 :
1323 0 : Table oTable( oTableName );
1324 0 : TableProxy oTP( oTable );
1325 0 : Record oR( oTP.getKeywordSet( String("") ) );
1326 :
1327 :
1328 : // Get the polarization basis, make it upper case, keep only the initial
1329 : // letter, and return it
1330 :
1331 0 : uInt uiIndex = oR.fieldNumber( String( "PolBasis" ) );
1332 0 : String poPolBasis = RecordFieldPtr<String>(oR,uiIndex).get();
1333 :
1334 0 : poPolBasis.upcase();
1335 0 : poPolBasis.operator=( poPolBasis.operator[](0) );
1336 :
1337 0 : return poPolBasis;
1338 :
1339 0 : }
1340 :
1341 : // -----------------------------------------------------------------------------
1342 :
1343 : /*
1344 :
1345 : CalAnalysis::polBasisSet
1346 :
1347 : Description:
1348 : ------------
1349 : This member function sets the polarization basis ("L" or "C") private variable.
1350 :
1351 : Inputs:
1352 : -------
1353 : oPolBasisIn - This reference to a String instance contains the polarization
1354 : basis.
1355 :
1356 : Outputs:
1357 : --------
1358 : None.
1359 :
1360 : Modification history:
1361 : ---------------------
1362 : 2012 Apr 04 - Nick Elias, NRAO
1363 : Initial version.
1364 :
1365 : */
1366 :
1367 : // -----------------------------------------------------------------------------
1368 :
1369 0 : void CalAnalysis::polBasisSet( const String& oPolBasisIn ) {
1370 :
1371 : // Set the polarization basis and return
1372 :
1373 0 : oPolBasis = String( oPolBasisIn );
1374 :
1375 0 : return;
1376 :
1377 : }
1378 :
1379 : // -----------------------------------------------------------------------------
1380 :
1381 : /*
1382 :
1383 : CalAnalysis::fieldGet
1384 :
1385 : Description:
1386 : ------------
1387 : This member function gets the field numbers from the new format calibration
1388 : table.
1389 :
1390 : Inputs:
1391 : -------
1392 : oTableName - This reference to a String instance contains the new format
1393 : calibration table name.
1394 :
1395 : Outputs:
1396 : --------
1397 : The Vector<uInt> instance containing the field numbers,
1398 : returned via the function value.
1399 :
1400 : Modification history:
1401 : ---------------------
1402 : 2012 Apr 17 - Nick Elias, NRAO
1403 : Initial version.
1404 : 2012 May 02 - Nick Elias, NRAO
1405 : Fields are now obtained directly from the FIELD_ID column of the
1406 : main table.
1407 :
1408 : */
1409 :
1410 : // -----------------------------------------------------------------------------
1411 :
1412 0 : Vector<uInt> CalAnalysis::fieldGet( const String& oTableName ) {
1413 :
1414 : // Get the field numbers from the new format calibration table
1415 :
1416 0 : Table oTable( oTableName, Table::Old );
1417 0 : ScalarColumn<Int> oROSC( oTable, String("FIELD_ID") );
1418 :
1419 0 : Vector<Int> oFieldInt;
1420 0 : oROSC.getColumn( oFieldInt, true );
1421 :
1422 0 : Vector<Int> oFieldUnique;
1423 0 : unique<Int>(oFieldInt, oFieldUnique);
1424 :
1425 0 : Vector<uInt> field( oFieldUnique.nelements() );
1426 0 : convertArray<uInt,Int>( field, oFieldUnique );
1427 :
1428 0 : return field;
1429 :
1430 0 : }
1431 :
1432 : // -----------------------------------------------------------------------------
1433 :
1434 : /*
1435 :
1436 : CalAnalysis::fieldSet
1437 :
1438 : Description:
1439 : ------------
1440 : This member function sets the field numbers private variables.
1441 :
1442 : Inputs:
1443 : -------
1444 : oFieldIn - This reference to a Vector<uInt> instance contains the field numbers.
1445 :
1446 : Outputs:
1447 : --------
1448 : None.
1449 :
1450 : Modification history:
1451 : ---------------------
1452 : 2012 Apr 17 - Nick Elias, NRAO
1453 : Initial version.
1454 :
1455 : */
1456 :
1457 : // -----------------------------------------------------------------------------
1458 :
1459 0 : void CalAnalysis::fieldSet( const Vector<uInt>& oFieldIn ) {
1460 :
1461 : // Set the number of fields and fields and return
1462 :
1463 0 : uiNumField = oFieldIn.nelements();
1464 0 : oField = Vector<uInt>( oFieldIn.copy() );
1465 :
1466 0 : return;
1467 :
1468 : }
1469 :
1470 : // -----------------------------------------------------------------------------
1471 :
1472 : /*
1473 :
1474 : CalAnalysis::fieldCheck
1475 :
1476 : Description:
1477 : ------------
1478 : This member function checks the input field vector and returns the fixed field
1479 : vector.
1480 :
1481 : Inputs:
1482 : -------
1483 : oFieldIn - This reference to a Vector<uInt> instance contains the field numbers.
1484 :
1485 : Outputs:
1486 : --------
1487 : oFieldOut - This reference to the Vector<uInt> instance contains the checked and
1488 : fixed field numbers.
1489 : The Bool variable containing the check boolean, returned via
1490 : the function value.
1491 :
1492 : Modification history:
1493 : ---------------------
1494 : 2012 Apr 17 - Nick Elias, NRAO
1495 : Initial version.
1496 :
1497 : */
1498 :
1499 : // -----------------------------------------------------------------------------
1500 :
1501 0 : Bool CalAnalysis::fieldCheck( const Vector<uInt>& oFieldIn,
1502 : Vector<uInt>& oFieldOut ) const {
1503 :
1504 : // Declare the success boolean
1505 :
1506 0 : Bool success = false;
1507 :
1508 :
1509 : // Check the input field numbers and return the fixed field numbers
1510 :
1511 0 : if ( oFieldIn.nelements() == 0 ) {
1512 0 : success = false;
1513 0 : return success;
1514 : }
1515 :
1516 0 : uInt uiNumFieldOut = 0;
1517 0 : oFieldOut.resize();
1518 :
1519 0 : for ( uInt f=0; f<oFieldIn.nelements(); f++ ) {
1520 0 : if ( exists<uInt>( oFieldIn[f], oField ) ) {
1521 0 : uiNumFieldOut += 1;
1522 0 : oFieldOut.resize( uiNumFieldOut, true );
1523 0 : oFieldOut[uiNumFieldOut-1] = oFieldIn[f];
1524 : }
1525 : }
1526 :
1527 0 : if ( uiNumFieldOut == 0 ) {
1528 0 : success = false;
1529 0 : return success;
1530 : }
1531 :
1532 :
1533 : // Return true
1534 :
1535 0 : success = true;
1536 :
1537 0 : return success;
1538 :
1539 : }
1540 :
1541 : // -----------------------------------------------------------------------------
1542 :
1543 : /*
1544 :
1545 : CalAnalysis::antennaGet
1546 :
1547 : Description:
1548 : ------------
1549 : This member function gets the antenna numbers from the new format calibration
1550 : table.
1551 :
1552 : Inputs:
1553 : -------
1554 : oTableName - This reference to a String instance contains the new format
1555 : calibration table name.
1556 :
1557 : Outputs:
1558 : --------
1559 : The Vector<uInt> instance containing the antenna numbers,
1560 : returned via the function value.
1561 :
1562 : Modification history:
1563 : ---------------------
1564 : 2012 Apr 17 - Nick Elias, NRAO
1565 : Initial version.
1566 :
1567 : */
1568 :
1569 : // -----------------------------------------------------------------------------
1570 :
1571 0 : Vector<uInt> CalAnalysis::antennaGet( const String& oTableName ) {
1572 :
1573 : // Create a temporary antenna subtable instance and get the number of antennas
1574 : // (the number of rows)
1575 :
1576 0 : Table oTableAntenna( oTableName+"/ANTENNA", Table::Old );
1577 0 : uInt uiNumRow = oTableAntenna.nrow();
1578 :
1579 :
1580 : // Create the vector containing the antenna numbers and return it
1581 :
1582 0 : Vector<uInt> antenna( uiNumRow );
1583 0 : indgen<uInt>( antenna, 0 );
1584 :
1585 0 : return antenna;
1586 :
1587 :
1588 0 : }
1589 :
1590 : // -----------------------------------------------------------------------------
1591 :
1592 : /*
1593 :
1594 : CalAnalysis::antennaSet
1595 :
1596 : Description:
1597 : ------------
1598 : This member function sets the antenna numbers private variables.
1599 :
1600 : Inputs:
1601 : -------
1602 : oAntennaIn - This reference to a Vector<uInt> instance contains the antenna
1603 : numbers.
1604 :
1605 : Outputs:
1606 : --------
1607 : None.
1608 :
1609 : Modification history:
1610 : ---------------------
1611 : 2012 Apr 17 - Nick Elias, NRAO
1612 : Initial version.
1613 :
1614 : */
1615 :
1616 : // -----------------------------------------------------------------------------
1617 :
1618 0 : void CalAnalysis::antennaSet( const Vector<uInt>& oAntennaIn ) {
1619 :
1620 : // Set the number of antennas and antennas and return
1621 :
1622 0 : uiNumAntenna = oAntennaIn.nelements();
1623 0 : oAntenna = Vector<uInt>( oAntennaIn.copy() );
1624 :
1625 0 : return;
1626 :
1627 : }
1628 :
1629 : // -----------------------------------------------------------------------------
1630 :
1631 : /*
1632 :
1633 : CalAnalysis::antenna1Get
1634 :
1635 : Description:
1636 : ------------
1637 : This member function gets the antenna 1 numbers from the new format calibration
1638 : table.
1639 :
1640 : Inputs:
1641 : -------
1642 : oTableName - This reference to a String instance contains the new format
1643 : calibration table name.
1644 :
1645 : Outputs:
1646 : --------
1647 : The Vector<uInt> instance containing the antenna 1 numbers,
1648 : returned via the function value.
1649 :
1650 : Modification history:
1651 : ---------------------
1652 : 2012 May 02 - Nick Elias, NRAO
1653 : Initial version.
1654 :
1655 : */
1656 :
1657 : // -----------------------------------------------------------------------------
1658 :
1659 0 : Vector<uInt> CalAnalysis::antenna1Get( const String& oTableName ) {
1660 :
1661 : // Get the antenna 1 numbers from the new format calibration table
1662 :
1663 0 : Table oTable( oTableName, Table::Old );
1664 0 : ScalarColumn<Int> oROSC( oTable, String("ANTENNA1") );
1665 :
1666 0 : Vector<Int> oAntenna1Int;
1667 0 : oROSC.getColumn( oAntenna1Int, true );
1668 :
1669 0 : Vector<Int> oAntenna1Unique;
1670 0 : unique<Int>(oAntenna1Int, oAntenna1Unique);
1671 :
1672 0 : Vector<uInt> antenna1( oAntenna1Unique.nelements() );
1673 0 : convertArray<uInt,Int>( antenna1, oAntenna1Unique );
1674 :
1675 0 : return antenna1;
1676 :
1677 0 : }
1678 :
1679 : // -----------------------------------------------------------------------------
1680 :
1681 : /*
1682 :
1683 : CalAnalysis::antenna1Set
1684 :
1685 : Description:
1686 : ------------
1687 : This member function sets the antenna 1 numbers private variables.
1688 :
1689 : Inputs:
1690 : -------
1691 : oAntenna1In - This reference to a Vector<uInt> instance contains the antenna 1
1692 : numbers.
1693 :
1694 : Outputs:
1695 : --------
1696 : None.
1697 :
1698 : Modification history:
1699 : ---------------------
1700 : 2012 May 02 - Nick Elias, NRAO
1701 : Initial version.
1702 :
1703 : */
1704 :
1705 : // -----------------------------------------------------------------------------
1706 :
1707 0 : void CalAnalysis::antenna1Set( const Vector<uInt>& oAntenna1In ) {
1708 :
1709 : // Set the number of antenna 1 and antenna 1 numbers and return
1710 :
1711 0 : uiNumAntenna1 = oAntenna1In.nelements();
1712 0 : oAntenna1 = Vector<uInt>( oAntenna1In.copy() );
1713 :
1714 0 : return;
1715 :
1716 : }
1717 :
1718 : // -----------------------------------------------------------------------------
1719 :
1720 : /*
1721 :
1722 : CalAnalysis::antenna1Check
1723 :
1724 : Description:
1725 : ------------
1726 : This member function checks the input antenna 1 vector and returns the fixed
1727 : antenna 1 vector.
1728 :
1729 : Inputs:
1730 : -------
1731 : oAntenna1In - This reference to a Vector<uInt> instance contains the antenna 1
1732 : numbers.
1733 :
1734 : Outputs:
1735 : --------
1736 : oAntenna1Out - This reference to the Vector<uInt> instance contains the checked
1737 : and fixed antenna 1 numbers.
1738 : The Bool variable containing the check boolean, returned via
1739 : the function value.
1740 :
1741 : Modification history:
1742 : ---------------------
1743 : 2012 Apr 17 - Nick Elias, NRAO
1744 : Initial version.
1745 : 2012 Apr 25 - Nick Elias, NRAO
1746 : Member function antennaCheck() renamed to antenna1Check().
1747 : 2012 May 02 - Nick Elias, NRAO
1748 : The comparison is now made to an internal list of antenna 2.
1749 :
1750 : */
1751 :
1752 : // -----------------------------------------------------------------------------
1753 :
1754 0 : Bool CalAnalysis::antenna1Check( const Vector<uInt>& oAntenna1In,
1755 : Vector<uInt>& oAntenna1Out ) const {
1756 :
1757 : // Declare the success boolean
1758 :
1759 0 : Bool success(false);
1760 :
1761 :
1762 : // Check the input antenna 1 numbers and return the fixed antenna 1 numbers
1763 :
1764 0 : if ( oAntenna1In.nelements() == 0 ) {
1765 0 : success = false;
1766 0 : return success;
1767 : }
1768 :
1769 0 : uInt uiNumAntenna1Out = 0;
1770 0 : oAntenna1Out.resize();
1771 :
1772 0 : for ( uInt a=0; a<oAntenna1In.nelements(); a++ ) {
1773 0 : if ( exists<uInt>( oAntenna1In[a], oAntenna1 ) ) {
1774 0 : uiNumAntenna1Out += 1;
1775 0 : oAntenna1Out.resize( uiNumAntenna1Out, true );
1776 0 : oAntenna1Out[uiNumAntenna1Out-1] = oAntenna1In[a];
1777 : }
1778 : }
1779 :
1780 0 : if ( uiNumAntenna1Out == 0 ) {
1781 0 : success = false;
1782 0 : return success;
1783 : }
1784 :
1785 :
1786 : // Return true
1787 :
1788 0 : success = true;
1789 :
1790 0 : return success;
1791 :
1792 : }
1793 :
1794 : // -----------------------------------------------------------------------------
1795 :
1796 : /*
1797 :
1798 : CalAnalysis::antenna2Get
1799 :
1800 : Description:
1801 : ------------
1802 : This member function gets the antenna 2 numbers from the new format calibration
1803 : table.
1804 :
1805 : Inputs:
1806 : -------
1807 : oTableName - This reference to a String instance contains the new format
1808 : calibration table name.
1809 :
1810 : Outputs:
1811 : --------
1812 : The Vector<Int> instance containing the antenna 2 numbers,
1813 : returned via the function value.
1814 :
1815 : Modification history:
1816 : ---------------------
1817 : 2012 May 02 - Nick Elias, NRAO
1818 : Initial version.
1819 :
1820 : */
1821 :
1822 : // -----------------------------------------------------------------------------
1823 :
1824 0 : Vector<Int> CalAnalysis::antenna2Get( const String& oTableName ) {
1825 :
1826 : // Get the antenna 2 numbers from the new format calibration table
1827 :
1828 0 : Table oTable( oTableName, Table::Old );
1829 0 : ScalarColumn<Int> oROSC( oTable, String("ANTENNA2") );
1830 :
1831 0 : Vector<Int> oAntenna2Int;
1832 0 : oROSC.getColumn( oAntenna2Int, true );
1833 :
1834 :
1835 0 : Vector<Int> uniqueA2;
1836 0 : unique<Int>(oAntenna2Int, uniqueA2);
1837 :
1838 0 : Vector<Int> antenna2( uniqueA2 );
1839 :
1840 0 : return antenna2;
1841 :
1842 0 : }
1843 :
1844 : // -----------------------------------------------------------------------------
1845 :
1846 : /*
1847 :
1848 : CalAnalysis::antenna2Set
1849 :
1850 : Description:
1851 : ------------
1852 : This member function sets the antenna 2 numbers private variables.
1853 :
1854 : Inputs:
1855 : -------
1856 : oAntenna2In - This reference to a Vector<uInt> instance contains the antenna 2
1857 : numbers.
1858 :
1859 : Outputs:
1860 : --------
1861 : None.
1862 :
1863 : Modification history:
1864 : ---------------------
1865 : 2012 May 02 - Nick Elias, NRAO
1866 : Initial version.
1867 :
1868 : */
1869 :
1870 : // -----------------------------------------------------------------------------
1871 :
1872 0 : void CalAnalysis::antenna2Set( const Vector<Int>& oAntenna2In ) {
1873 :
1874 : // Set the number of antenna 2 and antenna 2 numbers and return
1875 :
1876 0 : uiNumAntenna2 = oAntenna2In.nelements();
1877 0 : oAntenna2 = Vector<Int>( oAntenna2In.copy() );
1878 :
1879 0 : return;
1880 :
1881 : }
1882 :
1883 : // -----------------------------------------------------------------------------
1884 :
1885 : /*
1886 :
1887 : CalAnalysis::antenna2Check
1888 :
1889 : Description:
1890 : ------------
1891 : This member function checks the input antenna 2 vector and returns the fixed
1892 : antenna 2 vector.
1893 :
1894 : Inputs:
1895 : -------
1896 : oAntenna2In - This reference to a Vector<Int> instance contains the antenna 2
1897 : numbers.
1898 :
1899 : Outputs:
1900 : --------
1901 : oAntenna2Out - This reference to the Vector<Int> instance contains the checked
1902 : and fixed antenna 2 numbers.
1903 : The Bool variable containing the check boolean, returned via
1904 : the function value.
1905 :
1906 : Modification history:
1907 : ---------------------
1908 : 2012 Apr 25 - Nick Elias, NRAO
1909 : Initial version.
1910 : 2012 May 02 - Nick Elias, NRAO
1911 : The comparison is now made to an internal list of antenna 2.
1912 :
1913 : */
1914 :
1915 : // -----------------------------------------------------------------------------
1916 :
1917 0 : Bool CalAnalysis::antenna2Check( const Vector<Int>& oAntenna2In,
1918 : Vector<Int>& oAntenna2Out ) const {
1919 :
1920 : // Declare the success boolean
1921 :
1922 0 : Bool success( false );
1923 :
1924 :
1925 : // Check the input antenna 1 numbers and return the fixed antenna 1 numbers
1926 :
1927 0 : if ( oAntenna2In.nelements() == 0 ) {
1928 0 : success = false;
1929 0 : return success;
1930 : }
1931 :
1932 0 : uInt uiNumAntenna2Out = 0;
1933 0 : oAntenna2Out.resize();
1934 :
1935 0 : for ( uInt a=0; a<oAntenna2In.nelements(); a++ ) {
1936 0 : if ( oAntenna2In[a] == -1 || exists<Int>( oAntenna2In[a], oAntenna2 ) ) {
1937 0 : uiNumAntenna2Out += 1;
1938 0 : oAntenna2Out.resize( uiNumAntenna2Out, true );
1939 0 : oAntenna2Out[uiNumAntenna2Out-1] = oAntenna2In[a];
1940 : }
1941 : }
1942 :
1943 0 : if ( uiNumAntenna2Out == 0 ) {
1944 0 : success = false;
1945 0 : return success;
1946 : }
1947 :
1948 :
1949 : // Return true
1950 :
1951 0 : success = true;
1952 :
1953 0 : return success;
1954 :
1955 : }
1956 :
1957 : // -----------------------------------------------------------------------------
1958 :
1959 : /*
1960 :
1961 : CalAnalysis::timeGet
1962 :
1963 : Description:
1964 : ------------
1965 : This member function gets the times from the new format calibration table.
1966 :
1967 : Inputs:
1968 : -------
1969 : oTableName - This reference to a String instance contains the new format
1970 : calibration table name.
1971 :
1972 : Outputs:
1973 : --------
1974 : The Vector<Double> instance containing the times, returned via
1975 : the function value.
1976 :
1977 : Modification history:
1978 : ---------------------
1979 : 2012 Apr 04 - Nick Elias, NRAO
1980 : Initial version.
1981 :
1982 : */
1983 :
1984 : // -----------------------------------------------------------------------------
1985 :
1986 0 : Vector<Double> CalAnalysis::timeGet( const String& oTableName ) {
1987 :
1988 : // Create a temporary new format calibration table instance
1989 :
1990 0 : Table oTable( oTableName, Table::Old );
1991 0 : ScalarColumn<Double> oROSC( oTable, String("TIME") );
1992 :
1993 :
1994 : // Get the sorted and unique time stamps
1995 :
1996 0 : Vector<Double> oTimeTemp;
1997 0 : oROSC.getColumn( oTimeTemp, true );
1998 :
1999 0 : Vector<Double> timev( 0 );
2000 0 : unique<Double>( oTimeTemp, timev );
2001 :
2002 :
2003 : // Return the time stamps
2004 :
2005 0 : return timev;
2006 :
2007 0 : }
2008 :
2009 : // -----------------------------------------------------------------------------
2010 :
2011 : /*
2012 :
2013 : CalAnalysis::timeSet
2014 :
2015 : Description:
2016 : ------------
2017 : This member function sets the times private variables.
2018 :
2019 : Inputs:
2020 : -------
2021 : oTimeIn - This reference to a Vector<Double> instance contains the times.
2022 :
2023 : Outputs:
2024 : --------
2025 : None.
2026 :
2027 : Modification history:
2028 : ---------------------
2029 : 2012 Apr 04 - Nick Elias, NRAO
2030 : Initial version.
2031 :
2032 : */
2033 :
2034 : // -----------------------------------------------------------------------------
2035 :
2036 0 : void CalAnalysis::timeSet( const Vector<Double>& oTimeIn ) {
2037 :
2038 : // Set the number of times and times and return
2039 :
2040 0 : uiNumTime = oTimeIn.nelements();
2041 0 : oTime = Vector<Double>( oTimeIn.copy() );
2042 :
2043 0 : return;
2044 :
2045 : }
2046 :
2047 : // -----------------------------------------------------------------------------
2048 :
2049 : /*
2050 :
2051 : CalAnalysis::timeCheck
2052 :
2053 : Description:
2054 : ------------
2055 : This member function checks the time range and returns the corresponding time
2056 : vector.
2057 :
2058 : Inputs:
2059 : -------
2060 : dStartTimeIn - This reference to a Double variable contains the start time.
2061 : dStopTimeIn - This reference to a Double variable contains the stop time.
2062 :
2063 : Outputs:
2064 : --------
2065 : dStartTimeOut - This reference to a Double variable contains the start time.
2066 : dStopTimeOut - This reference to a Double variable contains the stop time.
2067 : oTimeOut - This reference to the Vector<Double> instance containing the
2068 : time stamps.
2069 : The Bool variable containing the check boolean, returned via
2070 : the function value.
2071 :
2072 : Modification history:
2073 : ---------------------
2074 : 2012 Jan 20 - Nick Elias, NRAO
2075 : Initial version.
2076 : 2012 May 06 - Nick Elias, NRAO
2077 : Output start and stop times added.
2078 :
2079 : */
2080 :
2081 : // -----------------------------------------------------------------------------
2082 :
2083 0 : Bool CalAnalysis::timeCheck( const Double& dStartTimeIn,
2084 : const Double& dStopTimeIn, Double& dStartTimeOut, Double& dStopTimeOut,
2085 : Vector<Double>& oTimeOut ) const {
2086 :
2087 : // Declare the success boolean
2088 :
2089 0 : Bool success( false );
2090 :
2091 :
2092 : // Check the start and stop times
2093 :
2094 0 : if ( dStartTimeIn > dStopTimeIn ) {
2095 0 : success = false;
2096 0 : return success;
2097 : }
2098 :
2099 0 : if ( dStartTimeIn > oTime[uiNumTime-1] ) {
2100 0 : success = false;
2101 0 : return success;
2102 : }
2103 :
2104 0 : if ( dStopTimeIn < oTime[0] ) {
2105 0 : success = false;
2106 0 : return success;
2107 : }
2108 :
2109 :
2110 : // Get the unique time values and the new start and stop times
2111 :
2112 0 : uInt uiNumTimeOut = 0;
2113 0 : oTimeOut.resize();
2114 :
2115 0 : for ( uInt t=0; t<uiNumTime; t++ ) {
2116 0 : if ( oTime[t] >= dStartTimeIn && oTime[t] <= dStopTimeIn ) {
2117 0 : oTimeOut.resize( ++uiNumTimeOut, true );
2118 0 : oTimeOut[uiNumTimeOut-1] = oTime[t];
2119 : }
2120 : }
2121 :
2122 0 : if ( oTimeOut.nelements() == 0 ) {
2123 0 : success = false;
2124 0 : return success;
2125 : }
2126 :
2127 0 : dStartTimeOut = min( oTimeOut );
2128 0 : dStopTimeOut = max( oTimeOut );
2129 :
2130 :
2131 : // Return true
2132 :
2133 0 : success = true;
2134 :
2135 0 : return success;
2136 :
2137 : }
2138 :
2139 : // -----------------------------------------------------------------------------
2140 :
2141 : /*
2142 :
2143 : CalAnalysis::feedGet
2144 :
2145 : Description:
2146 : ------------
2147 : This member function gets the feeds from the new format calibration table.
2148 :
2149 : NB: If the number of feeds in the column is a function of row, this function
2150 : will fail.
2151 :
2152 : Inputs:
2153 : -------
2154 : oTableName - This reference to a String instance contains the new format
2155 : calibration table name.
2156 :
2157 : Outputs:
2158 : --------
2159 : The Vector<String> instance containing the feeds, returned via
2160 : the function value.
2161 :
2162 : Modification history:
2163 : ---------------------
2164 : 2012 Apr 04 - Nick Elias, NRAO
2165 : Initial version.
2166 : 2012 May 02 - Nick Elias, NRAO
2167 : The new format calibration table iterator is no longer used. A
2168 : call to the main table is now used instead.
2169 :
2170 : */
2171 :
2172 : // -----------------------------------------------------------------------------
2173 :
2174 0 : Vector<String> CalAnalysis::feedGet( const String& oTableName ) {
2175 :
2176 : // Get the number of feeds from the new format calibration table
2177 :
2178 0 : Table oTable( oTableName, Table::Old );
2179 :
2180 0 : Array<Float> oParamErrCell0;
2181 :
2182 : try {
2183 :
2184 0 : ArrayColumn<Float> oROAC( oTable, String("PARAMERR") );
2185 :
2186 0 : oParamErrCell0.resize( oROAC(0).shape() );
2187 0 : oParamErrCell0 = oROAC( 0 );
2188 :
2189 0 : }
2190 :
2191 0 : catch ( AipsError oAipsError ) {
2192 0 : throw( oAipsError );
2193 0 : }
2194 :
2195 :
2196 : // Set the feeds
2197 :
2198 0 : uInt uiNumFeedTemp = oParamErrCell0.shape()[0];
2199 0 : Vector<String> feed( uiNumFeedTemp, "" );
2200 :
2201 0 : if ( uiNumFeedTemp == 1 ) {
2202 0 : feed[0] = "S";
2203 : } else {
2204 0 : if ( polBasisGet(oTableName) == "L" ) {
2205 0 : feed[0] = "X";
2206 0 : feed[1] = "Y";
2207 0 : } else if ( polBasisGet(oTableName) == "R" ) {
2208 0 : feed[0] = "R";
2209 0 : feed[1] = "L";
2210 : } else {
2211 0 : feed[0] = "1";
2212 0 : feed[1] = "2";
2213 : }
2214 : }
2215 :
2216 :
2217 : // Return the feeds
2218 :
2219 0 : return feed;
2220 :
2221 0 : }
2222 :
2223 : // -----------------------------------------------------------------------------
2224 :
2225 : /*
2226 :
2227 : CalAnalysis::feedSet
2228 :
2229 : Description:
2230 : ------------
2231 : This member function sets the feeds private variables.
2232 :
2233 : Inputs:
2234 : -------
2235 : oFeedIn - This reference to a Vector<String> instance contains the feeds.
2236 :
2237 : Outputs:
2238 : --------
2239 : None.
2240 :
2241 : Modification history:
2242 : ---------------------
2243 : 2012 Apr 04 - Nick Elias, NRAO
2244 : Initial version.
2245 :
2246 : */
2247 :
2248 : // -----------------------------------------------------------------------------
2249 :
2250 0 : void CalAnalysis::feedSet( const Vector<String>& oFeedIn ) {
2251 :
2252 : // Set the number of feeds and feeds and return
2253 :
2254 0 : uiNumFeed = oFeedIn.nelements();
2255 0 : oFeed = Vector<String>( oFeedIn.copy() );
2256 :
2257 0 : return;
2258 :
2259 : }
2260 :
2261 : // -----------------------------------------------------------------------------
2262 :
2263 : /*
2264 :
2265 : CalAnalysis::feedCheck
2266 :
2267 : Description:
2268 : ------------
2269 : This member function checks the input feed vector and returns the fixed feed
2270 : vector.
2271 :
2272 : Inputs:
2273 : -------
2274 : oFeedIn - This reference to a Vector<String> instance contains the feeds ("R"
2275 : and "L" for circular, "X" and "Y" for linear).
2276 :
2277 : Outputs:
2278 : --------
2279 : oFeedOut - This reference to the Vector<String> instance contains the checked
2280 : and fixed feeds.
2281 : The Bool variable containing the check boolean, returned via
2282 : the function value.
2283 :
2284 : Modification history:
2285 : ---------------------
2286 : 2012 Jan 20 - Nick Elias, NRAO
2287 : Initial version.
2288 : 2012 Mar 13 - Nick Elias, NRAO
2289 : Now checking for null.
2290 :
2291 : */
2292 :
2293 : // -----------------------------------------------------------------------------
2294 :
2295 0 : Bool CalAnalysis::feedCheck( const Vector<String>& oFeedIn,
2296 : Vector<String>& oFeedOut ) const {
2297 :
2298 : // Declare the success boolean
2299 :
2300 0 : Bool success( false );
2301 :
2302 :
2303 : // Check the input feed values
2304 :
2305 0 : if ( oFeedIn.nelements() == 0 ) {
2306 0 : success = false;
2307 0 : return success;
2308 : }
2309 :
2310 0 : uInt uiNumFeedOut = 0;
2311 0 : oFeedOut.resize();
2312 :
2313 0 : for ( uInt f=0; f<oFeedIn.nelements(); f++ ) {
2314 0 : if ( exists<String>( oFeedIn[f], oFeed ) ) {
2315 0 : uiNumFeedOut += 1;
2316 0 : oFeedOut.resize( uiNumFeedOut, true );
2317 0 : oFeedOut[uiNumFeedOut-1] = oFeedIn[f];
2318 : }
2319 : }
2320 :
2321 0 : if ( uiNumFeedOut == 0 ) {
2322 0 : success = false;
2323 0 : return success;
2324 : }
2325 :
2326 :
2327 : // Get the unique feed vector
2328 :
2329 0 : oFeedOut.resize();
2330 0 : unique<String>( oFeedIn, oFeedOut );
2331 :
2332 0 : if ( oFeedOut.nelements() > 2 ) {
2333 0 : success = false;
2334 0 : return success;
2335 : }
2336 :
2337 0 : if ( oFeedOut.nelements() == 1 ) {
2338 0 : if ( oFeedOut[0] != "R" && oFeedOut[0] != "L" &&
2339 0 : oFeedOut[0] != "X" && oFeedOut[0] != "Y" &&
2340 0 : oFeedOut[0] != "1" && oFeedOut[0] != "2" && oFeedOut[0] != "S" ) {
2341 0 : success = false;
2342 0 : return success;
2343 : }
2344 : }
2345 :
2346 0 : if ( oFeedOut.nelements() == 2 ) {
2347 :
2348 0 : if ( oFeedOut[0] != "R" && oFeedOut[0] != "L" &&
2349 0 : oFeedOut[0] != "X" && oFeedOut[0] != "Y" &&
2350 0 : oFeedOut[0] != "1" && oFeedOut[0] != "2" ) {
2351 0 : success = false;
2352 0 : return success;
2353 : }
2354 :
2355 0 : if ( oFeedOut[1] != "R" && oFeedOut[1] != "L" &&
2356 0 : oFeedOut[1] != "X" && oFeedOut[1] != "Y" &&
2357 0 : oFeedOut[1] != "1" && oFeedOut[1] != "2" ) {
2358 0 : success = false;
2359 0 : return success;
2360 : }
2361 :
2362 0 : if ( oFeedOut[0] == "L" && oFeedOut[1] == "R" ) {
2363 0 : oFeedOut[0] = "R";
2364 0 : oFeedOut[1] = "L";
2365 : }
2366 :
2367 0 : if ( oFeedOut[0] == "Y" && oFeedOut[1] == "X" ) {
2368 0 : oFeedOut[0] = "X";
2369 0 : oFeedOut[1] = "Y";
2370 : }
2371 :
2372 0 : if ( oFeedOut[0] == "2" && oFeedOut[1] == "1" ) {
2373 0 : oFeedOut[0] = "1";
2374 0 : oFeedOut[1] = "2";
2375 : }
2376 :
2377 : }
2378 :
2379 :
2380 : // Return true
2381 :
2382 0 : success = true;
2383 :
2384 0 : return success;
2385 :
2386 : }
2387 :
2388 : // -----------------------------------------------------------------------------
2389 :
2390 : /*
2391 :
2392 : CalAnalysis::spwInfoGet
2393 :
2394 : Description:
2395 : ------------
2396 : This member function gets the spectral window information from the new format
2397 : calibration table.
2398 :
2399 : Inputs:
2400 : -------
2401 : oTableName - This reference to a String instance contains the new format
2402 : calibration table name.
2403 :
2404 : Outputs:
2405 : --------
2406 : The reference to the SPW_INFO instance containing the spws, returned via the
2407 : function value.
2408 :
2409 : Modification history:
2410 : ---------------------
2411 : 2012 Apr 17 - Nick Elias, NRAO
2412 : Initial version.
2413 :
2414 : */
2415 :
2416 : // -----------------------------------------------------------------------------
2417 :
2418 0 : CalAnalysis::SPW_INFO& CalAnalysis::spwInfoGet( const String& oTableName ) {
2419 :
2420 : // Get the spectral window information and return it
2421 :
2422 : CalAnalysis::SPW_INFO* poSPWInfo;
2423 0 : poSPWInfo = new CalAnalysis::SPW_INFO( oTableName );
2424 :
2425 0 : return( *poSPWInfo );
2426 :
2427 : }
2428 :
2429 : // -----------------------------------------------------------------------------
2430 :
2431 : /*
2432 :
2433 : CalAnalysis::spwInfoSet
2434 :
2435 : Description:
2436 : ------------
2437 : This member function sets the spectral window information private variables.
2438 :
2439 : Inputs:
2440 : -------
2441 : oSPWInfoIn - This reference to the SPW_INFO instance contains the spectral
2442 : window information.
2443 :
2444 : Outputs:
2445 : --------
2446 : None.
2447 :
2448 : Modification history:
2449 : ---------------------
2450 : 2012 Apr 17 - Nick Elias, NRAO
2451 : Initial version.
2452 :
2453 : */
2454 :
2455 : // -----------------------------------------------------------------------------
2456 :
2457 0 : void CalAnalysis::spwInfoSet( const CalAnalysis::SPW_INFO& oSPWInfoIn ) {
2458 :
2459 : // Set the spectral window information and return
2460 :
2461 0 : oSPWInfo = CalAnalysis::SPW_INFO( oSPWInfoIn );
2462 :
2463 0 : return;
2464 :
2465 : }
2466 :
2467 : // -----------------------------------------------------------------------------
2468 :
2469 : /*
2470 :
2471 : CalAnalysis::statsCheckInput
2472 :
2473 : Description:
2474 : ------------
2475 : This member function checks and fixes (if possible) the inputs to the
2476 : CalAnalysis::stats<T>() member function.
2477 :
2478 : Inputs:
2479 : -------
2480 : oInputIn - This reference to an INPUT instance contains the inputs to the
2481 : CalAnalysis::stats<T>() member function.
2482 :
2483 : Outputs:
2484 : --------
2485 : oInputOut - This reference to an INPUT instance contains the checked and fixed
2486 : inputs to the CalAnalysis::stats<T>() member function.
2487 : The Bool variable containing the check boolean, returned via
2488 : the function value.
2489 :
2490 : Modification history:
2491 : ---------------------
2492 : 2012 Apr 27 - Nick Elias, NRAO
2493 : Initial version.
2494 :
2495 : */
2496 :
2497 : // -----------------------------------------------------------------------------
2498 :
2499 0 : Bool CalAnalysis::statsCheckInput( const CalAnalysis::INPUT& oInputIn,
2500 : CalAnalysis::INPUT& oInputOut ) {
2501 :
2502 : // Declare the success boolean
2503 :
2504 0 : Bool success( false );
2505 :
2506 :
2507 : // Check the fields and create a new field vector
2508 :
2509 0 : if ( !fieldCheck( oInputIn.oField, oInputOut.oField ) ) {
2510 0 : LogIO log( LogOrigin( "CalAnalysis", "statsCheckInput()", WHERE ) );
2511 0 : log << LogIO::WARN << "One or more invalid fields" << LogIO::POST;
2512 0 : success = false;
2513 0 : return success;
2514 0 : }
2515 :
2516 :
2517 : // Check the antennas and create the new antenna vectors
2518 :
2519 0 : if ( !antenna1Check( oInputIn.oAntenna1, oInputOut.oAntenna1 ) ) {
2520 0 : LogIO log( LogOrigin( "CalAnalysis", "statsCheckInput()", WHERE ) );
2521 0 : log << LogIO::WARN << "One or more invalid antenna 1" << LogIO::POST;
2522 0 : success = false;
2523 0 : return success;
2524 0 : }
2525 :
2526 0 : if ( !antenna2Check( oInputIn.oAntenna2, oInputOut.oAntenna2 ) ) {
2527 0 : LogIO log( LogOrigin( "CalAnalysis", "statsCheckInput<T>()", WHERE ) );
2528 0 : log << LogIO::WARN << "One or more invalid antenna 2" << LogIO::POST;
2529 0 : success = false;
2530 0 : return success;
2531 0 : }
2532 :
2533 :
2534 : // Check the time range and create the corresponding time vector
2535 :
2536 0 : Bool bTimeCheck = timeCheck( oInputIn.dStartTime, oInputIn.dStopTime,
2537 0 : oInputOut.dStartTime, oInputOut.dStopTime, oInputOut.oTime );
2538 :
2539 0 : if ( !bTimeCheck ) {
2540 0 : LogIO log( LogOrigin( "CalAnalysis", "statsCheckInput<T>()", WHERE ) );
2541 0 : log << LogIO::WARN << "Invalid start and/or stop times" << LogIO::POST;
2542 0 : success = false;
2543 0 : return success;
2544 0 : }
2545 :
2546 :
2547 : // Check the feeds and create the new feed vector
2548 :
2549 0 : if ( !feedCheck( oInputIn.oFeed, oInputOut.oFeed ) ) {
2550 0 : LogIO log( LogOrigin( "CalAnalysis", "statsCheckInput<T>()", WHERE ) );
2551 0 : log << LogIO::WARN << "Invalid feed(s)" << LogIO::POST;
2552 0 : success = false;
2553 0 : return success;
2554 0 : }
2555 :
2556 :
2557 : // Check the spectral window info and create the frequency vector
2558 :
2559 0 : Vector<uInt> oSPWOld( oInputIn.oSPW );
2560 0 : Vector<Vector<uInt> > oChannelOld( oInputIn.oChannel );
2561 :
2562 0 : Vector<uInt> oSPWNew;
2563 0 : Vector<Vector<uInt> > oChannelNew;
2564 :
2565 0 : Bool bSPWCheck = oSPWInfo.spwInfoCheck( oInputIn.oSPW, oInputIn.oChannel,
2566 0 : oInputOut.oSPW, oInputOut.oChannel );
2567 :
2568 0 : if ( !bSPWCheck ) {
2569 0 : LogIO log( LogOrigin( "CalAnalysis", "statsCheckInput<T>()", WHERE ) );
2570 0 : log << LogIO::WARN << "Invalid spectral window information" << LogIO::POST;
2571 0 : success = false;
2572 0 : return success;
2573 0 : }
2574 :
2575 :
2576 : // Check the user-defined iteration axis
2577 :
2578 0 : if ( oInputIn.eAxisIterUserID != CalStats::FREQUENCY &&
2579 0 : oInputIn.eAxisIterUserID != CalStats::TIME ) {
2580 0 : LogIO log( LogOrigin( "CalAnalysis", "statsCheckInput<T>()", WHERE ) );
2581 : log << LogIO::WARN << "User-defined iteration axis must be frequency/time"
2582 0 : << LogIO::POST;
2583 0 : success = false;
2584 0 : return success;
2585 0 : }
2586 :
2587 0 : oInputOut.eAxisIterUserID = oInputIn.eAxisIterUserID;
2588 :
2589 :
2590 : // Check the RAP (real, amplitude, phase) parameter
2591 :
2592 0 : if ( oInputIn.eRAP != CalAnalysis::REAL &&
2593 0 : oInputIn.eRAP != CalAnalysis::AMPLITUDE &&
2594 0 : oInputIn.eRAP != CalAnalysis::PHASE ) {
2595 0 : LogIO log( LogOrigin( "CalAnalysis", "statsCheckInput<T>()", WHERE ) );
2596 0 : log << LogIO::WARN << "Invalid RAP parameter" << LogIO::POST;
2597 0 : success = false;
2598 0 : return success;
2599 0 : }
2600 :
2601 0 : oInputOut.eRAP = oInputIn.eRAP;
2602 :
2603 :
2604 : // Set the normalization and unwrap booleans
2605 :
2606 0 : oInputOut.bNorm = oInputIn.bNorm;
2607 :
2608 0 : oInputOut.bUnwrap = oInputIn.bUnwrap;
2609 :
2610 :
2611 : // Check the maximum phase jump parameter
2612 :
2613 0 : if ( oInputIn.dJumpMax < 0.0 ) {
2614 0 : LogIO log( LogOrigin( "CalAnalysis", "statsCheckInput<T>()", WHERE ) );
2615 0 : log << LogIO::WARN << "Invalid maximum jump parameter" << LogIO::POST;
2616 0 : success = false;
2617 0 : return success;
2618 0 : }
2619 :
2620 0 : oInputOut.dJumpMax = oInputIn.dJumpMax;
2621 :
2622 :
2623 : // Return true
2624 :
2625 0 : success = true;
2626 :
2627 0 : return success;
2628 :
2629 0 : }
2630 :
2631 : // -----------------------------------------------------------------------------
2632 :
2633 : /*
2634 :
2635 : CalAnalysis::getGroup
2636 :
2637 : Description:
2638 : ------------
2639 : This member function gets input selected rows from a new format calibration
2640 : table and groups them according to unique (field,antenna1,antenna2).
2641 :
2642 : NB: Each element of the output Vector<T>() instances corresponds to a group.
2643 :
2644 : NB: Each group has a vector of unique times and frequencies (which are not
2645 : necessarily unique).
2646 :
2647 : NB: Each group has data cubes, which are dimensioned feed x frequency x time.
2648 : Each cube can have data from multiple rows, depending on the input elections.
2649 : E.g., channels from multiple spectral windows are concatenated in the data
2650 : cubes.
2651 :
2652 : NB: The float parameter cube is empty for a new format calibration table with
2653 : complex gains. Conversely, the complex parameter is empty for a new format
2654 : calibration table wth real values.
2655 :
2656 : NB: Sometimes the cubes cannot be completely filled because of the shape of the
2657 : new format calibration table. In this case, the empty cube elements are set to
2658 : zero and the corresponding flags set to true.
2659 :
2660 : Inputs:
2661 : -------
2662 : oNCT - This NewCalTable instance contains the new format calibration
2663 : table.
2664 : oInput - This INPUT instance contains the input selections.
2665 : oFieldGroup - This Vector<uInt> instance contains the fields for each
2666 : group.
2667 : oAntenna1Group - This Vector<uInt> instance contains the antenna 1 for each
2668 : group.
2669 : oAntenna2Group - This Vector<Int> instance contains the antenna 2 for each
2670 : group.
2671 : oTimeUniqueGroup - This Vector<Vector<Double> > instance contains the unique
2672 : times for each group.
2673 : oFreqGroup - This Vector<Vector<Double> >instance contains the frequencies
2674 : for each group. They can come from multiple spectral windows
2675 : (which are in different rows).
2676 :
2677 : Outputs:
2678 : --------
2679 : oCParamGroup - This Vector<Cube<DComplex> > instance contains the complex
2680 : parameters. This instance is empty for new format calibration
2681 : tables with real parameters.
2682 : oFParamGroup - This Vector<Cube<Double> > instance contains the real
2683 : parameters. This instance is empty for new format calibration
2684 : tables with complex parameters.
2685 : oParamErrGroup - This Vector<Cube<Double> > instance contains the parameter
2686 : errors.
2687 : oFlagGroup - This Vector<Cube<Bool> > instance contains the flags.
2688 : The Bool variable containing the check boolean, returned via
2689 : the function value.
2690 :
2691 : Modification history:
2692 : ---------------------
2693 : 2012 May 06 - Nick Elias, NRAO
2694 : Initial version.
2695 :
2696 : */
2697 :
2698 : // -----------------------------------------------------------------------------
2699 :
2700 0 : Bool CalAnalysis::getGroup( const NewCalTable& oNCT,
2701 : const CalAnalysis::INPUT& oInput, Vector<uInt>& oFieldGroup,
2702 : Vector<uInt>& oAntenna1Group, Vector<Int>& oAntenna2Group,
2703 : Vector<Vector<Double> >& oTimeUniqueGroup,
2704 : Vector<Vector<Double> >& oFreqGroup, Vector<Cube<DComplex> >& oCParamGroup,
2705 : Vector<Cube<Double> >& oFParamGroup, Vector<Cube<Double> >& oParamErrGroup,
2706 : Vector<Cube<Bool> >& oFlagGroup ) const {
2707 :
2708 : // Declare the success boolean
2709 :
2710 0 : Bool success( false );
2711 :
2712 :
2713 : // Get the selected rows
2714 :
2715 0 : Vector<uInt> oRowSelect;
2716 :
2717 0 : if ( !rowSelect( oNCT, oInput, oRowSelect ) ) {
2718 0 : LogIO log( LogOrigin( "CalAnalysis", "getGroup()", WHERE ) );
2719 0 : log << LogIO::WARN << "No matching rows selected" << LogIO::POST;
2720 0 : success = false;
2721 0 : return success;
2722 0 : }
2723 :
2724 :
2725 : // Group the selected rows according to unique combinations of field, antenna
2726 : // 1, and antenna 2
2727 :
2728 0 : Vector<Vector<uInt> > oRowGroup;
2729 :
2730 0 : Vector<Vector<uInt> > oSPWGroup;
2731 0 : Vector<Vector<uInt> > oSPWUniqueGroup;
2732 :
2733 0 : Vector<Vector<Double> > oTimeGroup;
2734 :
2735 0 : Bool bRowGroup = rowGroup( oNCT, oRowSelect, oRowGroup, oFieldGroup,
2736 : oAntenna1Group, oAntenna2Group, oSPWGroup, oSPWUniqueGroup, oTimeGroup,
2737 : oTimeUniqueGroup );
2738 :
2739 0 : if ( !bRowGroup ) {
2740 0 : LogIO log( LogOrigin( "CalAnalysis", "getGroup()", WHERE ) );
2741 0 : log << LogIO::WARN << "Cannot group the data" << LogIO::POST;
2742 0 : success = false;
2743 0 : return success;
2744 0 : }
2745 :
2746 :
2747 : // Get the frequency vector, start channel vector, and relative channel vector
2748 : // for each group
2749 :
2750 0 : Bool bFreqGroup = freqGroup( oInput, oSPWUniqueGroup, oFreqGroup );
2751 :
2752 0 : if ( !bFreqGroup ) {
2753 0 : LogIO log( LogOrigin( "CalAnalysis", "getGroup()", WHERE ) );
2754 0 : log << LogIO::WARN << "Cannot group frequencies" << LogIO::POST;
2755 0 : success = false;
2756 0 : return success;
2757 0 : }
2758 :
2759 :
2760 : // Get the cubes for each group
2761 :
2762 0 : Bool bCubeGroup = cubeGroup( oNCT, oInput, oRowGroup, oSPWGroup,
2763 : oSPWUniqueGroup, oTimeGroup, oTimeUniqueGroup, oFreqGroup, oCParamGroup,
2764 : oFParamGroup, oParamErrGroup, oFlagGroup );
2765 :
2766 0 : if ( !bCubeGroup ) {
2767 0 : LogIO log( LogOrigin( "CalAnalysis", "getGroup()", WHERE ) );
2768 0 : log << LogIO::WARN << "Cannot group cubes" << LogIO::POST;
2769 0 : success = false;
2770 0 : return success;
2771 0 : }
2772 :
2773 :
2774 : // Return true
2775 :
2776 0 : success = true;
2777 :
2778 0 : return success;
2779 :
2780 0 : }
2781 :
2782 : // -----------------------------------------------------------------------------
2783 :
2784 : /*
2785 :
2786 : CalAnalysis::rowSelect
2787 :
2788 : Description:
2789 : ------------
2790 : This member function returns the rows selected by the input parameters.
2791 :
2792 : Inputs:
2793 : -------
2794 : oNCT - This NewCalTable instance contains the new format calibration table.
2795 : oInput - This INPUT instance contains the input selections.
2796 :
2797 : Outputs:
2798 : --------
2799 : oRowSelect - This Vector<uInt> instance contains the row numbers selected by the
2800 : inputs.
2801 : The Bool variable containing the check boolean, returned via
2802 : the function value.
2803 :
2804 : Modification history:
2805 : ---------------------
2806 : 2012 May 06 - Nick Elias, NRAO
2807 : Initial version.
2808 :
2809 : */
2810 :
2811 : // -----------------------------------------------------------------------------
2812 :
2813 0 : Bool CalAnalysis::rowSelect( const NewCalTable& oNCT,
2814 : const CalAnalysis::INPUT& oInput, Vector<uInt>& oRowSelect ) const {
2815 :
2816 : // Declare the success boolean
2817 :
2818 0 : Bool success( false );
2819 :
2820 :
2821 : // Create the column accessors
2822 :
2823 0 : ScalarColumn<Int> oFieldCol( oNCT, String("FIELD_ID") );
2824 0 : ScalarColumn<Int> oAntenna1Col( oNCT, String("ANTENNA1") );
2825 0 : ScalarColumn<Int> oAntenna2Col( oNCT, String("ANTENNA2") );
2826 0 : ScalarColumn<Int> oSPWCol( oNCT, String("SPECTRAL_WINDOW_ID") );
2827 0 : ScalarColumn<Double> oTimeCol( oNCT, String("TIME") );
2828 :
2829 :
2830 : // Initialize the number of rows in the new format calibration table, the
2831 : // number of selected rows, and the Vector<uInt> instance containing the
2832 : // selected rows
2833 :
2834 0 : uInt uiNumRow = oNCT.nrow();
2835 0 : uInt uiNumRowSelect = 0;
2836 :
2837 0 : oRowSelect.resize();
2838 :
2839 :
2840 : // Loop over rows and record the selected ones
2841 :
2842 0 : for ( uInt r=0; r<uiNumRow; r++ ) {
2843 :
2844 : // Get the information from each column for the present row
2845 0 : uInt uiField = (uInt) oFieldCol( r );
2846 0 : uInt uiAntenna1 = (uInt) oAntenna1Col( r );
2847 0 : Int iAntenna2 = oAntenna2Col( r );
2848 0 : uInt uiSPW = (uInt) oSPWCol( r );
2849 0 : Double dTime = (Double) oTimeCol( r );
2850 :
2851 : // Are all of the quantities in the present row present in the input
2852 : // parameters? If not, don't do anything and increment the loop
2853 0 : if ( !exists<uInt>( uiField, oInput.oField ) ) continue;
2854 0 : if ( !exists<uInt>( uiAntenna1, oInput.oAntenna1 ) ) continue;
2855 0 : if ( !exists<Int>( iAntenna2, oInput.oAntenna2 ) ) continue;
2856 0 : if ( !exists<uInt>( uiSPW, oInput.oSPW ) ) continue;
2857 0 : if ( !exists<Double>( dTime, oInput.oTime ) ) continue;
2858 :
2859 : // Record the selected row
2860 0 : oRowSelect.resize( ++uiNumRowSelect, true );
2861 0 : oRowSelect[uiNumRowSelect-1] = r;
2862 :
2863 : }
2864 :
2865 :
2866 : // Were any rows found? It not, return false
2867 :
2868 0 : if ( uiNumRowSelect == 0 ) {
2869 0 : success = false;
2870 0 : return success;
2871 : }
2872 :
2873 :
2874 : // Return true
2875 :
2876 0 : success = true;
2877 :
2878 0 : return success;
2879 :
2880 0 : }
2881 :
2882 : // -----------------------------------------------------------------------------
2883 :
2884 : /*
2885 :
2886 : CalAnalysis::rowGroup
2887 :
2888 : Description:
2889 : ------------
2890 : This member function returns the row numbers, fields, antenna 1s, antenna 2s,
2891 : spectral windows, unique spectral windows, times, and unique times grouped
2892 : according to selected rows and input selection.
2893 :
2894 : Inputs:
2895 : -------
2896 : oNCT - This NewCalTable instance contains the new format calibration
2897 : table.
2898 : oRowSelect - This Vector<uInt> instance contains the row numbers selected by the
2899 : inputs.
2900 :
2901 : Outputs:
2902 : --------
2903 : oRowGroup - This Vector<uInt> instance contains the row numbers for each
2904 : group.
2905 : oFieldGroup - This Vector<uInt> instance contains the fields for each
2906 : group.
2907 : oAntenna1Group - This Vector<uInt> instance contains the antenna 1 for each
2908 : group.
2909 : oAntenna2Group - This Vector<Int> instance contains the antenna 2 for each
2910 : group.
2911 : oSPWGroup - This Vector<Vector<uInt> > instance contains the spectral
2912 : windows for each group.
2913 : oSPWUniqueGroup - This Vector<Vector<uInt> > instance contains the unique
2914 : spectral windows for each group.
2915 : oTimeGroup - This Vector<Vector<Double> > instance contains the times for
2916 : each group.
2917 : oTimeUniqueGroup - This Vector<Vector<Double> > instance contains the unique
2918 : times for each group.
2919 : The Bool variable containing the check boolean, returned via
2920 : the function value.
2921 :
2922 : Modification history:
2923 : ---------------------
2924 : 2012 May 06 - Nick Elias, NRAO
2925 : Initial version.
2926 :
2927 : */
2928 :
2929 : // -----------------------------------------------------------------------------
2930 :
2931 0 : Bool CalAnalysis::rowGroup( const NewCalTable& oNCT,
2932 : const Vector<uInt>& oRowSelect, Vector<Vector<uInt> >& oRowGroup,
2933 : Vector<uInt>& oFieldGroup, Vector<uInt>& oAntenna1Group,
2934 : Vector<Int>& oAntenna2Group, Vector<Vector<uInt> >& oSPWGroup,
2935 : Vector<Vector<uInt> >& oSPWUniqueGroup, Vector<Vector<Double> >& oTimeGroup,
2936 : Vector<Vector<Double> >& oTimeUniqueGroup ) const {
2937 :
2938 : // Declare the success boolean
2939 :
2940 0 : Bool success( false );
2941 :
2942 :
2943 : // If there are no rows, return false
2944 :
2945 0 : uInt uiNumRow = oRowSelect.nelements();
2946 :
2947 0 : if ( uiNumRow == 0 ) {
2948 0 : success = false;
2949 0 : return success;
2950 : }
2951 :
2952 :
2953 : // Create the column accessors
2954 :
2955 0 : ScalarColumn<Int> oFieldCol( oNCT, String("FIELD_ID") );
2956 0 : ScalarColumn<Int> oAntenna1Col( oNCT, String("ANTENNA1") );
2957 0 : ScalarColumn<Int> oAntenna2Col( oNCT, String("ANTENNA2") );
2958 0 : ScalarColumn<Int> oSPWCol( oNCT, String("SPECTRAL_WINDOW_ID") );
2959 0 : ScalarColumn<Double> oTimeCol( oNCT, String("TIME") );
2960 :
2961 :
2962 : // Initialize the number of groups according to unique values of
2963 : // (field,antenna1,antenna2) and the Vector<Vector<T> > instances containing
2964 : // the groups
2965 :
2966 0 : uInt uiNumGroup = 0;
2967 :
2968 0 : oRowGroup.resize( uiNumGroup, false );
2969 :
2970 0 : oFieldGroup.resize( uiNumGroup, false );
2971 0 : oAntenna1Group.resize( uiNumGroup, false );
2972 0 : oAntenna2Group.resize( uiNumGroup, false );
2973 :
2974 0 : oSPWGroup.resize( uiNumGroup, false );
2975 0 : oSPWUniqueGroup.resize( uiNumGroup, false );
2976 :
2977 0 : oTimeGroup.resize( uiNumGroup, false );
2978 0 : oTimeUniqueGroup.resize( uiNumGroup, false );
2979 :
2980 :
2981 : // Loop over the rows and form the groups
2982 :
2983 0 : for ( uInt r=0; r<uiNumRow; r++ ) {
2984 :
2985 : // Get the field, antenna 1, antenna2, spectral window, and time for the
2986 : // present row
2987 0 : uInt uiField = oFieldCol( oRowSelect[r] );
2988 0 : uInt uiAntenna1 = oAntenna1Col( oRowSelect[r] );
2989 0 : Int iAntenna2 = oAntenna2Col( oRowSelect[r] );
2990 0 : uInt uiSPW = oSPWCol( oRowSelect[r] );
2991 0 : Double dTime = oTimeCol( oRowSelect[r] );
2992 :
2993 : // Is this combination of field, antenna 1, and antenna 2 unique? If so
2994 : // create a new group, otherwise record the existing group.
2995 : uInt g;
2996 0 : for ( g=0; g<uiNumGroup; g++ ) {
2997 0 : if ( uiField == oFieldGroup[g] && uiAntenna1 == oAntenna1Group[g] &&
2998 0 : iAntenna2 == oAntenna2Group[g] ) {
2999 0 : break;
3000 : }
3001 : }
3002 :
3003 0 : if ( uiNumGroup == 0 || g >= uiNumGroup ) { // New group
3004 :
3005 : // Increment the number of groups
3006 0 : uiNumGroup++;
3007 :
3008 : // Add the row to the new group
3009 0 : oRowGroup.resize( uiNumGroup, true );
3010 0 : oRowGroup[uiNumGroup-1].resize( 1, true );
3011 0 : oRowGroup[uiNumGroup-1][0] = oRowSelect[r];
3012 :
3013 : // Add the field to the new group
3014 0 : oFieldGroup.resize( uiNumGroup, true );
3015 0 : oFieldGroup[uiNumGroup-1] = uiField;
3016 :
3017 : // Add the antenna 1 to the new group
3018 0 : oAntenna1Group.resize( uiNumGroup, true );
3019 0 : oAntenna1Group[uiNumGroup-1] = uiAntenna1;
3020 :
3021 : // Add the antenna 2 to the new group
3022 0 : oAntenna2Group.resize( uiNumGroup, true );
3023 0 : oAntenna2Group[uiNumGroup-1] = iAntenna2;
3024 :
3025 : // Add the spectral window to the new group
3026 0 : oSPWGroup.resize( uiNumGroup, true );
3027 0 : oSPWGroup[uiNumGroup-1].resize( 1, true );
3028 0 : oSPWGroup[uiNumGroup-1][0] = uiSPW;
3029 :
3030 : // Add the time to the new group
3031 0 : oTimeGroup.resize( uiNumGroup, true );
3032 0 : oTimeGroup[uiNumGroup-1].resize( 1, true );
3033 0 : oTimeGroup[uiNumGroup-1][0] = dTime;
3034 :
3035 : } else { // Existing group
3036 :
3037 : // Increment the number of rows in the group
3038 0 : uInt uiNumRowGroup = oRowGroup[g].nelements() + 1;
3039 :
3040 : // Add the row to the group
3041 0 : oRowGroup[g].resize( uiNumRowGroup, true );
3042 0 : oRowGroup[g][uiNumRowGroup-1] = oRowSelect[r];
3043 :
3044 : // Add the spectral window to the group
3045 0 : oSPWGroup[g].resize( uiNumRowGroup, true );
3046 0 : oSPWGroup[g][uiNumRowGroup-1] = uiSPW;
3047 :
3048 : // Add the time to the group
3049 0 : oTimeGroup[g].resize( uiNumRowGroup, true );
3050 0 : oTimeGroup[g][uiNumRowGroup-1] = dTime;
3051 :
3052 : }
3053 :
3054 : }
3055 :
3056 :
3057 : // Create the unique sorted spectral window and time vectors for each group
3058 :
3059 0 : oSPWUniqueGroup.resize( uiNumGroup, false );
3060 0 : oTimeUniqueGroup.resize( uiNumGroup, false );
3061 :
3062 0 : for ( uInt g=0; g<uiNumGroup; g++ ) {
3063 0 : oSPWUniqueGroup[g].resize();
3064 0 : unique<uInt>( oSPWGroup[g], oSPWUniqueGroup[g] );
3065 0 : oTimeUniqueGroup[g].resize();
3066 0 : unique<Double>( oTimeGroup[g], oTimeUniqueGroup[g] );
3067 : }
3068 :
3069 :
3070 : // Return true
3071 :
3072 0 : success = true;
3073 :
3074 0 : return success;
3075 :
3076 0 : }
3077 :
3078 : // -----------------------------------------------------------------------------
3079 :
3080 : /*
3081 :
3082 : CalAnalysis::chanSPW
3083 :
3084 : Description:
3085 : ------------
3086 : This member function maps the spectral windows to the input spectral windows (to
3087 : get the correct channels) and forms the start channels so that spectral windows
3088 : can be concatenated.
3089 :
3090 : NB: The spectral windows must be unique and sorted.
3091 :
3092 : Inputs:
3093 : -------
3094 : oSPW - This Vector<uInt> instance contains the unique and sorted spectral
3095 : windows.
3096 : oInput - This INPUT instance contains the input selections.
3097 :
3098 : Outputs:
3099 : --------
3100 : oSPWMap - This Vector<uInt> instance contains the mapped spectral windows.
3101 : oChanStart - This Vector<uInt> instance contains the start channels.
3102 : The Bool variable containing the check boolean, returned via
3103 : the function value.
3104 :
3105 : Modification history:
3106 : ---------------------
3107 : 2012 May 06 - Nick Elias, NRAO
3108 : Initial version.
3109 :
3110 : */
3111 :
3112 : // -----------------------------------------------------------------------------
3113 :
3114 0 : Bool CalAnalysis::chanSPW( const Vector<uInt>& oSPW, const INPUT& oInput,
3115 : Vector<uInt>& oSPWMap, Vector<uInt>& oChanStart ) const {
3116 :
3117 : // Declare the success boolean
3118 :
3119 0 : Bool success( false );
3120 :
3121 :
3122 : // Initialize the number of spectral windows, the spectral window map and
3123 : // start instances
3124 :
3125 0 : uInt uiNumSPW = oSPW.nelements();
3126 :
3127 0 : oSPWMap.resize( uiNumSPW, false );
3128 0 : oChanStart.resize( uiNumSPW, false );
3129 :
3130 :
3131 : // Load the spectral window map
3132 :
3133 0 : for ( uInt s=0; s<uiNumSPW; s++ ) {
3134 0 : if ( !where( oSPW[s], oInput.oSPW, oSPWMap[s] ) ) {
3135 0 : success = false;
3136 0 : return success;
3137 : }
3138 : }
3139 :
3140 :
3141 : // Load the start channels
3142 :
3143 0 : oChanStart[0] = 0;
3144 0 : for ( uInt s=1; s<uiNumSPW; s++ ) {
3145 0 : oChanStart[s] = oChanStart[s-1];
3146 0 : oChanStart[s] += oInput.oChannel[oSPWMap[s-1]].nelements();
3147 : }
3148 :
3149 :
3150 : // Return true
3151 :
3152 0 : success = true;
3153 :
3154 0 : return success;
3155 :
3156 : }
3157 :
3158 : // -----------------------------------------------------------------------------
3159 :
3160 : /*
3161 :
3162 : CalAnalysis::freqGroup
3163 :
3164 : Description:
3165 : ------------
3166 : This member function concatenates the frequencies from multiple spectral windows
3167 : for each group.
3168 :
3169 : Inputs:
3170 : -------
3171 : oInput - This INPUT instance contains the input selections.
3172 : oSPWUniqueGroup - This Vector<Vector<uInt> > instance contains the unique
3173 : spectral windows for each group.
3174 :
3175 : Outputs:
3176 : --------
3177 : oFreqGroup - This Vector<Vector<Double> >instance contains the frequencies (for
3178 : each group. They can come from multiple spectral windows (which
3179 : are in different rows).
3180 : The Bool variable containing the success boolean, returned via
3181 : the function value.
3182 :
3183 : Modification history:
3184 : ---------------------
3185 : 2012 May 06 - Nick Elias, NRAO
3186 : Initial version.
3187 :
3188 : */
3189 :
3190 : // -----------------------------------------------------------------------------
3191 :
3192 0 : Bool CalAnalysis::freqGroup( const INPUT& oInput,
3193 : const Vector<Vector<uInt> >& oSPWUniqueGroup,
3194 : Vector<Vector<Double> >& oFreqGroup ) const {
3195 :
3196 : // Declare the success boolean
3197 :
3198 0 : Bool success = false;
3199 :
3200 :
3201 : // Create the instance for the spectral window subtable of the new format
3202 : // calibration table and the accessor instance for the CHAN_FREQ column
3203 :
3204 0 : Table oTableSPW( oCalName+String("/SPECTRAL_WINDOW"), Table::Old );
3205 :
3206 0 : ArrayColumn<Double> oChanFreqCol( oTableSPW, String("CHAN_FREQ") );
3207 :
3208 :
3209 : // Initialize the number of groups and the output instance
3210 :
3211 0 : uInt uiNumGroup = oSPWUniqueGroup.nelements();
3212 :
3213 0 : oFreqGroup.resize( uiNumGroup, false );
3214 :
3215 :
3216 : // Load the output instances
3217 :
3218 0 : for ( uInt g=0; g<uiNumGroup; g++ ) {
3219 :
3220 : // Get the start channels for all spectral windows in the group
3221 0 : Vector<uInt> oSPWMap;
3222 0 : Vector<uInt> oChanStart;
3223 0 : if ( !chanSPW( oSPWUniqueGroup[g], oInput, oSPWMap, oChanStart ) ) {
3224 0 : success = false;
3225 0 : return success;
3226 : }
3227 :
3228 0 : for ( uInt s=0; s<oSPWUniqueGroup[g].nelements(); s++ ) {
3229 :
3230 : // Get the number of channels for the mapped spectral window
3231 0 : uInt uiNumChannelInput = oInput.oChannel[oSPWMap[s]].nelements();
3232 :
3233 : // Resize the frequency vector for the group
3234 0 : oFreqGroup[g].resize( oChanStart[s]+uiNumChannelInput, true );
3235 :
3236 : // Get the channels for the group and spectral window from the spectral
3237 : // window subtable of the new format calibration table
3238 0 : Vector<Double> oFreqTemp( oChanFreqCol(oSPWUniqueGroup[g][s]) );
3239 :
3240 : // Load the frequency vector for the group
3241 0 : for ( uInt c=0; c<uiNumChannelInput; c++ ) {
3242 0 : uInt uiChanGroup = oChanStart[s] + c;
3243 0 : uInt uiChanTemp = oInput.oChannel[oSPWMap[s]][c];
3244 0 : oFreqGroup[g][uiChanGroup] = oFreqTemp[uiChanTemp];
3245 : }
3246 :
3247 0 : }
3248 :
3249 0 : }
3250 :
3251 :
3252 : // Return true
3253 :
3254 0 : success = true;
3255 :
3256 0 : return success;
3257 :
3258 0 : }
3259 :
3260 : // -----------------------------------------------------------------------------
3261 :
3262 : /*
3263 :
3264 : CalAnalysis::cubeGroup
3265 :
3266 : Description:
3267 : ------------
3268 : This member function concatenates data from multiple rows into groups according
3269 : to unique (field,antenna1,antenna2).
3270 :
3271 : Inputs:
3272 : -------
3273 : oNCT - This NewCalTable instance contains the new format calibration
3274 : table.
3275 : oInput - This INPUT instance contains the input selections.
3276 : oRowGroup - This Vector<uInt> instance contains the row numbers for each
3277 : group.
3278 : oSPWGroup - This Vector<Vector<uInt> > instance contains the spectral
3279 : windows for each group.
3280 : oSPWUniqueGroup - This Vector<Vector<uInt> > instance contains the unique
3281 : spectral windows for each group.
3282 : oTimeGroup - This Vector<Vector<Double> > instance contains the times for
3283 : each group.
3284 : oTimeUniqueGroup - This Vector<Vector<Double> > instance contains the unique
3285 : times for each group.
3286 : oFreqGroup - This Vector<Vector<Double> >instance contains the frequencies
3287 : for each group. They can come from multiple spectral windows
3288 : (which are in different rows).
3289 :
3290 : Outputs:
3291 : --------
3292 : oCParamGroup - This Vector<Cube<DComplex> > instance contains the complex
3293 : parameters. This instance is empty for new format calibration
3294 : tables with real parameters.
3295 : oFParamGroup - This Vector<Cube<Double> > instance contains the real
3296 : parameters. This instance is empty for new format calibration
3297 : tables with complex parameters.
3298 : oParamErrGroup - This Vector<Cube<Double> > instance contains the parameter
3299 : errors.
3300 : oFlagGroup - This Vector<Cube<Bool> > instance contains the flags.
3301 : The Bool variable containing the check boolean, returned via
3302 : the function value.
3303 :
3304 : Modification history:
3305 : ---------------------
3306 : 2012 May 06 - Nick Elias, NRAO
3307 : Initial version.
3308 :
3309 : */
3310 :
3311 : // -----------------------------------------------------------------------------
3312 :
3313 0 : Bool CalAnalysis::cubeGroup( const NewCalTable& oNCT, const INPUT& oInput,
3314 : const Vector<Vector<uInt> >& oRowGroup,
3315 : const Vector<Vector<uInt> >& oSPWGroup,
3316 : const Vector<Vector<uInt> >& oSPWUniqueGroup,
3317 : const Vector<Vector<Double> >& oTimeGroup,
3318 : const Vector<Vector<Double> >& oTimeUniqueGroup,
3319 : const Vector<Vector<Double> >& oFreqGroup,
3320 : Vector<Cube<DComplex> >& oCParamGroup, Vector<Cube<Double> >& oFParamGroup,
3321 : Vector<Cube<Double> >& oParamErrGroup,
3322 : Vector<Cube<Bool> >& oFlagGroup ) const {
3323 :
3324 : // Declare the success boolean
3325 :
3326 0 : Bool success( false );
3327 :
3328 :
3329 : // Create accessors for the CPARAM/FPARAM, PARAMERR, and FLAG columns
3330 :
3331 0 : ArrayColumn<Complex> poCParamCol;
3332 0 : ArrayColumn<Float> poFParamCol;
3333 :
3334 0 : if ( oParType == String("Complex") ) {
3335 0 : poCParamCol = ArrayColumn<Complex>( oNCT, String("CPARAM") );
3336 : } else {
3337 0 : poFParamCol = ArrayColumn<Float>( oNCT, String("FPARAM") );
3338 : }
3339 :
3340 0 : ArrayColumn<Float> oParamErrCol( oNCT, String("PARAMERR") );
3341 :
3342 0 : ArrayColumn<Bool> oFlagCol( oNCT, String("FLAG") );
3343 :
3344 :
3345 : // Initialize the number of groups and the output instances
3346 :
3347 0 : uInt uiNumGroup = oRowGroup.nelements();
3348 :
3349 0 : oCParamGroup.resize( uiNumGroup, false );
3350 0 : oFParamGroup.resize( uiNumGroup, false );
3351 0 : oParamErrGroup.resize( uiNumGroup, false );
3352 0 : oFlagGroup.resize( uiNumGroup, false );
3353 :
3354 :
3355 : // Load the output instances for each group
3356 :
3357 0 : for ( uInt g=0; g<uiNumGroup; g++ ) { // Loop over group
3358 :
3359 : // Get the spectral window maps and start channels for the group
3360 0 : Vector<uInt> oSPWMap;
3361 0 : Vector<uInt> oChanStart;
3362 0 : if ( !chanSPW( oSPWUniqueGroup[g], oInput, oSPWMap, oChanStart ) ) {
3363 0 : success = false;
3364 0 : return success;
3365 : }
3366 :
3367 : // Initialize the shape of the output instances for the group
3368 0 : uInt uiNumFreq = oFreqGroup[g].nelements();
3369 0 : uInt uiNumTimeUnique = oTimeUniqueGroup[g].nelements();
3370 0 : IPosition oShape( 3, uiNumFeed, uiNumFreq, uiNumTimeUnique );
3371 :
3372 : // Allocate the output instances for the group
3373 0 : oCParamGroup[g].resize( oShape, false );
3374 0 : oFParamGroup[g].resize( oShape, false );
3375 0 : oParamErrGroup[g].resize( oShape, false );
3376 0 : oFlagGroup[g].resize( oShape, false );
3377 :
3378 : // Initialize the output instances for the group
3379 0 : oCParamGroup[g] = DComplex( 0.0, 0.0 );
3380 0 : oFParamGroup[g] = 0.0;
3381 0 : oParamErrGroup[g] = 0.0;
3382 0 : oFlagGroup[g] = true;
3383 :
3384 : // Get the number of rows for the group
3385 0 : uInt uiNumRow = oRowGroup[g].nelements();
3386 :
3387 0 : for ( uInt r=0; r<uiNumRow; r++ ) { // Loop over rows for the group
3388 :
3389 : // Get the row number in the new format calibration table
3390 0 : uInt uiRow = oRowGroup[g][r];
3391 :
3392 : // Get the CPARAM or FPARAM cell from the new format calibration table
3393 0 : Array<Complex> oCParamCube;
3394 0 : Array<Float> oFParamCube;
3395 0 : if ( oParType == String("Complex") ) {
3396 0 : IPosition oShape( poCParamCol( uiRow ).shape() );
3397 0 : oCParamCube.resize( oShape, false );
3398 0 : oCParamCube = poCParamCol( uiRow );
3399 0 : oFParamCube = Array<Float>( oShape, 0.0F );
3400 0 : } else {
3401 0 : IPosition oShape( poFParamCol(uiRow).shape() );
3402 0 : oFParamCube.resize( oShape, false );
3403 0 : oFParamCube = poFParamCol( uiRow );
3404 0 : oCParamCube = Array<Complex>( oShape, Complex(0.0,0.0) );
3405 0 : }
3406 :
3407 : // Get the PARAMERR cell from the new format calibration table
3408 0 : Array<Float> oParamErrCube( oParamErrCol(uiRow).shape(), 0.0F );
3409 0 : oParamErrCube = oParamErrCol( uiRow );
3410 :
3411 : // Get the FLAG cell from the new format calibration table
3412 0 : Array<Bool> oFlagCube( oFlagCol(uiRow).shape(), false );
3413 0 : oFlagCube = oFlagCol( uiRow );
3414 :
3415 : // Map the spectral window
3416 0 : uInt s = 0;
3417 0 : if ( !where( oSPWGroup[g][r], oSPWUniqueGroup[g], s ) ) {
3418 0 : success = false;
3419 0 : return success;
3420 : }
3421 :
3422 : // Get the number of input channels and the channels for the mapped
3423 : // spectral window
3424 0 : uInt uiNumChannelC = oInput.oChannel[oSPWMap[s]].nelements();
3425 0 : Vector<uInt> oChannelC( oInput.oChannel[oSPWMap[s]] );
3426 :
3427 : // Map the time
3428 0 : uInt t = 0;
3429 0 : if ( !where( oTimeGroup[g][r], oTimeUniqueGroup[g], t ) ) {
3430 0 : success = false;
3431 0 : return success;
3432 : }
3433 :
3434 : // Map the cubes from the new format calibration tables to the output
3435 : // instances for each group
3436 0 : for ( uInt f=0; f<uiNumFeed; f++ ) { // Loop over feeds
3437 0 : for ( uInt c=0; c<uiNumChannelC; c++ ) { // Loop over channnels
3438 0 : IPosition oPosG( 3, f, oChanStart[s]+c, t );
3439 0 : IPosition oPosC( 2, f, oChannelC[c] );
3440 0 : oCParamGroup[g](oPosG) = (DComplex) oCParamCube(oPosC);
3441 0 : oFParamGroup[g](oPosG) = (Double) oFParamCube(oPosC);
3442 0 : oParamErrGroup[g](oPosG) = (Double) oParamErrCube(oPosC);
3443 0 : oFlagGroup[g](oPosG) = oFlagCube(oPosC);
3444 0 : }
3445 : }
3446 :
3447 0 : }
3448 :
3449 0 : }
3450 :
3451 :
3452 : // Return true
3453 :
3454 0 : success = true;
3455 :
3456 0 : return success;
3457 :
3458 0 : }
3459 :
3460 : // -----------------------------------------------------------------------------
3461 : // End of CalAnalysis private member functions
3462 : // -----------------------------------------------------------------------------
3463 :
3464 : // -----------------------------------------------------------------------------
3465 : // Start of CalAnalysis protected member functions
3466 : // -----------------------------------------------------------------------------
3467 :
3468 : /*
3469 :
3470 : CalAnalysis::CalAnalysis (default)
3471 :
3472 : Description:
3473 : ------------
3474 : This default constructor is unused by this class and unavailable when an
3475 : instance is created.
3476 :
3477 : Inputs:
3478 : -------
3479 : None.
3480 :
3481 : Outputs:
3482 : --------
3483 : None.
3484 :
3485 : Modification history:
3486 : ---------------------
3487 : 2012 Jan 20 - Nick Elias, NRAO
3488 : Initial version.
3489 :
3490 : */
3491 :
3492 : // -----------------------------------------------------------------------------
3493 :
3494 0 : CalAnalysis::CalAnalysis( void ) {}
3495 :
3496 : // -----------------------------------------------------------------------------
3497 :
3498 : /*
3499 :
3500 : CalAnalysis::CalAnalysis (copy)
3501 :
3502 : Description:
3503 : ------------
3504 : This copy constructor is unused by this class and unavailable when an instance
3505 : is created.
3506 :
3507 : Inputs:
3508 : -------
3509 : oCalAnalysis - A reference to a CalAnalysis instance.
3510 :
3511 : Outputs:
3512 : --------
3513 : None.
3514 :
3515 : Modification history:
3516 : ---------------------
3517 : 2012 Jan 20 - Nick Elias, NRAO
3518 : Initial version.
3519 :
3520 : */
3521 :
3522 : // -----------------------------------------------------------------------------
3523 :
3524 0 : CalAnalysis::CalAnalysis( const CalAnalysis& oCalAnalysis ) {
3525 :
3526 : // Overwrite this instance and return. This code will bomb. I have written
3527 : // it in this way to keep the compiler from spewing warning messages about
3528 : // unused variables.
3529 :
3530 0 : *this = oCalAnalysis;
3531 :
3532 0 : return;
3533 :
3534 0 : }
3535 :
3536 : // -----------------------------------------------------------------------------
3537 :
3538 : /*
3539 :
3540 : CalAnalysis::operator=
3541 :
3542 : Description:
3543 : ------------
3544 : This operator= function is unused by this class and unavailable when an instance
3545 : is created.
3546 :
3547 : Inputs:
3548 : -------
3549 : oCalAnalysis - A reference to a CalAnalysis instance.
3550 :
3551 : Outputs:
3552 : --------
3553 : None.
3554 :
3555 : Modification history:
3556 : ---------------------
3557 : 2012 Jan 20 - Nick Elias, NRAO
3558 : Initial version.
3559 :
3560 : */
3561 :
3562 : // -----------------------------------------------------------------------------
3563 :
3564 0 : CalAnalysis& CalAnalysis::operator=( const CalAnalysis& oCalAnalysis ) {
3565 :
3566 : // Copy the input instance and return it. This code will bomb. I have
3567 : // written it in this way to keep the compiler from spewing warning messages
3568 : // about unused variables.
3569 :
3570 0 : CalAnalysis* poCalAnalysis = new CalAnalysis( oCalAnalysis );
3571 :
3572 0 : return( *poCalAnalysis );
3573 :
3574 : }
3575 :
3576 : // -----------------------------------------------------------------------------
3577 : // End of CalAnalysis protected member functions
3578 : // -----------------------------------------------------------------------------
3579 :
3580 : // -----------------------------------------------------------------------------
3581 : // End of CalAnalysis class
3582 : // -----------------------------------------------------------------------------
3583 :
3584 : };
3585 :
3586 : // -----------------------------------------------------------------------------
3587 : // End of casa namespace
3588 : // -----------------------------------------------------------------------------
|