Skip to content
Snippets Groups Projects
Select Git revision
  • 217b20ffdff2833f29c60c830ba69bb703bdf3d5
  • master default protected
  • zhang-master-patch-34807
  • add-single-element-interface
  • ast-919-readthedocs
  • ncp_fix
  • workaround-wsclean-issue-83
  • ast-645-add-beam-normalisation-mode-preapplied
  • ast-645-add-beam-normalisation-mode-jm
  • activate-oskar-pybindings
  • disable-element-beam-1
  • submodulesync
  • fix-eigen
  • ncp_check
  • random-fixes
  • lobes-se607-1
  • test-schaapcommon
  • just-testing
  • extend-add_beaminfo-script
  • extend-telescope-interface-to-support-dp3
  • lobes-investigation
  • v0.3.1
  • v0.3.0
  • v0.2.0
  • v0.1.3
  • v0.1.2
  • v0.1.1
  • v0.1.0
28 results

tlofar.cc

Blame
  • Forked from ResearchAndDevelopment / EveryBeam
    462 commits behind the upstream repository.
    Lars Krombeen's avatar
    Lars Krombeen authored and Jakob Maljaars committed
    932002c8
    History
    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()