From b720ef771dd19951bb7291ea2d7d49a2d5a1b426 Mon Sep 17 00:00:00 2001
From: Joris van Zwieten <zwieten@astron.nl>
Date: Wed, 11 Sep 2013 15:00:51 +0000
Subject: [PATCH] Task #4855: Fixed bug in TileAntenna::rawArrayFactor. Updated
 LofarMetaDataUtil to read LOFAR_PHASE_REFERENCE position from the ANTENNA
 table if this column is available.

---
 include/StationResponse/Station.h |  5 ++-
 src/LofarMetaDataUtil.cc          | 51 ++++++++++++++++++++-----------
 src/Station.cc                    | 10 ++++++
 src/TileAntenna.cc                |  2 +-
 4 files changed, 48 insertions(+), 20 deletions(-)

diff --git a/include/StationResponse/Station.h b/include/StationResponse/Station.h
index 6dc5ecd7..c3e6759c 100644
--- a/include/StationResponse/Station.h
+++ b/include/StationResponse/Station.h
@@ -51,11 +51,13 @@ public:
     const string &name() const;
     const vector3r_t &position() const;
 
+    void setPhaseReference(const vector3r_t &reference);
+    const vector3r_t &phaseReference() const;
+
     void addAntennaField(const AntennaField::Ptr &field);
     FieldList::const_iterator beginFields() const;
     FieldList::const_iterator endFields() const;
 
-
     /**
      *  \brief Compute the response of the station for a plane wave of frequency
      *  \p freq, arriving from direction \p direction, with the %station beam
@@ -151,6 +153,7 @@ private:
 private:
     string      itsName;
     vector3r_t  itsPosition;
+    vector3r_t  itsPhaseReference;
     FieldList   itsFields;
 };
 
diff --git a/src/LofarMetaDataUtil.cc b/src/LofarMetaDataUtil.cc
index 2b05e902..367cee4d 100644
--- a/src/LofarMetaDataUtil.cc
+++ b/src/LofarMetaDataUtil.cc
@@ -35,6 +35,7 @@
 #include <measures/Measures/MCPosition.h>
 #include <measures/Measures/MeasTable.h>
 #include <measures/Measures/MeasConvert.h>
+#include <measures/TableMeasures/ScalarMeasColumn.h>
 
 #include <ms/MeasurementSets/MSAntenna.h>
 #include <ms/MeasurementSets/MSAntennaParse.h>
@@ -58,10 +59,10 @@ namespace StationResponse
 
 using namespace casa;
 
-//bool hasColumn(const Table &table, const string &column)
-//{
-//    return table.tableDesc().isColumn(column);
-//}
+bool hasColumn(const Table &table, const string &column)
+{
+    return table.tableDesc().isColumn(column);
+}
 
 bool hasSubTable(const Table &table, const string &name)
 {
@@ -188,33 +189,47 @@ AntennaField::Ptr readAntennaField(const Table &table, unsigned int id)
     return field;
 }
 
+void readStationPhaseReference(const Table &table, unsigned int id,
+    const Station::Ptr &station)
+{
+    const string columnName("LOFAR_PHASE_REFERENCE");
+    if(hasColumn(table, columnName))
+    {
+        ROScalarMeasColumn<MPosition> c_reference(table, columnName);
+        MPosition mReference = MPosition::Convert(c_reference(id),
+            MPosition::ITRF)();
+        MVPosition mvReference = mReference.getValue();
+        vector3r_t reference = {{mvReference(0), mvReference(1),
+            mvReference(2)}};
+
+        station->setPhaseReference(reference);
+    }
+}
+
 Station::Ptr readStation(const MeasurementSet &ms, unsigned int id)
 {
     ROMSAntennaColumns antenna(ms.antenna());
 
-    // Get ITRF position.
+    // Get station name.
+    const string name(antenna.name()(id));
+
+    // Get station position (ITRF).
     MPosition mPosition = MPosition::Convert(antenna.positionMeas()(id),
         MPosition::ITRF)();
     MVPosition mvPosition = mPosition.getValue();
-    vector3r_t position = {{mvPosition(0), mvPosition(1), mvPosition(2)}};
+    const vector3r_t position = {{mvPosition(0), mvPosition(1), mvPosition(2)}};
 
     // Create station.
-    Station::Ptr station(new Station(antenna.name()(id), position));
+    Station::Ptr station(new Station(name, position));
+
+    // Read phase reference position (if available).
+    readStationPhaseReference(ms.antenna(), id, station);
 
-    // Read antenna field information for each field of this station.
+    // Read antenna field information.
     Table tab_field = getSubTable(ms, "LOFAR_ANTENNA_FIELD");
     tab_field = tab_field(tab_field.col("ANTENNA_ID") == static_cast<Int>(id));
 
-    const size_t nFields = tab_field.nrow();
-
-//    if(nFields == 0)
-//    {
-////        LOG_WARN_STR("Antenna " << name << " has no associated antenna fields."
-////          " Beamforming simulation will be switched off for this antenna.");
-//        return Station::Ptr(new Station(name, position));
-//    }
-
-    for(size_t i = 0; i < nFields; ++i)
+    for(size_t i = 0; i < tab_field.nrow(); ++i)
     {
         station->addAntennaField(readAntennaField(tab_field, i));
     }
diff --git a/src/Station.cc b/src/Station.cc
index c2767abb..2b1a9157 100644
--- a/src/Station.cc
+++ b/src/Station.cc
@@ -45,6 +45,16 @@ const vector3r_t &Station::position() const
     return itsPosition;
 }
 
+void Station::setPhaseReference(const vector3r_t &reference)
+{
+    itsPhaseReference = reference;
+}
+
+const vector3r_t &Station::phaseReference() const
+{
+    return itsPhaseReference;
+}
+
 void Station::addAntennaField(const AntennaField::Ptr &field)
 {
     itsFields.push_back(field);
diff --git a/src/TileAntenna.cc b/src/TileAntenna.cc
index 5af2ef8c..f375e89c 100644
--- a/src/TileAntenna.cc
+++ b/src/TileAntenna.cc
@@ -51,7 +51,7 @@ raw_array_factor_t TileAntenna::rawArrayFactor(real_t freq,
 
     complex_t af(0.0, 0.0);
     for(TileConfig::const_iterator element_it = itsConfig.begin(),
-        element_end = itsConfig.end(); element_it != element_end; ++element_end)
+        element_end = itsConfig.end(); element_it != element_end; ++element_it)
     {
         // Compute the effective delay for a plane wave approaching from the
         // direction of interest with respect to the position of element i
-- 
GitLab