Skip to content
Snippets Groups Projects
tilebeam2016.h 2.92 KiB
Newer Older
#ifndef EVERYBEAM_MWABEAM_TILEBEAM2016_H_
#define EVERYBEAM_MWABEAM_TILEBEAM2016_H_

#include <complex>
#include <map>
#include <set>

#include "beam2016implementation.h"

#include <casacore/measures/Measures/MEpoch.h>
#include <casacore/measures/Measures/MPosition.h>
#include <casacore/measures/Measures/MDirection.h>
#include <casacore/measures/Measures/MCDirection.h>

namespace everybeam {
namespace mwabeam {

class TileBeam2016 : public Beam2016Implementation {
 public:
  TileBeam2016(const double *delays, bool frequency_interpolation,
               const std::string &coeff_path);

  /**
   * @brief API method for computing MWA array response
   *
   * @param ra right ascension (rad)
   * @param dec declination (rad)
   * @param j2000_ref J2000 ref coordinates
   * @param j2000_to_hadecref HADEC coordinates
   * @param j2000_to_azelgeoref AZELGEO coordinates
   * @param arr_lattitude Lattitude
   * @param frequency Frequency (Hz)
   * @param gain Gain matrix
   */
  void ArrayResponse(double ra, double dec,
                     const casacore::MDirection::Ref &j2000_ref,
                     casacore::MDirection::Convert &j2000_to_hadecref,
                     casacore::MDirection::Convert &j2000_to_azelgeoref,
                     double arr_lattitude, double frequency,
                     std::complex<double> *gain);

  /**
   * @brief Compute MWA array response in given zenith/azimuth direction
   *
   * @param zenith_angle Zenith angle (rad)
   * @param azimuth Azimuthal angle (rad)
   * @param frequency Frequency (Hz)
   * @param gain Gain matrix
   */
  void ArrayResponse(double zenith_angle, double azimuth, double frequency,
                     std::complex<double> *gain) {
    // As yet, this conditional is effectively redundant
    if (frequency_interpolation_)
      GetInterpolatedResponse(azimuth, zenith_angle, frequency, gain);
    else
      GetTabulatedResponse(azimuth, zenith_angle, frequency, gain);
  }

 private:
  bool frequency_interpolation_;

  /**
   * Get the full Jones matrix response of the tile including the dipole
   * reponse and array factor incorporating any mutual coupling effects
   * from the impedance matrix. freq in Hz.
   */
  void GetTabulatedResponse(double az, double za, double freq,
                            std::complex<double> *result);

  /**
   * Create a few tabulated responses and interpolated over these.
   */
  void GetInterpolatedResponse(double az, double za, double freq,
                               std::complex<double> *result) {
    // Not implemented yet: just call normal function
    GetTabulatedResponse(az, za, freq, result);
  }

  // TODO: variables seem to be unused. Remove?
  const double mwa_lattitude_;  // Array latitude. degrees North
  const double mwa_longitude_;  // Array longitude. degrees East
  const double mwa_height_;     // Array altitude. meters above sea level
};
}  // namespace mwabeam
}  // namespace everybeam
#endif  // EVERYBEAM_MWABEAM_TILEBEAM2016_H_