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:
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;
};
......
......@@ -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));
}
......
......@@ -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);
......
......@@ -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
......
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