Source code for NuRadioReco.modules.LOFAR.beamforming_utilities

import numpy as np
import radiotools.helper as hp

from scipy.optimize import fmin_powell
from scipy import constants

from NuRadioReco.utilities import units


lightspeed = constants.c * units.m / units.s


[docs]def mini_beamformer(fft_data, frequencies, positions, direction): """ Adapted from PyCrTools hBeamformBlock Beamform the spectra given the arrival direction. Based on the arrival direction, the geometric delays are calculated. """ n_antennas = len(positions) output = np.zeros([len(frequencies)], dtype=complex) norm = np.sqrt(direction[0] * direction[0] + direction[1] * direction[1] + direction[2] * direction[2]) for a in np.arange(n_antennas): delay = GeometricDelayFarField(positions[a], direction, norm) real = 1.0 * np.cos(2 * np.pi * frequencies * delay) imag = 1.0 * np.sin(2 * np.pi * frequencies * delay) de = real + 1j * imag output = output + fft_data[a] * de return output
[docs]def beamformer(fft_data, frequencies, delay): """ Beamform the spectra according to the given delays. """ n_antennas = len(delay) output = np.zeros([len(frequencies)], dtype=complex) for a in np.arange(n_antennas): real = 1.0 * np.cos(2 * np.pi * frequencies * delay[a]) imag = 1.0 * np.sin(2 * np.pi * frequencies * delay[a]) de = real + 1j * imag output = output + fft_data[a] * de return output
[docs]def geometric_delays(ant_pos, sky): """ Calculate the geometric delays of given antenna position, given an arrival direction in the sky. """ distance = np.sqrt(sky[0] ** 2 + sky[1] ** 2 + sky[2] ** 2) delays = (np.sqrt( (sky[0] - ant_pos[0]) ** 2 + (sky[1] - ant_pos[1]) ** 2 + (sky[2] - ant_pos[2]) ** 2) - distance) / lightspeed return delays
[docs]def GeometricDelayFarField(position, direction, length): delay = np.sum(np.asarray(direction) * np.asarray(position)) / length / lightspeed return delay