LCOV - code coverage report
Current view: top level - singledishfiller/Filler - FieldRecord.h (source / functions) Hit Total Coverage
Test: casa_coverage.info Lines: 46 57 80.7 %
Date: 2023-10-25 08:47:59 Functions: 4 4 100.0 %

          Line data    Source code
       1             : /*
       2             :  * FieldRecord.h
       3             :  *
       4             :  *  Created on: Jan 27, 2016
       5             :  *      Author: nakazato
       6             :  */
       7             : 
       8             : #ifndef SINGLEDISH_FILLER_FIELDRECORD_H_
       9             : #define SINGLEDISH_FILLER_FIELDRECORD_H_
      10             : 
      11             : #include <casacore/casa/Arrays/Matrix.h>
      12             : #include <casacore/casa/BasicSL/String.h>
      13             : #include <casacore/measures/Measures/MDirection.h>
      14             : #include <casacore/ms/MeasurementSets/MSField.h>
      15             : #include <casacore/ms/MeasurementSets/MSFieldColumns.h>
      16             : 
      17             : namespace casa { //# NAMESPACE CASA - BEGIN
      18             : 
      19             : // forward decleration
      20             : template<class Reader>
      21             : class SingleDishMSFiller;
      22             : 
      23             : namespace sdfiller { //# NAMESPACE SDFILLER - BEGIN
      24             : 
      25             : struct FieldRecord {
      26             :   typedef casacore::MSField AssociatingTable;
      27             :   typedef casacore::MSFieldColumns AssociatingColumns;
      28             : 
      29             : private:
      30             :   // external resource
      31             :   casacore::Record source_map;
      32             :   AssociatingTable table;
      33             : 
      34             : public:
      35             :   // meta
      36             :   casacore::Int field_id;
      37             :   casacore::String source_name;
      38             :   casacore::MDirection::Types frame;
      39             : 
      40             :   // mandatory
      41             :   casacore::String name;
      42             :   casacore::Double time;
      43             :   casacore::Matrix<casacore::Double> direction;
      44             : 
      45             :   // optional
      46             :   casacore::String code;
      47             : 
      48             :   // for dummy entry
      49             :   casacore::Int const d_source_id = -1;
      50             :   casacore::String const d_name = "";
      51             :   casacore::Int const d_num_poly = 0;
      52             :   casacore::Double const d_time = 0.0;
      53             :   casacore::Matrix<casacore::Double> const d_direction = casacore::Matrix<casacore::Double>(2, 1, 0.0);
      54             : 
      55             :   // method
      56          14 :   void clear() {
      57          14 :     field_id = -1;
      58          14 :     source_name = "";
      59          14 :     name = "";
      60          14 :     time = -1.0;
      61          14 :     direction.resize();
      62          14 :     frame = casacore::MDirection::N_Types;
      63          14 :     code = "";
      64          14 :   }
      65             : 
      66             :   FieldRecord &operator=(FieldRecord const &other) {
      67             :     source_map = other.source_map;
      68             :     table = other.table;
      69             :     field_id = other.field_id;
      70             :     source_name = other.source_name;
      71             :     frame = other.frame;
      72             :     name = other.name;
      73             :     time = other.time;
      74             :     direction = other.direction;
      75             :     code = other.code;
      76             :     return *this;
      77             :   }
      78             : 
      79           7 :   void add(AssociatingTable &table, AssociatingColumns &columns) {
      80           7 :     casacore::uInt ufield_id = (casacore::uInt) field_id;
      81           7 :     casacore::uInt nrow = table.nrow();
      82           7 :     if (nrow == 0) {
      83             :       // set direction frame information
      84           7 :       setFrame(columns);
      85             :     }
      86           7 :     if (nrow <= ufield_id) {
      87           7 :       table.addRow(ufield_id - nrow + 1);
      88           7 :       casacore::uInt new_nrow = table.nrow();
      89           7 :       for (casacore::uInt i = nrow; i < new_nrow - 1; ++i) {
      90           0 :         columns.sourceId().put(i, d_source_id);
      91           0 :         columns.name().put(i, d_name);
      92           0 :         columns.time().put(i, d_time);
      93           0 :         columns.numPoly().put(i, d_num_poly);
      94           0 :         columns.delayDir().put(i, d_direction);
      95           0 :         columns.phaseDir().put(i, d_direction);
      96           0 :         columns.referenceDir().put(i, d_direction);
      97             :       }
      98             :     }
      99           7 :   }
     100             : 
     101           7 :   casacore::Bool fill(casacore::uInt /*irow*/, AssociatingColumns &columns) {
     102           7 :     if (field_id < 0) {
     103           0 :       return false;
     104             :     }
     105             : 
     106           7 :     casacore::uInt nrow = columns.nrow();
     107           7 :     if (nrow == 0) {
     108             :       // set direction frame information
     109           0 :       setFrame(columns);
     110             :     }
     111             : 
     112           7 :     if (table.nrow() <= (casacore::uInt) field_id) {
     113           0 :       return false;
     114             :     }
     115             : 
     116           7 :     columns.name().put(field_id, name);
     117           7 :     columns.time().put(field_id, time);
     118           7 :     casacore::Int source_id = -1;
     119           7 :     if (source_map.isDefined(source_name)) {
     120           7 :       source_id = source_map.asInt(source_name);
     121             :     }
     122           7 :     columns.sourceId().put(field_id, source_id);
     123           7 :     columns.delayDir().put(field_id, direction);
     124           7 :     columns.phaseDir().put(field_id, direction);
     125           7 :     columns.referenceDir().put(field_id, direction);
     126           7 :     casacore::Int num_poly = direction.shape()[1] - 1;
     127           7 :     columns.numPoly().put(field_id, num_poly);
     128           7 :     if (code.size() > 0) {
     129           0 :       columns.code().put(field_id, code);
     130             :     }
     131           7 :     return true;
     132             :   }
     133             : 
     134             : private:
     135           7 :   void setFrame(AssociatingColumns &columns) {
     136           7 :     casacore::TableRecord &record = columns.delayDir().rwKeywordSet();
     137          14 :     casacore::Record meas_info = record.asRecord("MEASINFO");
     138           7 :     casacore::String direction_frame = casacore::MDirection::showType(frame);
     139           7 :     meas_info.define("Ref", direction_frame);
     140           7 :     record.defineRecord("MEASINFO", meas_info);
     141           7 :     columns.phaseDir().rwKeywordSet().defineRecord("MEASINFO", meas_info);
     142           7 :     columns.referenceDir().rwKeywordSet().defineRecord("MEASINFO", meas_info);
     143           7 :   }
     144             : 
     145             :   template<class Reader>
     146             :   friend class casa::SingleDishMSFiller;
     147             : };
     148             : 
     149             : } //# NAMESPACE SDFILLER - END
     150             : } //# NAMESPACE CASA - END
     151             : 
     152             : #endif /* SINGLEDISH_FILLER_FIELDRECORD_H_ */

Generated by: LCOV version 1.16