Newer
Older
#include "tilebeam2016.h"
#include <casacore/measures/Measures/MDirection.h>
#include <casacore/measures/Measures/MCPosition.h>
#include <casacore/measures/Measures/MeasConvert.h>
namespace everybeam {
namespace mwabeam {
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
TileBeam2016::TileBeam2016(const double* delays, bool frequency_interpolation,
const std::string& coeff_path)
: Beam2016Implementation(delays, nullptr, coeff_path),
frequency_interpolation_(frequency_interpolation),
mwa_lattitude_(-26.703319),
mwa_longitude_(116.67081),
mwa_height_(377.0) {}
void TileBeam2016::ArrayResponse(
double ra, double dec, const casacore::MDirection::Ref& j2000_ref,
casacore::MDirection::Convert& j2000_to_hadec,
casacore::MDirection::Convert& j2000_to_azelgeo, double arr_lattitude,
double frequency, std::complex<double>* gain) {
static const casacore::Unit rad_unit("rad");
casacore::MDirection image_dir(
casacore::MVDirection(casacore::Quantity(ra, rad_unit), // RA
casacore::Quantity(dec, rad_unit)), // DEC
j2000_ref);
// convert ra, dec to ha
casacore::MDirection hadec = j2000_to_hadec(image_dir);
double ha = hadec.getValue().get()[0];
double sin_lat = std::sin(arr_lattitude), cos_lat = std::cos(arr_lattitude);
double sin_dec = std::sin(dec), cos_dec = std::cos(dec);
double cos_ha = std::cos(ha);
double zenith_distance =
std::acos(sin_lat * sin_dec + cos_lat * cos_dec * cos_ha);
casacore::MDirection azel = j2000_to_azelgeo(image_dir);
double azimuth = azel.getValue().get()[0];
ArrayResponse(zenith_distance, azimuth, frequency, gain);
}
/**
* 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 TileBeam2016::GetTabulatedResponse(double az, double za, double freq,
std::complex<double>* result) {
// input are radians -> convert to degrees as implementation class expects :
double az_deg = az * (180.00 / M_PI);
double za_deg = za * (180.00 / M_PI);
JonesMatrix jones = CalcJones(az_deg, za_deg, freq, 1);
result[0] = jones.j00;
result[1] = jones.j01;
result[2] = jones.j10;
result[3] = jones.j11;
}
} // namespace mwabeam
} // namespace everybeam