Skip to content

Beamforming

All tied-array beamforming is done via a call to tied_array, which forms dual-polarization beams towards a provided ra and dec. Because beamforming is such an expensive operation, the function tied_array is embarassingly parallel over frequency: for each frequency channel it calculates: baseband data start time -> ch_util for ephemeris + steering phases -> _accel for apply_phase_sum. Then it writes out data to data['tiedbeam_baseband']. Deleting data['baseband'] and calling concatenate() can then append the data over the frequency axis.

Infrastructure and helper functions

There are several ways to call the beamformer. The most basic use case is in outrigger_beamform.py: designed for use at each beamforming outrigger site. For more complicated beam patterns than the "singlebeam" pipeline, it is worth using the function get_beam_locations, which supports options like grids and NVSS calibrators. Eventually we will add bright LOFAR LBCS sources to get_beam_locations for simultaneous outrigger calibration.

Verifying the beamformer

The test suite for the beamformer is tricky because of the large data volumes and computational cost of testing it. We have provided a script called form_singlebeam.py that reads baseband data from a hard-coded location, beamforms it, and writes it out to another hard-coded location. The unit tests for the beamformer reads in the beamformed data and verifies that a (bright) B0329+54 pulse is seen and verifies that a (bright) Crab pulse can get dedispersed correctly in the sense that it gets lined up as a function of frequency to frame-level precision.

Beamforming

````# Ensure that the required data is mounted ls /path/to/golden/data

Text Only
# Run the helper script
python ./baseband_analysis/form_singlebeam.py
```

````