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 0 : void clear() { 57 0 : field_id = -1; 58 0 : source_name = ""; 59 0 : name = ""; 60 0 : time = -1.0; 61 0 : direction.resize(); 62 0 : frame = casacore::MDirection::N_Types; 63 0 : code = ""; 64 0 : } 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 0 : void add(AssociatingTable &table, AssociatingColumns &columns) { 80 0 : casacore::uInt ufield_id = (casacore::uInt) field_id; 81 0 : casacore::uInt nrow = table.nrow(); 82 0 : if (nrow == 0) { 83 : // set direction frame information 84 0 : setFrame(columns); 85 : } 86 0 : if (nrow <= ufield_id) { 87 0 : table.addRow(ufield_id - nrow + 1); 88 0 : casacore::uInt new_nrow = table.nrow(); 89 0 : 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 0 : } 100 : 101 0 : casacore::Bool fill(casacore::uInt /*irow*/, AssociatingColumns &columns) { 102 0 : if (field_id < 0) { 103 0 : return false; 104 : } 105 : 106 0 : casacore::uInt nrow = columns.nrow(); 107 0 : if (nrow == 0) { 108 : // set direction frame information 109 0 : setFrame(columns); 110 : } 111 : 112 0 : if (table.nrow() <= (casacore::uInt) field_id) { 113 0 : return false; 114 : } 115 : 116 0 : columns.name().put(field_id, name); 117 0 : columns.time().put(field_id, time); 118 0 : casacore::Int source_id = -1; 119 0 : if (source_map.isDefined(source_name)) { 120 0 : source_id = source_map.asInt(source_name); 121 : } 122 0 : columns.sourceId().put(field_id, source_id); 123 0 : columns.delayDir().put(field_id, direction); 124 0 : columns.phaseDir().put(field_id, direction); 125 0 : columns.referenceDir().put(field_id, direction); 126 0 : casacore::Int num_poly = direction.shape()[1] - 1; 127 0 : columns.numPoly().put(field_id, num_poly); 128 0 : if (code.size() > 0) { 129 0 : columns.code().put(field_id, code); 130 : } 131 0 : return true; 132 : } 133 : 134 : private: 135 0 : void setFrame(AssociatingColumns &columns) { 136 0 : casacore::TableRecord &record = columns.delayDir().rwKeywordSet(); 137 0 : casacore::Record meas_info = record.asRecord("MEASINFO"); 138 0 : casacore::String direction_frame = casacore::MDirection::showType(frame); 139 0 : meas_info.define("Ref", direction_frame); 140 0 : record.defineRecord("MEASINFO", meas_info); 141 0 : columns.phaseDir().rwKeywordSet().defineRecord("MEASINFO", meas_info); 142 0 : columns.referenceDir().rwKeywordSet().defineRecord("MEASINFO", meas_info); 143 0 : } 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_ */