Skip to content
Snippets Groups Projects
Commit b720ef77 authored by Joris van Zwieten's avatar Joris van Zwieten
Browse files

Task #4855: Fixed bug in TileAntenna::rawArrayFactor. Updated...

Task #4855: Fixed bug in TileAntenna::rawArrayFactor. Updated LofarMetaDataUtil to read LOFAR_PHASE_REFERENCE position from the ANTENNA table if this column is available.
parent 1613f56a
No related branches found
No related tags found
No related merge requests found
...@@ -51,11 +51,13 @@ public: ...@@ -51,11 +51,13 @@ public:
const string &name() const; const string &name() const;
const vector3r_t &position() const; const vector3r_t &position() const;
void setPhaseReference(const vector3r_t &reference);
const vector3r_t &phaseReference() const;
void addAntennaField(const AntennaField::Ptr &field); void addAntennaField(const AntennaField::Ptr &field);
FieldList::const_iterator beginFields() const; FieldList::const_iterator beginFields() const;
FieldList::const_iterator endFields() const; FieldList::const_iterator endFields() const;
/** /**
* \brief Compute the response of the station for a plane wave of frequency * \brief Compute the response of the station for a plane wave of frequency
* \p freq, arriving from direction \p direction, with the %station beam * \p freq, arriving from direction \p direction, with the %station beam
...@@ -151,6 +153,7 @@ private: ...@@ -151,6 +153,7 @@ private:
private: private:
string itsName; string itsName;
vector3r_t itsPosition; vector3r_t itsPosition;
vector3r_t itsPhaseReference;
FieldList itsFields; FieldList itsFields;
}; };
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <measures/Measures/MCPosition.h> #include <measures/Measures/MCPosition.h>
#include <measures/Measures/MeasTable.h> #include <measures/Measures/MeasTable.h>
#include <measures/Measures/MeasConvert.h> #include <measures/Measures/MeasConvert.h>
#include <measures/TableMeasures/ScalarMeasColumn.h>
#include <ms/MeasurementSets/MSAntenna.h> #include <ms/MeasurementSets/MSAntenna.h>
#include <ms/MeasurementSets/MSAntennaParse.h> #include <ms/MeasurementSets/MSAntennaParse.h>
...@@ -58,10 +59,10 @@ namespace StationResponse ...@@ -58,10 +59,10 @@ namespace StationResponse
using namespace casa; using namespace casa;
//bool hasColumn(const Table &table, const string &column) bool hasColumn(const Table &table, const string &column)
//{ {
// return table.tableDesc().isColumn(column); return table.tableDesc().isColumn(column);
//} }
bool hasSubTable(const Table &table, const string &name) bool hasSubTable(const Table &table, const string &name)
{ {
...@@ -188,33 +189,47 @@ AntennaField::Ptr readAntennaField(const Table &table, unsigned int id) ...@@ -188,33 +189,47 @@ AntennaField::Ptr readAntennaField(const Table &table, unsigned int id)
return field; 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) Station::Ptr readStation(const MeasurementSet &ms, unsigned int id)
{ {
ROMSAntennaColumns antenna(ms.antenna()); 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 mPosition = MPosition::Convert(antenna.positionMeas()(id),
MPosition::ITRF)(); MPosition::ITRF)();
MVPosition mvPosition = mPosition.getValue(); 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. // 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"); Table tab_field = getSubTable(ms, "LOFAR_ANTENNA_FIELD");
tab_field = tab_field(tab_field.col("ANTENNA_ID") == static_cast<Int>(id)); tab_field = tab_field(tab_field.col("ANTENNA_ID") == static_cast<Int>(id));
const size_t nFields = tab_field.nrow(); for(size_t i = 0; i < tab_field.nrow(); ++i)
// 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)
{ {
station->addAntennaField(readAntennaField(tab_field, i)); station->addAntennaField(readAntennaField(tab_field, i));
} }
......
...@@ -45,6 +45,16 @@ const vector3r_t &Station::position() const ...@@ -45,6 +45,16 @@ const vector3r_t &Station::position() const
return itsPosition; 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) void Station::addAntennaField(const AntennaField::Ptr &field)
{ {
itsFields.push_back(field); itsFields.push_back(field);
......
...@@ -51,7 +51,7 @@ raw_array_factor_t TileAntenna::rawArrayFactor(real_t freq, ...@@ -51,7 +51,7 @@ raw_array_factor_t TileAntenna::rawArrayFactor(real_t freq,
complex_t af(0.0, 0.0); complex_t af(0.0, 0.0);
for(TileConfig::const_iterator element_it = itsConfig.begin(), 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 // Compute the effective delay for a plane wave approaching from the
// direction of interest with respect to the position of element i // direction of interest with respect to the position of element i
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment