From fb35499738b9e260afa34373584547b42d159e5b Mon Sep 17 00:00:00 2001
From: "E. Joshua Rigler" <erigler@usgs.gov>
Date: Mon, 17 Mar 2025 09:15:11 -0600
Subject: [PATCH] Properly map `data_type`/`location` codes in *SNCL.py:

There is an ambiguity that exists between `data_type` and `location` in *SNCL.py. Ideally, we'd clean this up, but that involves many changes, and well beyond just the *SNCL.py files. These changes at least fix issues with geomagio scripts that popped up during testing.
---
 geomagio/edge/LegacySNCL.py | 21 +++++++++++++++++----
 geomagio/edge/SNCL.py       |  4 ++--
 2 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/geomagio/edge/LegacySNCL.py b/geomagio/edge/LegacySNCL.py
index 22b5770b..0f447954 100644
--- a/geomagio/edge/LegacySNCL.py
+++ b/geomagio/edge/LegacySNCL.py
@@ -44,7 +44,9 @@ class LegacySNCL(SNCL):
         return LegacySNCL(
             station=station,
             network=network,
-            channel=get_channel(element=element, interval=interval),
+            channel=get_channel(
+                element=element, interval=interval, data_type=location or data_type
+            ),
             location=location or get_location(element=element, data_type=data_type),
         )
 
@@ -68,9 +70,10 @@ class LegacySNCL(SNCL):
         raise ValueError(f"Unexcepted interval code: {channel_start}")
 
 
-def get_channel(element: str, interval: str) -> str:
+def get_channel(element: str, interval: str, data_type: str) -> str:
     return _check_predefined_channel(element=element, interval=interval) or (
-        _get_channel_start(interval=interval) + _get_channel_end(element=element)
+        _get_channel_start(interval=interval)
+        + _get_channel_end(element=element, data_type=data_type)
     )
 
 
@@ -133,7 +136,7 @@ def _check_predefined_channel(element: str, interval: str) -> Optional[str]:
         return None
 
 
-def _get_channel_end(element: str) -> str:
+def _get_channel_end(element: str, data_type: str) -> str:
     channel_middle = "V"
     if "_Volt" in element:
         channel_middle = "E"
@@ -144,6 +147,16 @@ def _get_channel_end(element: str) -> str:
     elif element in ["F", "G"]:
         channel_middle = "S"
     channel_end = element.split("_")[0]
+    if data_type == "variation" or data_type[0] == "R":
+        # this may not actually be necessary since UVW were
+        # never used as legacy channels; it is included here
+        # solely for consistency with SNCL.py, but should be safe
+        if channel_end == "U":
+            channel_end = "H"
+        elif channel_end == "V":
+            channel_end = "Y"
+        elif channel_end == "W":
+            channel_end = "Z"
     return channel_middle + channel_end
 
 
diff --git a/geomagio/edge/SNCL.py b/geomagio/edge/SNCL.py
index 3028f82d..421190d8 100644
--- a/geomagio/edge/SNCL.py
+++ b/geomagio/edge/SNCL.py
@@ -46,7 +46,7 @@ class SNCL(BaseModel):
             station=station,
             network=network,
             channel=get_channel(
-                element=element, interval=interval, data_type=data_type
+                element=element, interval=interval, data_type=location or data_type
             ),
             location=location or get_location(element=element, data_type=data_type),
         )
@@ -178,7 +178,7 @@ def _get_channel_end(element: str, data_type: str) -> str:
     elif "_Temp" in element:
         channel_middle = "K"
     channel_end = element.split("_")[0]
-    if data_type == "variation":
+    if data_type == "variation" or data_type[0] == "R":
         if channel_end == "H":
             channel_end = "U"
         elif channel_end == "E":
-- 
GitLab