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