Skip to content
Snippets Groups Projects
Select Git revision
  • 3eabeeea4865a24490f33ab66c20272e388b51f6
  • master default protected
  • L2SS-1914-fix_job_dispatch
  • TMSS-3170
  • TMSS-3167
  • TMSS-3161
  • TMSS-3158-Front-End-Only-Allow-Changing-Again
  • TMSS-3133
  • TMSS-3319-Fix-Templates
  • test-fix-deploy
  • TMSS-3134
  • TMSS-2872
  • defer-state
  • add-custom-monitoring-points
  • TMSS-3101-Front-End-Only
  • TMSS-984-choices
  • SDC-1400-Front-End-Only
  • TMSS-3079-PII
  • TMSS-2936
  • check-for-max-244-subbands
  • TMSS-2927---Front-End-Only-PXII
  • Before-Remove-TMSS
  • LOFAR-Release-4_4_318 protected
  • LOFAR-Release-4_4_317 protected
  • LOFAR-Release-4_4_316 protected
  • LOFAR-Release-4_4_315 protected
  • LOFAR-Release-4_4_314 protected
  • LOFAR-Release-4_4_313 protected
  • LOFAR-Release-4_4_312 protected
  • LOFAR-Release-4_4_311 protected
  • LOFAR-Release-4_4_310 protected
  • LOFAR-Release-4_4_309 protected
  • LOFAR-Release-4_4_308 protected
  • LOFAR-Release-4_4_307 protected
  • LOFAR-Release-4_4_306 protected
  • LOFAR-Release-4_4_304 protected
  • LOFAR-Release-4_4_303 protected
  • LOFAR-Release-4_4_302 protected
  • LOFAR-Release-4_4_301 protected
  • LOFAR-Release-4_4_300 protected
  • LOFAR-Release-4_4_299 protected
41 results

CMakeLists.txt

Blame
  • 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()