From d26377e5cbb24c4afc6f8822fcbbd77422cbc0c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Offringa?= <offringa@gmail.com> Date: Wed, 8 Jul 2020 14:52:12 +0200 Subject: [PATCH] Manual merge of Bas' and Bram's changes for HBA fix --- cpp/Antenna.h | 6 ++++++ cpp/BeamFormer.h | 6 ++++++ cpp/LofarMetaDataUtil.cc | 39 ++++++++++++++++++++++++--------------- cpp/common/Types.h | 2 ++ 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/cpp/Antenna.h b/cpp/Antenna.h index 87b603e1..5022b672 100644 --- a/cpp/Antenna.h +++ b/cpp/Antenna.h @@ -109,6 +109,12 @@ class Antenna { m_phase_reference_position(phase_reference_position), m_enabled{true, true} {} + Antenna(const vector3r_t &phase_reference_position) + : m_coordinate_system({phase_reference_position, // origin + CoordinateSystem::identity_axes}), + m_phase_reference_position(phase_reference_position), + m_enabled{true, true} {} + /** * @brief Compute the %Antenna response * diff --git a/cpp/BeamFormer.h b/cpp/BeamFormer.h index f57c8bd1..afe7f1e3 100644 --- a/cpp/BeamFormer.h +++ b/cpp/BeamFormer.h @@ -46,6 +46,12 @@ class BeamFormer : public Antenna { transform_to_local_position(m_phase_reference_position); } + BeamFormer(vector3r_t phase_reference_position) + : Antenna(phase_reference_position) { + m_local_phase_reference_position = + transform_to_local_position(m_phase_reference_position); + } + /** * @brief Add an antenna to the m_antenna array. * diff --git a/cpp/LofarMetaDataUtil.cc b/cpp/LofarMetaDataUtil.cc index 4cb3ff8a..4dfe7f0c 100644 --- a/cpp/LofarMetaDataUtil.cc +++ b/cpp/LofarMetaDataUtil.cc @@ -180,9 +180,25 @@ Antenna::CoordinateSystem readCoordinateSystem(const Table &table, return coordinate_system; } -BeamFormer::Ptr make_tile(std::string name, - Antenna::CoordinateSystem coordinate_system, - TileConfig tile_config, ElementResponse::Ptr) {} +BeamFormer::Ptr make_tile(unsigned int id, const vector3r_t &position, + const TileConfig &tile_config, + ElementResponse::Ptr element_response) { + BeamFormer::Ptr tile = BeamFormer::Ptr(new BeamFormer(position)); + + for (unsigned int id = 0; id < tile_config.size(); id++) { + vector3r_t antenna_position = tile_config[id]; + + Antenna::CoordinateSystem antenna_coordinate_system; + antenna_coordinate_system.origin = antenna_position; + antenna_coordinate_system.axes = lofar_antenna_orientation; + + Antenna::Ptr antenna = Element::Ptr( + new Element(antenna_coordinate_system, element_response, id)); + tile->add_antenna(antenna); + } + + return tile; +} BeamFormer::Ptr readAntennaField(const Table &table, unsigned int id, ElementResponse::Ptr element_response) { @@ -210,9 +226,9 @@ BeamFormer::Ptr readAntennaField(const Table &table, unsigned int id, Matrix<Bool> aips_flag = c_flag(id); assert(aips_flag.shape().isEqual(IPosition(2, 2, aips_offset.ncolumn()))); - // TileConfig tile_config; - // if(name != "LBA") readTileConfig(table, id); - // transformToFieldCoordinates(tile_config, coordinate_system.axes); + TileConfig tile_config; + if (name != "LBA") readTileConfig(table, id); + transformToFieldCoordinates(tile_config, coordinate_system.axes); for (size_t i = 0; i < aips_offset.ncolumn(); ++i) { vector3r_t antenna_position = {aips_offset(0, i).getValue(), @@ -220,9 +236,6 @@ BeamFormer::Ptr readAntennaField(const Table &table, unsigned int id, aips_offset(2, i).getValue()}; antenna_position = transformToFieldCoordinates(antenna_position, coordinate_system.axes); - // std::cout << "antenna_position: " << antenna_position[0] << ", " - // << antenna_position[1] << ", " << antenna_position[2] << - // std::endl; Antenna::Ptr antenna; Antenna::CoordinateSystem antenna_coordinate_system{ antenna_position, lofar_antenna_orientation}; @@ -230,12 +243,8 @@ BeamFormer::Ptr readAntennaField(const Table &table, unsigned int id, antenna = Element::Ptr( new Element(antenna_coordinate_system, element_response, id)); } else { - antenna = Element::Ptr( - new Element(antenna_coordinate_system, element_response, id)); - // TODO - // HBA, HBA0, HBA1 - // antenna = make_tile(name, coordinate_system, tile_config, - // element_response); + // name is HBA, HBA0, HBA1 + antenna = make_tile(id, antenna_position, tile_config, element_response); } antenna->m_enabled[0] = !aips_flag(0, i); diff --git a/cpp/common/Types.h b/cpp/common/Types.h index 0385ca1e..f4298c1d 100644 --- a/cpp/common/Types.h +++ b/cpp/common/Types.h @@ -92,6 +92,8 @@ struct raw_array_factor_t { diag22r_t weight; }; +typedef std::array<vector3r_t, 16> TileConfig; + template <typename T, size_t N> std::ostream &operator<<(std::ostream &out, const std::array<T, N> &obj) { print(out, obj.begin(), obj.end()); -- GitLab