From 458afa312728ffe051f4ce106d2e24aa28c08b22 Mon Sep 17 00:00:00 2001 From: Sebastiaan van der Tol <tol@astron.nl> Date: Fri, 7 Aug 2020 06:16:02 +0200 Subject: [PATCH] Fixes after rebase --- cpp/load.cc | 9 ++-- cpp/msv3readutils.cc | 65 +++++++++++------------ cpp/telescope/oskar.cc | 7 +-- cpp/telescope/oskar.h | 31 ++++++++++- demo/comparison-oskar/stationresponse.cpp | 16 ++++-- scripts/misc/add_beaminfo.py | 4 +- 6 files changed, 83 insertions(+), 49 deletions(-) diff --git a/cpp/load.cc b/cpp/load.cc index f34aa3fd..ad8a9977 100644 --- a/cpp/load.cc +++ b/cpp/load.cc @@ -25,8 +25,9 @@ TelescopeType GetTelescopeType(const casacore::MeasurementSet &ms) { return kATCATelescope; else if (telescope_name == "MWA") return kMWATelescope; - else if (str.rfind("OSKAR", 0) == 0) - return kOskarTelescope; + // check if telescope_name starts with "OSKAR" + else if (telescope_name.rfind("OSKAR", 0) == 0) + return kOSKARTelescope; else return kUnknownTelescope; } @@ -60,10 +61,10 @@ std::unique_ptr<telescope::Telescope> Load(casacore::MeasurementSet &ms, new telescope::MWA(ms, options)); return telescope; } - case kOskarTelescope: { + case kOSKARTelescope: { std::unique_ptr<telescope::Telescope> telescope = std::unique_ptr<telescope::Telescope>( - new telescope::OSKAR(ms, model, options)); + new telescope::OSKAR(ms, options)); return telescope; } default: diff --git a/cpp/msv3readutils.cc b/cpp/msv3readutils.cc index 5ee00ad5..3ad0da8b 100644 --- a/cpp/msv3readutils.cc +++ b/cpp/msv3readutils.cc @@ -73,39 +73,39 @@ using namespace casacore; vector3r_t TransformToFieldCoordinates( const vector3r_t &position, const Antenna::CoordinateSystem::Axes &axes); -inline Antenna::CoordinateSystem ReadCoordinateSystem( - const casacore::Table &table, unsigned int id) { - casacore::ArrayQuantColumn<casacore::Double> c_position(table, "POSITION", - "m"); - casacore::ArrayQuantColumn<casacore::Double> c_axes(table, - "COORDINATE_SYSTEM", "m"); - - // Read antenna field center (ITRF). - casacore::Vector<casacore::Quantity> aips_position = c_position(id); - assert(aips_position.size() == 3); - - vector3r_t position = {{aips_position(0).getValue(), - aips_position(1).getValue(), - aips_position(2).getValue()}}; - - // Read antenna field coordinate axes (ITRF). - casacore::Matrix<casacore::Quantity> aips_axes = c_axes(id); - assert(aips_axes.shape().isEqual(casacore::IPosition(2, 3, 3))); - - vector3r_t p = {{aips_axes(0, 0).getValue(), aips_axes(1, 0).getValue(), - aips_axes(2, 0).getValue()}}; - vector3r_t q = {{aips_axes(0, 1).getValue(), aips_axes(1, 1).getValue(), - aips_axes(2, 1).getValue()}}; - vector3r_t r = {{aips_axes(0, 2).getValue(), aips_axes(1, 2).getValue(), - aips_axes(2, 2).getValue()}}; - - Antenna::CoordinateSystem coordinate_system = {position, {p, q, r}}; - return coordinate_system; -} +// inline Antenna::CoordinateSystem ReadCoordinateSystem( +// const casacore::Table &table, unsigned int id) { +// casacore::ArrayQuantColumn<casacore::Double> c_position(table, "POSITION", +// "m"); +// casacore::ArrayQuantColumn<casacore::Double> c_axes(table, +// "COORDINATE_SYSTEM", "m"); +// +// // Read antenna field center (ITRF). +// casacore::Vector<casacore::Quantity> aips_position = c_position(id); +// assert(aips_position.size() == 3); +// +// vector3r_t position = {{aips_position(0).getValue(), +// aips_position(1).getValue(), +// aips_position(2).getValue()}}; +// +// // Read antenna field coordinate axes (ITRF). +// casacore::Matrix<casacore::Quantity> aips_axes = c_axes(id); +// assert(aips_axes.shape().isEqual(casacore::IPosition(2, 3, 3))); +// +// vector3r_t p = {{aips_axes(0, 0).getValue(), aips_axes(1, 0).getValue(), +// aips_axes(2, 0).getValue()}}; +// vector3r_t q = {{aips_axes(0, 1).getValue(), aips_axes(1, 1).getValue(), +// aips_axes(2, 1).getValue()}}; +// vector3r_t r = {{aips_axes(0, 2).getValue(), aips_axes(1, 2).getValue(), +// aips_axes(2, 2).getValue()}}; +// +// Antenna::CoordinateSystem coordinate_system = {position, {p, q, r}}; +// return coordinate_system; +// } BeamFormer::Ptr ReadMSv3AntennaField(const Table &table, unsigned int id, ElementResponse::Ptr element_response) { - Antenna::CoordinateSystem coordinate_system = ReadCoordinateSystem(table, id); + Antenna::CoordinateSystem coordinate_system = common::ReadCoordinateSystem(table, id); BeamFormer::Ptr beam_former( new BeamFormerIdenticalAntennas(coordinate_system)); // BeamFormer::Ptr beam_former(new BeamFormer(coordinate_system)); @@ -115,8 +115,6 @@ BeamFormer::Ptr ReadMSv3AntennaField(const Table &table, unsigned int id, // Read element offsets and flags. Matrix<Quantity> aips_offset = c_offset(id); - std::cout << aips_offset.shape() << std::endl; - std::cout << IPosition(2, aips_offset.nrow(), 3) << std::endl; assert(aips_offset.shape().isEqual(IPosition(2, aips_offset.nrow(), 3))); @@ -124,7 +122,6 @@ BeamFormer::Ptr ReadMSv3AntennaField(const Table &table, unsigned int id, assert(aips_flag.shape().isEqual(IPosition(2, aips_offset.nrow(), 2))); for (size_t i = 0; i < aips_offset.nrow(); ++i) { - std::cout << i << std::endl; vector3r_t antenna_position = {aips_offset(i, 0).getValue(), aips_offset(i, 1).getValue(), aips_offset(i, 2).getValue()}; @@ -194,7 +191,7 @@ Station::Ptr ReadMSv3Station(const MeasurementSet &ms, unsigned int id, size_t field_id = 0; size_t element_id = 0; Antenna::CoordinateSystem coordinate_system = - ReadCoordinateSystem(tab_phased_array, field_id); + common::ReadCoordinateSystem(tab_phased_array, field_id); auto element_response = station->GetElementResponse(); // TODO: rotate coordinate system for antenna auto element = Element::Ptr( diff --git a/cpp/telescope/oskar.cc b/cpp/telescope/oskar.cc index f280ec03..d498aa2a 100644 --- a/cpp/telescope/oskar.cc +++ b/cpp/telescope/oskar.cc @@ -11,10 +11,11 @@ using namespace everybeam; using namespace everybeam::telescope; using namespace casacore; -OSKAR::OSKAR(MeasurementSet &ms, const ElementResponseModel model, +OSKAR::OSKAR(MeasurementSet &ms, const Options &options) - : Telescope(ms, model, options) { - ReadAllStations(ms, model); + : Telescope(ms, options) { + stations_.resize(nstations_); + ReadAllStations(ms, options_.element_response_model); } std::unique_ptr<griddedresponse::GriddedResponse> OSKAR::GetGriddedResponse( diff --git a/cpp/telescope/oskar.h b/cpp/telescope/oskar.h index 62b49fb2..9b85e71e 100644 --- a/cpp/telescope/oskar.h +++ b/cpp/telescope/oskar.h @@ -25,6 +25,8 @@ #ifndef EVERYBEAM_TELESCOPE_OSKAR_H_ #define EVERYBEAM_TELESCOPE_OSKAR_H_ +#include "../station.h" +#include "../elementresponse.h" #include "telescope.h" #include <casacore/measures/Measures/MPosition.h> @@ -46,16 +48,41 @@ class OSKAR final : public Telescope { * @param model Element Response model * @param options telescope options */ - OSKAR(casacore::MeasurementSet &ms, const ElementResponseModel model, + OSKAR(casacore::MeasurementSet &ms, const Options &options); std::unique_ptr<griddedresponse::GriddedResponse> GetGriddedResponse( const coords::CoordinateSystem &coordinate_system) override; + /** + * @brief Get station by index + * + * @param station_id Station index to retrieve + * @return Station::Ptr + */ + Station::Ptr GetStation(std::size_t station_idx) const { + // Assert only in DEBUG mode + assert(station_idx < nstations_); + return stations_[station_idx]; + } + + private: + void ReadAllStations(const casacore::MeasurementSet &ms, + const ElementResponseModel model) { + casacore::ROMSAntennaColumns antenna(ms.antenna()); + + for (std::size_t i = 0; i < antenna.nrow(); ++i) { + stations_[i] = ReadStation(ms, i, model); + } + }; + Station::Ptr ReadStation(const casacore::MeasurementSet &ms, const std::size_t id, - const ElementResponseModel model) const override; + const ElementResponseModel model) const; + + std::vector<Station::Ptr> stations_; + }; } // namespace telescope } // namespace everybeam diff --git a/demo/comparison-oskar/stationresponse.cpp b/demo/comparison-oskar/stationresponse.cpp index a38322fd..5542e779 100644 --- a/demo/comparison-oskar/stationresponse.cpp +++ b/demo/comparison-oskar/stationresponse.cpp @@ -16,14 +16,23 @@ int main(int argc, char** argv){ ElementResponseModel response_model = ElementResponseModel::kOSKARSphericalWave; Options options; + options.element_response_model = response_model; casacore::MeasurementSet ms("/home/vdtol/skalowmini/skalowmini-coef1.MS"); + casacore::ScalarMeasColumn<casacore::MDirection> referenceDirColumn( + ms.field(), + casacore::MSField::columnName(casacore::MSFieldEnums::REFERENCE_DIR)); + + auto preapplied_beam_dir = referenceDirColumn(0); + + std::cout << preapplied_beam_dir << std::endl; + // Load OSKAR Telescope - std::unique_ptr<telescope::Telescope> telescope = - Load(ms, response_model, options); + auto telescope = Load(ms, options); + auto &oskar_telescope = *dynamic_cast<telescope::OSKAR*>(telescope.get()); - Station::Ptr station = telescope->GetStation(0); + Station::Ptr station = oskar_telescope.GetStation(0); Antenna::Ptr antenna = station->GetAntenna(); @@ -77,7 +86,6 @@ int main(int argc, char** argv){ result_arr[i][j][1][0] = result[1][0]; result_arr[i][j][1][1] = result[1][1]; -// element_response.Response(0, freq, theta, phi, result_arr[i][j]); } } diff --git a/scripts/misc/add_beaminfo.py b/scripts/misc/add_beaminfo.py index 633144d3..7ecd7cd1 100755 --- a/scripts/misc/add_beaminfo.py +++ b/scripts/misc/add_beaminfo.py @@ -72,7 +72,7 @@ def add_phased_array_table(oskar_ms_name: str): shape=[3, 3], comment="Local coordinate system", valuetype='double') phasedarraytable.addcols(coordinate_system_coldesc) - pt.taql("UPDATE $phasedarraytable SET COORDINATE_SYSTEM=0."); + pt.taql("UPDATE $phasedarraytable SET COORDINATE_AXES=0."); element_offset_coldesc = pt.makearrcoldesc("ELEMENT_OFFSET", 0., ndim=2, comment="Offset per element", @@ -113,7 +113,7 @@ def fill_phased_array(oskar_ms_name: str, oskar_telescope_dir: str): phasedarraytable = pt.table(f"{oskar_ms_name}::PHASED_ARRAY", readonly=False, ack=False) for stationnr in range(len(phasedarraytable)): - phasedarraytable.putcell("COORDINATE_SYSTEM", stationnr, local_to_itrf_projection_matrix.T) + phasedarraytable.putcell("COORDINATE_AXES", stationnr, local_to_itrf_projection_matrix.T) phasedarraytable.putcell("ELEMENT_OFFSET", stationnr, element_locations_itrf) phasedarraytable.putcell("ELEMENT_FLAG", stationnr, all_unflagged) -- GitLab