Skip to content
Snippets Groups Projects
Commit 34646e74 authored by Jan David Mol's avatar Jan David Mol
Browse files

Merge branch 'L2SS-626-derive-hba-deltas' into 'master'

L2SS-626: Calculate iHBADeltas from the values we actually measure and set

Closes L2SS-626

See merge request !246
parents 7fa05349 30689fb8
No related branches found
No related tags found
1 merge request!246L2SS-626: Calculate iHBADeltas from the values we actually measure and set
...@@ -64,6 +64,207 @@ ...@@ -64,6 +64,207 @@
], ],
"OPC_Time_Out": [ "OPC_Time_Out": [
"5.0" "5.0"
],
"HBAT_reference_ETRS": [
"3839371.416", "430339.901", "5057958.886",
"3839368.919", "430335.979", "5057961.1",
"3839365.645", "430339.299", "5057963.288",
"3839368.142", "430343.221", "5057961.074",
"3839374.094", "430299.513", "5057960.017",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0"
],
"HBAT_PQR_rotation_angle_deg": [
"45.73",
"45.73",
"45.73",
"45.73",
"54.40",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0"
],
"HBAT_PQR_to_ETRS_rotation_matrix": [
"-0.11660087", "-0.79095632", "0.60065992",
" 0.99317077", "-0.09529842", "0.06730545",
" 0.00400627", " 0.60440575", "0.79666658"
] ]
} }
} }
......
...@@ -103,23 +103,108 @@ ...@@ -103,23 +103,108 @@
"3826577.066", "461022.948", "5064892.786", "3826577.066", "461022.948", "5064892.786",
"3826577.066", "461022.948", "5064892.786" "3826577.066", "461022.948", "5064892.786"
], ],
"HBAT_antenna_itrf_offsets": [ "HBAT_PQR_rotation_angles_deg": [
"-1.847", "-1.180", " 1.493", "24",
"-1.581", " 0.003", " 1.186", "24",
"-1.315", " 1.185", " 0.880", "24",
"-1.049", " 2.367", " 0.573", "24",
"-0.882", "-1.575", " 0.804", "24",
"-0.616", "-0.393", " 0.498", "24",
"-0.350", " 0.789", " 0.191", "24",
"-0.083", " 1.971", "-0.116", "24",
" 0.083", "-1.971", " 0.116", "24",
" 0.350", "-0.789", "-0.191", "24",
" 0.616", " 0.393", "-0.498", "24",
" 0.882", " 1.575", "-0.804", "24",
" 1.049", "-2.367", "-0.573", "24",
" 1.315", "-1.185", "-0.880", "24",
" 1.581", "-0.003", "-1.186", "24",
" 1.847", " 1.180", "-1.493" "24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24",
"24"
],
"HBAT_PQR_to_ETRS_rotation_matrix": [
"-0.1195951054", "-0.7919544517", "0.5987530018",
" 0.9928227484", "-0.0954186800", "0.0720990002",
" 0.0000330969", " 0.6030782884", "0.7976820024"
] ]
} }
} }
......
...@@ -12,3 +12,4 @@ psutil >= 5.8.0 # BSD ...@@ -12,3 +12,4 @@ psutil >= 5.8.0 # BSD
docker >= 5.0.3 # Apache 2 docker >= 5.0.3 # Apache 2
python-logstash-async >= 2.3.0 # MIT python-logstash-async >= 2.3.0 # MIT
python-casacore >= 3.3.1 # GPL2 python-casacore >= 3.3.1 # GPL2
etrs-itrs@git+https://github.com/brentjens/etrs-itrs # license pending
import etrsitrs
import numpy
"""
LOFAR station positions are measured in ETRS89, which are the coordinates of the position as it would be in 1989.
These coordinates are carthesian (X, Y, Z), with (0, 0, 0) being the center of the Earth.
The ETRS89 positions differ from the current due to tectonic movements. Periodically, these differences are modelled
as position offsets and velocities. For example, ITRF2005 represents these offsets updated to 2005. We can
furthermore extrapolate these models to later dates, such as 2015.5.
By periodically extrapolating to later dates, or by using later models, we can obtain more precise positions of our
antennas without having to remeasure them.
The ETRSitrs package does all the transformation calculations for us.
"""
def ETRS_to_ITRF(ETRS_coordinates: numpy.array, ITRF_reference_frame: str = "ITRF2005", ITRF_reference_epoch: float = 2015.5) -> numpy.array:
""" Convert an array of coordinate triples from ETRS to ITRF, in the given reference frame and epoch. """
# fetch converter
ETRS_to_ITRF_fn = etrsitrs.convert_fn("ETRF2000", ITRF_reference_frame, ITRF_reference_epoch)
if ETRS_coordinates.ndim == 1:
# convert a single coordinate triple
ITRF_coordinates = ETRS_to_ITRF_fn(ETRS_coordinates)
else:
# convert each coordinate triple
ITRF_coordinates = numpy.apply_along_axis(ETRS_to_ITRF_fn, 1, ETRS_coordinates)
# return computed ITRF coordinates
return ITRF_coordinates
import numpy
from math import sin, cos
class HBATAntennaOffsets(object):
"""
This class helps calculate the absolute offsets of the antennas within a tile,
based on their relative orientation to ETRS.
These offsets are Known in LOFAR1 as "iHBADeltas".
Within LOFAR, we use a relative "PQR" coordinate system for each station:
* The origin is the same as the ETRS reference position of the station,
* "Q" points to true North as seen from CS002LBA, the center of LOFAR,
* "P" points (roughly) east,
* "R" points (roughly) up,
* All antennas are positioned in the same plane (R=0 with an error < 3cm).
With the PQR->ETRS rotation matrix (or "ROTATION_MATRIX" in LOFAR1),
we can thus convert from PQR to (relative) ETRS coordinates.
Below, the rotation of the HBA tiles is provided with respect to this PQR frame.
Along with the PQR->ETRS rotation matrix, this allows us to calculate the
` relative positions of each antenna element within a tile in ETRS space.
The relative ITRF positions are subsequently equal to the relative ETRS positions.
For reference, see:
https://git.astron.nl/RD/lofar-referentie-vlak/-/blob/master/data/dts/dts.ipynb
https://git.astron.nl/ro/lofar/-/blob/master/MAC/Deployment/data/Coordinates/calc_hba_deltas.py
https://github.com/brentjens/lofar-antenna-positions/blob/master/lofarantpos/db.py#L208
"""
""" Model of the HBAT1 tile, as offsets of each antenna with respect to the reference center, in metres. """
HBAT1_BASE_ANTENNA_OFFSETS = numpy.array(
[[-1.5, +1.5, 0.0], [-0.5, +1.5, 0.0], [+0.5, +1.5, 0.0], [+1.5, +1.5, 0.0],
[-1.5, +0.5, 0.0], [-0.5, +0.5, 0.0], [+0.5, +0.5, 0.0], [+1.5, +0.5, 0.0],
[-1.5, -0.5, 0.0], [-0.5, -0.5, 0.0], [+0.5, -0.5, 0.0], [+1.5, -0.5, 0.0],
[-1.5, -1.5, 0.0], [-0.5, -1.5, 0.0], [+0.5, -1.5, 0.0], [+1.5, -1.5, 0.0]]) * 1.25
@staticmethod
def rotation_matrix(rad: float) -> numpy.array:
""" Return a rotation matrix for coordinates for a given number of radians. """
rotation_matrix = numpy.array(
[[ cos(rad), sin(rad), 0],
[-sin(rad), cos(rad), 0],
[ 0, 0, 1]])
return rotation_matrix
@staticmethod
def ITRF_offsets(base_antenna_offsets: numpy.array, PQR_rotation: float, PQR_to_ETRS_rotation_matrix: numpy.array) -> numpy.array:
""" Return the antenna offsets in ITRF, given:
:param: base_antenna_offsets: antenna offsets within an unrotated tile (16x3).
:param: PQR_rotation: rotation of the tile(s) in PQR space (radians).
:param: PQR_to_ETRS_rotation_matrix: rotation matrix for PQR -> ETRS conversion (3x3).
"""
# Offsets in PQR are derived by rotating the base tile by the specified number of radians
PQR_offsets = numpy.inner(base_antenna_offsets, HBATAntennaOffsets.rotation_matrix(PQR_rotation))
# The PQR->ETRS mapping is a rotation as well
ETRS_offsets = numpy.inner(PQR_offsets, PQR_to_ETRS_rotation_matrix)
# The ITRF offsets are the same as the ETRS offsets
return ETRS_offsets
...@@ -105,13 +105,13 @@ class Beam(lofar_device): ...@@ -105,13 +105,13 @@ class Beam(lofar_device):
# Retrieve positions from RECV device # Retrieve positions from RECV device
HBAT_reference_itrf = self.recv_proxy.HBAT_reference_itrf_R HBAT_reference_itrf = self.recv_proxy.HBAT_reference_itrf_R
HBAT_antenna_itrf_offsets = self.recv_proxy.HBAT_antenna_itrf_offsets_R HBAT_antenna_itrf_offsets = self.recv_proxy.HBAT_antenna_itrf_offsets_R.reshape(96,16,3)
# a delay calculator for each tile # a delay calculator for each tile
self.HBAT_delay_calculators = [delay_calculator(reference_itrf) for reference_itrf in HBAT_reference_itrf] self.HBAT_delay_calculators = [delay_calculator(reference_itrf) for reference_itrf in HBAT_reference_itrf]
# absolute positions of each antenna element # absolute positions of each antenna element
self.HBAT_antenna_positions = [reference_itrf + HBAT_antenna_itrf_offsets for reference_itrf in HBAT_reference_itrf] self.HBAT_antenna_positions = [HBAT_reference_itrf[tile] + HBAT_antenna_itrf_offsets[tile] for tile in range(96)]
# Create a thread object to update HBAT beam weights # Create a thread object to update HBAT beam weights
self.HBAT_beam_tracker = BeamTracker(self) self.HBAT_beam_tracker = BeamTracker(self)
......
...@@ -17,9 +17,13 @@ from tango import DebugIt ...@@ -17,9 +17,13 @@ from tango import DebugIt
from tango.server import command from tango.server import command
from tango.server import device_property, attribute from tango.server import device_property, attribute
from tango import AttrWriteType, DevState, DevVarFloatArray from tango import AttrWriteType, DevState, DevVarFloatArray
import numpy import numpy
from math import pi
# Additional import # Additional import
from tangostationcontrol.beam.hba_tile import HBATAntennaOffsets
from tangostationcontrol.beam.geo import ETRS_to_ITRF
from tangostationcontrol.common.entrypoint import entry from tangostationcontrol.common.entrypoint import entry
from tangostationcontrol.common.lofar_logging import device_logging_to_python from tangostationcontrol.common.lofar_logging import device_logging_to_python
from tangostationcontrol.clients.attribute_wrapper import attribute_wrapper from tangostationcontrol.clients.attribute_wrapper import attribute_wrapper
...@@ -37,6 +41,9 @@ class RECV(opcua_device): ...@@ -37,6 +41,9 @@ class RECV(opcua_device):
# ----------------- # -----------------
# Device Properties # Device Properties
# ----------------- # -----------------
# ----- Default settings
ANT_mask_RW_default = device_property( ANT_mask_RW_default = device_property(
dtype='DevVarBooleanArray', dtype='DevVarBooleanArray',
mandatory=False, mandatory=False,
...@@ -67,6 +74,13 @@ class RECV(opcua_device): ...@@ -67,6 +74,13 @@ class RECV(opcua_device):
default_value=1 default_value=1
) )
translator_default_settings = [
'ANT_mask_RW',
'RCU_mask_RW'
]
# ----- Calibration values
HBAT_bf_delay_step_delays = device_property( HBAT_bf_delay_step_delays = device_property(
dtype="DevVarFloatArray", dtype="DevVarFloatArray",
mandatory=False, mandatory=False,
...@@ -80,39 +94,64 @@ class RECV(opcua_device): ...@@ -80,39 +94,64 @@ class RECV(opcua_device):
14.9781E-9, 15.5063E-9 14.9781E-9, 15.5063E-9
],dtype=numpy.float64) ],dtype=numpy.float64)
) )
HBAT_reference_itrf = device_property( HBAT_signal_input_delays = device_property(
dtype='DevVarFloatArray', dtype='DevVarFloatArray',
mandatory=False mandatory=False,
default_value = numpy.zeros((96,32), dtype=numpy.float64)
) )
HBAT_antenna_itrf_offsets = device_property( HBAT_base_antenna_offsets = device_property(
doc="Offsets of the antennas in a HBAT, with respect to its reference center (16x3).",
dtype='DevVarFloatArray', dtype='DevVarFloatArray',
mandatory=False mandatory=False,
default_value = HBATAntennaOffsets.HBAT1_BASE_ANTENNA_OFFSETS.flatten()
) )
HBAT_signal_input_delays = device_property( # ----- Position information
HBAT_reference_ITRF = device_property(
doc="ITRF position (XYZ) of each HBAT (leave empty to auto-derive from ETRS)",
dtype='DevVarFloatArray', dtype='DevVarFloatArray',
mandatory=False, mandatory=False
default_value = numpy.zeros((96,32), dtype=numpy.float64) )
HBAT_reference_ETRS = device_property(
doc="ETRS position (XYZ) of each HBAT",
dtype='DevVarFloatArray',
mandatory=False
) )
ITRF_Reference_Frame = device_property( ITRF_Reference_Frame = device_property(
doc="Reference frame in which the ITRF coordinates are provided, or are to be computed from ETRS89",
dtype='DevString', dtype='DevString',
mandatory=False, mandatory=False,
default_value = "ITRF2005" default_value = "ITRF2005"
) )
ITRF_Reference_Epoch = device_property( ITRF_Reference_Epoch = device_property(
doc="Reference epoch in which the ITRF coordinates are provided, or are to be extrapolated from ETRS89",
dtype='DevFloat', dtype='DevFloat',
mandatory=False, mandatory=False,
default_value = 2015.5 default_value = 2015.5
) )
translator_default_settings = [ HBAT_PQR_rotation_angles_deg = device_property(
'ANT_mask_RW', doc='Rotation of each tile in the PQ plane ("horizontal") in degrees.',
'RCU_mask_RW' dtype='DevVarFloatArray',
] mandatory=False,
default_value = [0.0] * 96
)
HBAT_PQR_to_ETRS_rotation_matrix = device_property(
doc="Field-specific rotation matrix to convert PQR offsets to ETRS/ITRF offsets.",
dtype='DevVarFloatArray',
mandatory=False,
default_value = numpy.array([ # PQR->ETRS rotation matrix for the core stations
[-0.1195951054, -0.7919544517, 0.5987530018],
[ 0.9928227484, -0.0954186800, 0.0720990002],
[ 0.0000330969, 0.6030782884, 0.7976820024]]).flatten()
)
# ---------- # ----------
# Attributes # Attributes
...@@ -161,13 +200,38 @@ class RECV(opcua_device): ...@@ -161,13 +200,38 @@ class RECV(opcua_device):
RECVTR_monitor_rate_RW = attribute_wrapper(comms_annotation=["RECVTR_monitor_rate_RW" ],datatype=numpy.int64 , access=AttrWriteType.READ_WRITE) RECVTR_monitor_rate_RW = attribute_wrapper(comms_annotation=["RECVTR_monitor_rate_RW" ],datatype=numpy.int64 , access=AttrWriteType.READ_WRITE)
RECVTR_translator_busy_R = attribute_wrapper(comms_annotation=["RECVTR_translator_busy_R" ],datatype=numpy.bool_ ) RECVTR_translator_busy_R = attribute_wrapper(comms_annotation=["RECVTR_translator_busy_R" ],datatype=numpy.bool_ )
HBAT_antenna_itrf_offsets_R = attribute(access=AttrWriteType.READ, # ----- Position information
dtype=((numpy.float,),), max_dim_x=3, max_dim_y=16,
fget=lambda self: numpy.array(self.HBAT_antenna_itrf_offsets).reshape(16,3)) HBAT_antenna_ITRF_offsets_R = attribute(access=AttrWriteType.READ,
doc='Offsets of the antennas within a tile, in ITRF ("iHBADeltas"). True shape: 96x16x3.',
dtype=((numpy.float,),), max_dim_x=48, max_dim_y=96)
HBAT_reference_ITRF_R = attribute(access=AttrWriteType.READ,
doc='Absolute reference position of each tile, in ITRF',
dtype=((numpy.float,),), max_dim_x=3, max_dim_y=96)
def read_HBAT_antenna_ITRF_offsets_R(self):
base_antenna_offsets = numpy.array(self.HBAT_base_antenna_offsets).reshape(16,3)
PQR_to_ETRS_rotation_matrix = numpy.array(self.HBAT_PQR_to_ETRS_rotation_matrix).reshape(3,3)
# each tile has its own rotation angle, resulting in different offsets per tile
all_offsets = numpy.array(
[HBATAntennaOffsets.ITRF_offsets(
base_antenna_offsets,
self.HBAT_PQR_rotation_angles_deg[tile] * pi / 180,
PQR_to_ETRS_rotation_matrix)
for tile in range(96)])
return all_offsets.reshape(96,48)
def read_HBAT_reference_ITRF_R(self):
# provide ITRF coordinates if they were configured
if self.HBAT_reference_ITRF:
return numpy.array(self.HBAT_reference_ITRF).reshape(96,3)
HBAT_reference_itrf_R = attribute(access=AttrWriteType.READ, # calculate them from ETRS coordinates if not, using the configured ITRF reference
dtype=((numpy.float,),), max_dim_x=3, max_dim_y=96, ETRS_coordinates = numpy.array(self.HBAT_reference_ETRS).reshape(96,3)
fget=lambda self: numpy.array(self.HBAT_reference_itrf).reshape(96,3)) return ETRS_to_ITRF(ETRS_coordinates, self.ITRF_Reference_Frame, self.ITRF_Reference_Epoch)
# ---------- # ----------
# Summarising Attributes # Summarising Attributes
......
# -*- coding: utf-8 -*-
#
# This file is part of the LOFAR 2.0 Station Software
#
#
#
# Distributed under the terms of the APACHE license.
# See LICENSE.txt for more info.
from tangostationcontrol.beam.geo import ETRS_to_ITRF
from tangostationcontrol.test import base
import numpy.testing
class TestETRS_to_ITRF(base.TestCase):
def test_convert_single_coordinate(self):
""" Convert a single coordinate. """
ETRS_coords = numpy.array([1.0, 1.0, 1.0])
ITRF_coords = ETRS_to_ITRF(ETRS_coords, "ITRF2005", 2015.5)
self.assertEqual(ETRS_coords.shape, ITRF_coords.shape)
def test_convert_array(self):
""" Convert an array of coordinates. """
ETRS_coords = numpy.array([ [1.0, 1.0, 1.0], [2.0, 2.0, 2.0] ])
ITRF_coords = ETRS_to_ITRF(ETRS_coords, "ITRF2005", 2015.5)
self.assertEqual(ETRS_coords.shape, ITRF_coords.shape)
def test_verify_CS001_LBA(self):
""" Verify if the calculated CS001LBA phase center matches those calculated in LOFAR1. """
# See CLBA in MAC/Deployment/data/Coordinates/ETRF_FILES/CS001/CS001-antenna-positions-ETRS.csv
CS001_LBA_ETRS = [3826923.942, 460915.117, 5064643.229]
# Convert to ITRF
CS001_LBA_ITRF = ETRS_to_ITRF(numpy.array(CS001_LBA_ETRS), "ITRF2005", 2015.5)
# verify against LOFAR1 (MAC/Deployment/data/StaticMetaData/AntennaFields/CS001-AntennaField.conf)
LOFAR1_CS001_LBA_ITRF = [3826923.50275, 460915.488115, 5064643.517]
numpy.testing.assert_almost_equal(CS001_LBA_ITRF, LOFAR1_CS001_LBA_ITRF, decimal=1.5)
# -*- coding: utf-8 -*-
#
# This file is part of the LOFAR 2.0 Station Software
#
#
#
# Distributed under the terms of the APACHE license.
# See LICENSE.txt for more info.
from tangostationcontrol.beam.hba_tile import HBATAntennaOffsets
from tangostationcontrol.test import base
from math import pi
import numpy.testing
class TestHBATAntennaOffsets(base.TestCase):
def test_verify_CS001_HBA0(self):
""" Verify if the calculated HBAT Antenna Offsets match those calculated in LOFAR1. """
CS001_HBA0_rotation_angle_deg = 24
CS001_PQR_to_ETRS_rotation_matrix = numpy.array([
[-0.1195951054, -0.7919544517, 0.5987530018],
[ 0.9928227484, -0.0954186800, 0.0720990002],
[ 0.0000330969, 0.6030782884, 0.7976820024]])
# recalculate the ITRF offsets
ITRF_offsets = HBATAntennaOffsets.ITRF_offsets(
HBATAntennaOffsets.HBAT1_BASE_ANTENNA_OFFSETS,
CS001_HBA0_rotation_angle_deg * pi / 180,
CS001_PQR_to_ETRS_rotation_matrix)
# verify against LOFAR1 (MAC/Deployment/data/StaticMetaData/iHBADeltas/CS001-iHBADeltas.conf)
LOFAR1_CS001_HBA0_ITRF_offsets = numpy.array([
[-1.847, -1.180, 1.493],
[-1.581, 0.003, 1.186],
[-1.315, 1.185, 0.880],
[-1.049, 2.367, 0.573],
[-0.882, -1.575, 0.804],
[-0.616, -0.393, 0.498],
[-0.350, 0.789, 0.191],
[-0.083, 1.971, -0.116],
[ 0.083, -1.971, 0.116],
[ 0.350, -0.789, -0.191],
[ 0.616, 0.393, -0.498],
[ 0.882, 1.575, -0.804],
[ 1.049, -2.367, -0.573],
[ 1.315, -1.185, -0.880],
[ 1.581, -0.003, -1.186],
[ 1.847, 1.180, -1.493]])
numpy.testing.assert_almost_equal(ITRF_offsets, LOFAR1_CS001_HBA0_ITRF_offsets, decimal=3)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment