LCOV - code coverage report
Current view: top level - singledishfiller/Filler - Scantable2MSReader.h (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 47 50 94.0 %
Date: 2024-12-11 20:54:31 Functions: 16 22 72.7 %

          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_ */

Generated by: LCOV version 1.16