Select Git revision
Forked from
ResearchAndDevelopment / EveryBeam
462 commits behind the upstream repository.

Lars Krombeen authored and
Jakob Maljaars
committed
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
tlofar.cc 5.02 KiB
#include <boost/test/unit_test.hpp>
#include "../load.h"
#include "../options.h"
#include "../griddedresponse/lofargrid.h"
#include "../elementresponse.h"
#include "../../external/npy.hpp"
#include "config.h"
#include <complex>
#include <cmath>
using everybeam::ElementResponseModel;
using everybeam::Load;
using everybeam::Options;
using everybeam::coords::CoordinateSystem;
using everybeam::griddedresponse::GriddedResponse;
using everybeam::griddedresponse::LOFARGrid;
using everybeam::telescope::LOFAR;
using everybeam::telescope::Telescope;
BOOST_AUTO_TEST_SUITE(tlofar)
BOOST_AUTO_TEST_CASE(load_lofar) {
Options options;
options.element_response_model = ElementResponseModel::kHamaker;
casacore::MeasurementSet ms(LOFAR_MOCK_MS);
// Load LOFAR Telescope
std::unique_ptr<Telescope> telescope = Load(ms, options);
// Assert if we indeed have a LOFAR pointer
BOOST_CHECK(nullptr != dynamic_cast<LOFAR*>(telescope.get()));
// Assert if correct number of stations
std::size_t nstations = 70;
BOOST_CHECK_EQUAL(telescope->GetNrStations(), nstations);
// Assert if GetStation(stationd_id) behaves properly
const LOFAR& lofartelescope = static_cast<const LOFAR&>(*telescope.get());
BOOST_CHECK_EQUAL(lofartelescope.GetStation(0)->GetName(), "CS001HBA0");
// Properties extracted from MS
double time = 4929192878.008341;
double frequency = 138476562.5;
std::size_t width(4), height(4);
double ra(2.15374123), dec(0.8415521), dl(0.5 * M_PI / 180.),
dm(0.5 * M_PI / 180.), shift_l(0.), shift_m(0.);
CoordinateSystem coord_system = {.width = width,
.height = height,
.ra = ra,
.dec = dec,
.dl = dl,
.dm = dm,
.phase_centre_dl = shift_l,
.phase_centre_dm = shift_m};
std::unique_ptr<GriddedResponse> grid_response =
telescope->GetGriddedResponse(coord_system);
BOOST_CHECK(nullptr != dynamic_cast<LOFARGrid*>(grid_response.get()));
// Define buffer and get gridded responses
std::vector<std::complex<float>> antenna_buffer_single(
grid_response->GetBufferSize(1));
grid_response->CalculateStation(antenna_buffer_single.data(), time, frequency,
23, 0);
BOOST_CHECK_EQUAL(antenna_buffer_single.size(),
std::size_t(width * height * 2 * 2));
// LOFARBeam output at pixel (2,2):
std::vector<std::complex<float>> lofar_p22 = {{-0.175908, -0.000478397},
{-0.845988, -0.00121503},
{-0.89047, -0.00125383},
{0.108123, -5.36076e-05}};
// Compare with everybeam
std::size_t offset_22 = (2 + 2 * width) * 4;
for (std::size_t i = 0; i < 4; ++i) {
BOOST_CHECK(std::abs(antenna_buffer_single[offset_22 + i] - lofar_p22[i]) <
1e-4);
}
// LOFARBeam output at pixel (1,3):
std::vector<std::complex<float>> lofar_p13 = {{-0.158755, -0.000749433},
{-0.816165, -0.00272568},
{-0.863389, -0.00283979},
{0.0936919, 0.000110673}};
// Compare with everybeam
std::size_t offset_13 = (1 + 3 * width) * 4;
for (std::size_t i = 0; i < 4; ++i) {
BOOST_CHECK(std::abs(antenna_buffer_single[offset_13 + i] - lofar_p13[i]) <
1e-4);
}
std::vector<std::complex<float>> antenna_buffer_all(
grid_response->GetBufferSize(telescope->GetNrStations()));
grid_response->CalculateAllStations(antenna_buffer_all.data(), time,
frequency, 0);
BOOST_CHECK_EQUAL(
antenna_buffer_all.size(),
std::size_t(telescope->GetNrStations() * width * height * 2 * 2));
// Test with differential beam, single
Options options_diff_beam;
options_diff_beam.element_response_model = ElementResponseModel::kHamaker;
options_diff_beam.use_differential_beam = true;
// Load LOFAR Telescope
std::unique_ptr<Telescope> telescope_diff_beam = Load(ms, options_diff_beam);
std::unique_ptr<GriddedResponse> grid_response_diff_beam =
telescope_diff_beam->GetGriddedResponse(coord_system);
std::vector<std::complex<float>> antenna_buffer_diff_beam(
grid_response_diff_beam->GetBufferSize(1));
grid_response_diff_beam->CalculateStation(antenna_buffer_diff_beam.data(),
time, frequency, 15, 0);
double norm_jones_mat = 0.;
for (std::size_t i = 0; i < 4; ++i) {
norm_jones_mat += std::norm(antenna_buffer_diff_beam[offset_22 + i]);
}
BOOST_CHECK(std::abs(norm_jones_mat - 2.) < 1e-6);
// Print to np array
const long unsigned leshape[] = {(long unsigned int)width, height, 2, 2};
npy::SaveArrayAsNumpy("lofar_station_responses.npy", false, 4, leshape,
antenna_buffer_single);
}
BOOST_AUTO_TEST_SUITE_END()