Skip to content
Snippets Groups Projects
Commit df246559 authored by Bram Veenboer's avatar Bram Veenboer
Browse files

Add ElementResponseModel to choose between various element response models

The Hamaker model is currently the only supported model. Two other
models, LOBES and Oskar are added to the enum of models, but are not
implemented yet. To maintain backwards compatability, the default
behavior is to use the Hamaker model.
parent 1e2fa189
No related branches found
No related tags found
No related merge requests found
...@@ -28,6 +28,7 @@ add_library(stationresponse SHARED ...@@ -28,6 +28,7 @@ add_library(stationresponse SHARED
AntennaModelHBA.cc AntennaModelHBA.cc
AntennaModelLBA.cc AntennaModelLBA.cc
DualDipoleAntenna.cc DualDipoleAntenna.cc
ElementResponseModel.cc
HamakerElementResponse.cc HamakerElementResponse.cc
ITRFConverter.cc ITRFConverter.cc
ITRFDirection.cc ITRFDirection.cc
...@@ -52,10 +53,12 @@ install (FILES ...@@ -52,10 +53,12 @@ install (FILES
Types.h Types.h
ITRFConverter.h ITRFConverter.h
ITRFDirection.h ITRFDirection.h
ElementResponseModel.h
DESTINATION include/StationResponse) DESTINATION include/StationResponse)
install (FILES install (FILES
ElementResponse.h ElementResponse.h
ElementResponseModel.h
DESTINATION include/ElementResponse) DESTINATION include/ElementResponse)
find_package(Doxygen) find_package(Doxygen)
......
#include "ElementResponseModel.h"
std::ostream& operator<<(std::ostream& os, ElementResponseModel model)
{
switch (model)
{
case Unknown: os << "Unknown"; break;
case Hamaker: os << "Hamaker"; break;
case LOBES : os << "LOBES"; break;
case OSKAR : os << "OSKAR"; break;
default : os.setstate(std::ios_base::failbit);
}
return os;
}
#ifndef ELEMENT_RESPONSE_MODEL_H
#define ELEMENT_RESPONSE_MODEL_H
#include <ostream>
enum ElementResponseModel {
Unknown,
Hamaker,
LOBES,
OSKAR
};
std::ostream& operator<<(std::ostream& os, ElementResponseModel model);
#endif
...@@ -259,7 +259,10 @@ void readStationPhaseReference(const Table &table, unsigned int id, ...@@ -259,7 +259,10 @@ void readStationPhaseReference(const Table &table, unsigned int id,
} }
} }
Station::Ptr readStation(const MeasurementSet &ms, unsigned int id) Station::Ptr readStation(
const MeasurementSet &ms,
unsigned int id,
const ElementResponseModel model)
{ {
ROMSAntennaColumns antenna(ms.antenna()); ROMSAntennaColumns antenna(ms.antenna());
assert(antenna.nrow() > id && !antenna.flagRow()(id)); assert(antenna.nrow() > id && !antenna.flagRow()(id));
...@@ -274,7 +277,7 @@ Station::Ptr readStation(const MeasurementSet &ms, unsigned int id) ...@@ -274,7 +277,7 @@ Station::Ptr readStation(const MeasurementSet &ms, unsigned int id)
const 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(name, position)); Station::Ptr station(new Station(name, position, model));
// Read phase reference position (if available). // Read phase reference position (if available).
readStationPhaseReference(ms.antenna(), id, station); readStationPhaseReference(ms.antenna(), id, station);
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
// LOFAR observations stored in MS format. // LOFAR observations stored in MS format.
#include "Station.h" #include "Station.h"
#include "ElementResponseModel.h"
#include <casacore/ms/MeasurementSets/MeasurementSet.h> #include <casacore/ms/MeasurementSets/MeasurementSet.h>
#include <casacore/ms/MeasurementSets/MSAntennaColumns.h> #include <casacore/ms/MeasurementSets/MSAntennaColumns.h>
...@@ -42,15 +43,23 @@ namespace StationResponse ...@@ -42,15 +43,23 @@ namespace StationResponse
// \addtogroup StationResponse // \addtogroup StationResponse
// @{ // @{
Station::Ptr readStation(const casacore::MeasurementSet &ms, unsigned int id); const ElementResponseModel defaultElementResponseModel = ElementResponseModel::Hamaker;
Station::Ptr readStation(
const casacore::MeasurementSet &ms,
unsigned int id,
const ElementResponseModel model = defaultElementResponseModel);
template <typename T> template <typename T>
void readStations(const casacore::MeasurementSet &ms, T out_it) void readStations(
const casacore::MeasurementSet &ms,
T out_it,
const ElementResponseModel model = defaultElementResponseModel)
{ {
casacore::ROMSAntennaColumns antenna(ms.antenna()); casacore::ROMSAntennaColumns antenna(ms.antenna());
for(unsigned int i = 0; i < antenna.nrow(); ++i) for(unsigned int i = 0; i < antenna.nrow(); ++i)
{ {
*out_it++ = readStation(ms, i); *out_it++ = readStation(ms, i, model);
} }
} }
......
...@@ -32,16 +32,37 @@ namespace LOFAR ...@@ -32,16 +32,37 @@ namespace LOFAR
namespace StationResponse namespace StationResponse
{ {
Station::Station(const string &name, const vector3r_t &position) Station::Station(
const string &name,
const vector3r_t &position,
const ElementResponseModel model)
: itsName(name), : itsName(name),
itsPosition(position), itsPosition(position),
itsPhaseReference(position) itsPhaseReference(position)
{ {
if (DualDipoleAntenna::itsElementResponse == nullptr) { if (itsModel != ElementResponseModel::Unknown &&
DualDipoleAntenna::itsElementResponse.reset(new HamakerElementResponseLBA); itsModel != model)
{
throw std::runtime_error("Every station must have the same element response model.");
} else {
itsModel = model;
} }
if (TileAntenna::itsElementResponse == nullptr) {
TileAntenna::itsElementResponse.reset(new HamakerElementResponseHBA); switch (model)
{
case Hamaker:
if (DualDipoleAntenna::itsElementResponse == nullptr) {
DualDipoleAntenna::itsElementResponse.reset(new HamakerElementResponseLBA);
}
if (TileAntenna::itsElementResponse == nullptr) {
TileAntenna::itsElementResponse.reset(new HamakerElementResponseHBA);
}
break;
default:
std::stringstream message;
message << "The requested element response model '"
<< model << "' is not implemented.";
throw std::runtime_error(message.str());
} }
} }
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "AntennaField.h" #include "AntennaField.h"
#include "Types.h" #include "Types.h"
#include "ElementResponseModel.h"
#include <memory> #include <memory>
#include <vector> #include <vector>
...@@ -53,7 +54,10 @@ public: ...@@ -53,7 +54,10 @@ public:
* \param name Name of the station. * \param name Name of the station.
* \param position Position of the station (ITRF, m). * \param position Position of the station (ITRF, m).
*/ */
Station(const string &name, const vector3r_t &position); Station(
const string &name,
const vector3r_t &position,
const ElementResponseModel model);
/*! /*!
* \brief Return the name of the station. * \brief Return the name of the station.
...@@ -306,6 +310,7 @@ private: ...@@ -306,6 +310,7 @@ private:
vector3r_t itsPosition; vector3r_t itsPosition;
vector3r_t itsPhaseReference; vector3r_t itsPhaseReference;
FieldList itsFields; FieldList itsFields;
ElementResponseModel itsModel;
}; };
// @} // @}
......
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