Source code for array_layout_struct
import numpy as np
from ctypes import POINTER, c_double, c_int, Structure
import sys
import os
from typing import Union
import argparse
from wodenpy.use_libwoden.woden_settings import Woden_Settings_Float, Woden_Settings_Double
VELC = 299792458.0
[docs]
class Array_Layout(Structure):
"""
A ctypes structure representing the layout of an array of antennas.
Attributes:
ant_X (POINTER(c_double)): Pointer to an array of antenna X positions.
ant_Y (POINTER(c_double)): Pointer to an array of antenna Y positions.
ant_Z (POINTER(c_double)): Pointer to an array of antenna Z positions.
X_diff_metres (POINTER(c_double)): Pointer to an array of X position differences in metres.
Y_diff_metres (POINTER(c_double)): Pointer to an array of Y position differences in metres.
Z_diff_metres (POINTER(c_double)): Pointer to an array of Z position differences in metres.
ant_east (POINTER(c_double)): Pointer to an array of antenna east positions.
ant_north (POINTER(c_double)): Pointer to an array of antenna north positions.
ant_height (POINTER(c_double)): Pointer to an array of antenna height positions.
latitude (c_double): The latitude of the array.
num_baselines (c_int): The number of baselines in the array.
num_tiles (c_int): The number of tiles in the array.
lst_base (c_double): The local sidereal time of the array.
"""
_fields_ = [("ant_X", POINTER(c_double)),
("ant_Y", POINTER(c_double)),
("ant_Z", POINTER(c_double)),
("X_diff_metres", POINTER(c_double)),
("Y_diff_metres", POINTER(c_double)),
("Z_diff_metres", POINTER(c_double)),
("ant_east", POINTER(c_double)),
("ant_north", POINTER(c_double)),
("ant_height", POINTER(c_double)),
("latitude", c_double),
("num_baselines", c_int),
("num_tiles", c_int),
("lst_base", c_double)]
[docs]
def setup_array_layout(woden_settings : Union[Woden_Settings_Float, Woden_Settings_Double], args : argparse.Namespace) -> Array_Layout:
"""Given the populated Woden_Settings struct and the command line arguments, set up the `array_layout` struct, and fill it with the correct values, as well as doing the equivalent of a "malloc" for the arrays:
- array_layout.ant_X
- array_layout.ant_Y
- array_layout.ant_Z
- array_layout.X_diff_metres
- array_layout.Y_diff_metres
- array_layout.Z_diff_metres
Parameters
----------
woden_settings : Union[Woden_Settings_Float, Woden_Settings_Double]
Populated Woden_Settings struct.
args : argparse.Namespace
Input arguments from the command line that have been checked using
`wodenpy.use_libwoden.check_args.check_args`.
Returns
-------
array_layout : Array_Layout
Initialised Array_Layout struct.
"""
array_layout = Array_Layout()
array_layout.num_tiles = args.num_antennas
woden_settings.num_ants = args.num_antennas
array_layout.latitude = woden_settings.latitude
array_layout.num_baselines = int((array_layout.num_tiles*(array_layout.num_tiles-1)) / 2)
woden_settings.num_baselines = array_layout.num_baselines
num_cross = woden_settings.num_baselines * woden_settings.num_time_steps * woden_settings.num_freqs
woden_settings.num_cross = num_cross
##If user asked for auto-correlations, set this number to total autos to work out
##Otherwise stick it to zero
if woden_settings.do_autos:
num_autos = woden_settings.num_ants * woden_settings.num_time_steps * woden_settings.num_freqs
else:
num_autos = 0
woden_settings.num_autos = num_autos
woden_settings.num_visis = num_cross + num_autos
# num_ants_array = args.num_antennas*c_double
# array_layout.ant_east = num_ants_array()
# array_layout.ant_north = num_ants_array()
# array_layout.ant_heigh = num_ants_array()
# ##TODO copy across the contents of args.east, args.north, args.height
num_timesants_array = (woden_settings.num_time_steps*args.num_antennas)*c_double
array_layout.ant_X = num_timesants_array()
array_layout.ant_Y = num_timesants_array()
array_layout.ant_Z = num_timesants_array()
diffs_array = (woden_settings.num_time_steps*array_layout.num_baselines)*c_double
array_layout.X_diff_metres = diffs_array()
array_layout.Y_diff_metres = diffs_array()
array_layout.Z_diff_metres = diffs_array()
return array_layout