Line data Source code
1 : /* 2 : * ScantableReader.h 3 : * 4 : * Created on: Jan 5, 2016 5 : * Author: nakazato 6 : */ 7 : 8 : #ifndef SINGLEDISH_FILLER_SCANTABLE2MSREADER_H_ 9 : #define SINGLEDISH_FILLER_SCANTABLE2MSREADER_H_ 10 : 11 : #include <string> 12 : #include <memory> 13 : #include <functional> 14 : 15 : // casacore includes 16 : #include <casacore/casa/Containers/Record.h> 17 : #include <casacore/tables/Tables/TableRecord.h> 18 : #include <casacore/tables/Tables/ArrayColumn.h> 19 : #include <casacore/tables/Tables/ScalarColumn.h> 20 : #include <singledishfiller/Filler/ReaderInterface.h> 21 : #include <singledishfiller/Filler/ScantableIterator.h> 22 : 23 : namespace casa { //# NAMESPACE CASA - BEGIN 24 : 25 : class Scantable2MSReader final : public ReaderInterface { 26 : public: 27 : // do nothing implementation for OptionalTables 28 : using OptionalTables = NullOptionalTables<Scantable2MSReader>; 29 : 30 : Scantable2MSReader(std::string const &scantable_name); 31 : virtual ~Scantable2MSReader(); 32 : 33 : // get number of rows for MAIN table 34 5 : size_t getNumberOfRows() const override { 35 5 : if (!main_table_) { 36 0 : return 0; 37 : } 38 5 : return main_table_->nrow(); 39 : } 40 : 41 5 : casacore::Bool isFloatData() const override { 42 5 : casacore::Bool is_float = true; 43 5 : if (!main_table_) { 44 0 : is_float = false; 45 : } else { 46 5 : casacore::String pol_type = main_table_->keywordSet().asString("POLTYPE"); 47 5 : casacore::ScalarColumn<casacore::uInt> polno_column(*main_table_, "POLNO"); 48 5 : casacore::uInt max_pol = max(polno_column.getColumn()); 49 : // std::cout << "pol_type=" << pol_type << " max_pol=" << max_pol << std::endl; 50 5 : if ((max_pol == 3) && (pol_type == "linear" || pol_type == "circular")) { 51 0 : is_float = false; 52 : } 53 5 : } 54 : // std::cout << "is_float = " << is_float << std::endl; 55 5 : return is_float; 56 : } 57 : 58 5 : casacore::MDirection::Types getDirectionFrame() const override { 59 5 : return casacore::MDirection::J2000; 60 : } 61 : 62 5 : casacore::String getDataUnit() const override { 63 5 : return main_table_->keywordSet().asString("FluxUnit"); 64 : } 65 : 66 : // to get OBSERVATION table 67 10 : casacore::Bool getObservationRow(sdfiller::ObservationRecord &record) override { 68 : POST_START; 69 : 70 10 : casacore::Bool return_value = get_observation_row_(record); 71 : 72 : POST_END; 73 10 : return return_value; 74 : } 75 : 76 : // to get ANTENNA table 77 10 : casacore::Bool getAntennaRow(sdfiller::AntennaRecord &record) override { 78 : POST_START; 79 : 80 10 : casacore::Bool return_value = get_antenna_row_(record); 81 : 82 : POST_END; 83 10 : return return_value; 84 : } 85 : 86 : // to get PROCESSOR table 87 10 : casacore::Bool getProcessorRow(sdfiller::ProcessorRecord &record) override { 88 : POST_START; 89 : 90 10 : casacore::Bool return_value = get_processor_row_(record); 91 : 92 : POST_END; 93 10 : return return_value; 94 : } 95 : 96 : // to get SOURCE table 97 30 : casacore::Bool getSourceRow(sdfiller::SourceRecord &record) override { 98 : POST_START; 99 : 100 30 : casacore::Bool return_value = get_source_row_(record); 101 : 102 : POST_END; 103 30 : return return_value; 104 : } 105 : 106 : // to get FIELD table 107 10 : casacore::Bool getFieldRow(sdfiller::FieldRecord &record) override { 108 : POST_START; 109 : 110 10 : casacore::Bool return_value = get_field_row_(record); 111 : 112 : POST_END; 113 10 : return return_value; 114 : } 115 : 116 : // to get SOURCE table 117 30 : casacore::Bool getSpectralWindowRow(sdfiller::SpectralWindowRecord &record) override { 118 : POST_START; 119 : 120 30 : casacore::Bool return_value = get_spw_row_(record); 121 : 122 : POST_END; 123 30 : return return_value; 124 : } 125 : 126 : // for DataAccumulator 127 : casacore::Bool getData(size_t irow, sdfiller::DataRecord &record) override ; 128 : 129 : protected: 130 : void initializeSpecific() override ; 131 : void finalizeSpecific() override ; 132 : 133 : private: 134 : std::unique_ptr<casacore::Table> main_table_; 135 : casacore::Table tcal_table_; 136 : casacore::Table weather_table_; 137 : 138 : casacore::ScalarColumn<casacore::uInt> scan_column_; 139 : casacore::ScalarColumn<casacore::uInt> cycle_column_; 140 : casacore::ScalarColumn<casacore::uInt> ifno_column_; 141 : casacore::ScalarColumn<casacore::uInt> polno_column_; 142 : casacore::ScalarColumn<casacore::uInt> beam_column_; 143 : casacore::ScalarColumn<casacore::uInt> flagrow_column_; 144 : casacore::ScalarColumn<casacore::Double> time_column_; 145 : casacore::ScalarColumn<casacore::Double> interval_column_; 146 : casacore::ScalarColumn<casacore::Int> srctype_column_; 147 : casacore::ArrayColumn<casacore::Float> data_column_; 148 : casacore::ArrayColumn<casacore::uChar> flag_column_; 149 : casacore::ArrayColumn<casacore::Double> direction_column_; 150 : casacore::ArrayColumn<casacore::Double> scanrate_column_; 151 : casacore::ScalarColumn<casacore::String> fieldname_column_; 152 : casacore::ArrayColumn<casacore::Float> tsys_column_; 153 : casacore::ScalarColumn<casacore::uInt> tcal_id_column_; 154 : casacore::ScalarColumn<casacore::uInt> weather_id_column_; 155 : casacore::ArrayColumn<casacore::Float> tcal_column_; 156 : casacore::ScalarColumn<casacore::Float> temperature_column_; 157 : casacore::ScalarColumn<casacore::Float> pressure_column_; 158 : casacore::ScalarColumn<casacore::Float> humidity_column_; 159 : casacore::ScalarColumn<casacore::Float> wind_speed_column_; 160 : casacore::ScalarColumn<casacore::Float> wind_direction_column_; 161 : casacore::Vector<casacore::uInt> sorted_rows_; 162 : ScantableFieldIterator::Product field_map_; 163 : ScantableFrequenciesIterator::Product num_chan_map_; 164 : std::map<casacore::uInt, casacore::uInt> tcal_id_map_; 165 : std::map<casacore::uInt, casacore::uInt> weather_id_map_; 166 : casacore::String pol_type_; 167 : 168 : std::function<casacore::Bool(sdfiller::AntennaRecord &)> get_antenna_row_; 169 : std::function<casacore::Bool(sdfiller::FieldRecord &)> get_field_row_; 170 : std::function<casacore::Bool(sdfiller::ObservationRecord &)> get_observation_row_; 171 : std::function<casacore::Bool(sdfiller::ProcessorRecord &)> get_processor_row_; 172 : std::function<casacore::Bool(sdfiller::SourceRecord &)> get_source_row_; 173 : std::function<casacore::Bool(sdfiller::SpectralWindowRecord &)> get_spw_row_; 174 : 175 : std::unique_ptr<ScantableFieldIterator> field_iter_; 176 : std::unique_ptr<ScantableFrequenciesIterator> freq_iter_; 177 : std::unique_ptr<ScantableSourceIterator> source_iter_; 178 : 179 : casacore::Bool getAntennaRowImpl(sdfiller::AntennaRecord &record); 180 : casacore::Bool getFieldRowImpl(sdfiller::FieldRecord &record); 181 : casacore::Bool getObservationRowImpl(sdfiller::ObservationRecord &record); 182 : casacore::Bool getProcessorRowImpl(sdfiller::ProcessorRecord &record); 183 : casacore::Bool getSourceRowImpl(sdfiller::SourceRecord &record); 184 : casacore::Bool getSpectralWindowRowImpl(sdfiller::SpectralWindowRecord &record); 185 : 186 : template<class _Record> 187 15 : casacore::Bool noMoreRowImpl(_Record &) { 188 : POST_START;POST_END; 189 15 : return false; 190 : } 191 : 192 : template<class _Iterator, class _Record, class _Func> 193 70 : casacore::Bool getRowImplTemplate(std::unique_ptr<_Iterator> &iter, _Record &record, 194 : _Func &func, typename _Iterator::Product *product = nullptr) { 195 : POST_START; 196 : 197 70 : if (!iter) { 198 15 : iter.reset(new _Iterator(*main_table_)); 199 : } 200 : 201 70 : casacore::Bool more_data = iter->moreData(); 202 70 : if (more_data) { 203 55 : iter->getEntry(record); 204 55 : iter->next(); 205 : } else { 206 : // seems to be passed through all the table, deallocate iterator 207 15 : iter->getProduct(product); 208 15 : iter.reset(nullptr); 209 : // and then redirect function pointer to noMoreRowImpl 210 15 : func = [&](_Record &r) {return Scantable2MSReader::noMoreRowImpl<_Record>(r);}; 211 : } 212 : 213 : POST_END; 214 : 215 70 : return more_data; 216 : } 217 : }; 218 : 219 : } //# NAMESPACE CASA - END 220 : 221 : #endif /* SINGLEDISH_FILLER_SCANTABLE2MSREADER_H_ */