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