Beamformers and elements

EveryBeam is designed such that it can handle an arbitrary number of nested beamformers within each station. The smallest entity in the EveryBeam nomenclature is the Element. Beamformers as well as the element inherit from the Antenna base class.

For efficiency reasons, certain telescopes (in conjunction with their response models) have dedicated implementations for the beamformer. This includes for example the BeamFormerIdenticalAntennas, BeamFormerLofarLBA, BeamFormerLofarHBA classes.

class Antenna

Abstract class describing an antenna, and computing the corresponding Response() and ArrayFactor(). Element and BeamFormer classes - and childs thereof - inherit from this class.

Subclassed by BeamFormer, BeamFormerLofar, Element

Public Functions

inline Antenna()

Construct a new Antenna object.

inline Antenna(const CoordinateSystem &coordinate_system)

Construct a new Antenna object, given a coordinate system.

Parameters:

coordinate_system

inline virtual ~Antenna()
Antenna(const CoordinateSystem &coordinate_system, const vector3r_t &phase_reference_position)

Construct a new Antenna object, given a coordinate system and a phase reference position.

Parameters:
  • coordinate_system – Coordinate system

  • phase_reference_position – Phase reference position (ITRF, m)

Antenna(const vector3r_t &phase_reference_position)

Construct a new Antenna object.

Parameters:

phase_reference_position – Phase reference position (ITRF, m)

virtual std::shared_ptr<Antenna> Clone() const = 0

Makes a copy of this Antenna object.

The method is virtual, so that copies can be created from a pointer to the base (Antenna) class. The original remains unchanged, therefore the method is const. The method has no implementation in the Antenna class, because Antenna is abstract, so no copy can be instantiated.

This method is used by the ExtractAntenna method of the BeamFormer class to create a copy of one of the Antennas it contains.

void Transform(const CoordinateSystem &coordinate_system)

Transform internal coordinate systems and positions.

This method is used by BeamFormer::ExtractAntenna to lift an antenna out of the beamformer.

The transformation is needed because the coordinate system of an antenna in a beamformer is expressed in terms of the coordinate system of the beamformer. To turn an embedded antenna into a stand-alone antenna, the coordinate system of the beamformer needs to be applied to the coordinate system of the antenna

Parameters:

coordinate_system – to apply in the transformation

inline virtual void Response(aocommon::MC2x2 *result, const ElementResponse &element_response, double time, const std::span<const double> &freqs, const vector3r_t &direction, const Options &options = {}) const

Compute the Antenna Response.

Parameters:
  • time – Time, modified Julian date, UTC, in seconds (MJD(UTC), s).

  • freq – Frequency of the plane wave (Hz).

  • direction – Direction of arrival (ITRF, m).

  • options

inline virtual void ArrayFactor(aocommon::MC2x2Diag *result, double time, const std::span<const double> &freqs, const vector3r_t &direction, const Options &options) const

Compute the array factor of the antenna.

Parameters:
  • time – Time, modified Julian date, UTC, in seconds (MJD(UTC), s).

  • freq – Frequency of the plane wave (Hz).

  • direction – Direction of arrival (ITRF, m).

  • options

Public Members

CoordinateSystem coordinate_system_
vector3r_t phase_reference_position_
bool enabled_[2]

Public Static Attributes

static constexpr CoordinateSystem IdentityCoordinateSystem = {CoordinateSystem::zero_origin, CoordinateSystem::identity_axes}
struct CoordinateSystem

Station coordinate system.

A right handed, cartesian, local coordinate system with coordinate axes p, q, and r is associated with each antenna field.

The r-axis is orthogonal to the antenna field, and points towards the local pseudo zenith.

The q-axis is the northern bisector of the X and Y dipoles, i.e. it is the reference direction from which the orientation of the dual dipole antennae is determined. The q-axis points towards the North at the core. At remote sites it is defined as the intersection of the antenna field plane and a plane parallel to the meridian plane at the core. This ensures the reference directions at all sites are similar.

The p-axis is orthogonal to both other axes, and points towards the East at the core.

The axes and origin of the anntena field coordinate system are expressed as vectors in the geocentric, cartesian, ITRF coordinate system, in meters.

See also

“LOFAR Reference Plane and Reference Direction”, M.A. Brentjens, LOFAR-ASTRON-MEM-248.

Public Members

vector3r_t origin
Axes axes

Public Static Attributes

static constexpr Axes identity_axes = Axes{{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}}
static constexpr vector3r_t zero_origin = vector3r_t{0.0, 0.0, 0.0}
struct Axes

Public Members

vector3r_t p
vector3r_t q
vector3r_t r
struct Options

Struct containing antenna options.

Public Members

double freq0

Antenna reference frequency (Hz).

vector3r_t station0

Reference direction (ITRF, m)

vector3r_t tile0

Tile beam former reference direction (ITRF, m).

bool rotate

If paralactic rotation should be applied.

vector3r_t east

Eastward pointing unit vector.

vector3r_t north

Northward pointing unit vector.

class BeamFormer : public Antenna

A BeamFormer contains a number of antennas - be it lower level beamformers or elements - and can return its combined response or array factor.

Subclassed by BeamFormerIdenticalAntennas

Public Types

typedef std::shared_ptr<BeamFormer> Ptr

Public Functions

inline BeamFormer()

Construct a new BeamFormer object.

inline BeamFormer(const CoordinateSystem &coordinate_system, bool fixate_direction = false)

Construct a new BeamFormer object.

Parameters:
  • coordinate_system – The coordinate system for the BeamFormer.

  • fixate_direction – If true, create a fixed direction ElementResponse object using ElementResponse::FixateDirection().

inline BeamFormer(CoordinateSystem coordinate_system, const vector3r_t &phase_reference_position)

Construct a new BeamFormer object given a coordinate system and a phase reference position.

inline BeamFormer(const vector3r_t &phase_reference_position)
virtual std::shared_ptr<Antenna> Clone() const override

Makes a copy of this Antenna object.

The method is virtual, so that copies can be created from a pointer to the base (Antenna) class. The original remains unchanged, therefore the method is const. The method has no implementation in the Antenna class, because Antenna is abstract, so no copy can be instantiated.

This method is used by the ExtractAntenna method of the BeamFormer class to create a copy of one of the Antennas it contains.

inline void AddAntenna(std::shared_ptr<Antenna> antenna)

Add an antenna to the antennas_ array.

Parameters:

antenna

std::shared_ptr<Antenna> ExtractAntenna(size_t antenna_index) const

Extracts an antenna from the beamformer.

The antenna is extracted such that it can be used stand-alone, independent of the beamformer. The coordinate system of the extracted antenna is transformed from internal representation to external representation by application of the beamformer coordinate system to the antenna coordinate system.

The returned antenna can be either an Element or a BeamFormer.

The beamformer itself remains unchanged.

Parameters:

antenna_index – index of antenna to extact

Returns:

pointer to a copy of antenna with index antenna_index

Public Static Functions

static aocommon::UVector<std::complex<double>> ComputeGeometricResponse(const std::span<const vector3r_t> &phase_reference_positions, const std::span<const vector3r_t> &direction)

Compute the geometric response given the the phase reference directions in the beam former and a direction of interest. In typical use cases, the direction of interest is computed as the (frequency weighted) difference between the pointing direction and the direction of interest, i.e. direction = pointing_freq * pointing_dir - interest_freq *.

Parameters:
  • phase_reference_positions – Phase reference positions.

  • direction – The direction of interest.

Returns:

The geometry response for each position.

class BeamFormerIdenticalAntennas : public BeamFormer

Sub-class of BeamFormer assuming that all the antennas have an identical LocalResponse.

Public Functions

inline BeamFormerIdenticalAntennas()

Construct a new BeamFormerIdenticalAntennas object.

inline BeamFormerIdenticalAntennas(const CoordinateSystem &coordinate_system)

Construct a new BeamFormerIdenticalAntennas object given a coordinate system.

Parameters:

coordinate_system

inline BeamFormerIdenticalAntennas(CoordinateSystem coordinate_system, const vector3r_t &phase_reference_position)

Construct a new BeamFormer object given a coordinate system and a phase reference position.

Parameters:
  • coordinate_system

  • phase_reference_position

inline BeamFormerIdenticalAntennas(const vector3r_t &phase_reference_position)
virtual std::shared_ptr<Antenna> Clone() const override

Makes a copy of this Antenna object.

The method is virtual, so that copies can be created from a pointer to the base (Antenna) class. The original remains unchanged, therefore the method is const. The method has no implementation in the Antenna class, because Antenna is abstract, so no copy can be instantiated.

This method is used by the ExtractAntenna method of the BeamFormer class to create a copy of one of the Antennas it contains.

class BeamFormerLofarLBA : public BeamFormerLofar

Optimized implementation of the BeamFormer class for the LOFAR LBA telescope in combination with Hamaker element response model.

Public Functions

inline BeamFormerLofarLBA()

Construct a new BeamFormerLofarLBA object.

inline BeamFormerLofarLBA(const CoordinateSystem &coordinate_system)

Construct a new BeamFormerLofarLBA object given a coordinate system.

Parameters:

coordinate_system

inline BeamFormerLofarLBA(CoordinateSystem coordinate_system, vector3r_t phase_reference_position)

Construct a new BeamFormerLofarLBA object given a coordinate system and a phase reference position.

Parameters:
  • coordinate_system

  • phase_reference_position

inline BeamFormerLofarLBA(vector3r_t phase_reference_position)
virtual std::shared_ptr<Antenna> Clone() const final override

Returns an (incomplete!) clone of the BeamFormerLofarLBA class only the element_ is copied. This method is intended to be exclusively used in Station::SetAntenna!

Returns:

std::shared_ptr<Antenna>

inline void AddElementEnabled(const std::array<bool, 2> enabled)

Mark whether the element is enabled by pushing back boolean array to element_enabled_ array.

Parameters:

enabled

class BeamFormerLofarHBA : public BeamFormerLofar

Optimized implementation of the BeamFormer class for the LOFAR HBA telescope in combination with Hamaker element response model.

Public Functions

inline BeamFormerLofarHBA()

Construct a new BeamFormerHBA object.

inline BeamFormerLofarHBA(const CoordinateSystem &coordinate_system)

Construct a new BeamFormerLofarHBA object given a coordinate system.

Parameters:

coordinate_system

inline BeamFormerLofarHBA(CoordinateSystem coordinate_system, vector3r_t phase_reference_position)

Construct a new BeamFormerLofarHBA object given a coordinate system and a phase reference position.

Parameters:
  • coordinate_system

  • phase_reference_position

inline BeamFormerLofarHBA(vector3r_t phase_reference_position)
virtual std::shared_ptr<Antenna> Clone() const final override

Returns an (incomplete!) clone of the BeamFormerLofarHBA class only the element_ is copied. This method is intended to be exclusively used in Station::SetAntenna!

Returns:

std::shared_ptr<Antenna>

inline void SetTile(BeamFormer::Ptr beamformer)

Set the (unique) Tile for the BeamFormerLofarHBA object.

Parameters:

beamformer

inline void AddTilePosition(const vector3r_t &position)

Add tile position to the tile_positions_ array.

Parameters:

position

inline void AddTileEnabled(const std::array<bool, 2> enabled)

Mark whether tile is enabled by pushing back boolean array to tile_enabled_ array.

Parameters:

enabled