LCOV - code coverage report
Current view: top level - synthesis/MeasurementComponents - SDDoubleCircleGainCalImpl.h (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 40 45 88.9 %
Date: 2024-12-11 20:54:31 Functions: 12 13 92.3 %

          Line data    Source code
       1             : /*
       2             :  * SDDoubleCircleGainCal.h
       3             :  *
       4             :  *  Created on: May 31, 2016
       5             :  *      Author: nakazato
       6             :  */
       7             : 
       8             : #ifndef SYNTHESIS_MEASUREMENTCOMPONENTS_SDDOUBLECIRCLEGAINCALIMPL_H_
       9             : #define SYNTHESIS_MEASUREMENTCOMPONENTS_SDDOUBLECIRCLEGAINCALIMPL_H_
      10             : 
      11             : #include <map>
      12             : #include <list>
      13             : 
      14             : #include <casacore/casa/aipstype.h>
      15             : #include <casacore/casa/Arrays/Cube.h>
      16             : #include <casacore/casa/Arrays/Matrix.h>
      17             : #include <casacore/casa/Arrays/Vector.h>
      18             : #include <casacore/casa/Logging/LogIO.h>
      19             : #include <casacore/casa/BasicSL/Constants.h>
      20             : #include <casacore/casa/Containers/Block.h>
      21             : 
      22             : namespace casa { // namespace casa START
      23             : 
      24             : class TimeRangeKey {
      25             : public:
      26             :   struct Less {
      27      331174 :     bool operator()(TimeRangeKey const &a, TimeRangeKey const &b) const {
      28     1324696 :       for (size_t i = 0; i < 3; ++i) {
      29      993522 :         if (a.meta_[i] != b.meta_[i]) {
      30           0 :           return a.meta_[i] < b.meta_[i];
      31             :         }
      32             :       }
      33             :       // a.meta_ == b.meta_
      34      331174 :       return false;
      35             :     }
      36             :   };
      37      165596 :   TimeRangeKey(casacore::Int const field_id, casacore::Int const antenna_id,
      38      165596 :   casacore::Int const feed_id) :
      39      165596 :       meta_(3) {
      40      165596 :     meta_[0] = field_id;
      41      165596 :     meta_[1] = antenna_id;
      42      165596 :     meta_[2] = feed_id;
      43      165596 :   }
      44      165605 :   ~TimeRangeKey() = default;
      45             : private:
      46             :   casacore::Block<casacore::Int> meta_;
      47             :   TimeRangeKey() = delete;
      48             : };
      49             : 
      50             : typedef std::pair<casacore::Double, casacore::Double> TimeRange;
      51             : typedef std::list<TimeRange> TimeRangeList;
      52             : 
      53             : class TimeRangeListTool {
      54             : public:
      55    14933490 :   static bool InRange(TimeRange const &timerange, casacore::Double const current_time) {
      56    14933490 :     auto const time_from = timerange.first * (1.0 - casacore::C::dbl_epsilon);
      57    14933490 :     auto const time_to = timerange.second * (1.0 + casacore::C::dbl_epsilon);
      58    14933490 :     return time_from < current_time && current_time < time_to;
      59             :   }
      60             : 
      61      165578 :   static bool InRange(TimeRangeList const &timerange_list, casacore::Double const current_time) {
      62    15092418 :     for (auto iter = timerange_list.begin(); iter != timerange_list.end(); ++iter) {
      63    14933490 :       if (InRange(*iter, current_time)) {
      64        6650 :         return true;
      65             :       }
      66             :     }
      67      158928 :     return false;
      68             :   }
      69             : };
      70             : 
      71             : class SDDoubleCircleGainCalImpl {
      72             : public:
      73             :   SDDoubleCircleGainCalImpl();
      74             :   virtual ~SDDoubleCircleGainCalImpl();
      75             : 
      76             :   // getter
      77             :   // get size of the central region in radian
      78             :   casacore::Double getCentralRegion() const {
      79             :     return central_region_;
      80             :   }
      81           9 :   casacore::Bool isSmoothingActive() const {
      82           9 :     return do_smooth_;
      83             :   }
      84             :   // get smoothing size
      85             :   casacore::Int getSmoothingSize() const {
      86             :     return smooth_size_;
      87             :   }
      88             :   // get observing frequency in Hz
      89          27 :   casacore::Double getObservingFrequency() const {
      90          27 :     return observing_frequency_;
      91             :   }
      92             :   // get antenna diameter in meter
      93          27 :   casacore::Double getAntennaDiameter() const {
      94          27 :     return antenna_diameter_;
      95             :   }
      96             : 
      97             :   // primvary beam size in radian
      98             :   casacore::Double getPrimaryBeamSize() const;
      99             : 
     100             :   // default smoothing size
     101             :   casacore::Int getDefaultSmoothingSize() const;
     102             : 
     103             :   // get radius of the central region in radian
     104             :   casacore::Double getRadius();
     105             : 
     106             :   // get effective smoothing size
     107             :   casacore::Int getEffectiveSmoothingSize();
     108             : 
     109             :   // setter
     110             :   // set radius of the central region in radian
     111          18 :   void setCentralRegion(casacore::Double value) {
     112          18 :     central_region_ = value;
     113          18 :   }
     114             : 
     115             :   // activate smoothing and set smoothing size
     116          18 :   void setSmoothing(casacore::Int size) {
     117          18 :     do_smooth_ = true;
     118          18 :     smooth_size_ = size;
     119          18 :   }
     120             : 
     121             :   // deactivate smoothing
     122           0 :   void unsetSmoothing() {
     123           0 :     do_smooth_ = false;
     124           0 :     smooth_size_ = -1;
     125           0 :   }
     126             : 
     127             :   // set observing frequency in Hz
     128          27 :   void setObservingFrequency(casacore::Double value) {
     129          27 :     observing_frequency_ = value;
     130          27 :   }
     131             : 
     132             :   // set antenna diameter in meter
     133          27 :   void setAntennaDiameter(casacore::Double value) {
     134          27 :     antenna_diameter_ = value;
     135          27 :   }
     136             : 
     137             :   // gain calibration
     138             :   // based on Stephen White's IDL script
     139             :   void calibrate(casacore::Cube<casacore::Float> const &data,
     140             :   casacore::Vector<casacore::Double> const &time,
     141             :   casacore::Matrix<casacore::Double> const &direction,
     142             :   casacore::Vector<casacore::Double> &gain_time,
     143             :   casacore::Cube<casacore::Float> &gain);
     144             :   // subspecies that take into account flag (false: valid, true: invalid)
     145             :   void calibrate(casacore::Cube<casacore::Float> const &data,
     146             :   casacore::Cube<casacore::Bool> const &flag,
     147             :   casacore::Vector<casacore::Double> const &time,
     148             :   casacore::Matrix<casacore::Double> const &direction,
     149             :   casacore::Vector<casacore::Double> &gain_time,
     150             :   casacore::Cube<casacore::Float> &gain,
     151             :   casacore::Cube<casacore::Bool> &gain_flag);
     152             : 
     153             :   // gain calibration implementation
     154             :   void doCalibrate(casacore::Vector<casacore::Double> &gain_time,
     155             :   casacore::Cube<casacore::Float> &gain,
     156             :   casacore::Cube<casacore::Bool> &gain_flag);
     157             : 
     158             :   // find time range that observed central region
     159             :   bool findTimeRange(casacore::Vector<casacore::Double> const &time,
     160             :   casacore::Vector<casacore::Double> const &interval,
     161             :   casacore::Matrix<casacore::Double> const &direction,
     162             :       TimeRangeList &timerange);
     163             : 
     164             :   // apply gain factor
     165             : //  void apply(casacore::Vector<casacore::Double> const &gain_time,
     166             : //      casacore::Cube<casacore::Float> const &gain,
     167             : //      casacore::Vector<casacore::Double> const &time,
     168             : //      casacore::Cube<casacore::Float> &data);
     169             : 
     170             : private:
     171             :   // radius of the central region [rad]
     172             :   casacore::Double central_region_;
     173             : 
     174             :   // flag for smoothing
     175             :   casacore::Bool do_smooth_;
     176             : 
     177             :   // smoothing size
     178             :   casacore::Int smooth_size_;
     179             : 
     180             :   // parameter for primary beam size determination
     181             :   // observing frequency [Hz]
     182             :   casacore::Double observing_frequency_;
     183             : 
     184             :   // antenna diameter [m]
     185             :   casacore::Double antenna_diameter_;
     186             : 
     187             :   // logger
     188             :   casacore::LogIO logger_;
     189             : 
     190             :   // find data within radius
     191             :   void findDataWithinRadius(casacore::Double const radius,
     192             :   casacore::Vector<casacore::Double> const &time,
     193             :   casacore::Cube<casacore::Float> const &data,
     194             :   casacore::Matrix<casacore::Double> const &direction,
     195             :   casacore::Vector<casacore::Double> &gain_time,
     196             :   casacore::Cube<casacore::Float> &gain);
     197             :   void findDataWithinRadius(casacore::Double const radius,
     198             :   casacore::Vector<casacore::Double> const &time,
     199             :   casacore::Cube<casacore::Float> const &data,
     200             :   casacore::Cube<casacore::Bool> const &flag,
     201             :   casacore::Matrix<casacore::Double> const &direction,
     202             :   casacore::Vector<casacore::Double> &gain_time,
     203             :   casacore::Cube<casacore::Float> &gain,
     204             :   casacore::Cube<casacore::Bool> &gain_flag);
     205             : };
     206             : 
     207             : } // namespace casa END
     208             : 
     209             : #endif /* SYNTHESIS_MEASUREMENTCOMPONENTS_SDDOUBLECIRCLEGAINCALIMPL_H_ */

Generated by: LCOV version 1.16