From 302f2206e90d2ff6887984b0691a08aefaaa74e9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B6rn=20K=C3=BCnsem=C3=B6ller?=
 <jkuensem@physik.uni-bielefeld.de>
Date: Fri, 2 Jun 2023 18:19:31 +0200
Subject: [PATCH] TMSS-1777: use station coordinates from newer epoch

---
 LCS/PyCommon/CMakeLists.txt                   |  3 ++-
 LCS/PyCommon/station_coordinates.py           | 24 +++++++++++++++++++
 LTA/sip/lib/siplib.py                         |  6 ++---
 .../data/StaticMetaData/CMakeLists.txt        |  3 ++-
 .../services/scheduling/lib/constraints.py    |  8 +++----
 .../backend/src/tmss/tmssapp/conversions.py   |  4 ++--
 6 files changed, 37 insertions(+), 11 deletions(-)
 create mode 100644 LCS/PyCommon/station_coordinates.py

diff --git a/LCS/PyCommon/CMakeLists.txt b/LCS/PyCommon/CMakeLists.txt
index db356cd03c2..74e17082cad 100644
--- a/LCS/PyCommon/CMakeLists.txt
+++ b/LCS/PyCommon/CMakeLists.txt
@@ -38,7 +38,8 @@ set(_py_files
   test_utils.py
   typing.py
   toposort.py
-  ring_coordinates.py)
+  ring_coordinates.py
+  station_coordinates.py)
 
 python_install(${_py_files} DESTINATION lofar/common)
 
diff --git a/LCS/PyCommon/station_coordinates.py b/LCS/PyCommon/station_coordinates.py
new file mode 100644
index 00000000000..2f07848a647
--- /dev/null
+++ b/LCS/PyCommon/station_coordinates.py
@@ -0,0 +1,24 @@
+from ast import literal_eval
+import os
+import functools
+
+DEFAULT_STATION_POSITIONS_PARSET_FILEPATH = os.path.expandvars("$LOFARROOT/etc/StaticMetaData/StationPositions.parset")
+
+@functools.lru_cache()
+def parse_station_coordinates() -> dict:
+    """
+    :return: a dict mapping station field name, e.g. "CS002_LBA", to a dict containing geocentric coordinates
+    """
+    station_coordinates = {}
+    with open(DEFAULT_STATION_POSITIONS_PARSET_FILEPATH, 'r') as f:
+        for line in f.readlines():
+            print(line)
+            line = line.strip()
+            if line and line.startswith('PIC.Core.'):
+                key, value = line.split('=')
+                key = key.replace('PIC.Core.', '').replace('.phaseCenter', '').strip()
+                eval_value = literal_eval(value)
+                field_coords = {'coordinate_system': 'ITRF2005', 'epoch': '2017.5' if 'DE605' in key else '2015.5', 'x': eval_value[0], 'y': eval_value[1], 'z': eval_value[2]}  # 'coordinate_system': 'ITRF2005' ?!
+                station_coordinates[key] = field_coords
+    return station_coordinates
+
diff --git a/LTA/sip/lib/siplib.py b/LTA/sip/lib/siplib.py
index aab5409b98b..ff3bba92ba1 100644
--- a/LTA/sip/lib/siplib.py
+++ b/LTA/sip/lib/siplib.py
@@ -28,7 +28,7 @@
 from . import ltasip
 import pyxb
 from . import constants
-from . import station_coordinates
+from lofar.common import station_coordinates
 import os
 import uuid
 import xml.dom.minidom
@@ -153,8 +153,8 @@ class Station():
         __afield2=None
         station_coords = station_coordinates.parse_station_coordinates()
         for atype in antennafieldtypes:
-            if name+"_"+atype in station_coords.keys():
-                field_coords = station_coords[name+"_"+atype]
+            if name+atype in station_coords.keys():
+                field_coords = station_coords[name+atype]
                 __afield=AntennafieldXYZ(
                             type=atype,
                             coordinate_system=field_coords["coordinate_system"],
diff --git a/MAC/Deployment/data/StaticMetaData/CMakeLists.txt b/MAC/Deployment/data/StaticMetaData/CMakeLists.txt
index 71266e4b377..cbcea42258c 100644
--- a/MAC/Deployment/data/StaticMetaData/CMakeLists.txt
+++ b/MAC/Deployment/data/StaticMetaData/CMakeLists.txt
@@ -24,5 +24,6 @@ file(GLOB staticmeta_data RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
   CableDelays/*.conf*
   iHBADeltas/*.conf*
   AntennaFields/*.conf*
-  Attenuation/*.conf*)
+  Attenuation/*.conf*
+  StationPositions.parset)
 lofar_add_sysconf_files(${staticmeta_data} DESTINATION StaticMetaData)
diff --git a/SAS/TMSS/backend/services/scheduling/lib/constraints.py b/SAS/TMSS/backend/services/scheduling/lib/constraints.py
index 9676a0f0929..42bdd43b185 100644
--- a/SAS/TMSS/backend/services/scheduling/lib/constraints.py
+++ b/SAS/TMSS/backend/services/scheduling/lib/constraints.py
@@ -218,10 +218,10 @@ def get_boundary_stations_from_list(stations: Tuple[str]) -> Tuple[str]:
     if not stations:
         return tuple()
 
-    from lofar.lta.sip import station_coordinates
+    from lofar.common import station_coordinates
     min_lat, max_lat, min_lon, max_lon = None, None, None, None
     for station in stations:
-        coords = station_coordinates.parse_station_coordinates()["%s_LBA" % station.upper()]
+        coords = station_coordinates.parse_station_coordinates()["%sLBA" % station.upper()]
         loc = EarthLocation.from_geocentric(x=coords['x'], y=coords['y'], z=coords['z'],  unit=astropy.units.m)
         if not min_lat or loc.lat < min_lat:
             min_lat = loc.lat
@@ -247,10 +247,10 @@ def get_unique_sorted_boundary_stations_or_cs002(stations: Tuple[str], min_dista
     boundary_stations = set(get_boundary_stations_from_list(tuple(stations)))
     if min_distance is not None:
         # find EarthLocation for each boundary_station
-        from lofar.lta.sip import station_coordinates
+        from lofar.common import station_coordinates
         locations = {}
         for station in boundary_stations:
-            coords = station_coordinates.parse_station_coordinates()["%s_LBA" % station.upper()]
+            coords = station_coordinates.parse_station_coordinates()["%sLBA" % station.upper()]
             locations[station] = EarthLocation.from_geocentric(x=coords['x'], y=coords['y'], z=coords['z'], unit=astropy.units.m)
 
         # loop over all station combinations, except (self,self), and compute great-circle-distance in meters between the two
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/conversions.py b/SAS/TMSS/backend/src/tmss/tmssapp/conversions.py
index 8164012de58..7669919ac34 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/conversions.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/conversions.py
@@ -75,8 +75,8 @@ def create_location_for_station(station: str) -> EarthLocation:
     :param station: a station name, e.g. "CS002"
     :return: astropy.coordinates.earth.EarthLocation
     '''
-    from lofar.lta.sip import station_coordinates
-    coords = station_coordinates.parse_station_coordinates()["%s_LBA" % station.upper()]
+    from lofar.common import station_coordinates
+    coords = station_coordinates.parse_station_coordinates()["%sLBA" % station.upper()]
     location = EarthLocation.from_geocentric(x=coords['x'], y=coords['y'], z=coords['z'],  unit=astropy.units.m)
     return location
 
-- 
GitLab